package org.activityinfo.legacy.shared.adapter.bindings;
import com.google.common.collect.Lists;
import org.activityinfo.model.resource.ResourceId;
import org.activityinfo.model.form.FormInstance;
import org.activityinfo.model.legacy.CuidAdapter;
import org.activityinfo.legacy.shared.model.EntityDTO;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Defines a two-way binding between a legacy model and a FormInstance
*/
public abstract class ModelBinding<T extends EntityDTO> {
private final ResourceId classId;
private final char instanceDomain;
private List<FieldBinding<? super T>> fieldBindings = Lists.newArrayList();
public ModelBinding(ResourceId classId, char instanceDomain) {
this.classId = classId;
this.instanceDomain = instanceDomain;
}
public void addField(FieldBinding<T> binding) {
this.fieldBindings.add(binding);
}
public void addField(ResourceId fieldId, String propertyName) {
this.fieldBindings.add(new SimpleFieldBinding(fieldId, propertyName));
}
public void addNestedField(ResourceId fieldId, char domain, String propertyName) {
this.fieldBindings.add(new NestedFieldBinding(fieldId, domain, propertyName));
}
public Map<String, Object> toChangePropertyMap(FormInstance instance) {
Map<String, Object> map = new HashMap<>();
map.put("id", CuidAdapter.getLegacyIdFromCuid(instance.getId()));
for (FieldBinding<? super T> binding : fieldBindings) {
binding.populateChangeMap(instance, map);
}
return map;
}
public FormInstance newInstance(T entity) {
FormInstance instance = new FormInstance(CuidAdapter.cuid(instanceDomain, entity.getId()), classId);
for (FieldBinding<? super T> binding : fieldBindings) {
binding.updateInstanceFromModel(instance, entity);
}
return instance;
}
}