package org.activityinfo.legacy.shared.adapter; import com.google.common.base.Function; import com.google.common.base.Strings; import com.google.common.collect.Lists; import org.activityinfo.core.shared.application.FolderClass; import org.activityinfo.core.shared.criteria.Criteria; import org.activityinfo.model.form.FormInstance; import org.activityinfo.i18n.shared.I18N; import org.activityinfo.legacy.shared.model.*; import org.activityinfo.model.form.FormClass; import org.activityinfo.model.legacy.CuidAdapter; import org.activityinfo.model.resource.ResourceId; import javax.annotation.Nullable; import java.util.HashSet; import java.util.List; import java.util.Set; import static org.activityinfo.model.legacy.CuidAdapter.*; /** * Extracts a list of databases as a list of folders */ public class FolderListAdapter implements Function<SchemaDTO, List<FormInstance>> { public static final ResourceId HOME_ID = ResourceId.valueOf("home"); public static final ResourceId GEODB_ID = ResourceId.valueOf("_geodb"); private final Criteria criteria; public FolderListAdapter(Criteria criteria) { this.criteria = criteria; } @Nullable @Override public List<FormInstance> apply(SchemaDTO schemaDTO) { List<FormInstance> instances = Lists.newArrayList(); FormInstance root = new FormInstance(HOME_ID, FolderClass.CLASS_ID); root.set(FolderClass.LABEL_FIELD_ID, I18N.CONSTANTS.home()); if (criteria.apply(root)) { instances.add(root); } FormInstance geodb = new FormInstance(GEODB_ID, FolderClass.CLASS_ID); root.set(FolderClass.LABEL_FIELD_ID, "Geographic Reference Database"); if (criteria.apply(geodb)) { instances.add(geodb); } for (UserDatabaseDTO db : schemaDTO.getDatabases()) { FormInstance dbFolder = newFolder(db); if (criteria.apply(dbFolder)) { instances.add(dbFolder); } Set<String> categories = new HashSet<>(); for (ActivityDTO activity : db.getActivities()) { FormInstance activityClass = new FormInstance(activityFormClass(activity.getId()), FormClass.CLASS_ID); if (!Strings.isNullOrEmpty(activity.getCategory())) { categories.add(activity.getCategory()); activityClass.setOwnerId(activityCategoryFolderId(db.getId(), activity.getCategory())); } else { activityClass.setOwnerId(databaseId(db.getId())); } activityClass.set(FormClass.LABEL_FIELD_ID, activity.getName()); if (criteria.apply(activityClass)) { instances.add(activityClass); } } for (String category : categories) { FormInstance categoryFolder = new FormInstance(activityCategoryFolderId(db.getId(), category), FolderClass.CLASS_ID); categoryFolder.setOwnerId(dbFolder.getId()); categoryFolder.set(FolderClass.LABEL_FIELD_ID, category); if (criteria.apply(categoryFolder)) { instances.add(categoryFolder); } } } // Add LocationTypes which have been assigned to a database for (CountryDTO country : schemaDTO.getCountries()) { for (LocationTypeDTO locationType : country.getLocationTypes()) { if (!locationType.isAdminLevel() && locationType.getDatabaseId() != null) { FormInstance instance = new FormInstance(CuidAdapter.locationFormClass(locationType.getId()), FormClass.CLASS_ID); instance.set(FormClass.LABEL_FIELD_ID, locationType.getName()); instance.setOwnerId(CuidAdapter.cuid(DATABASE_DOMAIN, locationType.getDatabaseId())); if (criteria.apply(instance)) { instances.add(instance); } } } } return instances; } private FormInstance newFolder(UserDatabaseDTO db) { FormInstance folder = new FormInstance(cuid(DATABASE_DOMAIN, db.getId()), FolderClass.CLASS_ID); folder.setOwnerId(HOME_ID); folder.set(FolderClass.LABEL_FIELD_ID, db.getName()); folder.set(FolderClass.DESCRIPTION_FIELD_ID, db.getFullName()); return folder; } }