package com.constellio.app.modules.rm.extensions;
import static com.constellio.app.ui.i18n.i18n.$;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import java.util.ArrayList;
import java.util.List;
import com.constellio.app.api.extensions.TaxonomyPageExtension;
import com.constellio.app.api.extensions.taxonomies.GetTaxonomyExtraFieldsParam;
import com.constellio.app.api.extensions.taxonomies.GetTaxonomyManagementClassifiedTypesParams;
import com.constellio.app.api.extensions.taxonomies.TaxonomyExtraField;
import com.constellio.app.api.extensions.taxonomies.TaxonomyManagementClassifiedType;
import com.constellio.app.modules.rm.constants.RMPermissionsTo;
import com.constellio.app.modules.rm.constants.RMTaxonomies;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.services.decommissioning.DecommissioningService;
import com.constellio.app.modules.rm.ui.builders.FolderToVOBuilder;
import com.constellio.app.modules.rm.ui.builders.RetentionRuleToVOBuilder;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.app.ui.entities.MetadataSchemaTypeVO;
import com.constellio.app.ui.entities.MetadataSchemaVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.framework.builders.MetadataSchemaToVOBuilder;
import com.constellio.app.ui.framework.builders.MetadataSchemaTypeToVOBuilder;
import com.constellio.app.ui.framework.builders.RecordToVOBuilder;
import com.constellio.app.ui.framework.components.MetadataDisplayFactory;
import com.constellio.app.ui.framework.components.display.ReferenceDisplay;
import com.constellio.app.ui.framework.data.RecordVODataProvider;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.app.ui.pages.base.SessionContextProvider;
import com.constellio.data.frameworks.extensions.ExtensionBooleanResult;
import com.constellio.data.utils.Factory;
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.Schemas;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordUtils;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.vaadin.ui.Component;
public class RMTaxonomyPageExtension extends TaxonomyPageExtension {
private String collection;
public RMTaxonomyPageExtension(String collection) {
this.collection = collection;
}
@Override
public ExtensionBooleanResult canManageTaxonomy(User user, Taxonomy taxonomy) {
if (taxonomy.getCode().equals(RMTaxonomies.ADMINISTRATIVE_UNITS)) {
return ExtensionBooleanResult.forceTrueIf(user.has(CorePermissions.MANAGE_SECURITY).globally());
} else if (taxonomy.getCode().equals(RMTaxonomies.CLASSIFICATION_PLAN)) {
return ExtensionBooleanResult.forceTrueIf(user.has(RMPermissionsTo.MANAGE_CLASSIFICATION_PLAN).globally());
} else if (taxonomy.getCode().equals(RMTaxonomies.STORAGES)) {
return ExtensionBooleanResult.forceTrueIf(user.has(RMPermissionsTo.MANAGE_STORAGE_SPACES).globally());
} else {
return ExtensionBooleanResult.NOT_APPLICABLE;
}
}
@Override
public List<TaxonomyManagementClassifiedType> getClassifiedTypesFor(GetTaxonomyManagementClassifiedTypesParams params) {
List<TaxonomyManagementClassifiedType> types = new ArrayList<>();
SessionContextProvider sessionContextProvider = params.getSessionContextProvider();
String conceptId = params.getRecord().getId();
if (params.isTaxonomy(RMTaxonomies.ADMINISTRATIVE_UNITS)) {
types.add(getClassifiedFolderInAdministrativeUnits(conceptId, sessionContextProvider));
types.add(getClassifiedRetentionRuleWithAdministrativeUnit(conceptId, sessionContextProvider));
} else if (params.isTaxonomy(RMTaxonomies.CLASSIFICATION_PLAN)) {
types.add(getClassifiedFolderInCategory(conceptId, sessionContextProvider));
}
return types;
}
@Override
public List<TaxonomyExtraField> getTaxonomyExtraFieldsFor(GetTaxonomyExtraFieldsParam params) {
List<TaxonomyExtraField> fields = new ArrayList<>();
// if (params.isTaxonomy(RMTaxonomies.ADMINISTRATIVE_UNITS)) {
// final List<String> retentionRules = getRetentionRules(params.getRecord().getId(), params.getSessionContextProvider());
// fields.add(new TaxonomyExtraField() {
// @Override
// public String getCode() {
// return "retentionRules";
// }
//
// @Override
// public String getTitle() {
// return $("TaxonomyManagementView.retentionRules");
// }
//
// @Override
// public Component buildComponent() {
// return buildDisplayList(retentionRules);
// }
// });
// }
return fields;
}
@Override
public ExtensionBooleanResult displayTaxonomy(User user, Taxonomy taxonomy) {
if (taxonomy.getCode().equals(RMTaxonomies.ADMINISTRATIVE_UNITS) || taxonomy.getCode()
.equals(RMTaxonomies.CLASSIFICATION_PLAN)) {
return ExtensionBooleanResult.FALSE;
} else {
return ExtensionBooleanResult.NOT_APPLICABLE;
}
}
public List<String> getRetentionRules(String conceptId, SessionContextProvider sessionContextProvider) {
AppLayerFactory appLayerFactory = sessionContextProvider.getConstellioFactories().getAppLayerFactory();
DecommissioningService decommissioningService = new DecommissioningService(collection, appLayerFactory);
return new RecordUtils().toWrappedRecordIdsList(decommissioningService.getRetentionRulesForAdministrativeUnit(conceptId));
}
private Component buildDisplayList(List<String> list) {
Component retentionRulesDisplayComponent;
MetadataDisplayFactory metadataDisplayFactory = new MetadataDisplayFactory();
List<Component> elementDisplayComponents = new ArrayList<Component>();
for (String elementDisplayValue : list) {
Component elementDisplayComponent = new ReferenceDisplay(elementDisplayValue);
elementDisplayComponent.setSizeFull();
elementDisplayComponents.add(elementDisplayComponent);
}
if (!elementDisplayComponents.isEmpty()) {
retentionRulesDisplayComponent = metadataDisplayFactory.newCollectionValueDisplayComponent(elementDisplayComponents);
} else {
retentionRulesDisplayComponent = null;
}
return retentionRulesDisplayComponent;
}
private TaxonomyManagementClassifiedType getClassifiedFolderInAdministrativeUnits(final String conceptId,
final SessionContextProvider sessionContextProvider) {
return new TaxonomyManagementClassifiedType() {
@Override
public MetadataSchemaTypeVO getSchemaType() {
return getFolderTypeVO(sessionContextProvider);
}
@Override
public RecordVODataProvider getDataProvider() {
Factory<LogicalSearchQuery> searchQueryFactory = newFolderInAdministrativeUnitSearchQuery(
conceptId, sessionContextProvider);
return newFolderDataProvider(searchQueryFactory, sessionContextProvider);
}
@Override
public String getCountLabel() {
return $("TaxonomyManagementView.numberOfFolders");
}
@Override
public String getTabLabel() {
return $("TaxonomyManagementView.tabs.folders");
}
};
}
private TaxonomyManagementClassifiedType getClassifiedRetentionRuleWithAdministrativeUnit(final String conceptId,
final SessionContextProvider sessionContextProvider) {
return new TaxonomyManagementClassifiedType() {
@Override
public MetadataSchemaTypeVO getSchemaType() {
return getRetentionRuleTypeVO(sessionContextProvider);
}
@Override
public RecordVODataProvider getDataProvider() {
Factory<LogicalSearchQuery> searchQueryFactory = newRulesWithAdministrativeUnitSearchQuery(
conceptId, sessionContextProvider);
return newRuleDataProvider(searchQueryFactory, sessionContextProvider);
}
@Override
public String getCountLabel() {
return $("TaxonomyManagementView.numberOfRetentionRules");
}
@Override
public String getTabLabel() {
return $("TaxonomyManagementView.tabs.retentionRules");
}
};
}
private TaxonomyManagementClassifiedType getClassifiedFolderInCategory(final String conceptId,
final SessionContextProvider sessionContextProvider) {
return new TaxonomyManagementClassifiedType() {
@Override
public MetadataSchemaTypeVO getSchemaType() {
return getFolderTypeVO(sessionContextProvider);
}
@Override
public RecordVODataProvider getDataProvider() {
Factory<LogicalSearchQuery> searchQueryFactory = newFolderInCategorySearchQuery(
conceptId, sessionContextProvider);
return newFolderDataProvider(searchQueryFactory, sessionContextProvider);
}
@Override
public String getCountLabel() {
return $("TaxonomyManagementView.numberOfFolders");
}
@Override
public String getTabLabel() {
return $("TaxonomyManagementView.tabs.folders");
}
};
}
private RecordVODataProvider newRuleDataProvider(final Factory<LogicalSearchQuery> logicalSearchQueryFactory,
SessionContextProvider sessionContextProvider) {
MetadataSchemaToVOBuilder schemaVOBuilder = new MetadataSchemaToVOBuilder();
SessionContext sessionContext = sessionContextProvider.getSessionContext();
AppLayerFactory appLayerFactory = sessionContextProvider.getConstellioFactories().getAppLayerFactory();
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, sessionContextProvider);
RecordToVOBuilder voBuilder = new RecordToVOBuilder();
MetadataSchemaVO rulesSchemaVO = schemaVOBuilder.build(rm.retentionRule.schema(), VIEW_MODE.TABLE, sessionContext);
return new RecordVODataProvider(rulesSchemaVO, voBuilder, sessionContextProvider) {
@Override
protected LogicalSearchQuery getQuery() {
return logicalSearchQueryFactory.get();
}
};
}
private RecordVODataProvider newFolderDataProvider(final Factory<LogicalSearchQuery> logicalSearchQueryFactory,
SessionContextProvider sessionContextProvider) {
MetadataSchemaToVOBuilder schemaVOBuilder = new MetadataSchemaToVOBuilder();
SessionContext sessionContext = sessionContextProvider.getSessionContext();
FolderToVOBuilder voBuilder = new FolderToVOBuilder();
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, sessionContextProvider);
MetadataSchemaVO foldersSchemaVO = schemaVOBuilder.build(rm.folder.schema(), VIEW_MODE.TABLE, sessionContext);
return new RecordVODataProvider(foldersSchemaVO, voBuilder, sessionContextProvider) {
@Override
protected LogicalSearchQuery getQuery() {
return logicalSearchQueryFactory.get();
}
};
}
private MetadataSchemaTypeVO getRetentionRuleTypeVO(SessionContextProvider sessionContextProvider) {
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, sessionContextProvider);
MetadataSchemaTypeToVOBuilder schemaTypeVOBuilder = new MetadataSchemaTypeToVOBuilder();
return schemaTypeVOBuilder.build(rm.retentionRule.schemaType());
}
private MetadataSchemaTypeVO getFolderTypeVO(SessionContextProvider sessionContextProvider) {
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, sessionContextProvider);
MetadataSchemaTypeToVOBuilder schemaTypeVOBuilder = new MetadataSchemaTypeToVOBuilder();
return schemaTypeVOBuilder.build(rm.folder.schemaType());
}
private Factory<LogicalSearchQuery> newFolderInAdministrativeUnitSearchQuery(
final String conceptId, final SessionContextProvider sessionContextProvider) {
return new Factory<LogicalSearchQuery>() {
@Override
public LogicalSearchQuery get() {
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, sessionContextProvider);
return new LogicalSearchQuery()
.setCondition(from(rm.folder.schemaType()).where(rm.folder.administrativeUnit()).isEqualTo(conceptId))
.sortAsc(Schemas.TITLE);
}
};
}
private Factory<LogicalSearchQuery> newRulesWithAdministrativeUnitSearchQuery(
final String conceptId, final SessionContextProvider sessionContextProvider) {
return new Factory<LogicalSearchQuery>() {
@Override
public LogicalSearchQuery get() {
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, sessionContextProvider);
return new LogicalSearchQuery()
.setCondition(from(rm.retentionRule.schemaType())
.where(rm.retentionRule.administrativeUnits()).isEqualTo(conceptId))
.sortAsc(Schemas.TITLE);
}
};
}
private Factory<LogicalSearchQuery> newFolderInCategorySearchQuery(
final String conceptId, final SessionContextProvider sessionContextProvider) {
return new Factory<LogicalSearchQuery>() {
@Override
public LogicalSearchQuery get() {
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, sessionContextProvider);
return new LogicalSearchQuery()
.setCondition(from(rm.folder.schemaType()).where(rm.folder.category()).isEqualTo(conceptId))
.sortAsc(Schemas.TITLE);
}
};
}
}