package com.constellio.app.ui.pages.management.taxonomy; import static com.constellio.app.ui.i18n.i18n.$; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import com.constellio.app.modules.rm.services.ValueListServices; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.services.schemasDisplay.SchemasDisplayManager; import com.constellio.app.ui.entities.TaxonomyVO; import com.constellio.app.ui.framework.builders.TaxonomyToVOBuilder; import com.constellio.app.ui.pages.base.BasePresenter; import com.constellio.app.ui.params.ParamUtils; import com.constellio.model.entities.CorePermissions; import com.constellio.model.entities.Taxonomy; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.MetadataSchemaType; import com.constellio.model.services.schemas.MetadataSchemasManager; import com.constellio.model.services.schemas.SchemaUtils; import com.constellio.model.services.taxonomies.TaxonomiesManager; import com.constellio.model.services.users.UserServices; public class AddEditTaxonomyPresenter extends BasePresenter<AddEditTaxonomyView> { transient UserServices userServices; private boolean actionEdit = false; private List<String> titles; private transient TaxonomiesManager taxonomiesManager; private transient MetadataSchemasManager schemasManager; private transient SchemasDisplayManager schemasDisplayManager; public AddEditTaxonomyPresenter(AddEditTaxonomyView view) { super(view); init(); } private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); init(); } private void init() { userServices = modelLayerFactory.newUserServices(); taxonomiesManager = modelLayerFactory.getTaxonomiesManager(); schemasManager = modelLayerFactory.getMetadataSchemasManager(); schemasDisplayManager = appLayerFactory.getMetadataSchemasDisplayManager(); } public void saveButtonClicked(TaxonomyVO taxonomyVO) { if (isActionEdit()) { Taxonomy taxonomy = fetchTaxonomy(taxonomyVO.getCode()) .withTitle(taxonomyVO.getTitle()) .withUserIds(taxonomyVO.getUserIds()) .withGroupIds(taxonomyVO.getGroupIds()) .withVisibleInHomeFlag(taxonomyVO.isVisibleInHomePage()); createMetadatasInClassifiedObjects(taxonomy, taxonomyVO.getClassifiedObjects()); taxonomiesManager.editTaxonomy(taxonomy); view.navigate().to().listTaxonomies(); } else { boolean canCreate = canCreate(taxonomyVO.getTitle()); if (canCreate) { Taxonomy taxonomy = valueListServices() .createTaxonomy(taxonomyVO.getTitle(), taxonomyVO.getUserIds(), taxonomyVO.getGroupIds(), taxonomyVO.isVisibleInHomePage()); createMetadatasInClassifiedObjects(taxonomy, taxonomyVO.getClassifiedObjects()); view.navigate().to().listTaxonomies(); titles.add(taxonomyVO.getTitle()); } else { view.showErrorMessage("Taxonomny already exists!"); return; } } } void createMetadatasInClassifiedObjects(Taxonomy taxonomy, List<String> classifiedObjects) { if (classifiedObjects != null) { if (classifiedObjects.contains("folderObject")) { if ((actionEdit && canEditClassifiedObjects(newTaxonomyVO(taxonomy))) || !actionEdit) { createMetadatasInDefaultSchemaIfInexistent(taxonomy, Folder.SCHEMA_TYPE); } } if (classifiedObjects.contains("documentObject")) { if ((actionEdit && canEditClassifiedObjects(newTaxonomyVO(taxonomy))) || !actionEdit) { createMetadatasInDefaultSchemaIfInexistent(taxonomy, Document.SCHEMA_TYPE); } } } } void createMetadatasInDefaultSchemaIfInexistent(Taxonomy taxonomy, String schemaType) { if (!getClassifiedObjects(taxonomy).contains(schemaType)) { //TODO Patrick - code instead label String groupLabel = $("classifiedInGroupLabel"); valueListServices() .createAMultivalueClassificationMetadataInGroup(taxonomy, schemaType, "classifiedInGroupLabel", groupLabel); } } Taxonomy fetchTaxonomy(String taxonomyCode) { TaxonomiesManager taxonomiesManager = view.getConstellioFactories().getModelLayerFactory().getTaxonomiesManager(); return taxonomiesManager.getEnabledTaxonomyWithCode(view.getSessionContext().getCurrentCollection(), taxonomyCode); } public TaxonomyVO newTaxonomyVO(Taxonomy taxonomy) { TaxonomyToVOBuilder voBuilder = new TaxonomyToVOBuilder(); TaxonomyVO taxonomyVO = voBuilder.build(taxonomy); taxonomyVO.setClassifiedObjects(getClassifiedObjects(taxonomy)); return taxonomyVO; } List<String> getClassifiedObjects(Taxonomy taxonomy) { List<String> classifiedObjects = new ArrayList<>(); List<String> classifiedTypes = getClassifiedSchemaTypes(taxonomy); if (classifiedTypes.contains(Folder.SCHEMA_TYPE)) { classifiedObjects.add("folderObject"); } if (classifiedTypes.contains(Document.SCHEMA_TYPE)) { classifiedObjects.add("documentObject"); } return classifiedObjects; } List<String> getClassifiedSchemaTypes(Taxonomy taxonomy) { List<MetadataSchemaType> classifiedTypes = valueListServices().getClassifiedSchemaTypes(taxonomy); return new SchemaUtils().toSchemaTypeCodes(classifiedTypes); } ValueListServices valueListServices() { return new ValueListServices(appLayerFactory, view.getCollection()); } public void cancelButtonClicked() { view.navigate().to().listTaxonomies(); } boolean canCreate(String taxonomy) { taxonomy = taxonomy.trim(); boolean canCreate = false; if (StringUtils.isNotBlank(taxonomy)) { boolean exist = verifyIfExists(taxonomy); canCreate = !exist; } return canCreate; } private boolean verifyIfExists(String taxonomy) { if (titles == null) { getTaxonomies(); } boolean exits = false; for (String title : titles) { if (title.equals(taxonomy)) { exits = true; } } return exits; } private List<TaxonomyVO> getTaxonomies() { titles = new ArrayList<>(); TaxonomyToVOBuilder builder = new TaxonomyToVOBuilder(); List<TaxonomyVO> result = new ArrayList<>(); for (Taxonomy taxonomy : valueListServices().getTaxonomies()) { result.add(builder.build(taxonomy)); titles.add(taxonomy.getTitle()); } return result; } public void setEditAction(boolean actionEdit) { this.actionEdit = actionEdit; } public boolean isActionEdit() { return actionEdit; } public boolean canEditClassifiedObjects(TaxonomyVO taxonomyVO) { return !actionEdit || taxonomyVO.getClassifiedObjects().isEmpty(); } @Override protected boolean hasPageAccess(String parameters, User user) { Map<String, String> params = ParamUtils.getParamsMap(parameters); String taxonomyCode = params.get("taxonomyCode"); if (taxonomyCode == null) { return user.has(CorePermissions.MANAGE_TAXONOMIES).globally(); } else { return new TaxonomyPresentersService(appLayerFactory).canManage(taxonomyCode, user); } } }