package org.wamblee.persistence;
import java.io.Serializable;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.persistence.Version;
import org.wamblee.reflection.Accessor;
-import org.wamblee.reflection.FieldAccessor;
-import org.wamblee.reflection.PropertyAccessor;
-import org.wamblee.reflection.ReflectionUtils;
+import org.wamblee.reflection.AnnotationUtils;
/**
* Factory which creates a {@link Persistent} object for a given JPA entity for
}
private static EntityAccessor analyse(Class aClass) {
- Accessor<Serializable> pk = analyse(aClass, Id.class);
- Accessor<Integer> version = analyse(aClass, Version.class);
+ Accessor<Serializable> pk = AnnotationUtils.analyse(aClass, Id.class);
+ Accessor<Integer> version = AnnotationUtils.analyse(aClass, Version.class);
if (pk != null || version != null) {
return new EntityAccessor(pk, version);
}
return null;
}
- /**
- * Returns the accessor for a given annotation.
- *
- * @param aClass
- * Class to analyse.
- * @param aAnnotation
- * Annotation that must be present.
- * @return Accessor to use or null if the annotation is not present.
- */
- // TODO move generic analysis part to the reflection package.
- public static Accessor analyse(Class aClass,
- Class<? extends Annotation> aAnnotation) {
- List<Field> fields = ReflectionUtils.getAllFields(aClass);
- for (Field field : fields) {
- if (field.isAnnotationPresent(aAnnotation)) {
- return new FieldAccessor(field);
- }
- }
- List<Method> methods = ReflectionUtils.getAllMethods(aClass,
- Object.class);
- for (Method method : methods) {
- if (method.isAnnotationPresent(aAnnotation)) {
- String setterName = null;
- if (method.getName().startsWith("get")) {
- setterName = method.getName().replaceFirst("get", "set");
- } else if (method.getName().startsWith("is")) {
- setterName = method.getName().replaceFirst("is", "set");
- }
- try {
- Class returnType = method.getReturnType();
- Method setter = method.getDeclaringClass()
- .getDeclaredMethod(setterName, returnType);
- return new PropertyAccessor(method, setter);
- } catch (NoSuchMethodException e) {
- throw new RuntimeException("Error obtaining setter for " +
- method.getName() + " in class " + aClass.getName(), e);
- }
- }
- }
- return null;
- }
-
/**
* Creates the {@link Persistent} wrapper for interfacing with primary key
* and version of the entity.
*/
package org.wamblee.reflection;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.List;
+
/**
* Utlities for working with annotations.
*
*/
public class AnnotationUtils {
+ /**
+ * Returns the accessor for a given annotation.
+ *
+ * @param aClass
+ * Class to analyse.
+ * @param aAnnotation
+ * Annotation that must be present.
+ * @return Accessor to use or null if the annotation is not present.
+ */
+ // TODO move generic analysis part to the reflection package.
+ public static Accessor analyse(Class aClass,
+ Class<? extends Annotation> aAnnotation) {
+ List<Field> fields = ReflectionUtils.getAllFields(aClass);
+ for (Field field : fields) {
+ if (field.isAnnotationPresent(aAnnotation)) {
+ return new FieldAccessor(field);
+ }
+ }
+ List<Method> methods = ReflectionUtils.getAllMethods(aClass,
+ Object.class);
+ for (Method method : methods) {
+ if (method.isAnnotationPresent(aAnnotation)) {
+ String setterName = null;
+ if (method.getName().startsWith("get")) {
+ setterName = method.getName().replaceFirst("get", "set");
+ } else if (method.getName().startsWith("is")) {
+ setterName = method.getName().replaceFirst("is", "set");
+ }
+ try {
+ Class returnType = method.getReturnType();
+ Method setter = method.getDeclaringClass()
+ .getDeclaredMethod(setterName, returnType);
+ return new PropertyAccessor(method, setter);
+ } catch (NoSuchMethodException e) {
+ throw new RuntimeException("Error obtaining setter for " +
+ method.getName() + " in class " + aClass.getName(), e);
+ }
+ }
+ }
+ return null;
+ }
+
}