*/
private static Map<String, EntityAccessor> CACHE = new ConcurrentHashMap<String, EntityAccessor>();
- static interface Accessor<T> {
- void set(Object aEntity, T aValue);
-
- T get(Object aEntity);
- }
-
- static class FieldAccessor<T> implements Accessor<T> {
- private Field field;
-
- public FieldAccessor(Field aField) {
- field = aField;
- field.setAccessible(true);
- }
-
- @Override
- public T get(Object aEntity) {
- try {
- T value = (T) field.get(aEntity);
- return value;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void set(Object aEntity, T aValue) {
- try {
- field.set(aEntity, aValue);
- } catch (IllegalAccessException e) {
- throw new RuntimeException(e.getMessage(), e);
- }
- }
-
- public Field getField() {
- return field;
- }
- }
-
- static class PropertyAccessor<T> implements Accessor<T> {
- private Method getter;
- private Method setter;
-
- public PropertyAccessor(Method aGetter, Method aSetter) {
- getter = aGetter;
- setter = aSetter;
- getter.setAccessible(true);
- setter.setAccessible(true);
- }
-
- @Override
- public T get(Object aEntity) {
- try {
- return (T) getter.invoke(aEntity);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public void set(Object aEntity, T aValue) {
- try {
- setter.invoke(aEntity, aValue);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- public Method getGetter() {
- return getter;
- }
-
- public Method getSetter() {
- return setter;
- }
- }
-
static class EntityAccessor {
private Accessor pk;
private Accessor version;
* Annotation that must be present.
* @return Accessor to use or null if the annotation is not present.
*/
- private static Accessor analyse(Class aClass,
+ // 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) {