package com.constellio.model.services.schemas.validators;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.constellio.data.dao.dto.records.RecordDTO;
import com.constellio.model.entities.Language;
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.services.records.RecordImpl;
public class MetadataUnmodifiableValidator implements Validator<Record> {
public static final String UNMODIFIABLE_METADATA = "modifiedUnmodifiableMetadata";
private final List<Metadata> metadatas;
public MetadataUnmodifiableValidator(List<Metadata> metadatas) {
this.metadatas = metadatas;
}
@Override
public void validate(Record record, ValidationErrors validationErrors) {
for (Metadata metadata : metadatas) {
if (metadata.isUnmodifiable()) {
RecordDTO recordDTO = ((RecordImpl) record).getRecordDTO();
if (recordDTO != null) {
Object currentValue = recordDTO.getFields().get(metadata.getDataStoreCode());
if (currentValue != null && record.isModified(metadata)) {
addValidationErrors(validationErrors, UNMODIFIABLE_METADATA, metadata);
}
}
}
}
//Validate no unmodifiable metadata are modified
// if (record.isSaved()) {
// RecordImpl recordImpl = (RecordImpl) record;
// for (Metadata metadata : metadatas) {
// if (metadata.isUnmodifiable()) {
// boolean wasInDTO = recordImpl.getRecordDTO().getFields().containsKey(metadata.getDataStoreCode());
// boolean isModified = recordImpl.isModified(metadata);
//
// if (wasInDTO && isModified) {
// addValidationErrors(validationErrors, UNMODIFIABLE_METADATA, metadata);
// }
// }
// }
// }
}
private void addValidationErrors(ValidationErrors validationErrors, String errorCode, Metadata metadata) {
Map<String, Object> parameters = new HashMap<>();
parameters.put(METADATA_CODE, metadata.getCode());
parameters.put(METADATA_LABEL,metadata.getLabelsByLanguageCodes());
validationErrors.add(getClass(), errorCode, parameters);
}
}