diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/EnumNotNull.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/EnumNotNull.java deleted file mode 100644 index 94003e578..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/EnumNotNull.java +++ /dev/null @@ -1,11 +0,0 @@ -package eu.eudat.commons.validation.old; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -public class EnumNotNull implements ConstraintValidator { - @Override - public boolean isValid(Object value, ConstraintValidatorContext context) { - return value != null; - } -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/FieldNotNullIfOtherSet.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/FieldNotNullIfOtherSet.java deleted file mode 100644 index 3014f1792..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/FieldNotNullIfOtherSet.java +++ /dev/null @@ -1,22 +0,0 @@ -package eu.eudat.commons.validation.old; - - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; -import java.lang.annotation.*; - -@Constraint( validatedBy = { FieldNotNullIfOtherSetValidator.class } ) -@Documented -@Target( { ElementType.TYPE } ) -@Retention( RetentionPolicy.RUNTIME ) -public @interface FieldNotNullIfOtherSet { - Class[] groups() default {}; - - String notNullField() default "id"; - String otherSetField() default "hash"; - String failOn() default "hash"; - - String message() default "hash is required if id is set"; - - Class[] payload() default {}; -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/FieldNotNullIfOtherSetValidator.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/FieldNotNullIfOtherSetValidator.java deleted file mode 100644 index 7bcd6acac..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/FieldNotNullIfOtherSetValidator.java +++ /dev/null @@ -1,36 +0,0 @@ -package eu.eudat.commons.validation.old; - -import eu.eudat.commons.validation.old.FieldNotNullIfOtherSet; -import org.springframework.beans.BeanWrapperImpl; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; -import java.util.Objects; - -public class FieldNotNullIfOtherSetValidator implements ConstraintValidator { - - private String notNullField; - private String otherSetField; - - @Override - public void initialize(FieldNotNullIfOtherSet constraintAnnotation) { - this.notNullField = constraintAnnotation.notNullField(); - this.otherSetField = constraintAnnotation.otherSetField(); - } - - @Override - public boolean isValid(Object entity, ConstraintValidatorContext context) { - Object notNullValue = new BeanWrapperImpl(entity) - .getPropertyValue(this.notNullField); - Object otherSetValue = new BeanWrapperImpl(entity) - .getPropertyValue(this.otherSetField); - - boolean hashIsString = Objects.equals(new BeanWrapperImpl(entity) - .getPropertyType(this.otherSetField), String.class); - - boolean hashValueEmpty = otherSetValue == null || (hashIsString && ((String)otherSetValue).isBlank()); - - if (notNullValue != null && hashValueEmpty) return false; - return true; - } -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/FieldsValueMatch.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/FieldsValueMatch.java deleted file mode 100644 index 5b411fe58..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/FieldsValueMatch.java +++ /dev/null @@ -1,29 +0,0 @@ -package eu.eudat.commons.validation.old; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Constraint(validatedBy = FieldsValueMatchValidator.class) -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.RUNTIME) -public @interface FieldsValueMatch { - Class[] groups() default {}; - - String field(); - String fieldMatch(); - String failOn(); - - String message() default "Fields values don't match!"; - - Class[] payload() default {}; - - @Target({ ElementType.TYPE }) - @Retention(RetentionPolicy.RUNTIME) - @interface List { - FieldsValueMatch[] value(); - } -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/FieldsValueMatchValidator.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/FieldsValueMatchValidator.java deleted file mode 100644 index 7706cd483..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/FieldsValueMatchValidator.java +++ /dev/null @@ -1,32 +0,0 @@ -package eu.eudat.commons.validation.old; - -import eu.eudat.commons.validation.old.FieldsValueMatch; -import org.springframework.beans.BeanWrapperImpl; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -public class FieldsValueMatchValidator implements ConstraintValidator { - - private String field; - private String fieldMatch; - - @Override - public void initialize(FieldsValueMatch constraintAnnotation) { - this.field = constraintAnnotation.field(); - this.fieldMatch = constraintAnnotation.fieldMatch(); - } - - @Override - public boolean isValid(Object entity, ConstraintValidatorContext context) { - - Object fieldValue = new BeanWrapperImpl(entity).getPropertyValue(field); - Object fieldMatchValue = new BeanWrapperImpl(entity).getPropertyValue(fieldMatch); - - if (fieldValue != null) { - return fieldValue.equals(fieldMatchValue); - } else { - return fieldMatchValue == null; - } - } -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/RequiredOneField.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/RequiredOneField.java deleted file mode 100644 index c461f924a..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/RequiredOneField.java +++ /dev/null @@ -1,21 +0,0 @@ -package eu.eudat.commons.validation.old; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; - -import java.lang.annotation.*; - -@Constraint( validatedBy = { RequiredOneFieldValidator.class } ) -@Documented -@Target( { ElementType.TYPE } ) -@Retention( RetentionPolicy.RUNTIME ) -public @interface RequiredOneField { - - String message() default "One field is required"; - - Class[] groups() default {}; - - Class[] payload() default {}; - - String[] fieldNames(); -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/RequiredOneFieldValidator.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/RequiredOneFieldValidator.java deleted file mode 100644 index b999b9470..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/RequiredOneFieldValidator.java +++ /dev/null @@ -1,41 +0,0 @@ -package eu.eudat.commons.validation.old; - -import eu.eudat.commons.validation.old.RequiredOneField; -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; -import org.apache.commons.beanutils.PropertyUtils; - - -public class RequiredOneFieldValidator implements ConstraintValidator { - - private String[] fieldNames; - - public void initialize(RequiredOneField constraintAnnotation) { - this.fieldNames = constraintAnnotation.fieldNames(); - } - - public boolean isValid(Object object, ConstraintValidatorContext constraintContext) { - - if (object == null) { - return true; - } - int requiredCount = 0; - try { - for (String fieldName:fieldNames){ - - Object property = PropertyUtils.getProperty(object, fieldName); - if (property != null) { - requiredCount = requiredCount + 1; - } - } - if (requiredCount == 1){ - return true; - } - return false; - } catch (Exception e) { - return false; - } - } - -} - diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/ValidEnum.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/ValidEnum.java deleted file mode 100644 index ce0c8f125..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/ValidEnum.java +++ /dev/null @@ -1,17 +0,0 @@ -package eu.eudat.commons.validation.old; - -import eu.eudat.commons.validation.old.EnumNotNull; -import jakarta.validation.Constraint; -import jakarta.validation.Payload; -import java.lang.annotation.*; - - -@Constraint(validatedBy = EnumNotNull.class) -@Documented -@Target({ ElementType.FIELD }) -@Retention(RetentionPolicy.RUNTIME) -public @interface ValidEnum { - String message() default "enum is required"; - Class[] groups() default {}; - Class[] payload() default {}; -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/ValidId.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/ValidId.java deleted file mode 100644 index f8a9115d6..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/ValidId.java +++ /dev/null @@ -1,18 +0,0 @@ -package eu.eudat.commons.validation.old; - - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; -import java.lang.annotation.*; - -@Constraint( validatedBy = { ValidIdValidator.class } ) -@Documented -@Target( { ElementType.FIELD } ) -@Retention( RetentionPolicy.RUNTIME ) -public @interface ValidId { - Class[] groups() default {}; - - String message() default "id set but not valid"; - - Class[] payload() default {}; -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/ValidIdValidator.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/ValidIdValidator.java deleted file mode 100644 index fa71ff4c8..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/ValidIdValidator.java +++ /dev/null @@ -1,41 +0,0 @@ -package eu.eudat.commons.validation.old; - -import eu.eudat.commons.validation.old.ValidId; -import eu.eudat.convention.ConventionService; -import org.springframework.beans.factory.annotation.Autowired; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; -import java.util.UUID; - -public class ValidIdValidator implements ConstraintValidator { - - @Autowired - private ConventionService conventionService; - - @Override - public void initialize(ValidId constraintAnnotation) { } - - @Override - public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) { - if(o == null) return true; - else if(o instanceof UUID){ - UUID uuidId = (UUID)o; - return this.conventionService.isValidGuid(uuidId); - } - else if(o instanceof Integer){ - Integer intId = (Integer)o; - return this.conventionService.isValidId(intId); - } - else{ - String stringId = o.toString(); - UUID uuidId = null; - try { - uuidId = UUID.fromString(stringId); - }catch (Exception ex){ - return false; - } - return this.conventionService.isValidGuid(uuidId); - } - } -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/ValidationServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/ValidationServiceImpl.java deleted file mode 100644 index a98561485..000000000 --- a/dmp-backend/core/src/main/java/eu/eudat/commons/validation/old/ValidationServiceImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package eu.eudat.commons.validation.old; - -import eu.eudat.errorcode.ErrorThesaurusProperties; -import gr.cite.tools.exception.MyValidationException; -import gr.cite.tools.validation.BaseValidationService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import jakarta.validation.Validator; -import java.util.List; -import java.util.Map; - -@Service -public class ValidationServiceImpl extends BaseValidationService { - - private final ErrorThesaurusProperties errors; - - @Autowired - public ValidationServiceImpl(Validator validator, ErrorThesaurusProperties errors) { - super(validator); - this.errors = errors; - } - - @Override - public void validateForce(T item, Class... groups) { - List>> validationErrors = this.validate(item, groups); - if (validationErrors != null && !validationErrors.isEmpty()) { - throw new MyValidationException(this.errors.getModelValidation().getCode(), - this.errors.getModelValidation().getMessage(), - validationErrors); - } - } -} diff --git a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/notification/NotificationIntegrationEventHandlerImpl.java b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/notification/NotificationIntegrationEventHandlerImpl.java index 9474f0a27..775a37ae4 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/notification/NotificationIntegrationEventHandlerImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/integrationevent/outbox/notification/NotificationIntegrationEventHandlerImpl.java @@ -1,15 +1,14 @@ package eu.eudat.integrationevent.outbox.notification; - import eu.eudat.audit.AuditableAction; import eu.eudat.commons.enums.ContactInfoType; import eu.eudat.commons.enums.notification.NotificationContactType; import eu.eudat.commons.enums.notification.NotificationNotifyState; import eu.eudat.commons.enums.notification.NotificationTrackingProcess; import eu.eudat.commons.enums.notification.NotificationTrackingState; +import eu.eudat.commons.validation.ValidatorFactory; import eu.eudat.data.UserContactInfoEntity; import eu.eudat.data.UserEntity; -import eu.eudat.integrationevent.outbox.OutboxIntegrationEvent; import eu.eudat.integrationevent.outbox.OutboxService; import eu.eudat.model.persist.notification.NotificationPersist; import eu.eudat.query.UserContactInfoQuery; @@ -19,7 +18,6 @@ import gr.cite.tools.auditing.AuditService; import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.exception.MyApplicationException; import gr.cite.tools.logging.LoggerService; -import gr.cite.tools.validation.ValidationService; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -28,79 +26,86 @@ import org.springframework.web.context.annotation.RequestScope; import javax.management.InvalidApplicationException; import java.time.Instant; import java.util.List; -import java.util.UUID; @Component @RequestScope public class NotificationIntegrationEventHandlerImpl implements NotificationIntegrationEventHandler { - private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(NotificationIntegrationEventHandlerImpl.class)); - private final NotificationService notificationService; - private final ValidationService validationService; - private final QueryFactory queryFactory; - private final AuditService auditService; - private final OutboxService outboxService; - @Autowired - public NotificationIntegrationEventHandlerImpl( - OutboxService outboxService, - NotificationService notificationService, - ValidationService validationService, - QueryFactory queryFactory, - AuditService auditService) { - this.outboxService = outboxService; - this.notificationService = notificationService; - this.validationService = validationService; - this.queryFactory = queryFactory; - this.auditService = auditService; - } + private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(NotificationIntegrationEventHandlerImpl.class)); - @Override - public void handle(NotificationIntegrationEvent event) throws InvalidApplicationException { + private final NotificationService notificationService; + + private final QueryFactory queryFactory; + + private final AuditService auditService; + + private final OutboxService outboxService; + + private final ValidatorFactory validatorFactory; + + @Autowired + public NotificationIntegrationEventHandlerImpl( + OutboxService outboxService, + NotificationService notificationService, + QueryFactory queryFactory, + AuditService auditService, ValidatorFactory validatorFactory) { + this.outboxService = outboxService; + this.notificationService = notificationService; + this.validatorFactory = validatorFactory; + this.queryFactory = queryFactory; + this.auditService = auditService; + } + + @Override + public void handle(NotificationIntegrationEvent event) throws InvalidApplicationException { // OutboxIntegrationEvent message = new OutboxIntegrationEvent(); // message.setMessageId(UUID.randomUUID()); // message.setType(OutboxIntegrationEvent.NOTIFY); // message.setEvent(event); // this.outboxService.publish(message); - NotificationPersist persist = new NotificationPersist(); - persist.setType(event.getNotificationType()); - persist.setUserId(event.getUserId()); - persist.setContactHint(event.getContactHint()); - persist.setContactTypeHint(event.getContactTypeHint()); - persist.setData(event.getData()); - persist.setNotifyState(NotificationNotifyState.PENDING); - persist.setNotifiedWith(NotificationContactType.EMAIL); - persist.setRetryCount(0); - persist.setTrackingState(NotificationTrackingState.UNDEFINED); - persist.setTrackingProcess(NotificationTrackingProcess.PENDING); - persist.setTrackingData(null); - persist.setProvenanceRef(event.getProvenanceRef()); - persist.setNotifiedAt(Instant.now()); - //validationService.validateForce(persist); //TODO - if (isNotificationConsistent(persist)) { - notificationService.persist(persist, null); - auditService.track(AuditableAction.Notification_Persist, "notification_event", event); - } - } + NotificationPersist persist = new NotificationPersist(); + persist.setType(event.getNotificationType()); + persist.setUserId(event.getUserId()); + persist.setContactHint(event.getContactHint()); + persist.setContactTypeHint(event.getContactTypeHint()); + persist.setData(event.getData()); + persist.setNotifyState(NotificationNotifyState.PENDING); + persist.setNotifiedWith(NotificationContactType.EMAIL); + persist.setRetryCount(0); + persist.setTrackingState(NotificationTrackingState.UNDEFINED); + persist.setTrackingProcess(NotificationTrackingProcess.PENDING); + persist.setTrackingData(null); + persist.setProvenanceRef(event.getProvenanceRef()); + persist.setNotifiedAt(Instant.now()); + validatorFactory.validator(NotificationPersist.NotificationPersistValidator.class).validateForce(persist); + if (isNotificationConsistent(persist)) { + notificationService.persist(persist, null); + auditService.track(AuditableAction.Notification_Persist, "notification_event", event); + } + } - private boolean isNotificationConsistent(NotificationPersist notification) { - switch (notification.getContactTypeHint()){ - case IN_APP:{ - if (notification.getUserId() == null) return false; + private boolean isNotificationConsistent(NotificationPersist notification) { + switch (notification.getContactTypeHint()) { + case IN_APP: { + if (notification.getUserId() == null) + return false; - List users = this.queryFactory.query(UserQuery.class).ids(notification.getUserId()).collect(); - return users.size() > 0; - } - case EMAIL:{ - if (notification.getContactHint() != null && !notification.getContactHint().isBlank()) return true; + List users = this.queryFactory.query(UserQuery.class).ids(notification.getUserId()).collect(); + return !users.isEmpty(); + } + case EMAIL: { + if (notification.getContactHint() != null && !notification.getContactHint().isBlank()) + return true; - if (notification.getUserId() == null) return false; + if (notification.getUserId() == null) + return false; - List userContactInfoEntities = this.queryFactory.query(UserContactInfoQuery.class).types(ContactInfoType.Email).userIds(notification.getUserId()).collect(); - return userContactInfoEntities.size() > 0; - } - default: - throw new MyApplicationException("invalid type " + notification.getContactTypeHint()); - - } - } + List userContactInfoEntities = this.queryFactory.query(UserContactInfoQuery.class).types(ContactInfoType.Email).userIds(notification.getUserId()).collect(); + return !userContactInfoEntities.isEmpty(); + } + default: + throw new MyApplicationException("invalid type " + notification.getContactTypeHint()); + + } + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/CloneDmpPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/CloneDmpPersist.java index bf097fd00..dcaeff347 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/CloneDmpPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/CloneDmpPersist.java @@ -90,13 +90,13 @@ public class CloneDmpPersist { .must(() -> this.isValidGuid(item.getId())) .failOn(CloneDmpPersist._id).failWith(messageSource.getMessage("Validation_Required", new Object[]{CloneDmpPersist._id}, LocaleContextHolder.getLocale())), this.spec() - .must(() -> this.isEmpty(item.getLabel())) + .must(() -> !this.isEmpty(item.getLabel())) .failOn(CloneDmpPersist._label).failWith(messageSource.getMessage("Validation_Required", new Object[]{CloneDmpPersist._label}, LocaleContextHolder.getLocale())), this.spec() - .must(() -> this.isEmpty(item.getDescription())) + .must(() -> !this.isEmpty(item.getDescription())) .failOn(CloneDmpPersist._description).failWith(messageSource.getMessage("Validation_Required", new Object[]{CloneDmpPersist._description}, LocaleContextHolder.getLocale())), this.spec() - .must(() -> this.isNull(item.getDescriptions())) + .must(() -> !this.isNull(item.getDescriptions())) .failOn(CloneDmpPersist._descriptions).failWith(messageSource.getMessage("Validation_Required", new Object[]{CloneDmpPersist._descriptions}, LocaleContextHolder.getLocale())) ); } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionPersist.java index 78f987c70..23a54cb8f 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionPersist.java @@ -3,7 +3,6 @@ package eu.eudat.model.persist; import eu.eudat.commons.enums.DescriptionStatus; import eu.eudat.commons.validation.BaseValidator; import eu.eudat.commons.validation.ValidatorFactory; -import eu.eudat.commons.validation.old.FieldNotNullIfOtherSet; import eu.eudat.commons.validation.specification.Specification; import eu.eudat.convention.ConventionService; import eu.eudat.data.DescriptionEntity; @@ -19,7 +18,6 @@ import java.util.Arrays; import java.util.List; import java.util.UUID; -@FieldNotNullIfOtherSet(message = "{validation.hashempty}") public class DescriptionPersist { private UUID id; @@ -193,19 +191,23 @@ public class DescriptionPersist { .must(() -> this.isValidGuid(item.getDmpId())) .failOn(DescriptionPersist._dmpId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._dmpId}, LocaleContextHolder.getLocale())), this.spec() + .iff(() -> item.getStatus() == DescriptionStatus.Finalized) .must(() -> this.isValidGuid(item.getDescriptionTemplateId())) .failOn(DescriptionPersist._descriptionTemplateId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._descriptionTemplateId}, LocaleContextHolder.getLocale())), this.spec() + .iff(() -> item.getStatus() == DescriptionStatus.Finalized) .must(() -> this.isValidGuid(item.getDmpDescriptionTemplateId())) .failOn(DescriptionPersist._dmpDescriptionTemplateId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._dmpDescriptionTemplateId}, LocaleContextHolder.getLocale())), this.spec() .must(() -> !this.isNull(item.getStatus())) .failOn(DescriptionPersist._status).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._status}, LocaleContextHolder.getLocale())), this.spec() + .iff(() -> item.getStatus() == DescriptionStatus.Finalized) .must(() -> !this.isNull(item.getTags())) .failOn(DescriptionPersist._tags).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._tags}, LocaleContextHolder.getLocale())), this.spec() + .iff(() -> item.getStatus() == DescriptionStatus.Finalized) .must(() -> !this.isNull(item.getProperties())) .failOn(DescriptionPersist._properties).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._properties}, LocaleContextHolder.getLocale())), this.refSpec() @@ -214,10 +216,11 @@ public class DescriptionPersist { .over(item.getProperties()) .using(() -> this.validatorFactory.validator(PropertyDefinitionPersist.PropertyDefinitionPersistValidator.class)), this.spec() + .iff(() -> item.getStatus() == DescriptionStatus.Finalized) .must(() -> !this.isNull(item.getReferences())) .failOn(DescriptionPersist._references).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._references}, LocaleContextHolder.getLocale())), this.navSpec() - .iff(() -> !this.isNull(item.getReferences())) + .iff(() -> item.getStatus() == DescriptionStatus.Finalized && !this.isNull(item.getReferences())) .on(DescriptionPersist._references) .over(item.getReferences()) .using(() -> this.validatorFactory.validator(DescriptionReferencePersist.DescriptionReferencePersistValidator.class)) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionStatusPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionStatusPersist.java index 361918915..3bb7ea013 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionStatusPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionStatusPersist.java @@ -75,7 +75,7 @@ public class DescriptionStatusPersist { protected List specifications(DescriptionStatusPersist item) { return Arrays.asList( this.spec() - .must(() -> !this.isValidGuid(item.getId())) + .must(() -> this.isValidGuid(item.getId())) .failOn(DescriptionStatusPersist._id).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionStatusPersist._id}, LocaleContextHolder.getLocale())), this.spec() .iff(() -> this.isValidGuid(item.getId())) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpDescriptionTemplatePersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpDescriptionTemplatePersist.java index 26644846c..b6826fa55 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpDescriptionTemplatePersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpDescriptionTemplatePersist.java @@ -1,9 +1,11 @@ package eu.eudat.model.persist; +import eu.eudat.commons.enums.DmpStatus; import eu.eudat.commons.validation.BaseValidator; import eu.eudat.commons.validation.specification.Specification; import eu.eudat.convention.ConventionService; import eu.eudat.errorcode.ErrorThesaurusProperties; +import eu.eudat.model.persist.validation.StatusAware; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Scope; @@ -42,12 +44,14 @@ public class DmpDescriptionTemplatePersist { @Component(DmpDescriptionTemplatePersistValidator.ValidatorName) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public static class DmpDescriptionTemplatePersistValidator extends BaseValidator { + public static class DmpDescriptionTemplatePersistValidator extends BaseValidator implements StatusAware { public static final String ValidatorName = "DmpDescriptionTemplatePersistValidator"; private final MessageSource messageSource; + private DmpStatus status; + protected DmpDescriptionTemplatePersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource) { super(conventionService, errors); this.messageSource = messageSource; @@ -62,13 +66,21 @@ public class DmpDescriptionTemplatePersist { protected List specifications(DmpDescriptionTemplatePersist item) { return Arrays.asList( this.spec() + .iff(() -> this.status == DmpStatus.Finalized) .must(() -> this.isValidGuid(item.getDescriptionTemplateGroupId())) .failOn(DmpDescriptionTemplatePersist._descriptionTemplateGroupId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpDescriptionTemplatePersist._descriptionTemplateGroupId}, LocaleContextHolder.getLocale())), this.spec() + .iff(() -> this.status == DmpStatus.Finalized) .must(() -> this.isValidGuid(item.getSectionId())) .failOn(DmpDescriptionTemplatePersist._sectionId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpDescriptionTemplatePersist._sectionId}, LocaleContextHolder.getLocale())) ); } + + @Override + public DmpDescriptionTemplatePersistValidator setStatus(DmpStatus status) { + this.status = status; + return this; + } } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpPersist.java index 25020190c..affb3b9a1 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpPersist.java @@ -4,20 +4,11 @@ import eu.eudat.commons.enums.DmpAccessType; import eu.eudat.commons.enums.DmpStatus; import eu.eudat.commons.validation.BaseValidator; import eu.eudat.commons.validation.ValidatorFactory; -import eu.eudat.commons.validation.old.FieldNotNullIfOtherSet; -import eu.eudat.commons.validation.old.ValidEnum; -import eu.eudat.commons.validation.old.ValidId; import eu.eudat.commons.validation.specification.Specification; import eu.eudat.convention.ConventionService; -import eu.eudat.data.DescriptionEntity; import eu.eudat.data.DmpEntity; import eu.eudat.errorcode.ErrorThesaurusProperties; -import eu.eudat.model.persist.descriptionproperties.PropertyDefinitionPersist; import eu.eudat.model.persist.dmpproperties.DmpPropertiesPersist; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Scope; @@ -197,33 +188,37 @@ public class DmpPersist { .must(() -> !this.isNull(item.getStatus())) .failOn(DmpPersist._status).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._status}, LocaleContextHolder.getLocale())), this.spec() + .iff(() -> item.getStatus() == DmpStatus.Finalized) .must(() -> this.isValidGuid(item.getBlueprint())) .failOn(DmpPersist._blueprint).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._blueprint}, LocaleContextHolder.getLocale())), this.spec() + .iff(() -> item.getStatus() == DmpStatus.Finalized) .must(() -> !this.isNull(item.getProperties())) .failOn(DmpPersist._properties).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._properties}, LocaleContextHolder.getLocale())), this.refSpec() .iff(() -> !this.isNull(item.getProperties())) .on(DmpPersist._properties) .over(item.getProperties()) - .using(() -> this.validatorFactory.validator(DmpPropertiesPersist.DmpPropertiesPersistValidator.class)), + .using(() -> this.validatorFactory.validator(DmpPropertiesPersist.DmpPropertiesPersistValidator.class).setStatus(item.getStatus())), this.spec() + .iff(() -> item.getStatus() == DmpStatus.Finalized) .must(() -> !this.isNull(item.getReferences())) .failOn(DmpPersist._references).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._references}, LocaleContextHolder.getLocale())), this.navSpec() - .iff(() -> !this.isNull(item.getReferences())) + .iff(() -> item.getStatus() == DmpStatus.Finalized && !this.isNull(item.getReferences())) .on(DmpPersist._references) .over(item.getReferences()) .using(() -> this.validatorFactory.validator(DmpReferencePersist.DmpReferencePersistValidator.class)), this.spec() + .iff(() -> item.getStatus() == DmpStatus.Finalized) .must(() -> !this.isNull(item.getDescriptionTemplates())) .failOn(DmpPersist._descriptionTemplates).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._descriptionTemplates}, LocaleContextHolder.getLocale())), this.navSpec() .iff(() -> !this.isNull(item.getDescriptionTemplates())) .on(DmpPersist._descriptionTemplates) .over(item.getDescriptionTemplates()) - .using(() -> this.validatorFactory.validator(DmpDescriptionTemplatePersist.DmpDescriptionTemplatePersistValidator.class)) + .using(() -> this.validatorFactory.validator(DmpDescriptionTemplatePersist.DmpDescriptionTemplatePersistValidator.class).setStatus(item.getStatus())) ); } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpReferencePersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpReferencePersist.java index deb1065a0..cee1cb94b 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpReferencePersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpReferencePersist.java @@ -109,6 +109,7 @@ public class DmpReferencePersist { .using(() -> this.validatorFactory.validator(ReferencePersist.ReferencePersistValidator.class)) ); } + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInviteTypePersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInviteTypePersist.java index e12202db2..1cabaa3fc 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInviteTypePersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserInviteTypePersist.java @@ -63,7 +63,7 @@ public class DmpUserInviteTypePersist { return Arrays.asList( this.spec() .iff(() -> this.isEmpty(item.getEmail())) - .must(() -> !this.isValidGuid(item.getUserId())) + .must(() -> this.isValidGuid(item.getUserId())) .failOn(DmpUserInviteTypePersist._userId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpUserInviteTypePersist._userId}, LocaleContextHolder.getLocale())), this.spec() .iff(() -> !this.isValidGuid(item.getUserId())) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserPersist.java index e1816ec3b..d274afe75 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpUserPersist.java @@ -63,7 +63,7 @@ public class DmpUserPersist { protected List specifications(DmpUserPersist item) { return Arrays.asList( this.spec() - .must(() -> !this.isValidGuid(item.getUser())) + .must(() -> this.isValidGuid(item.getUser())) .failOn(DmpUserPersist._user).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpUserPersist._user}, LocaleContextHolder.getLocale())), this.spec() .must(() -> !this.isNull(item.getRole())) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/NewVersionDmpPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/NewVersionDmpPersist.java index c2b3c04f1..cc0bef95d 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/NewVersionDmpPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/NewVersionDmpPersist.java @@ -119,7 +119,7 @@ public class NewVersionDmpPersist { .must(() -> !this.isEmpty(item.getDescription())) .failOn(NewVersionDmpPersist._description).failWith(messageSource.getMessage("Validation_Required", new Object[]{NewVersionDmpPersist._description}, LocaleContextHolder.getLocale())), this.spec() - .must(() -> !this.isValidGuid(item.getBlueprintId())) + .must(() -> this.isValidGuid(item.getBlueprintId())) .failOn(NewVersionDmpPersist._blueprintId).failWith(messageSource.getMessage("Validation_Required", new Object[]{NewVersionDmpPersist._blueprintId}, LocaleContextHolder.getLocale())), this.spec() .must(() -> !this.isNull(item.getDescriptions())) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/deposit/DepositRequest.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/deposit/DepositRequest.java index 03e5f6857..b00bdeba8 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/deposit/DepositRequest.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/deposit/DepositRequest.java @@ -86,7 +86,7 @@ public class DepositRequest { .must(() -> !this.isEmpty(item.getRepositoryId())) .failOn(DepositRequest._repositoryId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DepositRequest._repositoryId}, LocaleContextHolder.getLocale())), this.spec() - .must(() -> !this.isValidGuid(item.getDmpId())) + .must(() -> this.isValidGuid(item.getDmpId())) .failOn(DepositRequest._dmpId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DepositRequest._dmpId}, LocaleContextHolder.getLocale())) ); } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpproperties/DmpPropertiesPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpproperties/DmpPropertiesPersist.java index 3a3533847..63a8dbb8b 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpproperties/DmpPropertiesPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpproperties/DmpPropertiesPersist.java @@ -1,10 +1,13 @@ package eu.eudat.model.persist.dmpproperties; +import eu.eudat.commons.enums.DmpStatus; import eu.eudat.commons.validation.BaseValidator; import eu.eudat.commons.validation.ValidatorFactory; import eu.eudat.commons.validation.specification.Specification; import eu.eudat.convention.ConventionService; import eu.eudat.errorcode.ErrorThesaurusProperties; +import eu.eudat.model.persist.DmpPersist; +import eu.eudat.model.persist.validation.StatusAware; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @@ -40,12 +43,14 @@ public class DmpPropertiesPersist { @Component(DmpPropertiesPersistValidator.ValidatorName) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public static class DmpPropertiesPersistValidator extends BaseValidator { + public static class DmpPropertiesPersistValidator extends BaseValidator implements StatusAware { public static final String ValidatorName = "DmpPropertiesPersistValidator"; private final ValidatorFactory validatorFactory; + private DmpStatus status; + protected DmpPropertiesPersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, ValidatorFactory validatorFactory) { super(conventionService, errors); this.validatorFactory = validatorFactory; @@ -60,17 +65,24 @@ public class DmpPropertiesPersist { protected List specifications(DmpPropertiesPersist item) { return Arrays.asList( this.refSpec() - .iff(() -> !this.isNull(item.getDmpBlueprintValues())) + .iff(() -> this.status == DmpStatus.Finalized && !this.isNull(item.getDmpBlueprintValues())) .on(DmpPropertiesPersist._dmpBlueprintValues) .over(item.getDmpBlueprintValues()) .using(() -> this.validatorFactory.validator(DmpBlueprintValuePersist.DmpBlueprintValuePersistValidator.class)), this.refSpec() - .iff(() -> !this.isNull(item.getContacts())) + .iff(() -> this.status == DmpStatus.Finalized && !this.isNull(item.getContacts())) .on(DmpPropertiesPersist._contacts) .over(item.getContacts()) .using(() -> this.validatorFactory.validator(DmpContactPersist.DmpContactPersistValidator.class)) ); } + + @Override + public DmpPropertiesPersistValidator setStatus(DmpStatus status) { + this.status = status; + return this; + } + } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/notification/NotificationPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/notification/NotificationPersist.java index 71228d9ad..9b8461504 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/notification/NotificationPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/notification/NotificationPersist.java @@ -4,23 +4,29 @@ import eu.eudat.commons.enums.notification.NotificationContactType; import eu.eudat.commons.enums.notification.NotificationNotifyState; import eu.eudat.commons.enums.notification.NotificationTrackingProcess; import eu.eudat.commons.enums.notification.NotificationTrackingState; -import eu.eudat.commons.validation.old.FieldNotNullIfOtherSet; -import eu.eudat.commons.validation.old.ValidId; -import jakarta.validation.constraints.NotNull; - +import eu.eudat.commons.validation.BaseValidator; +import eu.eudat.commons.validation.specification.Specification; +import eu.eudat.convention.ConventionService; +import eu.eudat.errorcode.ErrorThesaurusProperties; +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.time.Instant; +import java.util.Arrays; +import java.util.List; import java.util.UUID; -@FieldNotNullIfOtherSet(message = "{validation.hashempty}") public class NotificationPersist { - @ValidId(message = "{validation.invalidid}") private UUID id; - @NotNull(message = "{validation.empty}") private UUID userId; + public static final String _userId = "userId"; + private UUID type; private NotificationContactType contactTypeHint; @@ -47,6 +53,8 @@ public class NotificationPersist { private String hash; + public static final String _hash = "hash"; + public UUID getId() { return id; } @@ -166,4 +174,41 @@ public class NotificationPersist { public void setHash(String hash) { this.hash = hash; } + + @Component(NotificationPersistValidator.ValidatorName) + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public static class NotificationPersistValidator extends BaseValidator { + + public static final String ValidatorName = "NotificationPersistValidator"; + + private final MessageSource messageSource; + + protected NotificationPersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource) { + super(conventionService, errors); + this.messageSource = messageSource; + } + + @Override + protected Class modelClass() { + return NotificationPersist.class; + } + + @Override + protected List specifications(NotificationPersist item) { + return Arrays.asList( + this.spec() + .iff(() -> this.isValidGuid(item.getId())) + .must(() -> this.isValidHash(item.getHash())) + .failOn(NotificationPersist._hash).failWith(messageSource.getMessage("Validation_Required", new Object[]{NotificationPersist._hash}, LocaleContextHolder.getLocale())), + this.spec() + .iff(() -> !this.isValidGuid(item.getId())) + .must(() -> !this.isValidHash(item.getHash())) + .failOn(NotificationPersist._hash).failWith(messageSource.getMessage("Validation_OverPosting", new Object[]{}, LocaleContextHolder.getLocale())), + this.spec() + .must(() -> this.isValidGuid(item.getUserId())) + .failOn(NotificationPersist._userId).failWith(messageSource.getMessage("Validation_Required", new Object[]{NotificationPersist._userId}, LocaleContextHolder.getLocale())) + ); + } + } + } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/referencedefinition/FieldPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/referencedefinition/FieldPersist.java index 655bf5a79..b3acd1fd9 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/referencedefinition/FieldPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/referencedefinition/FieldPersist.java @@ -2,14 +2,10 @@ package eu.eudat.model.persist.referencedefinition; import eu.eudat.commons.enums.ReferenceFieldDataType; import eu.eudat.commons.validation.BaseValidator; -import eu.eudat.commons.validation.old.ValidEnum; import eu.eudat.commons.validation.specification.Specification; import eu.eudat.convention.ConventionService; import eu.eudat.errorcode.ErrorThesaurusProperties; -import eu.eudat.model.persist.DescriptionTemplateTypePersist; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Scope; diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/validation/StatusAware.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/validation/StatusAware.java new file mode 100644 index 000000000..0c6fe069f --- /dev/null +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/validation/StatusAware.java @@ -0,0 +1,7 @@ +package eu.eudat.model.persist.validation; + +public interface StatusAware> { + + StatusAware setStatus(T status); + +} diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/descriptiontemplate/DescriptionTemplateServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/descriptiontemplate/DescriptionTemplateServiceImpl.java index 0a1e82249..eea650f6e 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/descriptiontemplate/DescriptionTemplateServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/descriptiontemplate/DescriptionTemplateServiceImpl.java @@ -13,6 +13,7 @@ import eu.eudat.commons.types.descriptiontemplate.*; import eu.eudat.commons.types.descriptiontemplate.fielddata.BaseFieldDataEntity; import eu.eudat.commons.types.descriptiontemplate.importexport.*; import eu.eudat.commons.types.notification.*; +import eu.eudat.commons.validation.ValidatorFactory; import eu.eudat.configurations.notification.NotificationProperties; import eu.eudat.convention.ConventionService; import eu.eudat.data.DescriptionTemplateEntity; @@ -81,11 +82,13 @@ import java.util.stream.Collectors; @Service public class DescriptionTemplateServiceImpl implements DescriptionTemplateService { + private List semantics = null; private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DescriptionTemplateServiceImpl.class)); private final EntityManager entityManager; + private final UserScope userScope; private final AuthorizationService authorizationService; @@ -93,20 +96,33 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic private final DeleterFactory deleterFactory; private final BuilderFactory builderFactory; + private final ConventionService conventionService; + private final MessageSource messageSource; + private final XmlHandlingService xmlHandlingService; + private final FieldDataHelperServiceProvider fieldDataHelperServiceProvider; + private final QueryFactory queryFactory; + private final ErrorThesaurusProperties errors; - private final ValidationService validationService; + private final TenantScope tenantScope; + private final ResponseUtilsService responseUtilsService; + private final StorageFileService storageFileService; + private final JsonHandlingService jsonHandlingService; + private final NotificationIntegrationEventHandler eventHandler; + private final NotificationProperties notificationProperties; - + + private final ValidatorFactory validatorFactory; + @Autowired public DescriptionTemplateServiceImpl( EntityManager entityManager, @@ -116,7 +132,15 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic ConventionService conventionService, MessageSource messageSource, XmlHandlingService xmlHandlingService, - FieldDataHelperServiceProvider fieldDataHelperServiceProvider, QueryFactory queryFactory, ErrorThesaurusProperties errors, ValidationService validationService, TenantScope tenantScope, ResponseUtilsService responseUtilsService, StorageFileService storageFileService, JsonHandlingService jsonHandlingService, NotificationIntegrationEventHandler eventHandler, NotificationProperties notificationProperties) { + FieldDataHelperServiceProvider fieldDataHelperServiceProvider, + QueryFactory queryFactory, ErrorThesaurusProperties errors, + TenantScope tenantScope, + ResponseUtilsService responseUtilsService, + StorageFileService storageFileService, + JsonHandlingService jsonHandlingService, + NotificationIntegrationEventHandler eventHandler, + NotificationProperties notificationProperties, + ValidatorFactory validatorFactory) { this.entityManager = entityManager; this.userScope = userScope; this.authorizationService = authorizationService; @@ -128,15 +152,15 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic this.fieldDataHelperServiceProvider = fieldDataHelperServiceProvider; this.queryFactory = queryFactory; this.errors = errors; - this.validationService = validationService; this.tenantScope = tenantScope; this.responseUtilsService = responseUtilsService; this.storageFileService = storageFileService; this.jsonHandlingService = jsonHandlingService; this.eventHandler = eventHandler; this.notificationProperties = notificationProperties; + this.validatorFactory = validatorFactory; } - + //region Persist public DescriptionTemplate persist(DescriptionTemplatePersist model, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException, InvalidApplicationException, JAXBException, ParserConfigurationException, JsonProcessingException, TransformerException { @@ -149,9 +173,12 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic DescriptionTemplateEntity data; if (isUpdate) { data = this.entityManager.find(DescriptionTemplateEntity.class, model.getId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); - if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); - if (data.getStatus() == DescriptionTemplateStatus.Finalized) throw new MyForbiddenException("Can not update finalized template"); + if (data == null) + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) + throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); + if (data.getStatus() == DescriptionTemplateStatus.Finalized) + throw new MyForbiddenException("Can not update finalized template"); } else { data = new DescriptionTemplateEntity(); data.setId(UUID.randomUUID()); @@ -159,7 +186,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic data.setCreatedAt(Instant.now()); data.setGroupId(UUID.randomUUID()); data.setVersionStatus(DescriptionTemplateVersionStatus.Current); - data.setVersion((short)1); + data.setVersion((short) 1); } data.setDescription(model.getDescription()); @@ -173,22 +200,24 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic this.entityManager.merge(data); else this.entityManager.persist(data); - + this.persistUsers(data.getId(), model.getUsers()); - if (!isUpdate) this.addOwner(data); + if (!isUpdate) + this.addOwner(data); this.entityManager.flush(); return this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, DescriptionTemplate._id), data); } - + private void persistUsers(UUID id, List users) throws InvalidApplicationException { - if (users == null) users = new ArrayList<>(); + if (users == null) + users = new ArrayList<>(); List items = this.queryFactory.query(UserDescriptionTemplateQuery.class).isActive(IsActive.Active).descriptionTemplateIds(id).collect(); List updatedCreatedIds = new ArrayList<>(); for (UserDescriptionTemplatePersist user : users) { UserDescriptionTemplateEntity data = items.stream().filter(x -> x.getUserId().equals(user.getUserId()) && x.getRole().equals(user.getRole())).findFirst().orElse(null); - if (data == null){ + if (data == null) { data = new UserDescriptionTemplateEntity(); data.setId(UUID.randomUUID()); data.setIsActive(IsActive.Active); @@ -202,10 +231,11 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic } updatedCreatedIds.add(data.getId()); } - List toDelete = items.stream().filter(x-> updatedCreatedIds.stream().noneMatch(y-> y.equals(x.getId()))).collect(Collectors.toList()); + List toDelete = items.stream().filter(x -> updatedCreatedIds.stream().noneMatch(y -> y.equals(x.getId()))).collect(Collectors.toList()); this.deleterFactory.deleter(UserDescriptionTemplateDeleter.class).delete(toDelete); } + private void sendJoinMail(UserDescriptionTemplateEntity userDescriptionTemplate) throws InvalidApplicationException { NotificationIntegrationEvent event = new NotificationIntegrationEvent(); event.setTenant(tenantScope.getTenant()); @@ -233,6 +263,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic eventHandler.handle(event); } + private void addOwner(DescriptionTemplateEntity descriptionTemplateEntity) throws InvalidApplicationException { UserDescriptionTemplateEntity data = new UserDescriptionTemplateEntity(); data.setId(UUID.randomUUID()); @@ -245,18 +276,19 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic this.entityManager.persist(data); } - private @NotNull DefinitionEntity buildDefinitionEntity(DefinitionPersist persist){ + private @NotNull DefinitionEntity buildDefinitionEntity(DefinitionPersist persist) { DefinitionEntity data = new DefinitionEntity(); - if (persist == null) return data; - if (!this.conventionService.isListNullOrEmpty(persist.getSections())){ + if (persist == null) + return data; + if (!this.conventionService.isListNullOrEmpty(persist.getSections())) { data.setSections(new ArrayList<>()); - for (SectionPersist sectionPersist: persist.getSections()) { + for (SectionPersist sectionPersist : persist.getSections()) { data.getSections().add(this.buildSectionEntity(sectionPersist)); } } - if (!this.conventionService.isListNullOrEmpty(persist.getPages())){ + if (!this.conventionService.isListNullOrEmpty(persist.getPages())) { data.setPages(new ArrayList<>()); - for (PagePersist pagePersist: persist.getPages()) { + for (PagePersist pagePersist : persist.getPages()) { data.getPages().add(this.buildPageEntity(pagePersist)); } } @@ -264,9 +296,10 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return data; } - private @NotNull SectionEntity buildSectionEntity(SectionPersist persist){ + private @NotNull SectionEntity buildSectionEntity(SectionPersist persist) { SectionEntity data = new SectionEntity(); - if (persist == null) return data; + if (persist == null) + return data; data.setId(persist.getId()); data.setDescription(persist.getDescription()); @@ -276,16 +309,16 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic data.setPage(persist.getPage()); data.setTitle(persist.getTitle()); - if (!this.conventionService.isListNullOrEmpty(persist.getSections())){ + if (!this.conventionService.isListNullOrEmpty(persist.getSections())) { data.setSections(new ArrayList<>()); - for (SectionPersist sectionPersist: persist.getSections()) { + for (SectionPersist sectionPersist : persist.getSections()) { data.getSections().add(this.buildSectionEntity(sectionPersist)); } } - if (!this.conventionService.isListNullOrEmpty(persist.getFieldSets())){ + if (!this.conventionService.isListNullOrEmpty(persist.getFieldSets())) { data.setFieldSets(new ArrayList<>()); - for (FieldSetPersist fieldSetPersist: persist.getFieldSets()) { + for (FieldSetPersist fieldSetPersist : persist.getFieldSets()) { data.getFieldSets().add(this.buildFieldSetEntity(fieldSetPersist)); } } @@ -293,9 +326,10 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return data; } - private @NotNull FieldSetEntity buildFieldSetEntity(FieldSetPersist persist){ + private @NotNull FieldSetEntity buildFieldSetEntity(FieldSetPersist persist) { FieldSetEntity data = new FieldSetEntity(); - if (persist == null) return data; + if (persist == null) + return data; data.setId(persist.getId()); data.setDescription(persist.getDescription()); @@ -304,22 +338,24 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic data.setNumbering(persist.getNumbering()); data.setAdditionalInformation(persist.getAdditionalInformation()); data.setTitle(persist.getTitle()); - if (persist.getMultiplicity() != null) data.setMultiplicity(this.buildMultiplicityEntity(persist.getMultiplicity())); + if (persist.getMultiplicity() != null) + data.setMultiplicity(this.buildMultiplicityEntity(persist.getMultiplicity())); data.setHasCommentField(persist.getHasCommentField()); data.setTitle(persist.getTitle()); - if (!this.conventionService.isListNullOrEmpty(persist.getFields())){ + if (!this.conventionService.isListNullOrEmpty(persist.getFields())) { data.setFields(new ArrayList<>()); - for (FieldPersist fieldPersist: persist.getFields()) { + for (FieldPersist fieldPersist : persist.getFields()) { data.getFields().add(this.buildFieldEntity(fieldPersist)); } } return data; } - private @NotNull FieldEntity buildFieldEntity(FieldPersist persist){ + private @NotNull FieldEntity buildFieldEntity(FieldPersist persist) { FieldEntity data = new FieldEntity(); - if (persist == null) return data; + if (persist == null) + return data; data.setId(persist.getId()); data.setOrdinal(persist.getOrdinal()); @@ -328,56 +364,65 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic data.setDefaultValue(persist.getDefaultValue()); data.setValidations(persist.getValidations()); data.setIncludeInExport(persist.getIncludeInExport()); - if (persist.getData() != null) data.setData(this.buildFieldDataEntity(persist.getData())); + if (persist.getData() != null) + data.setData(this.buildFieldDataEntity(persist.getData())); - if (!this.conventionService.isListNullOrEmpty(persist.getVisibilityRules())){ + if (!this.conventionService.isListNullOrEmpty(persist.getVisibilityRules())) { data.setVisibilityRules(new ArrayList<>()); - for (RulePersist fieldPersist: persist.getVisibilityRules()) { + for (RulePersist fieldPersist : persist.getVisibilityRules()) { data.getVisibilityRules().add(this.buildRuleEntity(fieldPersist)); } } return data; } - private BaseFieldDataEntity buildFieldDataEntity(BaseFieldDataPersist persist){ - if (persist == null) return null; + private BaseFieldDataEntity buildFieldDataEntity(BaseFieldDataPersist persist) { + if (persist == null) + return null; return this.fieldDataHelperServiceProvider.get(persist.getFieldType()).applyPersist(persist); } - private @NotNull RuleEntity buildRuleEntity(RulePersist persist){ + private @NotNull RuleEntity buildRuleEntity(RulePersist persist) { RuleEntity data = new RuleEntity(); - if (persist == null) return data; + if (persist == null) + return data; data.setTarget(persist.getTarget()); data.setValue(persist.getValue()); return data; } - private @NotNull MultiplicityEntity buildMultiplicityEntity(MultiplicityPersist persist){ + private @NotNull MultiplicityEntity buildMultiplicityEntity(MultiplicityPersist persist) { MultiplicityEntity data = new MultiplicityEntity(); - if (persist == null) return data; + if (persist == null) + return data; - if (persist.getMax() != null) data.setMax(persist.getMax()); - if (persist.getMin() != null) data.setMin(persist.getMin()); - if (persist.getPlaceholder() != null) data.setPlaceholder(persist.getPlaceholder()); - if (persist.getTableView() != null) data.setTableView(persist.getTableView()); + if (persist.getMax() != null) + data.setMax(persist.getMax()); + if (persist.getMin() != null) + data.setMin(persist.getMin()); + if (persist.getPlaceholder() != null) + data.setPlaceholder(persist.getPlaceholder()); + if (persist.getTableView() != null) + data.setTableView(persist.getTableView()); return data; } - private @NotNull PageEntity buildPageEntity(PagePersist persist){ + private @NotNull PageEntity buildPageEntity(PagePersist persist) { PageEntity data = new PageEntity(); - if (persist == null) return data; + if (persist == null) + return data; data.setId(persist.getId()); data.setOrdinal(persist.getOrdinal()); data.setTitle(persist.getTitle()); return data; } - + //endregion - + //region Delete - + public void deleteAndSave(UUID id) throws MyForbiddenException, InvalidApplicationException { logger.debug("deleting dataset: {}", id); @@ -387,9 +432,9 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic } //endregion - + //region Clone - + public DescriptionTemplate buildClone(UUID id, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException { logger.debug(new MapLogEntry("persisting data").And("id", id).And("fields", fields)); @@ -397,7 +442,8 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic DescriptionTemplateQuery query = this.queryFactory.query(DescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); DescriptionTemplate model = this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fields, query.firstAs(fields)); - if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (model == null) + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); model.setLabel(model.getLabel() + " new "); model.setId(null); @@ -408,80 +454,89 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return model; } - private void reassignDefinition(Definition model){ - if (model == null) return; + private void reassignDefinition(Definition model) { + if (model == null) + return; - if (model.getSections() != null){ + if (model.getSections() != null) { for (Section section : model.getSections()) { this.reassignSection(section); } } - if (model.getPages() != null){ + if (model.getPages() != null) { for (Page page : model.getPages()) { this.reassignPage(page); } } } - private void reassignPage(Page model){ - if (model == null) return; + private void reassignPage(Page model) { + if (model == null) + return; model.setId(UUID.randomUUID().toString()); } - private void reassignSection(Section model){ - if (model == null) return; + private void reassignSection(Section model) { + if (model == null) + return; model.setId(UUID.randomUUID().toString()); - if (model.getSections() != null){ + if (model.getSections() != null) { for (Section section : model.getSections()) { this.reassignSection(section); } } - if (model.getFieldSets() != null){ + if (model.getFieldSets() != null) { for (eu.eudat.model.descriptiontemplatedefinition.FieldSet fieldSet : model.getFieldSets()) { this.reassignFieldSet(fieldSet); } } } - private void reassignFieldSet(eu.eudat.model.descriptiontemplatedefinition.FieldSet model){ - if (model == null) return; + private void reassignFieldSet(eu.eudat.model.descriptiontemplatedefinition.FieldSet model) { + if (model == null) + return; model.setId(UUID.randomUUID().toString()); - if (model.getFields() != null){ + if (model.getFields() != null) { for (Field field : model.getFields()) { this.reassignField(field); } } } - private void reassignField(Field model){ - if (model == null) return; + private void reassignField(Field model) { + if (model == null) + return; model.setId(UUID.randomUUID().toString()); } //endregion //region NewVersion - + public DescriptionTemplate createNewVersion(NewVersionDescriptionTemplatePersist model, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException, InvalidApplicationException, JAXBException, ParserConfigurationException, JsonProcessingException, TransformerException { logger.debug(new MapLogEntry("persisting data descriptionTemplateType").And("model", model).And("fields", fields)); this.authorizationService.authorizeForce(Permission.CreateNewVersionDescriptionTemplate); DescriptionTemplateEntity oldDescriptionTemplateEntity = this.entityManager.find(DescriptionTemplateEntity.class, model.getId()); - if (oldDescriptionTemplateEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); - if (!this.conventionService.hashValue(oldDescriptionTemplateEntity.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); - + if (oldDescriptionTemplateEntity == null) + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (!this.conventionService.hashValue(oldDescriptionTemplateEntity.getUpdatedAt()).equals(model.getHash())) + throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); + DescriptionTemplateQuery latestVersionDescriptionTemplateEntityQuery = this.queryFactory.query(DescriptionTemplateQuery.class).versionStatuses(DescriptionTemplateVersionStatus.Current).groupIds(oldDescriptionTemplateEntity.getGroupId()); List latestVersionDescriptionTemplates = latestVersionDescriptionTemplateEntityQuery.collect(); - if (latestVersionDescriptionTemplates.isEmpty()) throw new MyValidationException("Previous template not found"); - if (latestVersionDescriptionTemplates.size() > 1) throw new MyValidationException("Multiple previous template found"); - if (!latestVersionDescriptionTemplates.get(0).getVersion().equals(oldDescriptionTemplateEntity.getVersion())){ + if (latestVersionDescriptionTemplates.isEmpty()) + throw new MyValidationException("Previous template not found"); + if (latestVersionDescriptionTemplates.size() > 1) + throw new MyValidationException("Multiple previous template found"); + if (!latestVersionDescriptionTemplates.get(0).getVersion().equals(oldDescriptionTemplateEntity.getVersion())) { throw new MyValidationException(this.errors.getDescriptionTemplateNewVersionConflict().getCode(), this.errors.getDescriptionTemplateNewVersionConflict().getMessage()); } - + DescriptionTemplateEntity data = new DescriptionTemplateEntity(); data.setId(UUID.randomUUID()); data.setIsActive(IsActive.Active); @@ -489,32 +544,32 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic data.setUpdatedAt(Instant.now()); data.setVersionStatus(DescriptionTemplateVersionStatus.Current); data.setGroupId(oldDescriptionTemplateEntity.getGroupId()); - data.setVersion((short)(oldDescriptionTemplateEntity.getVersion() + 1)); + data.setVersion((short) (oldDescriptionTemplateEntity.getVersion() + 1)); data.setDescription(model.getDescription()); data.setLabel(model.getLabel()); data.setTypeId(model.getType()); data.setLanguage(model.getLanguage()); data.setStatus(model.getStatus()); data.setDefinition(this.xmlHandlingService.toXml(this.buildDefinitionEntity(model.getDefinition()))); - + this.entityManager.persist(data); - + this.persistUsers(data.getId(), model.getUsers()); - + //this.addOwner(data); oldDescriptionTemplateEntity.setVersionStatus(DescriptionTemplateVersionStatus.Previous); this.entityManager.merge(oldDescriptionTemplateEntity); - + this.entityManager.flush(); return this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, DescriptionTemplate._id), data); } - + //endregion //region Import - + public DescriptionTemplate importXml(byte[] bytes, UUID id, String label, FieldSet fields) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, TransformerException, InvalidApplicationException, IOException, InstantiationException, IllegalAccessException, SAXException { logger.debug(new MapLogEntry("import data").And("bytes", bytes).And("fields", fields)); @@ -529,7 +584,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic persist.setLanguage(importXml.getLanguage()); persist.setType(importXml.getType()); persist.setDefinition(this.xmlDefinitionToPersist(importXml)); - this.validationService.validateForce(persist); + this.validatorFactory.validator(DescriptionTemplatePersist.DescriptionTemplatePersistValidator.class).validateForce(persist); return this.persist(persist, fields); } else { NewVersionDescriptionTemplatePersist persist = new NewVersionDescriptionTemplatePersist(); @@ -540,19 +595,21 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic persist.setLanguage(importXml.getLanguage()); persist.setDefinition(this.xmlDefinitionToPersist(importXml)); persist.setType(importXml.getType()); - + DescriptionTemplateEntity oldDescriptionTemplateEntity = this.entityManager.find(DescriptionTemplateEntity.class, id); - if (oldDescriptionTemplateEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (oldDescriptionTemplateEntity == null) + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); persist.setHash(this.conventionService.hashValue(oldDescriptionTemplateEntity.getUpdatedAt())); - this.validationService.validateForce(persist); + this.validatorFactory.validator(DescriptionTemplatePersist.DescriptionTemplatePersistValidator.class).validateForce(persist); return this.createNewVersion(persist, fields); } } - public DefinitionPersist xmlDefinitionToPersist(DescriptionTemplateImportExport importExport){ + public DefinitionPersist xmlDefinitionToPersist(DescriptionTemplateImportExport importExport) { DefinitionPersist definitionPersist = new DefinitionPersist(); - if(importExport == null) return null; - + if (importExport == null) + return null; + List pagesDatasetEntity = new LinkedList<>(); List sectionDatasetEntity = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(importExport.getPages())) { @@ -570,8 +627,8 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return definitionPersist; } - - public PagePersist xmlPageToPersist(PageImportExport importExport){ + + public PagePersist xmlPageToPersist(PageImportExport importExport) { PagePersist pageEntity = new PagePersist(); pageEntity.setId(importExport.getId()); pageEntity.setOrdinal(importExport.getOrdinal()); @@ -594,7 +651,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic sectionEntity.setPage(importExport.getPage()); sectionEntity.setDescription(importExport.getDescription()); List fieldSetEntity = new LinkedList<>(); - if(!this.conventionService.isListNullOrEmpty(importExport.getFieldSets())) { + if (!this.conventionService.isListNullOrEmpty(importExport.getFieldSets())) { for (FieldSetImportExport xmlFieldSet : importExport.getFieldSets()) { fieldSetEntity.add(this.toFieldSetModel(xmlFieldSet)); } @@ -606,7 +663,6 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return sectionEntity; } - public FieldSetPersist toFieldSetModel(FieldSetImportExport importExport) { FieldSetPersist fieldSet1Entity = new FieldSetPersist(); fieldSet1Entity.setId(importExport.getId()); @@ -619,7 +675,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic fieldSet1Entity.setAdditionalInformation(importExport.getAdditionalInformation()); List fieldsEntity = new LinkedList<>(); - if (!this.conventionService.isListNullOrEmpty(importExport.getFields())){ + if (!this.conventionService.isListNullOrEmpty(importExport.getFields())) { for (FieldImportExport xmlField : importExport.getFields()) { fieldsEntity.add(this.xmlFieldToPersist(xmlField)); } @@ -628,15 +684,14 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return fieldSet1Entity; } - public FieldPersist xmlFieldToPersist(FieldImportExport importExport) { - FieldPersist fieldEntity = new FieldPersist(); + FieldPersist fieldEntity = new FieldPersist(); fieldEntity.setId(importExport.getId()); fieldEntity.setOrdinal(importExport.getOrdinal()); fieldEntity.setValidations(importExport.getValidations()); fieldEntity.setDefaultValue(importExport.getDefaultValue()); List rulePersists = new ArrayList<>(); - if(importExport.getVisibilityRules() !=null) { + if (importExport.getVisibilityRules() != null) { for (RuleImportExport xmlRule : importExport.getVisibilityRules()) { rulePersists.add(this.toRuleModel(xmlRule)); } @@ -652,14 +707,13 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return fieldEntity; } - public RulePersist toRuleModel(RuleImportExport importExport){ + public RulePersist toRuleModel(RuleImportExport importExport) { RulePersist ruleEntity = new RulePersist(); ruleEntity.setTarget(importExport.getTarget()); ruleEntity.setValue(importExport.getValue()); return ruleEntity; } - public MultiplicityPersist xmlMultiplicityToPersist(MultiplicityImportXml importXml) { MultiplicityPersist multiplicityEntity = new MultiplicityPersist(); multiplicityEntity.setMax(importXml.getMax()); @@ -668,9 +722,9 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic multiplicityEntity.setTableView(importXml.getTableView()); return multiplicityEntity; } - + //endregion - + //region Export @Override @@ -679,20 +733,21 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic this.authorizationService.authorizeForce(Permission.ExportDescriptionTemplate); DescriptionTemplateEntity data = this.entityManager.find(DescriptionTemplateEntity.class, id); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); DefinitionEntity definition = this.xmlHandlingService.fromXml(DefinitionEntity.class, data.getDefinition()); String xml = this.xmlHandlingService.toXml(this.definitionXmlToExport(data, definition)); return this.responseUtilsService.buildResponseFileFromText(xml, data.getLabel() + ".xml"); } - private DescriptionTemplateImportExport definitionXmlToExport(DescriptionTemplateEntity data, DefinitionEntity entity){ + private DescriptionTemplateImportExport definitionXmlToExport(DescriptionTemplateEntity data, DefinitionEntity entity) { DescriptionTemplateImportExport xml = new DescriptionTemplateImportExport(); xml.setType(data.getTypeId()); xml.setLanguage(data.getLanguage()); xml.setDescription(data.getDescription()); List pagesDatasetEntity = new LinkedList<>(); - for (PageEntity xmlPage: entity.getPages()) { + for (PageEntity xmlPage : entity.getPages()) { pagesDatasetEntity.add(this.pageXmlToExport(xmlPage, entity.getSections())); } xml.setPages(pagesDatasetEntity); @@ -700,7 +755,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return xml; } - private PageImportExport pageXmlToExport(PageEntity entity, List sectionEntities){ + private PageImportExport pageXmlToExport(PageEntity entity, List sectionEntities) { PageImportExport xml = new PageImportExport(); xml.setId(entity.getId()); xml.setOrdinal(entity.getOrdinal()); @@ -714,7 +769,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic } } xml.setSections(sectionsListEntity); - + return xml; } @@ -728,14 +783,14 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic } } xml.setSections(sectionsListEntity); - + xml.setId(entity.getId()); xml.setOrdinal(entity.getOrdinal()); xml.setTitle(entity.getTitle()); xml.setPage(entity.getPage()); xml.setDescription(entity.getDescription()); List fieldSetEntity = new LinkedList<>(); - if(!this.conventionService.isListNullOrEmpty(entity.getFieldSets())) { + if (!this.conventionService.isListNullOrEmpty(entity.getFieldSets())) { for (FieldSetEntity xmlFieldSet : entity.getFieldSets()) { fieldSetEntity.add(this.fieldSetXmlToExport(xmlFieldSet)); } @@ -746,7 +801,6 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return xml; } - private FieldSetImportExport fieldSetXmlToExport(FieldSetEntity entity) { FieldSetImportExport fieldSet1Entity = new FieldSetImportExport(); fieldSet1Entity.setId(entity.getId()); @@ -759,7 +813,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic fieldSet1Entity.setAdditionalInformation(entity.getAdditionalInformation()); List fieldsEntity = new LinkedList<>(); - if (entity.getFields() != null){ + if (entity.getFields() != null) { for (FieldEntity xmlField : entity.getFields()) { fieldsEntity.add(this.fieldXmlToExport(xmlField)); } @@ -768,15 +822,14 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return fieldSet1Entity; } - private FieldImportExport fieldXmlToExport(FieldEntity entity) { - FieldImportExport xml = new FieldImportExport(); + FieldImportExport xml = new FieldImportExport(); xml.setId(entity.getId()); xml.setOrdinal(entity.getOrdinal()); xml.setValidations(entity.getValidations()); xml.setDefaultValue(entity.getDefaultValue()); List rulePersists = new ArrayList<>(); - if(!this.conventionService.isListNullOrEmpty(entity.getVisibilityRules())) { + if (!this.conventionService.isListNullOrEmpty(entity.getVisibilityRules())) { for (RuleEntity xmlRule : entity.getVisibilityRules()) { rulePersists.add(this.toRuleModel(xmlRule)); } @@ -792,14 +845,13 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return xml; } - private RuleImportExport toRuleModel(RuleEntity entity){ + private RuleImportExport toRuleModel(RuleEntity entity) { RuleImportExport xml = new RuleImportExport(); xml.setTarget(entity.getTarget()); xml.setValue(entity.getValue()); return xml; } - private MultiplicityImportXml multiplicityXmlToExport(MultiplicityEntity entity) { MultiplicityImportXml xml = new MultiplicityImportXml(); xml.setMax(entity.getMax()); @@ -808,25 +860,25 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic xml.setTableView(entity.getTableView()); return xml; } - + //endregion - + //region @Override public List getSemantics(String query) throws IOException { List semantics = this.getSemantics(); List filteredSemantics = semantics.stream().map(Semantic::getName).collect(Collectors.toList()); - if(query != null && !query.isEmpty()){ + if (query != null && !query.isEmpty()) { filteredSemantics = semantics.stream().filter(x -> x.getCategory().contains(query) || x.getName().contains(query)).map(Semantic::getName).collect(Collectors.toList()); } return filteredSemantics; } - + @Override public List getSemantics() throws IOException { this.authorizationService.authorizeForce(Permission.BrowseDescriptionTemplate); - + if (semantics == null) { semantics = new ArrayList<>(); this.loadSemantics(); @@ -840,13 +892,12 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic try { String json = new String(bytes, StandardCharsets.UTF_8); semantics = List.of(jsonHandlingService.fromJson(Semantic[].class, json)); - } - catch (IOException e) { + } catch (IOException e) { logger.error(e.getMessage(), e); } } } - + //endregion } diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/dmpblueprint/DmpBlueprintServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/dmpblueprint/DmpBlueprintServiceImpl.java index 782473a2e..23da2dad3 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/dmpblueprint/DmpBlueprintServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/dmpblueprint/DmpBlueprintServiceImpl.java @@ -4,9 +4,13 @@ import com.fasterxml.jackson.core.JsonProcessingException; import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.authorization.Permission; import eu.eudat.commons.XmlHandlingService; -import eu.eudat.commons.enums.*; +import eu.eudat.commons.enums.DmpBlueprintFieldCategory; +import eu.eudat.commons.enums.DmpBlueprintStatus; +import eu.eudat.commons.enums.DmpBlueprintSystemFieldType; +import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.types.dmpblueprint.*; import eu.eudat.commons.types.dmpblueprint.importexport.*; +import eu.eudat.commons.validation.ValidatorFactory; import eu.eudat.convention.ConventionService; import eu.eudat.data.DmpBlueprintEntity; import eu.eudat.errorcode.ErrorThesaurusProperties; @@ -33,7 +37,6 @@ import gr.cite.tools.fieldset.BaseFieldSet; import gr.cite.tools.fieldset.FieldSet; import gr.cite.tools.logging.LoggerService; import gr.cite.tools.logging.MapLogEntry; -import gr.cite.tools.validation.ValidationService; import jakarta.persistence.EntityManager; import jakarta.xml.bind.JAXBException; import org.jetbrains.annotations.NotNull; @@ -70,13 +73,19 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { private final BuilderFactory builderFactory; private final ConventionService conventionService; + private final MessageSource messageSource; + private final QueryFactory queryFactory; + private final ResponseUtilsService responseUtilsService; + private final XmlHandlingService xmlHandlingService; + private final ErrorThesaurusProperties errors; - private final ValidationService validationService; - + + private final ValidatorFactory validatorFactory; + @Autowired public DmpBlueprintServiceImpl( EntityManager entityManager, @@ -85,10 +94,10 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { BuilderFactory builderFactory, ConventionService conventionService, MessageSource messageSource, QueryFactory queryFactory, - ResponseUtilsService responseUtilsService, + ResponseUtilsService responseUtilsService, XmlHandlingService xmlHandlingService, - ErrorThesaurusProperties errors, - ValidationService validationService) { + ErrorThesaurusProperties errors, + ValidatorFactory validatorFactory) { this.entityManager = entityManager; this.authorizationService = authorizationService; this.deleterFactory = deleterFactory; @@ -99,7 +108,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { this.responseUtilsService = responseUtilsService; this.xmlHandlingService = xmlHandlingService; this.errors = errors; - this.validationService = validationService; + this.validatorFactory = validatorFactory; } //region Persist @@ -114,8 +123,10 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { DmpBlueprintEntity data; if (isUpdate) { data = this.entityManager.find(DmpBlueprintEntity.class, model.getId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); - if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); + if (data == null) + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) + throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); } else { data = new DmpBlueprintEntity(); data.setId(UUID.randomUUID()); @@ -127,46 +138,51 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { data.setStatus(model.getStatus()); data.setUpdatedAt(Instant.now()); data.setDefinition(this.xmlHandlingService.toXml(this.buildDefinitionEntity(model.getDefinition()))); - - if (isUpdate) this.entityManager.merge(data); - else this.entityManager.persist(data); + + if (isUpdate) + this.entityManager.merge(data); + else + this.entityManager.persist(data); this.entityManager.flush(); return this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, DmpBlueprint._id), data); } - - private @NotNull DefinitionEntity buildDefinitionEntity(DefinitionPersist persist){ + + private @NotNull DefinitionEntity buildDefinitionEntity(DefinitionPersist persist) { DefinitionEntity data = new DefinitionEntity(); - if (persist == null) return data; - if (!this.conventionService.isListNullOrEmpty(persist.getSections())){ + if (persist == null) + return data; + if (!this.conventionService.isListNullOrEmpty(persist.getSections())) { data.setSections(new ArrayList<>()); - for (SectionPersist sectionPersist: persist.getSections()) { + for (SectionPersist sectionPersist : persist.getSections()) { data.getSections().add(this.buildSectionEntity(sectionPersist)); } } - + return data; } - private @NotNull SectionEntity buildSectionEntity(SectionPersist persist){ + + private @NotNull SectionEntity buildSectionEntity(SectionPersist persist) { SectionEntity data = new SectionEntity(); - if (persist == null) return data; + if (persist == null) + return data; data.setId(persist.getId()); data.setDescription(persist.getDescription()); data.setLabel(persist.getLabel()); data.setOrdinal(persist.getOrdinal()); data.setHasTemplates(persist.getHasTemplates()); - if (!this.conventionService.isListNullOrEmpty(persist.getFields())){ + if (!this.conventionService.isListNullOrEmpty(persist.getFields())) { data.setFields(new ArrayList<>()); - for (FieldPersist fieldPersist: persist.getFields()) { + for (FieldPersist fieldPersist : persist.getFields()) { data.getFields().add(this.buildExtraFieldEntity(fieldPersist)); } } - if (!this.conventionService.isListNullOrEmpty(persist.getDescriptionTemplates())){ + if (!this.conventionService.isListNullOrEmpty(persist.getDescriptionTemplates())) { data.setDescriptionTemplates(new ArrayList<>()); - for (DescriptionTemplatePersist descriptionTemplatePersist: persist.getDescriptionTemplates()) { + for (DescriptionTemplatePersist descriptionTemplatePersist : persist.getDescriptionTemplates()) { data.getDescriptionTemplates().add(this.buildDescriptionTemplateEntity(descriptionTemplatePersist)); } } @@ -174,9 +190,10 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return data; } - private @NotNull DescriptionTemplateEntity buildDescriptionTemplateEntity(DescriptionTemplatePersist persist){ + private @NotNull DescriptionTemplateEntity buildDescriptionTemplateEntity(DescriptionTemplatePersist persist) { DescriptionTemplateEntity data = new DescriptionTemplateEntity(); - if (persist == null) return data; + if (persist == null) + return data; data.setId(persist.getId()); data.setDescriptionTemplateId(persist.getDescriptionTemplateId()); @@ -187,16 +204,17 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return data; } - private @NotNull FieldEntity buildExtraFieldEntity(FieldPersist persist){ - if (persist == null) return new ExtraFieldEntity(); + private @NotNull FieldEntity buildExtraFieldEntity(FieldPersist persist) { + if (persist == null) + return new ExtraFieldEntity(); FieldEntity data; - if (DmpBlueprintFieldCategory.Extra.equals(persist.getCategory())){ + if (DmpBlueprintFieldCategory.Extra.equals(persist.getCategory())) { ExtraFieldEntity dataTyped = new ExtraFieldEntity(); - dataTyped.setType(((ExtraFieldPersist)persist).getDataType()); + dataTyped.setType(((ExtraFieldPersist) persist).getDataType()); data = dataTyped; } else { SystemFieldEntity dataTyped = new SystemFieldEntity(); - dataTyped.setType(((SystemFieldPersist)persist).getSystemFieldType()); + dataTyped.setType(((SystemFieldPersist) persist).getSystemFieldType()); data = dataTyped; } data.setId(persist.getId()); @@ -213,7 +231,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { //endregion //region Delete - + public void deleteAndSave(UUID id) throws MyForbiddenException, InvalidApplicationException { logger.debug("deleting : {}", id); @@ -223,20 +241,22 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { } //endregion - + //region FieldInBlueprint public boolean fieldInBlueprint(DmpBlueprintEntity dmpBlueprintEntity, DmpBlueprintSystemFieldType type) { DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(DefinitionEntity.class, dmpBlueprintEntity.getDefinition()); - if (definition == null || definition.getSections() == null) return false; - - for(SectionEntity section: definition.getSections()){ - if (section.getFields() == null) continue; - for(FieldEntity field: section.getFields()){ - if(field.getCategory().equals(DmpBlueprintFieldCategory.System)){ - SystemFieldEntity systemField = (SystemFieldEntity)field; - if(systemField.getType().equals(type)){ + if (definition == null || definition.getSections() == null) + return false; + + for (SectionEntity section : definition.getSections()) { + if (section.getFields() == null) + continue; + for (FieldEntity field : section.getFields()) { + if (field.getCategory().equals(DmpBlueprintFieldCategory.System)) { + SystemFieldEntity systemField = (SystemFieldEntity) field; + if (systemField.getType().equals(type)) { return true; } } @@ -245,9 +265,10 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return false; } - public boolean fieldInBlueprint(UUID id, DmpBlueprintSystemFieldType type) { + public boolean fieldInBlueprint(UUID id, DmpBlueprintSystemFieldType type) { DmpBlueprintEntity data = this.entityManager.find(DmpBlueprintEntity.class, id); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); return this.fieldInBlueprint(data, type); } @@ -262,71 +283,78 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { DmpBlueprintQuery query = this.queryFactory.query(DmpBlueprintQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); DmpBlueprint model = this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(fields, query.firstAs(fields)); - if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (model == null) + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); model.setLabel(model.getLabel() + " new "); model.setId(null); model.setHash(null); model.setStatus(DmpBlueprintStatus.Draft); this.reassignDefinition(model.getDefinition()); - + return model; } - - private void reassignDefinition(Definition model){ - if (model == null) return; - - if (model.getSections() != null){ + + private void reassignDefinition(Definition model) { + if (model == null) + return; + + if (model.getSections() != null) { for (Section section : model.getSections()) { this.reassignSection(section); } } } - private void reassignSection(Section model){ - if (model == null) return; + private void reassignSection(Section model) { + if (model == null) + return; model.setId(UUID.randomUUID()); - if (model.getFields() != null){ + if (model.getFields() != null) { for (Field field : model.getFields()) { this.reassignField(field); } } - if (model.getDescriptionTemplates() != null){ + if (model.getDescriptionTemplates() != null) { for (DescriptionTemplate descriptionTemplate : model.getDescriptionTemplates()) { this.reassignDescriptionTemplate(descriptionTemplate); } } } - private void reassignField(Field model){ - if (model == null) return; + private void reassignField(Field model) { + if (model == null) + return; model.setId(UUID.randomUUID()); } - private void reassignDescriptionTemplate(DescriptionTemplate model){ - if (model == null) return; + private void reassignDescriptionTemplate(DescriptionTemplate model) { + if (model == null) + return; model.setId(UUID.randomUUID()); } //endregion - + //region Export - + public ResponseEntity exportXml(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, TransformerException, InvalidApplicationException { logger.debug(new MapLogEntry("persisting data").And("id", id)); this.authorizationService.authorizeForce(Permission.ExportDmpBlueprint); DmpBlueprintEntity data = this.entityManager.find(DmpBlueprintEntity.class, id); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) + throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); DefinitionEntity dmpDefinition = this.xmlHandlingService.fromXml(DefinitionEntity.class, data.getDefinition()); String xml = this.xmlHandlingService.toXml(this.definitionXmlToExport(dmpDefinition)); return this.responseUtilsService.buildResponseFileFromText(xml, data.getLabel() + ".xml"); } - private DefinitionImportExport definitionXmlToExport(DefinitionEntity entity){ - if (entity == null) return null; + private DefinitionImportExport definitionXmlToExport(DefinitionEntity entity) { + if (entity == null) + return null; DefinitionImportExport xml = new DefinitionImportExport(); List dmpBlueprintSections = new ArrayList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getSections())) { @@ -347,19 +375,19 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { xml.setHasTemplates(entity.getHasTemplates()); List dmpBlueprintSystemFieldModels = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getFields())) { - for (SystemFieldEntity systemField : entity.getFields().stream().filter(x-> x.getCategory() == DmpBlueprintFieldCategory.System).map(x-> (SystemFieldEntity)x).toList()) { + for (SystemFieldEntity systemField : entity.getFields().stream().filter(x -> x.getCategory() == DmpBlueprintFieldCategory.System).map(x -> (SystemFieldEntity) x).toList()) { dmpBlueprintSystemFieldModels.add(this.systemFieldXmlToExport(systemField)); } } xml.setSystemFields(dmpBlueprintSystemFieldModels); List dmpBlueprintExtraFieldModels = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getFields())) { - for (ExtraFieldEntity systemField : entity.getFields().stream().filter(x-> x.getCategory() == DmpBlueprintFieldCategory.Extra).map(x-> (ExtraFieldEntity)x).toList()) { + for (ExtraFieldEntity systemField : entity.getFields().stream().filter(x -> x.getCategory() == DmpBlueprintFieldCategory.Extra).map(x -> (ExtraFieldEntity) x).toList()) { dmpBlueprintExtraFieldModels.add(this.extraFieldXmlToExport(systemField)); } } xml.setExtraFields(dmpBlueprintExtraFieldModels); - + List dmpBlueprintDescriptionTemplates = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getDescriptionTemplates())) { for (DescriptionTemplateEntity descriptionTemplate : entity.getDescriptionTemplates()) { @@ -404,11 +432,10 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return xml; } - //endregion - + //region Import - + public DmpBlueprint importXml(byte[] bytes, String label, FieldSet fields) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, TransformerException, InvalidApplicationException, IOException, InstantiationException, IllegalAccessException, SAXException { logger.debug(new MapLogEntry("import data").And("bytes", bytes).And("label", label).And("fields", fields)); @@ -418,16 +445,18 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { persist.setLabel(label); persist.setStatus(DmpBlueprintStatus.Draft); - - BlueprintImportExport dmpDefinition = this.xmlHandlingService.fromXml(BlueprintImportExport.class, new String(bytes, StandardCharsets.UTF_8)); - if(dmpDefinition != null) persist.setDefinition(this.xmlDefinitionToPersist(dmpDefinition.getDmpBlueprintDefinition())); - this.validationService.validateForce(persist); + BlueprintImportExport dmpDefinition = this.xmlHandlingService.fromXml(BlueprintImportExport.class, new String(bytes, StandardCharsets.UTF_8)); + if (dmpDefinition != null) + persist.setDefinition(this.xmlDefinitionToPersist(dmpDefinition.getDmpBlueprintDefinition())); + + this.validatorFactory.validator(DmpBlueprintPersist.DmpBlueprintPersistValidator.class).validateForce(persist); return this.persist(persist, fields); } - - private DefinitionPersist xmlDefinitionToPersist(DefinitionImportExport importXml){ - if (importXml == null) return null; + + private DefinitionPersist xmlDefinitionToPersist(DefinitionImportExport importXml) { + if (importXml == null) + return null; DefinitionPersist persist = new DefinitionPersist(); List dmpBlueprintSections = new ArrayList<>(); if (!this.conventionService.isListNullOrEmpty(importXml.getSections())) { @@ -503,7 +532,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { persist.setRequired(importXml.isRequired()); return persist; } - + //endregion }