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 }