package com.constellio.app.modules.rm.reports.model.administration.plan; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.slf4j.LoggerFactory; import com.constellio.app.modules.rm.constants.RMTaxonomies; import com.constellio.app.modules.rm.reports.model.administration.plan.ClassificationPlanReportModel.ClassificationPlanReportModel_Category; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.wrappers.AdministrativeUnit; import com.constellio.app.modules.rm.wrappers.Category; import com.constellio.model.conf.FoldersLocator; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.MetadataSchemaType; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.search.SearchServices; import com.constellio.model.services.search.query.ReturnedMetadatasFilter; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators; import com.constellio.model.services.taxonomies.TaxonomiesSearchOptions; import com.constellio.model.services.taxonomies.TaxonomiesSearchServices; import com.constellio.model.services.taxonomies.TaxonomySearchRecord; public class ClassificationPlanReportPresenter { private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(ClassificationPlanReportPresenter.class); private String collection; private ModelLayerFactory modelLayerFactory; private MetadataSchemaTypes types; private TaxonomiesSearchOptions searchOptions; private TaxonomiesSearchServices taxonomiesSearchServices; private SearchServices searchServices; private boolean detailed; private String administrativeUnitId; private RMSchemasRecordsServices rm; public ClassificationPlanReportPresenter(String collection, ModelLayerFactory modelLayerFactory) { this(collection, modelLayerFactory, false); } public ClassificationPlanReportPresenter(String collection, ModelLayerFactory modelLayerFactory, boolean detailed) { this(collection, modelLayerFactory, detailed, null); } public ClassificationPlanReportPresenter(String collection, ModelLayerFactory modelLayerFactory, boolean detailed, String administrativeUnitId) { this.collection = collection; this.modelLayerFactory = modelLayerFactory; this.detailed = (detailed || StringUtils.isNotBlank(administrativeUnitId) ? true : false); this.administrativeUnitId = administrativeUnitId; } public ClassificationPlanReportModel build() { init(); ClassificationPlanReportModel model = new ClassificationPlanReportModel(); model.setDetailed(detailed); model.setByAdministrativeUnit(StringUtils.isNotBlank(administrativeUnitId)); if (StringUtils.isNotBlank(administrativeUnitId)) { List<ClassificationPlanReportModel_Category> classificationPlanReportModel_categories = new ArrayList<>(); Map<AdministrativeUnit, List<ClassificationPlanReportModel_Category>> categoriesByAdmUnit = model .getCategoriesByAdministrativeUnitMap(); MetadataSchemaType retentionRuleSchemaType = rm.retentionRule.schemaType(); AdministrativeUnit administrativeUnit = rm.getAdministrativeUnit(administrativeUnitId); LogicalSearchQuery retentionRulesQuery = new LogicalSearchQuery() .setCondition(LogicalSearchQueryOperators.from(retentionRuleSchemaType) .where(rm.retentionRule.administrativeUnits()) .isContaining(Arrays.asList(administrativeUnit.getId()))).sortAsc(Schemas.CODE); List<String> retentionRulesIds = searchServices.searchRecordIds(retentionRulesQuery); for (String retentionRulesId : retentionRulesIds) { MetadataSchemaType categorySchemaType = rm.category.schemaType(); LogicalSearchQuery categoriesQuery = new LogicalSearchQuery() .setCondition(LogicalSearchQueryOperators.from(categorySchemaType) .where(rm.category.retentionRules()) .isContaining(Arrays.asList(retentionRulesId))) .sortAsc(Schemas.CODE); List<Record> categoryRecords = searchServices.search(categoriesQuery); for (Record categoryRecord : categoryRecords) { Category recordCategory = new Category(categoryRecord, types); if (recordCategory != null) { ClassificationPlanReportModel_Category modelCategory = new ClassificationPlanReportModel_Category(); String code = StringUtils.defaultString(recordCategory.getCode()); modelCategory.setCode(code); String title = StringUtils.defaultString(recordCategory.getTitle()); modelCategory.setLabel(title); String description = StringUtils.defaultString(recordCategory.getDescription()); modelCategory.setDescription(description); modelCategory.setKeywords(recordCategory.getKeywords()); List<String> retentionRules = new ArrayList<>(); for (String retentionRuleId : recordCategory.getRententionRules()) { retentionRules.add(rm.getRetentionRule(retentionRuleId).getCode()); } modelCategory.setRetentionRules(retentionRules); classificationPlanReportModel_categories.add(modelCategory); } } } categoriesByAdmUnit.put(administrativeUnit, classificationPlanReportModel_categories); } else { List<ClassificationPlanReportModel_Category> rootCategories = model.getRootCategories(); List<TaxonomySearchRecord> taxonomySearchRecords = taxonomiesSearchServices .getLinkableRootConcept(User.GOD, collection, RMTaxonomies.CLASSIFICATION_PLAN, Category.SCHEMA_TYPE, searchOptions); if (taxonomySearchRecords != null) { for (TaxonomySearchRecord taxonomyRecord : taxonomySearchRecords) { if (taxonomyRecord != null) { Record record = taxonomyRecord.getRecord(); if (record != null) { Category recordCategory = new Category(record, types); if (recordCategory != null) { ClassificationPlanReportModel_Category modelCategory = new ClassificationPlanReportModel_Category(); String code = StringUtils.defaultString(recordCategory.getCode()); modelCategory.setCode(code); String title = StringUtils.defaultString(recordCategory.getTitle()); modelCategory.setLabel(title); String description = StringUtils.defaultString(recordCategory.getDescription()); modelCategory.setDescription(description); modelCategory.setCategories(getCategoriesForRecord(record)); rootCategories.add(modelCategory); } } } } } } return model; } private void init() { types = modelLayerFactory.getMetadataSchemasManager().getSchemaTypes(collection); searchOptions = new TaxonomiesSearchOptions().setReturnedMetadatasFilter(ReturnedMetadatasFilter.all()); taxonomiesSearchServices = modelLayerFactory.newTaxonomiesSearchService(); rm = new RMSchemasRecordsServices(collection, modelLayerFactory); searchServices = modelLayerFactory.newSearchServices(); } private List<ClassificationPlanReportModel_Category> getCategoriesForRecord(Record record) { List<ClassificationPlanReportModel_Category> modelCategories = new ArrayList<>(); List<TaxonomySearchRecord> children = taxonomiesSearchServices.getLinkableChildConcept(User.GOD, record, RMTaxonomies.CLASSIFICATION_PLAN, Category.SCHEMA_TYPE, searchOptions); if (children != null) { for (TaxonomySearchRecord child : children) { if (child != null) { try { Record childRecord = child.getRecord(); if (childRecord != null) { Category recordCategory = new Category(childRecord, types); if (recordCategory != null) { ClassificationPlanReportModel_Category modelCategory = new ClassificationPlanReportModel_Category(); String categoryCode = StringUtils.defaultString(recordCategory.getCode()); modelCategory.setCode(categoryCode); String categoryTitle = StringUtils.defaultString(recordCategory.getTitle()); modelCategory.setLabel(categoryTitle); String categoryDescription = StringUtils.defaultString(recordCategory.getDescription()); modelCategory.setDescription(categoryDescription); Record childChildRecord = child.getRecord(); modelCategory.setCategories(getCategoriesForRecord(childChildRecord)); modelCategories.add(modelCategory); } } } catch (Exception e) { // throw new RuntimeException(e); LOGGER.info("This is not a category. It's a " + child.getRecord().getSchemaCode()); } } } } return modelCategories; } public FoldersLocator getFoldersLocator() { return modelLayerFactory.getFoldersLocator(); } }