package com.constellio.model.services.schemas.validators;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.constellio.model.entities.Language;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.frameworks.validation.ValidationErrors;
import com.constellio.model.frameworks.validation.Validator;
import com.constellio.model.utils.MaskUtils;
public class MaskedMetadataValidator implements Validator<Record> {
private static final Logger LOGGER = LoggerFactory.getLogger(MaskedMetadataValidator.class);
public static final String VALUE_INCOMPATIBLE_WITH_SPECIFIED_MASK = "valueIncompatibleWithSpecifiedMask";
public static final String METADATA_LABEL = "metadataLabel";
public static final String VALUE = "value";
public static final String MASK = "mask";
private final List<Metadata> metadatas;
public MaskedMetadataValidator(List<Metadata> metadatas) {
this.metadatas = metadatas;
}
@SuppressWarnings("rawtypes")
@Override
public void validate(Record record, ValidationErrors validationErrors) {
for (Metadata metadata : metadatas) {
if (StringUtils.isNotBlank(metadata.getInputMask())) {
Object value = record.get(metadata);
validateMetadata(validationErrors, metadata, value);
}
}
}
public void validateMetadata(ValidationErrors validationErrors, Metadata metadata, Object value) {
validate(validationErrors, metadata, value);
}
public static void validate(ValidationErrors validationErrors, Metadata metadata, Object value) {
if (value != null && value instanceof String) {
String strValue = (String) value;
if (!MaskUtils.isValid(metadata.getInputMask(), strValue)) {
LOGGER.info("Failed to format value '" + strValue + "' using mask '" + metadata.getInputMask() + "'");
addValidationErrors(validationErrors, (String) value, metadata);
}
}
}
private static void addValidationErrors(ValidationErrors validationErrors, String value, Metadata metadata) {
Map<String, Object> parameters = new HashMap<>();
parameters.put(METADATA_CODE, metadata.getCode());
parameters.put(METADATA_LABEL, metadata.getLabelsByLanguageCodes());
parameters.put(MASK, metadata.getInputMask());
parameters.put(VALUE, value);
validationErrors.add(MaskedMetadataValidator.class, VALUE_INCOMPATIBLE_WITH_SPECIFIED_MASK, parameters);
}
}