package uk.ac.cam.echo.server.models;
import org.apache.commons.beanutils.PropertyUtils;
import org.codehaus.jackson.annotate.JsonCreator;
import uk.ac.cam.echo.server.HibernateUtil;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
public class BaseModel {
public void delete() {
HibernateUtil.getTransaction().delete(this);
}
public void save() {
HibernateUtil.getTransaction().save(this);
}
public BaseModel() {
}
@JsonCreator
public BaseModel(Map<String, Object> props, String[] allowed) {
// Update Method
if (props.containsKey("id") && props.get("id") != null) {
sanitizieLong(props, "id");
HibernateUtil.getTransaction().load(this, (Long) props.get("id"));
}
for (String f: allowed) {
try {
Class type = PropertyUtils.getPropertyDescriptor(this, f).getPropertyType();
if (type.equals(Long.class))
sanitizieLong(props, f);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
//ignore
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (!props.containsKey(f))
continue;
try {
PropertyUtils.setProperty(this, f, props.get(f));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
private void sanitizieLong(Map<String, Object> props, String key) {
if (! props.containsKey(key))
return;
Object value = props.get(key);
Object res = value;
if (value instanceof String) {
try {
res = Long.parseLong((String) value);
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
if (value instanceof Integer)
res = ((Integer) value).longValue();
props.put(key, res);
}
}