package com.constellio.app.modules.rm.reports.model.administration.plan; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.constellio.app.services.factories.AppLayerFactory; import org.apache.commons.lang.StringUtils; import org.slf4j.LoggerFactory; import com.constellio.app.modules.rm.model.CopyRetentionRule; import com.constellio.app.modules.rm.model.RetentionPeriod; import com.constellio.app.modules.rm.model.enums.CopyType; import com.constellio.app.modules.rm.model.enums.DisposalType; import com.constellio.app.modules.rm.reports.model.administration.plan.ConservationRulesReportModel.ConservationRulesReportModel_Copy; import com.constellio.app.modules.rm.reports.model.administration.plan.ConservationRulesReportModel.ConservationRulesReportModel_Rule; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.services.decommissioning.DecommissioningService; import com.constellio.app.modules.rm.wrappers.AdministrativeUnit; import com.constellio.app.modules.rm.wrappers.RetentionRule; import com.constellio.app.modules.rm.wrappers.type.MediumType; import com.constellio.model.conf.FoldersLocator; import com.constellio.model.entities.schemas.MetadataSchemaType; 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.logical.LogicalSearchQuery; import com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators; public class ConservationRulesReportPresenter { private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(ConservationRulesReportPresenter.class); private String collection; private ModelLayerFactory modelLayerFactory; private AppLayerFactory appLayerFactory; private RMSchemasRecordsServices rm; private SearchServices searchServices; private boolean byAdministrativeUnit; private DecommissioningService decommissioningService; private String administrativeUnitId; public ConservationRulesReportPresenter(String collection, AppLayerFactory appLayerFactory) { this(collection, appLayerFactory, false, null); } public ConservationRulesReportPresenter(String collection, AppLayerFactory appLayerFactory, boolean byAdministrativeUnit) { this(collection, appLayerFactory, byAdministrativeUnit, null); } public ConservationRulesReportPresenter(String collection, AppLayerFactory appLayerFactory, boolean byAdministrativeUnit, String administrativeUnitId) { this.collection = collection; this.appLayerFactory = appLayerFactory; this.modelLayerFactory = appLayerFactory.getModelLayerFactory(); searchServices = modelLayerFactory.newSearchServices(); decommissioningService = new DecommissioningService(collection, appLayerFactory); rm = new RMSchemasRecordsServices(collection, modelLayerFactory); this.byAdministrativeUnit = byAdministrativeUnit; this.administrativeUnitId = administrativeUnitId; } public ConservationRulesReportModel build() { ConservationRulesReportModel model = new ConservationRulesReportModel(); if (byAdministrativeUnit) { Map<AdministrativeUnit, List<ConservationRulesReportModel_Rule>> conservationRulesModelByAdministrativeUnit = new HashMap<>(); Map<AdministrativeUnit, List<RetentionRule>> retentionRulesByAdministrativeUnit; if (StringUtils.isNotBlank(administrativeUnitId)) { retentionRulesByAdministrativeUnit = getRetentionRulesByAdministrativeUnit(administrativeUnitId); } else { retentionRulesByAdministrativeUnit = getRetentionRulesByAdministrativeUnit(); } for (Entry<AdministrativeUnit, List<RetentionRule>> entry : retentionRulesByAdministrativeUnit.entrySet()) { List<ConservationRulesReportModel_Rule> reportModelRules = convertRulesToModelRules(entry.getValue()); conservationRulesModelByAdministrativeUnit.put(entry.getKey(), reportModelRules); } model.setRulesByAdministrativeUnit(conservationRulesModelByAdministrativeUnit); model.setByAdministrativeUnit(true); } else { List<ConservationRulesReportModel_Rule> rules = getAndConvertRulesToModelRules(); model.setRules(rules); } return model; } // private List<ConservationRulesReportModel_Rule> getAndConvertRulesToModelRules() { List<ConservationRulesReportModel_Rule> conservationRulesReportModel_Rules = new ArrayList<>(); List<RetentionRule> retentionRules = getRetentionRules(); if (retentionRules != null) { conservationRulesReportModel_Rules = convertRulesToModelRules(retentionRules); } return conservationRulesReportModel_Rules; } private List<ConservationRulesReportModel_Rule> convertRulesToModelRules(List<RetentionRule> retentionRules) { List<ConservationRulesReportModel_Rule> conservationRulesReportModel_Rules = new ArrayList<>(); for (RetentionRule retentionRule : retentionRules) { if (retentionRule != null) { try { ConservationRulesReportModel_Rule conservationRulesReportModel_Rule = new ConservationRulesReportModel_Rule(); String code = StringUtils.defaultString(retentionRule.getCode()); String title = StringUtils.defaultString(retentionRule.getTitle()); String description = StringUtils.defaultString(retentionRule.getDescription()); String juridicReference = StringUtils.defaultString(retentionRule.getJuridicReference()); conservationRulesReportModel_Rule.setRuleNumber(code); conservationRulesReportModel_Rule.setTitle(title); conservationRulesReportModel_Rule.setDescription(description); conservationRulesReportModel_Rule.setJuridicReference(juridicReference); conservationRulesReportModel_Rule.setPrincipalsHolders(getPrincipalsHolders(retentionRule)); conservationRulesReportModel_Rule.setPrincipalsCopies(getPrincipalCopies(retentionRule)); conservationRulesReportModel_Rule.setSecondaryCopy(getSecondaryCopy(retentionRule)); conservationRulesReportModel_Rules.add(conservationRulesReportModel_Rule); } catch (Exception e) { LOGGER.info(e.getMessage()); } } } return conservationRulesReportModel_Rules; } private List<RetentionRule> getRetentionRules() { MetadataSchemaType retentionRuleSchemaType = rm.retentionRule.schemaType(); LogicalSearchQuery allRetentionRules = new LogicalSearchQuery() .setCondition(LogicalSearchQueryOperators.from(retentionRuleSchemaType).returnAll()) .sortAsc(Schemas.CODE); List<RetentionRule> retentionRules = rm.wrapRetentionRules(searchServices .search(allRetentionRules)); if (retentionRules == null) { retentionRules = new ArrayList<>(); } return retentionRules; } private Map<AdministrativeUnit, List<RetentionRule>> getRetentionRulesByAdministrativeUnit(String administrativeUnitId) { Map<AdministrativeUnit, List<RetentionRule>> retentionRulesByAdministrativeUnit = new HashMap<>(); MetadataSchemaType retentionRuleSchemaType = rm.retentionRule.schemaType(); AdministrativeUnit administrativeUnit = rm.getAdministrativeUnit(administrativeUnitId); List<RetentionRule> newRetentionRules = getRetentionRulesByAdministrativeUnit(administrativeUnit, retentionRuleSchemaType); if (!newRetentionRules.isEmpty()) { retentionRulesByAdministrativeUnit.put(administrativeUnit, newRetentionRules); } return retentionRulesByAdministrativeUnit; } private List<RetentionRule> getRetentionRulesByAdministrativeUnit(AdministrativeUnit administrativeUnit, MetadataSchemaType retentionRuleSchemaType) { //List<RetentionRule> newRetentionRules = new ArrayList<>(); LogicalSearchQuery retentionRulesQuery = new LogicalSearchQuery() .setCondition(LogicalSearchQueryOperators.from(retentionRuleSchemaType) .where(rm.retentionRule.administrativeUnits()) .isContaining(Arrays.asList(administrativeUnit.getId()))).sortAsc(Schemas.CODE); List<RetentionRule> retentionRules = rm.wrapRetentionRules(searchServices .search(retentionRulesQuery)); /*for (RetentionRule retentionRule : retentionRules) { if (!retentionRule.isResponsibleAdministrativeUnits()) { newRetentionRules.add(retentionRule); } }*/ return retentionRules;//newRetentionRules; } private Map<AdministrativeUnit, List<RetentionRule>> getRetentionRulesByAdministrativeUnit() { MetadataSchemaType administrativeUnitSchemaType = rm.administrativeUnit.schemaType(); Map<AdministrativeUnit, List<RetentionRule>> retentionRulesByAdministrativeUnit = new HashMap<>(); MetadataSchemaType retentionRuleSchemaType = rm.retentionRule.schemaType(); LogicalSearchQuery alladministrativesUnits = new LogicalSearchQuery() .setCondition(LogicalSearchQueryOperators.from(administrativeUnitSchemaType).returnAll()) .sortAsc(Schemas.CODE); List<AdministrativeUnit> administrativeUnits = rm.wrapAdministrativeUnits(searchServices .search(alladministrativesUnits)); if (administrativeUnits != null) { for (AdministrativeUnit administrativeUnit : administrativeUnits) { List<RetentionRule> newRetentionRules = getRetentionRulesByAdministrativeUnit(administrativeUnit, retentionRuleSchemaType); if (!newRetentionRules.isEmpty()) { retentionRulesByAdministrativeUnit.put(administrativeUnit, newRetentionRules); } } } return retentionRulesByAdministrativeUnit; } private Map<String, String> getPrincipalsHolders(RetentionRule rule) { Map<String, String> principalsHolders = new HashMap<String, String>(); if (rule != null) { List<String> administrativeUnitIds = rule.getAdministrativeUnits(); if (administrativeUnitIds != null) { for (String administrativeUnitId : administrativeUnitIds) { if (administrativeUnitId != null && !administrativeUnitId.isEmpty()) { AdministrativeUnit administrativeUnit = rm.getAdministrativeUnit(administrativeUnitId); if (administrativeUnit != null) { String code = StringUtils.defaultString(administrativeUnit.getCode()); if (code != null && !code.isEmpty()) { String label = StringUtils.defaultString(administrativeUnit.getTitle()); principalsHolders.put(code, label); } } } } } } return principalsHolders; } private List<ConservationRulesReportModel_Copy> getPrincipalCopies(RetentionRule rule) { List<ConservationRulesReportModel_Copy> modelCopies = new ArrayList<>(); if (rule != null) { List<CopyRetentionRule> copies = rule.getPrincipalCopies(); Map<String, String> commentMap = buildCommentMap(rule); for (CopyRetentionRule copyRetentionRule : copies) { if (copyRetentionRule != null) { ConservationRulesReportModel_Copy conservationRulesReportModel_copy = new ConservationRulesReportModel_Copy(); String observations = StringUtils.defaultString(buildObservations(copyRetentionRule, commentMap)); conservationRulesReportModel_copy.setObservations(observations); // boolean principal = copyRetentionRule.getCopyType() == CopyType.PRINCIPAL ? true : false; conservationRulesReportModel_copy.setPrincipal(principal); // conservationRulesReportModel_copy.setSupportTypes(getMediumTypesCodesOf(copyRetentionRule)); // RetentionPeriod activeRetentionPeriod = copyRetentionRule.getActiveRetentionPeriod(); String activeRetentionPeriodValue = ""; if (activeRetentionPeriod != null) { activeRetentionPeriodValue = StringUtils.defaultString(activeRetentionPeriod.toString()); } conservationRulesReportModel_copy.setActive(activeRetentionPeriodValue); // RetentionPeriod semiActiveRetentionPeriod = copyRetentionRule.getSemiActiveRetentionPeriod(); String semiActiveRetentionPeriodValue = ""; if (semiActiveRetentionPeriod != null) { semiActiveRetentionPeriodValue = StringUtils .defaultString(semiActiveRetentionPeriod.toString()); } conservationRulesReportModel_copy.setSemiActive(semiActiveRetentionPeriodValue); // DisposalType inactiveDisposalType = copyRetentionRule.getInactiveDisposalType(); String inactiveDisposalTypeCode = ""; if (inactiveDisposalType != null) { inactiveDisposalTypeCode = StringUtils.defaultString(inactiveDisposalType.getCode()); } conservationRulesReportModel_copy.setInactive(inactiveDisposalTypeCode); modelCopies.add(conservationRulesReportModel_copy); } } } return modelCopies; } private List<String> getMediumTypesCodesOf(CopyRetentionRule copyRetentionRule) { List<String> mediumTypeIds = copyRetentionRule.getMediumTypeIds(); if (mediumTypeIds == null) { mediumTypeIds = new ArrayList<>(); } List<String> codes = new ArrayList<>(); for (MediumType mediumType : rm.getMediumTypes(mediumTypeIds)) { codes.add(mediumType.getCode()); } return codes; } private Map<String, String> buildCommentMap(RetentionRule rule) { Map<String, String> map = new HashMap<>(); if (rule != null) { for (String copyRulesCommentLine : rule.getCopyRulesComment()) { String code = StringUtils.substringBefore(copyRulesCommentLine, ":"); code = StringUtils.trim(code); String value = StringUtils.substringAfter(copyRulesCommentLine, ":"); value = StringUtils.trim(value); if (!code.isEmpty()) { map.put(code, value); } } } return map; } private String buildObservations(CopyRetentionRule copyRetentionRule, Map<String, String> commentMap) { StringBuilder observationsBuilder = new StringBuilder(); if (copyRetentionRule != null && commentMap != null) { appendObservation(observationsBuilder, copyRetentionRule.getContentTypesComment(), commentMap, "Supports"); appendObservation(observationsBuilder, copyRetentionRule.getActiveRetentionComment(), commentMap, "Actif"); appendObservation(observationsBuilder, copyRetentionRule.getSemiActiveRetentionComment(), commentMap, "Semi-actif"); appendObservation(observationsBuilder, copyRetentionRule.getInactiveDisposalComment(), commentMap, "Inactif"); } String observations = StringUtils.removeEnd(observationsBuilder.toString(), "\n"); observations = StringUtils.defaultString(observations); return observations; } private void appendObservation(StringBuilder builder, String commentCode, Map<String, String> commentMap, String label) { String observation = ""; if (StringUtils.isNotBlank(commentCode)) { if (commentMap != null) { String comment = commentMap.get(commentCode); if (StringUtils.isNotBlank(comment)) { observation += label + ": " + comment; } } } if (StringUtils.isNotBlank(observation)) { builder.append(observation + "\n"); } } private ConservationRulesReportModel_Copy getSecondaryCopy(RetentionRule rule) { ConservationRulesReportModel_Copy conservationRulesReportModel_copy = new ConservationRulesReportModel_Copy(); Map<String, String> commentMap = new HashMap<>(); String observations = ""; boolean principal = false; List<String> mediumTypeIds = new ArrayList<>(); String activeRetentionPeriodValue = ""; String semiActiveRetentionPeriodValue = ""; String inactiveDisposalTypeCode = ""; if (rule != null) { CopyRetentionRule copyRetentionRule = rule.getSecondaryCopy(); commentMap = buildCommentMap(rule); observations = buildObservations(copyRetentionRule, commentMap); principal = copyRetentionRule.getCopyType() == CopyType.PRINCIPAL ? true : false; mediumTypeIds = getMediumTypesCodesOf(copyRetentionRule); RetentionPeriod activeRetentionPeriod = copyRetentionRule.getActiveRetentionPeriod(); if (activeRetentionPeriod != null) { activeRetentionPeriodValue = StringUtils.defaultString(activeRetentionPeriod.toString()); } RetentionPeriod semiActiveRetentionPeriod = copyRetentionRule.getSemiActiveRetentionPeriod(); if (semiActiveRetentionPeriod != null) { semiActiveRetentionPeriodValue = StringUtils.defaultString(semiActiveRetentionPeriod.toString()); } DisposalType inactiveDisposalType = copyRetentionRule.getInactiveDisposalType(); if (inactiveDisposalType != null) { inactiveDisposalTypeCode = StringUtils.defaultString(inactiveDisposalType.getCode()); } } conservationRulesReportModel_copy.setObservations(observations); conservationRulesReportModel_copy.setPrincipal(principal); conservationRulesReportModel_copy.setSupportTypes(mediumTypeIds); conservationRulesReportModel_copy.setActive(activeRetentionPeriodValue); conservationRulesReportModel_copy.setSemiActive(semiActiveRetentionPeriodValue); conservationRulesReportModel_copy.setInactive(inactiveDisposalTypeCode); return conservationRulesReportModel_copy; } public FoldersLocator getFoldersLocator() { return modelLayerFactory.getFoldersLocator(); } }