package org.springframework.data.simpledb.core.entity; import java.io.Serializable; import java.lang.reflect.Field; import java.util.Map; import org.springframework.data.simpledb.reflection.ReflectionUtils; import org.springframework.util.Assert; public abstract class AbstractFieldWrapper<T, ID extends Serializable> { /* field metadata */ private final Field field; private final EntityWrapper<T, ID> parentWrapper; private final boolean isNewParent; protected AbstractFieldWrapper(final Field field, final EntityWrapper<T, ID> parentWrapper, final boolean isNewParent) { Assert.notNull(field); Assert.notNull(parentWrapper); this.field = field; this.parentWrapper = parentWrapper; this.field.setAccessible(Boolean.TRUE); this.isNewParent = isNewParent; } protected boolean isNewParent() { return isNewParent; } public abstract Map<String, String> serialize(String prefix); public abstract Object deserialize(final Map<String, String> attributes); /** * Template method. * * Create an instance of the field and set it on the parentWrapper instance. */ public abstract void createInstance(); public Field getField() { return this.field; } @SuppressWarnings("unchecked") public Class<T> getFieldType() { return (Class<T>) getField().getType(); } /** * Sets value via setter */ public void setFieldValue(Object fieldValue) { ReflectionUtils.callSetter(parentWrapper.getItem(), field.getName(), fieldValue); } /** * Retrieves value via getter */ public Object getFieldValue() { return ReflectionUtils.callGetter(parentWrapper.getItem(), field.getName()); } public T getParentEntity() { return this.parentWrapper.getItem(); } String getFieldName() { return field.getName(); } EntityWrapper<T, ID> getParentWrapper() { return this.parentWrapper; } }