001    /*
002     * JBoss, Home of Professional Open Source
003     *
004     * Distributable under LGPL license.
005     * See terms of license at gnu.org.
006     */
007    
008    package org.granite.util;
009    
010    import java.lang.reflect.Field;
011    import java.lang.reflect.Method;
012    import java.lang.reflect.Type;
013    
014    import javax.persistence.EmbeddedId;
015    import javax.persistence.Id;
016    import javax.persistence.Version;
017    
018    
019    
020    /**
021     * A wrapper for a entity, This code was pulled from Entity.java 
022     * in the seam project www.seamframework.org jboss-seam-2.0.0.GA author Gavin King
023     * @author gavin king
024     */
025    
026    public class Entity {
027            
028            private Class<?> entityClass;
029            private Method identifierGetter;
030            private Field identifierField;
031            private Method versionGetter;
032            private Field versionField;
033            private Object wrappedEntity;
034            private String name;
035            
036            
037            public Entity(Object entity) {
038                    if (entity instanceof Class<?>)
039                            this.entityClass = (Class<?>)entity;
040                    else {
041                            this.entityClass = entity.getClass();
042                            this.wrappedEntity = entity;
043                    }
044                    
045            if (entityClass.isAnnotationPresent(javax.persistence.Entity.class)) {
046                    if (!"".equals(entityClass.getAnnotation(javax.persistence.Entity.class).name()))
047                        name = entityClass.getAnnotation(javax.persistence.Entity.class).name();
048                    else
049                        name = entityClass.getName();
050            }
051                    
052                for (Class<?> clazz = entityClass; clazz != Object.class; clazz = clazz.getSuperclass())  {
053                for (Method method : clazz.getDeclaredMethods()) {
054                                if (method.isAnnotationPresent(Id.class) || method.isAnnotationPresent(EmbeddedId.class))
055                                    identifierGetter = method;
056                                
057                                if (method.isAnnotationPresent(Version.class))
058                                    versionGetter = method;
059                            }
060                
061                }
062                
063            if (identifierGetter == null) {
064                for (Class<?> clazz = entityClass; clazz != Object.class; clazz = clazz.getSuperclass())      {
065                   for (Field field : clazz.getDeclaredFields()) {
066                       if (field.isAnnotationPresent(Id.class) || field.isAnnotationPresent(EmbeddedId.class)) {
067                               identifierField = field;
068                           if (!field.isAccessible())
069                               field.setAccessible(true);
070                       }
071                  
072                       if (field.isAnnotationPresent(Version.class)) {
073                               versionField = field;
074                           if (!field.isAccessible())
075                               field.setAccessible(true);
076                       }
077                   }
078               }
079            }
080            }
081            
082            
083            
084            public Object getIdentifier() {
085                    if (wrappedEntity == null)
086                            throw new IllegalStateException("No entity instance defined");
087                    
088                    return getIdentifier(wrappedEntity);
089            }
090            
091            public Object getIdentifier(Object entity) {            
092                if (identifierGetter != null)
093                    return Reflections.invokeAndWrap(identifierGetter, entity);
094                else if (identifierField != null)
095                    return Reflections.getAndWrap(identifierField, entity);
096                else
097                    throw new IllegalStateException("@Id attribute not found for entity class: " + entity.getClass().getName());
098            }
099            
100            public Object getVersion() {
101                    if (wrappedEntity == null)
102                            throw new IllegalStateException("No entity instance defined");
103                    
104                    return getVersion(wrappedEntity);
105            }
106            
107            public Object getVersion(Object entity) {
108                if (versionGetter != null)
109                    return Reflections.invokeAndWrap(versionGetter, entity);
110                else if (versionField != null)
111                    return Reflections.getAndWrap(versionField, entity);
112                return null;
113            }
114    
115            
116            public Method getIdentifierGetter() {
117                    return identifierGetter;
118            }
119    
120            public Field getIdentifierField() {
121                    return identifierField;
122            }
123    
124            public Type getIdentifierType() {
125                if (identifierGetter != null)
126                    return identifierGetter.getGenericReturnType();
127                else if (identifierField != null)
128                    return identifierField.getGenericType();
129                else
130                    throw new IllegalStateException("@Id attribute not found for entity class: " + entityClass.getName());
131            }
132            
133            
134            public Method getVersionGetter() {
135                    return versionGetter;
136            }
137    
138            public Field getVersionField() {
139                    return versionField;
140            }
141            
142            public boolean isVersioned() {
143                    return versionGetter != null || versionField != null;
144            }
145    
146    
147            public String getName() {
148                    return name;
149            }
150    }