001 /**
002 * GRANITE DATA SERVICES
003 * Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004 *
005 * This file is part of the Granite Data Services Platform.
006 *
007 * Granite Data Services is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * Granite Data Services is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
015 * General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
020 * USA, or see <http://www.gnu.org/licenses/>.
021 */
022 /*
023 * JBoss, Home of Professional Open Source
024 *
025 * Distributable under LGPL license.
026 * See terms of license at gnu.org.
027 */
028
029 package org.granite.util;
030
031 import java.lang.reflect.Field;
032 import java.lang.reflect.Method;
033 import java.lang.reflect.Type;
034
035 import javax.persistence.EmbeddedId;
036 import javax.persistence.Id;
037 import javax.persistence.Version;
038
039
040
041 /**
042 * A wrapper for a entity, This code was pulled from Entity.java
043 * in the seam project www.seamframework.org jboss-seam-2.0.0.GA author Gavin King
044 * @author gavin king
045 */
046
047 public class Entity {
048
049 private Class<?> entityClass;
050 private Method identifierGetter;
051 private Field identifierField;
052 private Method versionGetter;
053 private Field versionField;
054 private Object wrappedEntity;
055 private String name;
056
057
058 public Entity(Object entity) {
059 if (entity instanceof Class<?>)
060 this.entityClass = (Class<?>)entity;
061 else {
062 this.entityClass = entity.getClass();
063 this.wrappedEntity = entity;
064 }
065
066 if (entityClass.isAnnotationPresent(javax.persistence.Entity.class)) {
067 if (!"".equals(entityClass.getAnnotation(javax.persistence.Entity.class).name()))
068 name = entityClass.getAnnotation(javax.persistence.Entity.class).name();
069 else
070 name = entityClass.getName();
071 }
072
073 for (Class<?> clazz = entityClass; clazz != Object.class; clazz = clazz.getSuperclass()) {
074 for (Method method : clazz.getDeclaredMethods()) {
075 if (method.isAnnotationPresent(Id.class) || method.isAnnotationPresent(EmbeddedId.class))
076 identifierGetter = method;
077
078 if (method.isAnnotationPresent(Version.class))
079 versionGetter = method;
080 }
081
082 }
083
084 if (identifierGetter == null) {
085 for (Class<?> clazz = entityClass; clazz != Object.class; clazz = clazz.getSuperclass()) {
086 for (Field field : clazz.getDeclaredFields()) {
087 if (field.isAnnotationPresent(Id.class) || field.isAnnotationPresent(EmbeddedId.class)) {
088 identifierField = field;
089 if (!field.isAccessible())
090 field.setAccessible(true);
091 }
092
093 if (field.isAnnotationPresent(Version.class)) {
094 versionField = field;
095 if (!field.isAccessible())
096 field.setAccessible(true);
097 }
098 }
099 }
100 }
101 }
102
103
104
105 public Object getIdentifier() {
106 if (wrappedEntity == null)
107 throw new IllegalStateException("No entity instance defined");
108
109 return getIdentifier(wrappedEntity);
110 }
111
112 public Object getIdentifier(Object entity) {
113 if (identifierGetter != null)
114 return Reflections.invokeAndWrap(identifierGetter, entity);
115 else if (identifierField != null)
116 return Reflections.getAndWrap(identifierField, entity);
117 else
118 throw new IllegalStateException("@Id attribute not found for entity class: " + entity.getClass().getName());
119 }
120
121 public Object getVersion() {
122 if (wrappedEntity == null)
123 throw new IllegalStateException("No entity instance defined");
124
125 return getVersion(wrappedEntity);
126 }
127
128 public Object getVersion(Object entity) {
129 if (versionGetter != null)
130 return Reflections.invokeAndWrap(versionGetter, entity);
131 else if (versionField != null)
132 return Reflections.getAndWrap(versionField, entity);
133 return null;
134 }
135
136
137 public Method getIdentifierGetter() {
138 return identifierGetter;
139 }
140
141 public Field getIdentifierField() {
142 return identifierField;
143 }
144
145 public Type getIdentifierType() {
146 if (identifierGetter != null)
147 return identifierGetter.getGenericReturnType();
148 else if (identifierField != null)
149 return identifierField.getGenericType();
150 else
151 throw new IllegalStateException("@Id attribute not found for entity class: " + entityClass.getName());
152 }
153
154
155 public Method getVersionGetter() {
156 return versionGetter;
157 }
158
159 public Field getVersionField() {
160 return versionField;
161 }
162
163 public boolean isVersioned() {
164 return versionGetter != null || versionField != null;
165 }
166
167
168 public String getName() {
169 return name;
170 }
171 }