}
@SuppressWarnings("deprecation")
public static <T extends JPABase> T edit(Object o, String name, Map<String, String[]> params, Annotation[] annotations) {
try {
BeanWrapper bw = new BeanWrapper(o.getClass());
// Start with relations
Set<Field> fields = new HashSet<Field>();
Class clazz = o.getClass();
while (!clazz.equals(Object.class)) {
Collections.addAll(fields, clazz.getDeclaredFields());
clazz = clazz.getSuperclass();
}
for (Field field : fields) {
boolean isEntity = false;
String relation = null;
boolean multiple = false;
//
if (field.isAnnotationPresent(OneToOne.class) || field.isAnnotationPresent(ManyToOne.class)) {
isEntity = true;
relation = field.getType().getName();
}
if (field.isAnnotationPresent(OneToMany.class) || field.isAnnotationPresent(ManyToMany.class)) {
Class fieldType = (Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
isEntity = true;
relation = fieldType.getName();
multiple = true;
}
if (isEntity) {
Class<Model> c = (Class<Model>) Play.classloader.loadClass(relation);
if (JPABase.class.isAssignableFrom(c)) {
String keyName = Model.Manager.factoryFor(c).keyName();
if (multiple && Collection.class.isAssignableFrom(field.getType())) {
Collection l = new ArrayList();
if (SortedSet.class.isAssignableFrom(field.getType())) {
l = new TreeSet();
} else if (Set.class.isAssignableFrom(field.getType())) {
l = new HashSet();
}
String[] ids = params.get(name + "." + field.getName() + "." + keyName);
if (ids != null) {
params.remove(name + "." + field.getName() + "." + keyName);
for (String _id : ids) {
if (_id.equals("")) {
continue;
}
Query q = JPA.em().createQuery("from " + relation + " where " + keyName + " = ?");
q.setParameter(1, Binder.directBind(_id, Model.Manager.factoryFor((Class<Model>) Play.classloader.loadClass(relation)).keyType()));
try {
l.add(q.getSingleResult());
} catch (NoResultException e) {
Validation.addError(name + "." + field.getName(), "validation.notFound", _id);
}
}
bw.set(field.getName(), o, l);
}
} else {
String[] ids = params.get(name + "." + field.getName() + "." + keyName);
if (ids != null && ids.length > 0 && !ids[0].equals("")) {
params.remove(name + "." + field.getName() + "." + keyName);
Query q = JPA.em().createQuery("from " + relation + " where " + keyName + " = ?");
q.setParameter(1, Binder.directBind(ids[0], Model.Manager.factoryFor((Class<Model>) Play.classloader.loadClass(relation)).keyType()));
try {
String localName = name + "." + field.getName();
Object to = q.getSingleResult();
edit(to, localName, params, field.getAnnotations());
params = Utils.filterMap(params, localName);
bw.set(field.getName(), o, to);
} catch (NoResultException e) {
Validation.addError(name + "." + field.getName(), "validation.notFound", ids[0]);
}
} else if (ids != null && ids.length > 0 && ids[0].equals("")) {
bw.set(field.getName(), o, null);
params.remove(name + "." + field.getName() + "." + keyName);
}
}
}
}
// ----- THIS CODE IS DEPRECATED AND WILL BE REMOVED IN NEXT VERSION -----
if (field.getType().equals(FileAttachment.class) && Params.current() != null) {
FileAttachment fileAttachment = ((FileAttachment) field.get(o));
if (fileAttachment == null) {
fileAttachment = new FileAttachment(o, field.getName());
bw.set(field.getName(), o, fileAttachment);
}
File file = Params.current().get(name + "." + field.getName(), File.class);
if (file != null && file.exists() && file.length() > 0) {
fileAttachment.set(Params.current().get(name + "." + field.getName(), File.class));
fileAttachment.filename = file.getName();
} else {
String df = Params.current().get(name + "." + field.getName() + "_delete_", String.class);
if (df != null && df.equals("true")) {
fileAttachment.delete();
bw.set(field.getName(), o, null);
}
}
params.remove(name + "." + field.getName());
}
// -----
}
bw.bind(name, o.getClass(), params, "", o, annotations);
return (T) o;
} catch (Exception e) {
throw new UnexpectedException(e);
}
}