package eu.eudat.model.persist.dmpproperties; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.commons.enums.DmpBlueprintFieldCategory; import eu.eudat.commons.types.dmpblueprint.DefinitionEntity; import eu.eudat.commons.types.dmpblueprint.FieldEntity; import eu.eudat.commons.types.dmpblueprint.ReferenceTypeFieldEntity; import eu.eudat.commons.validation.BaseValidator; import eu.eudat.model.DmpDescriptionTemplate; import eu.eudat.model.ReferenceType; import eu.eudat.query.ReferenceTypeQuery; import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.fieldset.BaseFieldSet; import gr.cite.tools.validation.ValidatorFactory; import gr.cite.tools.validation.specification.Specification; import eu.eudat.convention.ConventionService; import eu.eudat.errorcode.ErrorThesaurusProperties; import eu.eudat.model.persist.ReferencePersist; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Scope; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.List; import java.util.UUID; public class DmpBlueprintValuePersist { private UUID fieldId; public static final String _fieldId = "fieldId"; private String fieldValue; public static final String _fieldValue = "fieldValue"; private List references; public static final String _references = "references"; public UUID getFieldId() { return fieldId; } public void setFieldId(UUID fieldId) { this.fieldId = fieldId; } public String getFieldValue() { return fieldValue; } public void setFieldValue(String fieldValue) { this.fieldValue = fieldValue; } public List getReferences() { return references; } public void setReferences(List references) { this.references = references; } @Component(DmpBlueprintValuePersistValidator.ValidatorName) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public static class DmpBlueprintValuePersistValidator extends BaseValidator { private final ValidatorFactory validatorFactory; private final QueryFactory queryFactory; private final MessageSource messageSource; public static final String ValidatorName = "DmpBlueprintValuePersistValidator"; private DefinitionEntity definition; private FieldEntity fieldEntity; protected DmpBlueprintValuePersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, ValidatorFactory validatorFactory, QueryFactory queryFactory, MessageSource messageSource) { super(conventionService, errors); this.validatorFactory = validatorFactory; this.queryFactory = queryFactory; this.messageSource = messageSource; } @Override protected Class modelClass() { return DmpBlueprintValuePersist.class; } @Override protected List specifications(DmpBlueprintValuePersist item) { fieldEntity = definition != null && this.isValidGuid(item.getFieldId())? definition.getFieldById(item.getFieldId()).stream().findFirst().orElse(null) : null; boolean required = fieldEntity != null && fieldEntity.isRequired(); return Arrays.asList( this.spec() .must(() -> this.isValidGuid(item.getFieldId())) .failOn(DmpBlueprintValuePersist._fieldId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpBlueprintValuePersist._fieldId}, LocaleContextHolder.getLocale())), this.spec() .iff(() -> fieldEntity.getCategory().equals(DmpBlueprintFieldCategory.Extra) && this.isListNullOrEmpty(item.getReferences()) && required) .must(() -> !this.isEmpty(item.getFieldValue())) .failOn(DmpBlueprintValuePersist._fieldValue).failWith(messageSource.getMessage("Validation_Required", new Object[]{fieldEntity.getLabel()}, LocaleContextHolder.getLocale())), this.spec() .iff(() -> fieldEntity.getCategory().equals(DmpBlueprintFieldCategory.ReferenceType) && this.isEmpty(item.getFieldValue()) && required) .must(() -> !this.isListNullOrEmpty(item.getReferences())) // TODO: Cast Exception // .failOn(DmpBlueprintValuePersist._references).failWith(messageSource.getMessage("Validation_Required", new Object[]{!this.isEmpty(fieldEntity.getLabel()) ? fieldEntity.getLabel() : this.getReferenceTypeName(((ReferenceTypeFieldEntity) fieldEntity).getReferenceTypeId())}, LocaleContextHolder.getLocale())), .failOn(DmpBlueprintValuePersist._references).failWith(messageSource.getMessage("Validation_Required", new Object[]{!this.isEmpty(fieldEntity.getLabel()) ? fieldEntity.getLabel() : DmpBlueprintValuePersist._references}, LocaleContextHolder.getLocale())), this.navSpec() .iff(() -> !this.isListNullOrEmpty(item.getReferences())) .on(DmpBlueprintValuePersist._references) .over(item.getReferences()) .using((itm) -> this.validatorFactory.validator(ReferencePersist.ReferenceWithoutTypePersistValidator.class)) ); } public DmpBlueprintValuePersistValidator withDefinition(DefinitionEntity definition) { this.definition = definition; return this; } private String getReferenceTypeName(UUID referenceTypeId){ return this.queryFactory.query(ReferenceTypeQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(referenceTypeId).firstAs(new BaseFieldSet().ensure(ReferenceType._name)).getName(); } } }