package org.springframework.data.simpledb.reflection; import java.lang.reflect.Field; import java.util.Collection; import java.util.Map; import java.util.Set; import org.springframework.data.annotation.Id; import org.springframework.data.simpledb.annotation.Attributes; import org.springframework.util.Assert; public enum FieldType { ID { private static final String FIELD_NAME_DEFAULT_ID = "id"; @Override boolean isOfType(Field field) { Assert.notNull(field); return field.getName().equals(FIELD_NAME_DEFAULT_ID) || field.getAnnotation(Id.class) != null; } }, ATTRIBUTES { @Override boolean isOfType(Field field) { Assert.notNull(field); return field.getAnnotation(Attributes.class) != null; } }, PRIMITIVE { @Override boolean isOfType(Field field) { Assert.notNull(field); return SupportedCoreTypes.PRIMITIVE_TYPES.isOfType(field.getType()); } }, CORE_TYPE { @Override boolean isOfType(Field field) { final boolean isCoreType = SupportedCoreTypes.CORE_TYPES.isOfType(field.getType()); return isCoreType; } }, COLLECTION { @Override boolean isOfType(Field field) { Assert.notNull(field); return Collection.class.isAssignableFrom(field.getType()); } }, ARRAY { @Override boolean isOfType(Field field) { final boolean isArrayType = SupportedCoreTypes.ARRAYS.isOfType(field.getType()); return isArrayType; } }, MAP { @Override boolean isOfType(Field field) { Assert.notNull(field); return Map.class.isAssignableFrom(field.getType()); } }, OBJECT { @Override boolean isOfType(Field field) { Assert.notNull(field); return field.getType().equals(Object.class); } }, NESTED_ENTITY { @Override boolean isOfType(Field field) { Assert.notNull(field); return !(field.getType().equals(Class.class) || field.getType().isEnum() || isOfType(field, ID, ATTRIBUTES, PRIMITIVE, CORE_TYPE, COLLECTION, ARRAY, MAP, OBJECT, REFERENCE_ENTITY)); } }, REFERENCE_ENTITY { @Override boolean isOfType(Field field) { Assert.notNull(field); return ReflectionUtils.isReference(field); } }; abstract boolean isOfType(Field field); static boolean isOfType(final Class<?> fieldType, final Set<Class<?>> supportedTypes) { Assert.notNull(fieldType); for(Class<?> clazz : supportedTypes) { if(fieldType == clazz || clazz.isAssignableFrom(fieldType)) { return true; } } return false; } static boolean isOfType(final Field field, final FieldType... fieldTypes) { for(final FieldType fieldType : fieldTypes) { if(fieldType.isOfType(field)) { return true; } } return false; } }