argos/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpproperties/DmpBlueprintValuePersist.java

125 lines
6.1 KiB
Java
Raw Normal View History

package eu.eudat.model.persist.dmpproperties;
2024-04-08 12:47:00 +02:00
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;
2024-04-08 12:47:00 +02:00
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;
2024-01-31 11:30:21 +01:00
import gr.cite.tools.validation.ValidatorFactory;
2024-01-17 10:20:02 +01:00
import gr.cite.tools.validation.specification.Specification;
import eu.eudat.convention.ConventionService;
import eu.eudat.errorcode.ErrorThesaurusProperties;
2024-01-12 14:00:34 +01:00
import eu.eudat.model.persist.ReferencePersist;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
2024-01-12 14:00:34 +01:00
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Scope;
2024-01-12 14:00:34 +01:00
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
2024-01-12 14:00:34 +01:00
import java.util.Arrays;
import java.util.List;
2024-01-12 14:00:34 +01:00
import java.util.UUID;
public class DmpBlueprintValuePersist {
2024-01-12 14:00:34 +01:00
private UUID fieldId;
2024-01-12 14:00:34 +01:00
public static final String _fieldId = "fieldId";
private String fieldValue;
2024-01-12 14:00:34 +01:00
public static final String _fieldValue = "fieldValue";
private List<ReferencePersist> references;
public static final String _references = "references";
2024-01-12 14:00:34 +01:00
public UUID getFieldId() {
return fieldId;
}
2024-01-12 14:00:34 +01:00
public void setFieldId(UUID fieldId) {
this.fieldId = fieldId;
}
public String getFieldValue() {
return fieldValue;
}
public void setFieldValue(String fieldValue) {
this.fieldValue = fieldValue;
}
2024-01-12 14:00:34 +01:00
public List<ReferencePersist> getReferences() {
return references;
}
public void setReferences(List<ReferencePersist> references) {
this.references = references;
}
@Component(DmpBlueprintValuePersistValidator.ValidatorName)
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public static class DmpBlueprintValuePersistValidator extends BaseValidator<DmpBlueprintValuePersist> {
2024-01-31 11:30:21 +01:00
private final ValidatorFactory validatorFactory;
2024-04-08 12:47:00 +02:00
private final QueryFactory queryFactory;
2024-01-12 14:00:34 +01:00
private final MessageSource messageSource;
public static final String ValidatorName = "DmpBlueprintValuePersistValidator";
2024-04-08 12:47:00 +02:00
private DefinitionEntity definition;
private FieldEntity fieldEntity;
protected DmpBlueprintValuePersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, ValidatorFactory validatorFactory, QueryFactory queryFactory, MessageSource messageSource) {
super(conventionService, errors);
2024-01-31 11:30:21 +01:00
this.validatorFactory = validatorFactory;
2024-04-08 12:47:00 +02:00
this.queryFactory = queryFactory;
this.messageSource = messageSource;
}
@Override
protected Class<DmpBlueprintValuePersist> modelClass() {
return DmpBlueprintValuePersist.class;
}
@Override
protected List<Specification> specifications(DmpBlueprintValuePersist item) {
2024-04-08 12:47:00 +02:00
fieldEntity = definition != null && this.isValidGuid(item.getFieldId())? definition.getFieldById(item.getFieldId()).stream().findFirst().orElse(null) : null;
boolean required = fieldEntity != null && fieldEntity.isRequired();
2024-01-12 14:00:34 +01:00
return Arrays.asList(
2024-04-08 12:47:00 +02:00
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()
2024-01-31 16:07:16 +01:00
.iff(() -> !this.isListNullOrEmpty(item.getReferences()))
.on(DmpBlueprintValuePersist._references)
.over(item.getReferences())
2024-04-08 12:47:00 +02:00
.using((itm) -> this.validatorFactory.validator(ReferencePersist.ReferenceWithoutTypePersistValidator.class))
2024-01-12 14:00:34 +01:00
);
}
2024-04-08 12:47:00 +02:00
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();
}
}
}