package com.constellio.model.services.schemas.validators; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.constellio.model.entities.calculators.dependencies.Dependency; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.entries.CalculatedDataEntry; import com.constellio.model.entities.schemas.entries.DataEntryType; import com.constellio.model.frameworks.validation.ValidationErrors; import com.constellio.model.frameworks.validation.Validator; public class ValueRequirementValidator implements Validator<Record> { public static final String BASED_ON_METADATAS = "basedOnMetadatas"; public static final String REQUIRED_VALUE_FOR_METADATA = "requiredValueForMetadata"; private final List<Metadata> metadatas; private boolean skipUSRMetadatas; public ValueRequirementValidator(List<Metadata> metadatas, boolean skipUSRMetadatas) { this.metadatas = metadatas; this.skipUSRMetadatas = skipUSRMetadatas; } @SuppressWarnings("rawtypes") @Override public void validate(Record record, ValidationErrors validationErrors) { for (Metadata metadata : metadatas) { Object value = record.get(metadata); if (metadata.isDefaultRequirement() && (!metadata.getLocalCode().startsWith("USR") || !skipUSRMetadatas) && (value == null || (metadata.isMultivalue() && ((List) value).size() == 0)) && metadata.isEnabled()) { addValidationErrors(record.getId(), validationErrors, REQUIRED_VALUE_FOR_METADATA, metadata); } } } private void addValidationErrors(String recordId, ValidationErrors validationErrors, String errorCode, Metadata metadata) { Map<String, Object> parameters = new HashMap<>(); parameters.put(RECORD, recordId); parameters.put(METADATA_CODE, metadata.getCode()); parameters.put(METADATA_LABEL, metadata.getLabelsByLanguageCodes()); if (metadata.getDataEntry().getType() == DataEntryType.CALCULATED) { List<String> basedOnMetadatas = new ArrayList<>(); CalculatedDataEntry calculatedDataEntry = (CalculatedDataEntry) metadata.getDataEntry(); for (Dependency dependency : calculatedDataEntry.getCalculator().getDependencies()) { basedOnMetadatas.add(dependency.getLocalMetadataCode()); } parameters.put(BASED_ON_METADATAS, basedOnMetadatas.toString()); } validationErrors.add(getClass(), errorCode, parameters); } }