package eu.eudat.model.persist.descriptionproperties; import eu.eudat.commons.enums.DescriptionStatus; import eu.eudat.commons.enums.FieldType; import eu.eudat.commons.enums.FieldValidationType; import eu.eudat.commons.types.descriptiontemplate.FieldEntity; import eu.eudat.commons.validation.BaseValidator; import eu.eudat.model.persist.ReferencePersist; import gr.cite.tools.validation.ValidatorFactory; import gr.cite.tools.validation.specification.Specification; import eu.eudat.convention.ConventionService; import eu.eudat.errorcode.ErrorThesaurusProperties; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Component; import java.time.Instant; import java.util.Arrays; import java.util.List; public class FieldPersist { private String textValue; public static final String _textValue = "textValue"; private List textListValue; public static final String _textListValue = "textListValue"; private Instant dateValue; public static final String _dateValue = "dateValue"; private List references; public static final String _references = "references"; private ReferencePersist reference; public static final String _reference = "reference"; private ExternalIdentifierPersist externalIdentifier; public static final String _externalIdentifier = "externalIdentifier"; public String getTextValue() { return textValue; } public void setTextValue(String textValue) { this.textValue = textValue; } public List getTextListValue() { return textListValue; } public void setTextListValue(List textListValue) { this.textListValue = textListValue; } public Instant getDateValue() { return dateValue; } public void setDateValue(Instant dateValue) { this.dateValue = dateValue; } public List getReferences() { return references; } public void setReferences(List references) { this.references = references; } public ReferencePersist getReference() { return reference; } public void setReference(ReferencePersist reference) { this.reference = reference; } public ExternalIdentifierPersist getExternalIdentifier() { return externalIdentifier; } public void setExternalIdentifier(ExternalIdentifierPersist externalIdentifier) { this.externalIdentifier = externalIdentifier; } @Component(PersistValidator.ValidatorName) public static class PersistValidator extends BaseValidator { public static final String ValidatorName = "Description.FieldPersistValidator"; private final ValidatorFactory validatorFactory; private final MessageSource messageSource; private FieldEntity fieldEntity; private DescriptionStatus status; protected PersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, ValidatorFactory validatorFactory, MessageSource messageSource) { super(conventionService, errors); this.validatorFactory = validatorFactory; this.messageSource = messageSource; } @Override protected Class modelClass() { return FieldPersist.class; } @Override protected List specifications(FieldPersist item) { FieldType fieldType = this.fieldEntity != null && this.fieldEntity.getData() != null ? this.fieldEntity.getData().getFieldType() : FieldType.FREE_TEXT; boolean required = this.fieldEntity != null && this.fieldEntity.getValidations() != null ? this.fieldEntity.getValidations().contains(FieldValidationType.Required) : false; return Arrays.asList( this.spec() .iff(()-> FieldType.isTextType(fieldType) && DescriptionStatus.Finalized.equals(this.status) && required) .must(() -> !this.isEmpty(item.getTextValue())) .failOn(FieldPersist._textValue).failWith(messageSource.getMessage("Validation_Required", new Object[]{FieldPersist._textValue}, LocaleContextHolder.getLocale())), this.spec() .iff(()-> FieldType.isDateType(fieldType) && DescriptionStatus.Finalized.equals(this.status) && required) .must(() -> !this.isNull(item.getDateValue())) .failOn(FieldPersist._dateValue).failWith(messageSource.getMessage("Validation_Required", new Object[]{FieldPersist._dateValue}, LocaleContextHolder.getLocale())), this.spec() .iff(()-> FieldType.isExternalIdentifierType(fieldType) && DescriptionStatus.Finalized.equals(this.status) && required) .must(() -> !this.isNull(item.getExternalIdentifier())) .failOn(FieldPersist._externalIdentifier).failWith(messageSource.getMessage("Validation_Required", new Object[]{FieldPersist._externalIdentifier}, LocaleContextHolder.getLocale())), this.spec() .iff(()-> FieldType.isTextListType(fieldType) && DescriptionStatus.Finalized.equals(this.status) && required) .must(() -> !this.isNull(item.getTextListValue())) .failOn(FieldPersist._textListValue).failWith(messageSource.getMessage("Validation_Required", new Object[]{FieldPersist._textListValue}, LocaleContextHolder.getLocale())), this.spec() .iff(()-> FieldType.isReferenceType(fieldType) && DescriptionStatus.Finalized.equals(this.status) && required) .must(() -> !this.isNull(item.getTextListValue())) .failOn(FieldPersist._textListValue).failWith(messageSource.getMessage("Validation_Required", new Object[]{FieldPersist._textListValue}, LocaleContextHolder.getLocale())), this.spec() .iff(()-> !this.isEmpty(item.getTextValue()) && fieldType.equals(FieldType.CHECK_BOX) || fieldType.equals(FieldType.BOOLEAN_DECISION) ) .must(() -> this.isBoolean(item.getTextValue())) .failOn(FieldPersist._textValue).failWith(messageSource.getMessage("Validation_UnexpectedValue", new Object[]{FieldPersist._textValue}, LocaleContextHolder.getLocale())), this.spec() .iff(()-> !this.isEmpty(item.getTextValue()) && fieldType.equals(FieldType.CURRENCY)) .must(() -> this.isUUID(item.getTextValue())) .failOn(FieldPersist._textValue).failWith(messageSource.getMessage("Validation_UnexpectedValue", new Object[]{FieldPersist._textValue}, LocaleContextHolder.getLocale())), this.spec() .iff(()-> !this.isNull(item.getTextListValue()) && (fieldType.equals(FieldType.INTERNAL_ENTRIES_DMPS) || fieldType.equals(FieldType.INTERNAL_ENTRIES_DESCRIPTIONS))) .must(() -> item.getTextListValue().stream().allMatch(this::isUUID)) .failOn(FieldPersist._textListValue).failWith(messageSource.getMessage("Validation_UnexpectedValue", new Object[]{FieldPersist._textListValue}, LocaleContextHolder.getLocale())), this.navSpec() .iff(() -> FieldType.isReferenceType(fieldType) && !this.isListNullOrEmpty(item.getReferences())) .on(FieldPersist._references) .over(item.getReferences()) .using((itm) -> this.validatorFactory.validator(ReferencePersist.ReferenceWithoutTypePersistValidator.class)), this.refSpec() .iff(() -> FieldType.isReferenceType(fieldType) && !this.isNull(item.getReference())) .on(FieldPersist._reference) .over(item.getReference()) .using(() -> this.validatorFactory.validator(ReferencePersist.ReferenceWithoutTypePersistValidator.class)), this.refSpec() .iff(() -> FieldType.isExternalIdentifierType(fieldType) && !this.isNull(item.getExternalIdentifier())) .on(FieldPersist._externalIdentifier) .over(item.getExternalIdentifier()) .using(() -> this.validatorFactory.validator(ExternalIdentifierPersist.PersistValidator.class)) ); } public PersistValidator withFieldEntity(FieldEntity fieldEntity) { this.fieldEntity = fieldEntity; return this; } public PersistValidator setStatus(DescriptionStatus status) { this.status = status; return this; } } }