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.HashSet;
import java.util.List;
import java.util.Set;
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.schemas.MetadataValueType;
public class PathPartsCalculator implements MetadataValueCalculator<List<String>> {
LocalDependency<List<String>> pathDependency = LocalDependency.toAStringList("path");
@Override
public List<String> calculate(CalculatorParameters parameters) {
return getPathsParts(parameters.getId(), parameters.get(pathDependency));
}
@Override
public List<String> getDefaultValue() {
return new ArrayList<>();
}
@Override
public MetadataValueType getReturnType() {
return STRING;
}
@Override
public boolean isMultiValue() {
return true;
}
@Override
public List<? extends Dependency> getDependencies() {
return Arrays.asList(pathDependency);
}
private List<String> getPathsParts(String id, List<String> paths) {
Set<String> pathsParts = new HashSet<>();
for (String path : paths) {
String last = null;
if (path != null) {
String[] splittedPath = path.split("/");
if (splittedPath.length >= 3) {
String taxonomyCode = splittedPath[1];
for (int i = 2; i < splittedPath.length; i++) {
int level = i - 2;
String pathAncestorId = splittedPath[i];
if (!id.equals(pathAncestorId)) {
pathsParts.add(pathAncestorId);
last = pathAncestorId;
}
}
}
}
if (last != null) {
pathsParts.add("_LAST_" + last);
}
}
if (pathsParts.isEmpty() && !paths.isEmpty()) {
pathsParts.add("R");
}
return new ArrayList<>(pathsParts);
}
}