package org.springframework.data.simpledb.core.entity; import org.springframework.data.simpledb.reflection.FieldType; import org.springframework.data.simpledb.reflection.FieldTypeIdentifier; import java.io.Serializable; import java.lang.reflect.Field; public final class FieldWrapperFactory { private FieldWrapperFactory() { /* utility class */ } public static <T, ID extends Serializable> AbstractFieldWrapper<T, ID> createFieldWrapper(final Field field, final EntityWrapper<T, ID> parent, final boolean isNewParent) { if(FieldTypeIdentifier.isOfType(field, FieldType.PRIMITIVE)) { return createSimpleFieldWrapper(field, parent, isNewParent); } else if(FieldTypeIdentifier.isOfType(field, FieldType.CORE_TYPE)) { return createSimpleFieldWrapper(field, parent, isNewParent); } else if(FieldTypeIdentifier.isOfType(field, FieldType.COLLECTION)) { return createCollectionFieldWrapper(field, parent, isNewParent); } else if(FieldTypeIdentifier.isOfType(field, FieldType.ARRAY)) { return createArrayFieldWrapper(field, parent, isNewParent); } else if(FieldTypeIdentifier.isOfType(field, FieldType.NESTED_ENTITY)) { return createNestedEntityFieldWrapper(field, parent, isNewParent); } else if(FieldTypeIdentifier.isOfType(field, FieldType.REFERENCE_ENTITY)) { return createReferenceEntityFieldWrapper(field, parent, isNewParent); } else if(FieldTypeIdentifier.isOfType(field, FieldType.MAP)) { return createMapFieldWrapper(field, parent, isNewParent); } return createObjectFieldWrapper(field, parent, isNewParent); } private static <T, ID extends Serializable> AbstractFieldWrapper<T, ID> createSimpleFieldWrapper( final Field field, final EntityWrapper<T, ID> parent, final boolean isNewParent) { return new SimpleFieldWrapper<T, ID>(field, parent, isNewParent); } private static <T, ID extends Serializable> AbstractFieldWrapper<T, ID> createArrayFieldWrapper( final Field field, final EntityWrapper<T, ID> parent, final boolean isNewParent) { return new JSONFieldWrapper<T, ID>(field, parent, isNewParent); } private static <T, ID extends Serializable> AbstractFieldWrapper<T, ID> createCollectionFieldWrapper( final Field field, final EntityWrapper<T, ID> parent, final boolean isNewParent) { return new JSONFieldWrapper<T, ID>(field, parent, isNewParent); } private static <T, ID extends Serializable> AbstractFieldWrapper<T, ID> createNestedEntityFieldWrapper( final Field field, final EntityWrapper<T, ID> parent, final boolean isNewParent) { return new NestedEntityFieldWrapper<T, ID>(field, parent, isNewParent); } private static <T, ID extends Serializable> AbstractFieldWrapper<T, ID> createReferenceEntityFieldWrapper( final Field field, final EntityWrapper<T, ID> parent, final boolean isNewParent) { return new ReferenceEntityFieldWrapper<T, ID>(field, parent, isNewParent); } private static <T, ID extends Serializable> AbstractFieldWrapper<T, ID> createMapFieldWrapper(final Field field, final EntityWrapper<T, ID> parent, final boolean isNewParent) { return new JSONFieldWrapper<T, ID>(field, parent, isNewParent); } private static <T, ID extends Serializable> AbstractFieldWrapper<T, ID> createObjectFieldWrapper( final Field field, final EntityWrapper<T, ID> parent, final boolean isNewParent) { return new JSONFieldWrapper<T, ID>(field, parent, isNewParent); } }