package com.constellio.app.modules.rm.model.calculators; import static com.constellio.data.utils.LangUtils.isEqual; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.constellio.app.modules.rm.model.CopyRetentionRule; import com.constellio.app.modules.rm.model.enums.CopyType; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.modules.rm.wrappers.RetentionRule; import com.constellio.model.entities.calculators.CalculatorParameters; import com.constellio.model.entities.calculators.MetadataValueCalculator; import com.constellio.model.entities.calculators.dependencies.Dependency; import com.constellio.model.entities.calculators.dependencies.LocalDependency; import com.constellio.model.entities.calculators.dependencies.ReferenceDependency; import com.constellio.model.entities.schemas.MetadataValueType; public class FolderApplicableCopyRuleCalculator implements MetadataValueCalculator<List<CopyRetentionRule>> { LocalDependency<CopyType> folderCopyTypeParam = LocalDependency.toAnEnum(Folder.COPY_STATUS).whichIsRequired(); LocalDependency<List<String>> folderMediumTypesParam = LocalDependency.toAReference(Folder.MEDIUM_TYPES).whichIsMultivalue(); LocalDependency<String> enteredTypeParam = LocalDependency.toAReference(Folder.TYPE); ReferenceDependency<List<CopyRetentionRule>> ruleCopyRulesParam = ReferenceDependency.toAStructure(Folder.RETENTION_RULE, RetentionRule.COPY_RETENTION_RULES).whichIsMultivalue().whichIsRequired(); @Override public List<CopyRetentionRule> calculate(CalculatorParameters parameters) { CalculatorInput input = new CalculatorInput(parameters); if (input.folderCopyType == CopyType.SECONDARY) { return input.rulesOfCopyType; } else { List<CopyRetentionRule> copies = input.rulesOfCopyType; copies = filterUsingFolderType(copies, input.enteredType); copies = filterUsingFolderMediumTypes(copies, input.folderMediumTypes); return copies; } } private List<CopyRetentionRule> filterUsingFolderType(List<CopyRetentionRule> copies, String enteredType) { List<CopyRetentionRule> matches = new ArrayList<>(); List<CopyRetentionRule> applicableIfNoMatches = new ArrayList<>(); for (CopyRetentionRule copy : copies) { if (isEqual(enteredType, copy.getTypeId())) { matches.add(copy); } else if (copy.getTypeId() == null) { applicableIfNoMatches.add(copy); } } if (matches.size() == 0) { return applicableIfNoMatches; } else { return matches; } } private List<CopyRetentionRule> filterUsingFolderMediumTypes(List<CopyRetentionRule> copies, List<String> mediumTypes) { if (mediumTypes.isEmpty()) { return copies; } List<CopyRetentionRule> matches = new ArrayList<>(); for (CopyRetentionRule rulePrincipalCopyRule : copies) { loop2: for (String copyRuleMediumType : rulePrincipalCopyRule.getMediumTypeIds()) { if (mediumTypes.contains(copyRuleMediumType)) { matches.add(rulePrincipalCopyRule); break loop2; } } } if (matches.size() == 0) { return copies; } else { return matches; } } private List<CopyRetentionRule> getCopyRulesWithType(List<CopyRetentionRule> ruleCopyRules, CopyType copyType) { List<CopyRetentionRule> rulesWithCopyType = new ArrayList<>(); for (CopyRetentionRule copyRule : ruleCopyRules) { if (copyRule.getCopyType() == copyType) { rulesWithCopyType.add(copyRule); } } return rulesWithCopyType; } @Override public List<CopyRetentionRule> getDefaultValue() { return new ArrayList<>(); } @Override public MetadataValueType getReturnType() { return MetadataValueType.STRUCTURE; } @Override public boolean isMultiValue() { return true; } @Override public List<? extends Dependency> getDependencies() { return Arrays.asList(folderCopyTypeParam, folderMediumTypesParam, ruleCopyRulesParam, enteredTypeParam); } private class CalculatorInput { CopyType folderCopyType; List<String> folderMediumTypes; String enteredType; List<CopyRetentionRule> rulesOfCopyType; List<CopyRetentionRule> ruleCopyRules; public CalculatorInput(CalculatorParameters parameters) { folderCopyType = parameters.get(folderCopyTypeParam); folderMediumTypes = parameters.get(folderMediumTypesParam); ruleCopyRules = parameters.get(ruleCopyRulesParam); enteredType = parameters.get(enteredTypeParam); rulesOfCopyType = getCopyRulesWithType(ruleCopyRules, folderCopyType); } } }