package fi.otavanopisto.pyramus.util.dataimport;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import fi.internetix.smvc.SmvcRuntimeException;
import fi.otavanopisto.pyramus.dao.DAOFactory;
import fi.otavanopisto.pyramus.framework.PyramusStatusCode;
@SuppressWarnings("rawtypes")
public class ReferenceFieldHandlingStrategy implements FieldHandlingStrategy {
private final Class entityClass;
private final String fieldName;
private final Class referencedClass;
/**
*
* @param entityClass Entity class to save data into
* @param fieldName Field name in entityClass entity to save data into
* @param referencedClass Class of the object that fieldName in entity is referring to
*/
public ReferenceFieldHandlingStrategy(Class entityClass, String fieldName, Class referencedClass) {
this.entityClass = entityClass;
this.referencedClass = referencedClass;
this.fieldName = fieldName;
}
@SuppressWarnings("unchecked")
@Override
public void handleField(String fieldName, Object fieldValue, DataImportContext context) throws SecurityException, IllegalArgumentException,
NoSuchFieldException, IllegalAccessException {
Object entity = context.getEntity(entityClass);
if (entity == null) {
Constructor<?> defaultConstructor;
try {
defaultConstructor = entityClass.getDeclaredConstructor(new Class[] {});
defaultConstructor.setAccessible(true);
entity = defaultConstructor.newInstance(new Object[] {});
context.addEntity(entityClass, entity);
} catch (Exception e) {
throw new SmvcRuntimeException(PyramusStatusCode.OK, "Couldn't instantiate entityClass");
}
}
Long id = Long.valueOf((String) fieldValue);
fieldValue = DAOFactory.getInstance().getSystemDAO().findEntityById(referencedClass, id);
Field field = DataImportUtils.getField(entity, this.fieldName != null ? this.fieldName : fieldName);
DataImportUtils.setFieldValue(entity, field, fieldValue);
}
}