package com.constellio.app.modules.rm.model.calculators; import java.util.Arrays; import java.util.List; import com.constellio.app.modules.rm.RMConfigs; import com.constellio.app.modules.rm.wrappers.Category; 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.ConfigDependency; 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; import com.constellio.model.entities.schemas.Schemas; public class CategoryIsLinkableCalculator implements MetadataValueCalculator<Boolean> { // I guess dependencies should be parent and retentionRules LocalDependency<List<String>> rulesDependency = LocalDependency.toAReference(Category.RETENTION_RULES).whichIsMultivalue(); LocalDependency<String> parentDependency = LocalDependency.toAReference(Category.PARENT); ReferenceDependency<List<Boolean>> rulesApprovedDependency = ReferenceDependency .toABoolean(Category.RETENTION_RULES, RetentionRule.APPROVED).whichIsMultivalue(); ReferenceDependency<List<Boolean>> rulesInactiveDependency = ReferenceDependency .toABoolean(Category.RETENTION_RULES, Schemas.LOGICALLY_DELETED_STATUS.getLocalCode()).whichIsMultivalue(); ConfigDependency<Boolean> configNotRoot = RMConfigs.LINKABLE_CATEGORY_MUST_NOT_BE_ROOT.dependency(); ConfigDependency<Boolean> configRulesApproved = RMConfigs.LINKABLE_CATEGORY_MUST_HAVE_APPROVED_RULES.dependency(); @Override public Boolean calculate(CalculatorParameters parameters) { boolean considerNotRoot = parameters.get(configNotRoot); boolean considerRulesApproved = parameters.get(configRulesApproved); String parentId = parameters.get(parentDependency); List<String> rulesIds = parameters.get(rulesDependency); List<Boolean> rulesApproved = parameters.get(rulesApprovedDependency); List<Boolean> rulesInactive = parameters.get(rulesInactiveDependency); if (rulesIds.isEmpty()) { return false; } else { boolean allRulesInactive = true; for (Boolean ruleIsInactive : rulesInactive) { if (ruleIsInactive == null || !ruleIsInactive) { allRulesInactive = false; break; } } if (allRulesInactive) { return false; } } if (considerNotRoot && parentId == null) { return false; } if (considerRulesApproved) { for (Boolean ruleIsApproved : rulesApproved) { if (ruleIsApproved != null && ruleIsApproved.booleanValue()) { return true; } } return false; } return true; } @Override public Boolean getDefaultValue() { return null; } @Override public MetadataValueType getReturnType() { return MetadataValueType.BOOLEAN; } @Override public boolean isMultiValue() { return false; } @Override public List<? extends Dependency> getDependencies() { return Arrays.asList(rulesDependency, parentDependency, rulesApprovedDependency, rulesInactiveDependency, configNotRoot, configRulesApproved); } }