package com.constellio.model.services.schemas.validators; import java.util.HashMap; import java.util.List; import java.util.Map; import org.joda.time.LocalDateTime; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.frameworks.validation.ValidationErrors; import com.constellio.model.frameworks.validation.Validator; public class MetadataValueTypeValidator implements Validator<Record> { public static final long MAX_SIZE_FOR_STRING_VALUE = 10000; public static final String REQUIRED_VALUE_FOR_METADATA = "requiredValueForMetadata"; public static final String INVALID_VALUE_FOR_METADATA = "invalidValueForMetadata"; public static final String EXPECTED_TYPE_MESSAGE_PARAM = "expectedType"; public static final String METADATA_CODE_MESSAGE_PARAM = "metadataCode"; public static final String METADATA_LABEL_MESSAGE_PARAM = "metadataLabel"; public static final String WAS_VALUE_CLASS_MESSAGE_PARAM = "wasValueOfClass"; private final List<Metadata> metadatas; public MetadataValueTypeValidator(List<Metadata> metadatas) { this.metadatas = metadatas; } @Override public void validate(Record record, ValidationErrors validationErrors) { for (Metadata metadata : metadatas) { Object value = record.get(metadata); if (value != null) { if (metadata.getType() == MetadataValueType.STRING) { verifyTextValue(metadata, value, validationErrors); } else if (metadata.getType() == MetadataValueType.BOOLEAN) { verifyBooleanValue(metadata, value, validationErrors); } else if (metadata.getType() == MetadataValueType.NUMBER) { verifyNumberValue(metadata, value, validationErrors); } else if (metadata.getType() == MetadataValueType.DATE_TIME) { verifyDateValue(metadata, value, validationErrors); } else if (metadata.getType() == MetadataValueType.REFERENCE) { verifyReferenceValue(metadata, value, validationErrors); } } } } @SuppressWarnings("rawtypes") private void verifyTextValue(Metadata metadata, Object value, ValidationErrors validationErrors) { if (metadata.isMultivalue()) { List values = (List) value; for (Object object : values) { if (object != null && !(object instanceof String)) { addValidationErrors(metadata, object, validationErrors, "STRING"); } } } else if (!(value instanceof String)) { addValidationErrors(metadata, value, validationErrors, "STRING"); } } @SuppressWarnings("rawtypes") private void verifyBooleanValue(Metadata metadata, Object value, ValidationErrors validationErrors) { if (metadata.isMultivalue()) { List values = (List) value; for (Object object : values) { if (object != null && !(object instanceof Boolean)) { addValidationErrors(metadata, object, validationErrors, "BOOLEAN"); } } } else if (!(value instanceof Boolean)) { addValidationErrors(metadata, value, validationErrors, "BOOLEAN"); } } @SuppressWarnings("rawtypes") private void verifyNumberValue(Metadata metadata, Object value, ValidationErrors validationErrors) { if (metadata.isMultivalue()) { List values = (List) value; for (Object object : values) { if (object != null && !(object instanceof Number)) { addValidationErrors(metadata, object, validationErrors, "NUMBER"); } } } else if (!(value instanceof Number)) { addValidationErrors(metadata, value, validationErrors, "NUMBER"); } } @SuppressWarnings("rawtypes") private void verifyDateValue(Metadata metadata, Object value, ValidationErrors validationErrors) { if (metadata.isMultivalue()) { List values = (List) value; for (Object object : values) { if (object != null && !(object instanceof LocalDateTime)) { addValidationErrors(metadata, object, validationErrors, "DATE_TIME"); } } } else if (!(value instanceof LocalDateTime)) { addValidationErrors(metadata, value, validationErrors, "DATE_TIME"); } } @SuppressWarnings("rawtypes") private void verifyReferenceValue(Metadata metadata, Object value, ValidationErrors validationErrors) { if (metadata.isMultivalue()) { List values = (List) value; for (Object object : values) { if (object != null && !(object instanceof String)) { addValidationErrors(metadata, object, validationErrors, "REFERENCE"); } } } else if (!(value instanceof String)) { addValidationErrors(metadata, value, validationErrors, "REFERENCE"); } } //@formatter:off private void addValidationErrors(Metadata metadata, Object value, ValidationErrors validationErrors, String metadataValueType) { Map<String, Object> parameters = createParameters(metadata, value, metadataValueType); validationErrors.add(getClass(), INVALID_VALUE_FOR_METADATA, parameters); } //@formatter:on private Map<String, Object> createParameters(Metadata metadata, Object value, String expected) { Map<String, Object> parameters = new HashMap<>(); parameters.put(METADATA_CODE_MESSAGE_PARAM, metadata.getCode()); parameters.put(METADATA_LABEL_MESSAGE_PARAM, metadata.getLabelsByLanguageCodes()); parameters.put(EXPECTED_TYPE_MESSAGE_PARAM, expected); parameters.put(WAS_VALUE_CLASS_MESSAGE_PARAM, value == null ? "null" : value.getClass().getName()); return parameters; } }