package org.activityinfo.legacy.shared.adapter; import com.google.common.base.Function; import com.google.common.collect.Sets; import org.activityinfo.model.form.FormInstance; import org.activityinfo.legacy.shared.model.AdminEntityDTO; import org.activityinfo.legacy.shared.model.LocationDTO; import org.activityinfo.model.legacy.CuidAdapter; import org.activityinfo.model.resource.ResourceId; import org.activityinfo.model.type.ReferenceValue; import java.util.List; import java.util.Set; /** * Converts a legacy LocationDTO to a FormInstance */ public class LocationInstanceAdapter implements Function<LocationDTO, FormInstance> { @Override public FormInstance apply(LocationDTO input) { ResourceId instanceId = CuidAdapter.locationInstanceId(input.getId()); ResourceId classId = CuidAdapter.locationFormClass(input.getLocationTypeId()); FormInstance instance = new FormInstance(instanceId, classId); instance.set(LocationClassAdapter.getNameFieldId(classId), input.getName()); instance.set(LocationClassAdapter.getAxeFieldId(classId), input.getAxe()); instance.set(LocationClassAdapter.getPointFieldId(classId), input.getPoint()); instance.set(LocationClassAdapter.getAdminFieldId(classId), toInstanceIdSet(input.getAdminEntities())); return instance; } private ReferenceValue toInstanceIdSet(List<AdminEntityDTO> adminEntities) { // in the legacy database, all admin entities are stored to simplify // querying the sql database. here we need to eliminate the redundancy Set<Integer> parents = Sets.newHashSet(); for (AdminEntityDTO entity : adminEntities) { if (entity.getParentId() != null) { parents.add(entity.getParentId()); } } Set<ResourceId> instanceIds = Sets.newHashSet(); for (AdminEntityDTO entity : adminEntities) { if (!parents.contains(entity.getId())) { instanceIds.add(CuidAdapter.entity(entity.getId())); } } return new ReferenceValue(instanceIds); } }