package com.constellio.model.services.schemas.calculators; import static com.constellio.model.entities.schemas.MetadataValueType.STRING; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import com.constellio.data.utils.LangUtils; 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.HierarchyDependencyValue; import com.constellio.model.entities.calculators.dependencies.LocalDependency; import com.constellio.model.entities.calculators.dependencies.SpecialDependencies; import com.constellio.model.entities.calculators.dependencies.SpecialDependency; import com.constellio.model.entities.schemas.MetadataValueType; public class PathCalculator implements MetadataValueCalculator<List<String>> { //LocalDependency<List<String>> parentPathDependency = LocalDependency.toAStringList("parentpath"); SpecialDependency<HierarchyDependencyValue> taxonomiesParam = SpecialDependencies.HIERARCHY; SpecialDependency<String> idDependency = SpecialDependencies.IDENTIFIER; @Override public List<String> calculate(CalculatorParameters parameters) { List<String> calculatedValue = new ArrayList<>(); String id = parameters.get(idDependency); List<String> parentPathsValue = getParentPaths(parameters); if (parentPathsValue != null && !parentPathsValue.isEmpty()) { for (String parentPath : parentPathsValue) { calculatedValue.add(parentPath + "/" + id); } } else { calculatedValue.add("/" + id); } return calculatedValue; } private List<String> getParentPaths(CalculatorParameters parameters) { List<String> calculatedValue = new ArrayList<>(); HierarchyDependencyValue paramValue = parameters.get(taxonomiesParam); List<String> paramValuePaths = paramValue.getPaths(); if (paramValuePaths != null && !paramValuePaths.isEmpty()) { calculatedValue = paramValuePaths; } else if (paramValue.getTaxonomy() != null) { calculatedValue = Arrays.asList("/" + paramValue.getTaxonomy().getCode()); } Collections.sort(calculatedValue); for (int i = 0; i < calculatedValue.size(); i++) { String calculatedValueAtI = calculatedValue.get(i); if (calculatedValueAtI != null) { for (int j = 0; j < calculatedValue.size(); j++) { String calculatedValueAtJ = calculatedValue.get(j); if (i != j && calculatedValueAtJ != null && calculatedValueAtI.startsWith(calculatedValueAtJ)) { calculatedValue.set(j, null); } } } } return LangUtils.withoutNulls(calculatedValue); } @Override public List<String> getDefaultValue() { return null; } @Override public MetadataValueType getReturnType() { return STRING; } @Override public boolean isMultiValue() { return true; } @Override public List<? extends Dependency> getDependencies() { return Arrays.asList(taxonomiesParam, idDependency); } }