Resolving issues with validators, removing old validation methods

This commit is contained in:
Thomas Georgios Giannos 2024-01-05 13:32:38 +02:00
parent 7ba374d844
commit 897d099c2c
28 changed files with 461 additions and 606 deletions

View File

@ -1,11 +0,0 @@
package eu.eudat.commons.validation.old;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class EnumNotNull implements ConstraintValidator<ValidEnum,Object> {
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
return value != null;
}
}

View File

@ -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<? extends Payload>[] payload() default {};
}

View File

@ -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<FieldNotNullIfOtherSet, Object> {
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;
}
}

View File

@ -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<? extends Payload>[] payload() default {};
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@interface List {
FieldsValueMatch[] value();
}
}

View File

@ -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<FieldsValueMatch, Object> {
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;
}
}
}

View File

@ -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<? extends Payload>[] payload() default {};
String[] fieldNames();
}

View File

@ -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<RequiredOneField, Object> {
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;
}
}
}

View File

@ -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<? extends Payload>[] payload() default {};
}

View File

@ -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<? extends Payload>[] payload() default {};
}

View File

@ -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<ValidId, Object> {
@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);
}
}
}

View File

@ -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 <T> void validateForce(T item, Class<?>... groups) {
List<Map.Entry<String, List<String>>> validationErrors = this.validate(item, groups);
if (validationErrors != null && !validationErrors.isEmpty()) {
throw new MyValidationException(this.errors.getModelValidation().getCode(),
this.errors.getModelValidation().getMessage(),
validationErrors);
}
}
}

View File

@ -1,15 +1,14 @@
package eu.eudat.integrationevent.outbox.notification; package eu.eudat.integrationevent.outbox.notification;
import eu.eudat.audit.AuditableAction; import eu.eudat.audit.AuditableAction;
import eu.eudat.commons.enums.ContactInfoType; import eu.eudat.commons.enums.ContactInfoType;
import eu.eudat.commons.enums.notification.NotificationContactType; import eu.eudat.commons.enums.notification.NotificationContactType;
import eu.eudat.commons.enums.notification.NotificationNotifyState; import eu.eudat.commons.enums.notification.NotificationNotifyState;
import eu.eudat.commons.enums.notification.NotificationTrackingProcess; import eu.eudat.commons.enums.notification.NotificationTrackingProcess;
import eu.eudat.commons.enums.notification.NotificationTrackingState; import eu.eudat.commons.enums.notification.NotificationTrackingState;
import eu.eudat.commons.validation.ValidatorFactory;
import eu.eudat.data.UserContactInfoEntity; import eu.eudat.data.UserContactInfoEntity;
import eu.eudat.data.UserEntity; import eu.eudat.data.UserEntity;
import eu.eudat.integrationevent.outbox.OutboxIntegrationEvent;
import eu.eudat.integrationevent.outbox.OutboxService; import eu.eudat.integrationevent.outbox.OutboxService;
import eu.eudat.model.persist.notification.NotificationPersist; import eu.eudat.model.persist.notification.NotificationPersist;
import eu.eudat.query.UserContactInfoQuery; 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.data.query.QueryFactory;
import gr.cite.tools.exception.MyApplicationException; import gr.cite.tools.exception.MyApplicationException;
import gr.cite.tools.logging.LoggerService; import gr.cite.tools.logging.LoggerService;
import gr.cite.tools.validation.ValidationService;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -28,28 +26,32 @@ import org.springframework.web.context.annotation.RequestScope;
import javax.management.InvalidApplicationException; import javax.management.InvalidApplicationException;
import java.time.Instant; import java.time.Instant;
import java.util.List; import java.util.List;
import java.util.UUID;
@Component @Component
@RequestScope @RequestScope
public class NotificationIntegrationEventHandlerImpl implements NotificationIntegrationEventHandler { public class NotificationIntegrationEventHandlerImpl implements NotificationIntegrationEventHandler {
private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(NotificationIntegrationEventHandlerImpl.class)); private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(NotificationIntegrationEventHandlerImpl.class));
private final NotificationService notificationService; private final NotificationService notificationService;
private final ValidationService validationService;
private final QueryFactory queryFactory; private final QueryFactory queryFactory;
private final AuditService auditService; private final AuditService auditService;
private final OutboxService outboxService; private final OutboxService outboxService;
private final ValidatorFactory validatorFactory;
@Autowired @Autowired
public NotificationIntegrationEventHandlerImpl( public NotificationIntegrationEventHandlerImpl(
OutboxService outboxService, OutboxService outboxService,
NotificationService notificationService, NotificationService notificationService,
ValidationService validationService,
QueryFactory queryFactory, QueryFactory queryFactory,
AuditService auditService) { AuditService auditService, ValidatorFactory validatorFactory) {
this.outboxService = outboxService; this.outboxService = outboxService;
this.notificationService = notificationService; this.notificationService = notificationService;
this.validationService = validationService; this.validatorFactory = validatorFactory;
this.queryFactory = queryFactory; this.queryFactory = queryFactory;
this.auditService = auditService; this.auditService = auditService;
} }
@ -75,7 +77,7 @@ public class NotificationIntegrationEventHandlerImpl implements NotificationInte
persist.setTrackingData(null); persist.setTrackingData(null);
persist.setProvenanceRef(event.getProvenanceRef()); persist.setProvenanceRef(event.getProvenanceRef());
persist.setNotifiedAt(Instant.now()); persist.setNotifiedAt(Instant.now());
//validationService.validateForce(persist); //TODO validatorFactory.validator(NotificationPersist.NotificationPersistValidator.class).validateForce(persist);
if (isNotificationConsistent(persist)) { if (isNotificationConsistent(persist)) {
notificationService.persist(persist, null); notificationService.persist(persist, null);
auditService.track(AuditableAction.Notification_Persist, "notification_event", event); auditService.track(AuditableAction.Notification_Persist, "notification_event", event);
@ -83,20 +85,23 @@ public class NotificationIntegrationEventHandlerImpl implements NotificationInte
} }
private boolean isNotificationConsistent(NotificationPersist notification) { private boolean isNotificationConsistent(NotificationPersist notification) {
switch (notification.getContactTypeHint()){ switch (notification.getContactTypeHint()) {
case IN_APP:{ case IN_APP: {
if (notification.getUserId() == null) return false; if (notification.getUserId() == null)
return false;
List<UserEntity> users = this.queryFactory.query(UserQuery.class).ids(notification.getUserId()).collect(); List<UserEntity> users = this.queryFactory.query(UserQuery.class).ids(notification.getUserId()).collect();
return users.size() > 0; return !users.isEmpty();
} }
case EMAIL:{ case EMAIL: {
if (notification.getContactHint() != null && !notification.getContactHint().isBlank()) return true; if (notification.getContactHint() != null && !notification.getContactHint().isBlank())
return true;
if (notification.getUserId() == null) return false; if (notification.getUserId() == null)
return false;
List<UserContactInfoEntity> userContactInfoEntities = this.queryFactory.query(UserContactInfoQuery.class).types(ContactInfoType.Email).userIds(notification.getUserId()).collect(); List<UserContactInfoEntity> userContactInfoEntities = this.queryFactory.query(UserContactInfoQuery.class).types(ContactInfoType.Email).userIds(notification.getUserId()).collect();
return userContactInfoEntities.size() > 0; return !userContactInfoEntities.isEmpty();
} }
default: default:
throw new MyApplicationException("invalid type " + notification.getContactTypeHint()); throw new MyApplicationException("invalid type " + notification.getContactTypeHint());

View File

@ -90,13 +90,13 @@ public class CloneDmpPersist {
.must(() -> this.isValidGuid(item.getId())) .must(() -> this.isValidGuid(item.getId()))
.failOn(CloneDmpPersist._id).failWith(messageSource.getMessage("Validation_Required", new Object[]{CloneDmpPersist._id}, LocaleContextHolder.getLocale())), .failOn(CloneDmpPersist._id).failWith(messageSource.getMessage("Validation_Required", new Object[]{CloneDmpPersist._id}, LocaleContextHolder.getLocale())),
this.spec() 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())), .failOn(CloneDmpPersist._label).failWith(messageSource.getMessage("Validation_Required", new Object[]{CloneDmpPersist._label}, LocaleContextHolder.getLocale())),
this.spec() 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())), .failOn(CloneDmpPersist._description).failWith(messageSource.getMessage("Validation_Required", new Object[]{CloneDmpPersist._description}, LocaleContextHolder.getLocale())),
this.spec() 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())) .failOn(CloneDmpPersist._descriptions).failWith(messageSource.getMessage("Validation_Required", new Object[]{CloneDmpPersist._descriptions}, LocaleContextHolder.getLocale()))
); );
} }

View File

@ -3,7 +3,6 @@ package eu.eudat.model.persist;
import eu.eudat.commons.enums.DescriptionStatus; import eu.eudat.commons.enums.DescriptionStatus;
import eu.eudat.commons.validation.BaseValidator; import eu.eudat.commons.validation.BaseValidator;
import eu.eudat.commons.validation.ValidatorFactory; import eu.eudat.commons.validation.ValidatorFactory;
import eu.eudat.commons.validation.old.FieldNotNullIfOtherSet;
import eu.eudat.commons.validation.specification.Specification; import eu.eudat.commons.validation.specification.Specification;
import eu.eudat.convention.ConventionService; import eu.eudat.convention.ConventionService;
import eu.eudat.data.DescriptionEntity; import eu.eudat.data.DescriptionEntity;
@ -19,7 +18,6 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@FieldNotNullIfOtherSet(message = "{validation.hashempty}")
public class DescriptionPersist { public class DescriptionPersist {
private UUID id; private UUID id;
@ -193,19 +191,23 @@ public class DescriptionPersist {
.must(() -> this.isValidGuid(item.getDmpId())) .must(() -> this.isValidGuid(item.getDmpId()))
.failOn(DescriptionPersist._dmpId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._dmpId}, LocaleContextHolder.getLocale())), .failOn(DescriptionPersist._dmpId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._dmpId}, LocaleContextHolder.getLocale())),
this.spec() this.spec()
.iff(() -> item.getStatus() == DescriptionStatus.Finalized)
.must(() -> this.isValidGuid(item.getDescriptionTemplateId())) .must(() -> this.isValidGuid(item.getDescriptionTemplateId()))
.failOn(DescriptionPersist._descriptionTemplateId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._descriptionTemplateId}, LocaleContextHolder.getLocale())), .failOn(DescriptionPersist._descriptionTemplateId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._descriptionTemplateId}, LocaleContextHolder.getLocale())),
this.spec() this.spec()
.iff(() -> item.getStatus() == DescriptionStatus.Finalized)
.must(() -> this.isValidGuid(item.getDmpDescriptionTemplateId())) .must(() -> this.isValidGuid(item.getDmpDescriptionTemplateId()))
.failOn(DescriptionPersist._dmpDescriptionTemplateId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._dmpDescriptionTemplateId}, LocaleContextHolder.getLocale())), .failOn(DescriptionPersist._dmpDescriptionTemplateId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._dmpDescriptionTemplateId}, LocaleContextHolder.getLocale())),
this.spec() this.spec()
.must(() -> !this.isNull(item.getStatus())) .must(() -> !this.isNull(item.getStatus()))
.failOn(DescriptionPersist._status).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._status}, LocaleContextHolder.getLocale())), .failOn(DescriptionPersist._status).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._status}, LocaleContextHolder.getLocale())),
this.spec() this.spec()
.iff(() -> item.getStatus() == DescriptionStatus.Finalized)
.must(() -> !this.isNull(item.getTags())) .must(() -> !this.isNull(item.getTags()))
.failOn(DescriptionPersist._tags).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._tags}, LocaleContextHolder.getLocale())), .failOn(DescriptionPersist._tags).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._tags}, LocaleContextHolder.getLocale())),
this.spec() this.spec()
.iff(() -> item.getStatus() == DescriptionStatus.Finalized)
.must(() -> !this.isNull(item.getProperties())) .must(() -> !this.isNull(item.getProperties()))
.failOn(DescriptionPersist._properties).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._properties}, LocaleContextHolder.getLocale())), .failOn(DescriptionPersist._properties).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._properties}, LocaleContextHolder.getLocale())),
this.refSpec() this.refSpec()
@ -214,10 +216,11 @@ public class DescriptionPersist {
.over(item.getProperties()) .over(item.getProperties())
.using(() -> this.validatorFactory.validator(PropertyDefinitionPersist.PropertyDefinitionPersistValidator.class)), .using(() -> this.validatorFactory.validator(PropertyDefinitionPersist.PropertyDefinitionPersistValidator.class)),
this.spec() this.spec()
.iff(() -> item.getStatus() == DescriptionStatus.Finalized)
.must(() -> !this.isNull(item.getReferences())) .must(() -> !this.isNull(item.getReferences()))
.failOn(DescriptionPersist._references).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._references}, LocaleContextHolder.getLocale())), .failOn(DescriptionPersist._references).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._references}, LocaleContextHolder.getLocale())),
this.navSpec() this.navSpec()
.iff(() -> !this.isNull(item.getReferences())) .iff(() -> item.getStatus() == DescriptionStatus.Finalized && !this.isNull(item.getReferences()))
.on(DescriptionPersist._references) .on(DescriptionPersist._references)
.over(item.getReferences()) .over(item.getReferences())
.using(() -> this.validatorFactory.validator(DescriptionReferencePersist.DescriptionReferencePersistValidator.class)) .using(() -> this.validatorFactory.validator(DescriptionReferencePersist.DescriptionReferencePersistValidator.class))

View File

@ -75,7 +75,7 @@ public class DescriptionStatusPersist {
protected List<Specification> specifications(DescriptionStatusPersist item) { protected List<Specification> specifications(DescriptionStatusPersist item) {
return Arrays.asList( return Arrays.asList(
this.spec() 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())), .failOn(DescriptionStatusPersist._id).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionStatusPersist._id}, LocaleContextHolder.getLocale())),
this.spec() this.spec()
.iff(() -> this.isValidGuid(item.getId())) .iff(() -> this.isValidGuid(item.getId()))

View File

@ -1,9 +1,11 @@
package eu.eudat.model.persist; package eu.eudat.model.persist;
import eu.eudat.commons.enums.DmpStatus;
import eu.eudat.commons.validation.BaseValidator; import eu.eudat.commons.validation.BaseValidator;
import eu.eudat.commons.validation.specification.Specification; import eu.eudat.commons.validation.specification.Specification;
import eu.eudat.convention.ConventionService; import eu.eudat.convention.ConventionService;
import eu.eudat.errorcode.ErrorThesaurusProperties; import eu.eudat.errorcode.ErrorThesaurusProperties;
import eu.eudat.model.persist.validation.StatusAware;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.MessageSource; import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
@ -42,12 +44,14 @@ public class DmpDescriptionTemplatePersist {
@Component(DmpDescriptionTemplatePersistValidator.ValidatorName) @Component(DmpDescriptionTemplatePersistValidator.ValidatorName)
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public static class DmpDescriptionTemplatePersistValidator extends BaseValidator<DmpDescriptionTemplatePersist> { public static class DmpDescriptionTemplatePersistValidator extends BaseValidator<DmpDescriptionTemplatePersist> implements StatusAware<DmpStatus> {
public static final String ValidatorName = "DmpDescriptionTemplatePersistValidator"; public static final String ValidatorName = "DmpDescriptionTemplatePersistValidator";
private final MessageSource messageSource; private final MessageSource messageSource;
private DmpStatus status;
protected DmpDescriptionTemplatePersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource) { protected DmpDescriptionTemplatePersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource) {
super(conventionService, errors); super(conventionService, errors);
this.messageSource = messageSource; this.messageSource = messageSource;
@ -62,13 +66,21 @@ public class DmpDescriptionTemplatePersist {
protected List<Specification> specifications(DmpDescriptionTemplatePersist item) { protected List<Specification> specifications(DmpDescriptionTemplatePersist item) {
return Arrays.asList( return Arrays.asList(
this.spec() this.spec()
.iff(() -> this.status == DmpStatus.Finalized)
.must(() -> this.isValidGuid(item.getDescriptionTemplateGroupId())) .must(() -> this.isValidGuid(item.getDescriptionTemplateGroupId()))
.failOn(DmpDescriptionTemplatePersist._descriptionTemplateGroupId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpDescriptionTemplatePersist._descriptionTemplateGroupId}, LocaleContextHolder.getLocale())), .failOn(DmpDescriptionTemplatePersist._descriptionTemplateGroupId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpDescriptionTemplatePersist._descriptionTemplateGroupId}, LocaleContextHolder.getLocale())),
this.spec() this.spec()
.iff(() -> this.status == DmpStatus.Finalized)
.must(() -> this.isValidGuid(item.getSectionId())) .must(() -> this.isValidGuid(item.getSectionId()))
.failOn(DmpDescriptionTemplatePersist._sectionId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpDescriptionTemplatePersist._sectionId}, LocaleContextHolder.getLocale())) .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;
}
} }
} }

View File

@ -4,20 +4,11 @@ import eu.eudat.commons.enums.DmpAccessType;
import eu.eudat.commons.enums.DmpStatus; import eu.eudat.commons.enums.DmpStatus;
import eu.eudat.commons.validation.BaseValidator; import eu.eudat.commons.validation.BaseValidator;
import eu.eudat.commons.validation.ValidatorFactory; 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.commons.validation.specification.Specification;
import eu.eudat.convention.ConventionService; import eu.eudat.convention.ConventionService;
import eu.eudat.data.DescriptionEntity;
import eu.eudat.data.DmpEntity; import eu.eudat.data.DmpEntity;
import eu.eudat.errorcode.ErrorThesaurusProperties; import eu.eudat.errorcode.ErrorThesaurusProperties;
import eu.eudat.model.persist.descriptionproperties.PropertyDefinitionPersist;
import eu.eudat.model.persist.dmpproperties.DmpPropertiesPersist; 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.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.MessageSource; import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
@ -197,33 +188,37 @@ public class DmpPersist {
.must(() -> !this.isNull(item.getStatus())) .must(() -> !this.isNull(item.getStatus()))
.failOn(DmpPersist._status).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._status}, LocaleContextHolder.getLocale())), .failOn(DmpPersist._status).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._status}, LocaleContextHolder.getLocale())),
this.spec() this.spec()
.iff(() -> item.getStatus() == DmpStatus.Finalized)
.must(() -> this.isValidGuid(item.getBlueprint())) .must(() -> this.isValidGuid(item.getBlueprint()))
.failOn(DmpPersist._blueprint).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._blueprint}, LocaleContextHolder.getLocale())), .failOn(DmpPersist._blueprint).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._blueprint}, LocaleContextHolder.getLocale())),
this.spec() this.spec()
.iff(() -> item.getStatus() == DmpStatus.Finalized)
.must(() -> !this.isNull(item.getProperties())) .must(() -> !this.isNull(item.getProperties()))
.failOn(DmpPersist._properties).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._properties}, LocaleContextHolder.getLocale())), .failOn(DmpPersist._properties).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._properties}, LocaleContextHolder.getLocale())),
this.refSpec() this.refSpec()
.iff(() -> !this.isNull(item.getProperties())) .iff(() -> !this.isNull(item.getProperties()))
.on(DmpPersist._properties) .on(DmpPersist._properties)
.over(item.getProperties()) .over(item.getProperties())
.using(() -> this.validatorFactory.validator(DmpPropertiesPersist.DmpPropertiesPersistValidator.class)), .using(() -> this.validatorFactory.validator(DmpPropertiesPersist.DmpPropertiesPersistValidator.class).setStatus(item.getStatus())),
this.spec() this.spec()
.iff(() -> item.getStatus() == DmpStatus.Finalized)
.must(() -> !this.isNull(item.getReferences())) .must(() -> !this.isNull(item.getReferences()))
.failOn(DmpPersist._references).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._references}, LocaleContextHolder.getLocale())), .failOn(DmpPersist._references).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._references}, LocaleContextHolder.getLocale())),
this.navSpec() this.navSpec()
.iff(() -> !this.isNull(item.getReferences())) .iff(() -> item.getStatus() == DmpStatus.Finalized && !this.isNull(item.getReferences()))
.on(DmpPersist._references) .on(DmpPersist._references)
.over(item.getReferences()) .over(item.getReferences())
.using(() -> this.validatorFactory.validator(DmpReferencePersist.DmpReferencePersistValidator.class)), .using(() -> this.validatorFactory.validator(DmpReferencePersist.DmpReferencePersistValidator.class)),
this.spec() this.spec()
.iff(() -> item.getStatus() == DmpStatus.Finalized)
.must(() -> !this.isNull(item.getDescriptionTemplates())) .must(() -> !this.isNull(item.getDescriptionTemplates()))
.failOn(DmpPersist._descriptionTemplates).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._descriptionTemplates}, LocaleContextHolder.getLocale())), .failOn(DmpPersist._descriptionTemplates).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._descriptionTemplates}, LocaleContextHolder.getLocale())),
this.navSpec() this.navSpec()
.iff(() -> !this.isNull(item.getDescriptionTemplates())) .iff(() -> !this.isNull(item.getDescriptionTemplates()))
.on(DmpPersist._descriptionTemplates) .on(DmpPersist._descriptionTemplates)
.over(item.getDescriptionTemplates()) .over(item.getDescriptionTemplates())
.using(() -> this.validatorFactory.validator(DmpDescriptionTemplatePersist.DmpDescriptionTemplatePersistValidator.class)) .using(() -> this.validatorFactory.validator(DmpDescriptionTemplatePersist.DmpDescriptionTemplatePersistValidator.class).setStatus(item.getStatus()))
); );
} }
} }

View File

@ -109,6 +109,7 @@ public class DmpReferencePersist {
.using(() -> this.validatorFactory.validator(ReferencePersist.ReferencePersistValidator.class)) .using(() -> this.validatorFactory.validator(ReferencePersist.ReferencePersistValidator.class))
); );
} }
} }
} }

View File

@ -63,7 +63,7 @@ public class DmpUserInviteTypePersist {
return Arrays.asList( return Arrays.asList(
this.spec() this.spec()
.iff(() -> this.isEmpty(item.getEmail())) .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())), .failOn(DmpUserInviteTypePersist._userId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpUserInviteTypePersist._userId}, LocaleContextHolder.getLocale())),
this.spec() this.spec()
.iff(() -> !this.isValidGuid(item.getUserId())) .iff(() -> !this.isValidGuid(item.getUserId()))

View File

@ -63,7 +63,7 @@ public class DmpUserPersist {
protected List<Specification> specifications(DmpUserPersist item) { protected List<Specification> specifications(DmpUserPersist item) {
return Arrays.asList( return Arrays.asList(
this.spec() 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())), .failOn(DmpUserPersist._user).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpUserPersist._user}, LocaleContextHolder.getLocale())),
this.spec() this.spec()
.must(() -> !this.isNull(item.getRole())) .must(() -> !this.isNull(item.getRole()))

View File

@ -119,7 +119,7 @@ public class NewVersionDmpPersist {
.must(() -> !this.isEmpty(item.getDescription())) .must(() -> !this.isEmpty(item.getDescription()))
.failOn(NewVersionDmpPersist._description).failWith(messageSource.getMessage("Validation_Required", new Object[]{NewVersionDmpPersist._description}, LocaleContextHolder.getLocale())), .failOn(NewVersionDmpPersist._description).failWith(messageSource.getMessage("Validation_Required", new Object[]{NewVersionDmpPersist._description}, LocaleContextHolder.getLocale())),
this.spec() 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())), .failOn(NewVersionDmpPersist._blueprintId).failWith(messageSource.getMessage("Validation_Required", new Object[]{NewVersionDmpPersist._blueprintId}, LocaleContextHolder.getLocale())),
this.spec() this.spec()
.must(() -> !this.isNull(item.getDescriptions())) .must(() -> !this.isNull(item.getDescriptions()))

View File

@ -86,7 +86,7 @@ public class DepositRequest {
.must(() -> !this.isEmpty(item.getRepositoryId())) .must(() -> !this.isEmpty(item.getRepositoryId()))
.failOn(DepositRequest._repositoryId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DepositRequest._repositoryId}, LocaleContextHolder.getLocale())), .failOn(DepositRequest._repositoryId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DepositRequest._repositoryId}, LocaleContextHolder.getLocale())),
this.spec() 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())) .failOn(DepositRequest._dmpId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DepositRequest._dmpId}, LocaleContextHolder.getLocale()))
); );
} }

View File

@ -1,10 +1,13 @@
package eu.eudat.model.persist.dmpproperties; package eu.eudat.model.persist.dmpproperties;
import eu.eudat.commons.enums.DmpStatus;
import eu.eudat.commons.validation.BaseValidator; import eu.eudat.commons.validation.BaseValidator;
import eu.eudat.commons.validation.ValidatorFactory; import eu.eudat.commons.validation.ValidatorFactory;
import eu.eudat.commons.validation.specification.Specification; import eu.eudat.commons.validation.specification.Specification;
import eu.eudat.convention.ConventionService; import eu.eudat.convention.ConventionService;
import eu.eudat.errorcode.ErrorThesaurusProperties; 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.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -40,12 +43,14 @@ public class DmpPropertiesPersist {
@Component(DmpPropertiesPersistValidator.ValidatorName) @Component(DmpPropertiesPersistValidator.ValidatorName)
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public static class DmpPropertiesPersistValidator extends BaseValidator<DmpPropertiesPersist> { public static class DmpPropertiesPersistValidator extends BaseValidator<DmpPropertiesPersist> implements StatusAware<DmpStatus> {
public static final String ValidatorName = "DmpPropertiesPersistValidator"; public static final String ValidatorName = "DmpPropertiesPersistValidator";
private final ValidatorFactory validatorFactory; private final ValidatorFactory validatorFactory;
private DmpStatus status;
protected DmpPropertiesPersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, ValidatorFactory validatorFactory) { protected DmpPropertiesPersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, ValidatorFactory validatorFactory) {
super(conventionService, errors); super(conventionService, errors);
this.validatorFactory = validatorFactory; this.validatorFactory = validatorFactory;
@ -60,17 +65,24 @@ public class DmpPropertiesPersist {
protected List<Specification> specifications(DmpPropertiesPersist item) { protected List<Specification> specifications(DmpPropertiesPersist item) {
return Arrays.asList( return Arrays.asList(
this.refSpec() this.refSpec()
.iff(() -> !this.isNull(item.getDmpBlueprintValues())) .iff(() -> this.status == DmpStatus.Finalized && !this.isNull(item.getDmpBlueprintValues()))
.on(DmpPropertiesPersist._dmpBlueprintValues) .on(DmpPropertiesPersist._dmpBlueprintValues)
.over(item.getDmpBlueprintValues()) .over(item.getDmpBlueprintValues())
.using(() -> this.validatorFactory.validator(DmpBlueprintValuePersist.DmpBlueprintValuePersistValidator.class)), .using(() -> this.validatorFactory.validator(DmpBlueprintValuePersist.DmpBlueprintValuePersistValidator.class)),
this.refSpec() this.refSpec()
.iff(() -> !this.isNull(item.getContacts())) .iff(() -> this.status == DmpStatus.Finalized && !this.isNull(item.getContacts()))
.on(DmpPropertiesPersist._contacts) .on(DmpPropertiesPersist._contacts)
.over(item.getContacts()) .over(item.getContacts())
.using(() -> this.validatorFactory.validator(DmpContactPersist.DmpContactPersistValidator.class)) .using(() -> this.validatorFactory.validator(DmpContactPersist.DmpContactPersistValidator.class))
); );
} }
@Override
public DmpPropertiesPersistValidator setStatus(DmpStatus status) {
this.status = status;
return this;
}
} }
} }

View File

@ -4,23 +4,29 @@ import eu.eudat.commons.enums.notification.NotificationContactType;
import eu.eudat.commons.enums.notification.NotificationNotifyState; import eu.eudat.commons.enums.notification.NotificationNotifyState;
import eu.eudat.commons.enums.notification.NotificationTrackingProcess; import eu.eudat.commons.enums.notification.NotificationTrackingProcess;
import eu.eudat.commons.enums.notification.NotificationTrackingState; import eu.eudat.commons.enums.notification.NotificationTrackingState;
import eu.eudat.commons.validation.old.FieldNotNullIfOtherSet; import eu.eudat.commons.validation.BaseValidator;
import eu.eudat.commons.validation.old.ValidId; import eu.eudat.commons.validation.specification.Specification;
import jakarta.validation.constraints.NotNull; 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.time.Instant;
import java.util.Arrays;
import java.util.List;
import java.util.UUID; import java.util.UUID;
@FieldNotNullIfOtherSet(message = "{validation.hashempty}")
public class NotificationPersist { public class NotificationPersist {
@ValidId(message = "{validation.invalidid}")
private UUID id; private UUID id;
@NotNull(message = "{validation.empty}")
private UUID userId; private UUID userId;
public static final String _userId = "userId";
private UUID type; private UUID type;
private NotificationContactType contactTypeHint; private NotificationContactType contactTypeHint;
@ -47,6 +53,8 @@ public class NotificationPersist {
private String hash; private String hash;
public static final String _hash = "hash";
public UUID getId() { public UUID getId() {
return id; return id;
} }
@ -166,4 +174,41 @@ public class NotificationPersist {
public void setHash(String hash) { public void setHash(String hash) {
this.hash = hash; this.hash = hash;
} }
@Component(NotificationPersistValidator.ValidatorName)
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public static class NotificationPersistValidator extends BaseValidator<NotificationPersist> {
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<NotificationPersist> modelClass() {
return NotificationPersist.class;
}
@Override
protected List<Specification> 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()))
);
}
}
} }

View File

@ -2,14 +2,10 @@ package eu.eudat.model.persist.referencedefinition;
import eu.eudat.commons.enums.ReferenceFieldDataType; import eu.eudat.commons.enums.ReferenceFieldDataType;
import eu.eudat.commons.validation.BaseValidator; import eu.eudat.commons.validation.BaseValidator;
import eu.eudat.commons.validation.old.ValidEnum;
import eu.eudat.commons.validation.specification.Specification; import eu.eudat.commons.validation.specification.Specification;
import eu.eudat.convention.ConventionService; import eu.eudat.convention.ConventionService;
import eu.eudat.errorcode.ErrorThesaurusProperties; 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.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.MessageSource; import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;

View File

@ -0,0 +1,7 @@
package eu.eudat.model.persist.validation;
public interface StatusAware<T extends Enum<?>> {
StatusAware<T> setStatus(T status);
}

View File

@ -13,6 +13,7 @@ import eu.eudat.commons.types.descriptiontemplate.*;
import eu.eudat.commons.types.descriptiontemplate.fielddata.BaseFieldDataEntity; import eu.eudat.commons.types.descriptiontemplate.fielddata.BaseFieldDataEntity;
import eu.eudat.commons.types.descriptiontemplate.importexport.*; import eu.eudat.commons.types.descriptiontemplate.importexport.*;
import eu.eudat.commons.types.notification.*; import eu.eudat.commons.types.notification.*;
import eu.eudat.commons.validation.ValidatorFactory;
import eu.eudat.configurations.notification.NotificationProperties; import eu.eudat.configurations.notification.NotificationProperties;
import eu.eudat.convention.ConventionService; import eu.eudat.convention.ConventionService;
import eu.eudat.data.DescriptionTemplateEntity; import eu.eudat.data.DescriptionTemplateEntity;
@ -81,11 +82,13 @@ import java.util.stream.Collectors;
@Service @Service
public class DescriptionTemplateServiceImpl implements DescriptionTemplateService { public class DescriptionTemplateServiceImpl implements DescriptionTemplateService {
private List<Semantic> semantics = null; private List<Semantic> semantics = null;
private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DescriptionTemplateServiceImpl.class)); private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(DescriptionTemplateServiceImpl.class));
private final EntityManager entityManager; private final EntityManager entityManager;
private final UserScope userScope; private final UserScope userScope;
private final AuthorizationService authorizationService; private final AuthorizationService authorizationService;
@ -93,20 +96,33 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
private final DeleterFactory deleterFactory; private final DeleterFactory deleterFactory;
private final BuilderFactory builderFactory; private final BuilderFactory builderFactory;
private final ConventionService conventionService; private final ConventionService conventionService;
private final MessageSource messageSource; private final MessageSource messageSource;
private final XmlHandlingService xmlHandlingService; private final XmlHandlingService xmlHandlingService;
private final FieldDataHelperServiceProvider fieldDataHelperServiceProvider; private final FieldDataHelperServiceProvider fieldDataHelperServiceProvider;
private final QueryFactory queryFactory; private final QueryFactory queryFactory;
private final ErrorThesaurusProperties errors; private final ErrorThesaurusProperties errors;
private final ValidationService validationService;
private final TenantScope tenantScope; private final TenantScope tenantScope;
private final ResponseUtilsService responseUtilsService; private final ResponseUtilsService responseUtilsService;
private final StorageFileService storageFileService; private final StorageFileService storageFileService;
private final JsonHandlingService jsonHandlingService; private final JsonHandlingService jsonHandlingService;
private final NotificationIntegrationEventHandler eventHandler; private final NotificationIntegrationEventHandler eventHandler;
private final NotificationProperties notificationProperties; private final NotificationProperties notificationProperties;
private final ValidatorFactory validatorFactory;
@Autowired @Autowired
public DescriptionTemplateServiceImpl( public DescriptionTemplateServiceImpl(
EntityManager entityManager, EntityManager entityManager,
@ -116,7 +132,15 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
ConventionService conventionService, ConventionService conventionService,
MessageSource messageSource, MessageSource messageSource,
XmlHandlingService xmlHandlingService, 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.entityManager = entityManager;
this.userScope = userScope; this.userScope = userScope;
this.authorizationService = authorizationService; this.authorizationService = authorizationService;
@ -128,13 +152,13 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
this.fieldDataHelperServiceProvider = fieldDataHelperServiceProvider; this.fieldDataHelperServiceProvider = fieldDataHelperServiceProvider;
this.queryFactory = queryFactory; this.queryFactory = queryFactory;
this.errors = errors; this.errors = errors;
this.validationService = validationService;
this.tenantScope = tenantScope; this.tenantScope = tenantScope;
this.responseUtilsService = responseUtilsService; this.responseUtilsService = responseUtilsService;
this.storageFileService = storageFileService; this.storageFileService = storageFileService;
this.jsonHandlingService = jsonHandlingService; this.jsonHandlingService = jsonHandlingService;
this.eventHandler = eventHandler; this.eventHandler = eventHandler;
this.notificationProperties = notificationProperties; this.notificationProperties = notificationProperties;
this.validatorFactory = validatorFactory;
} }
//region Persist //region Persist
@ -149,9 +173,12 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
DescriptionTemplateEntity data; DescriptionTemplateEntity data;
if (isUpdate) { if (isUpdate) {
data = this.entityManager.find(DescriptionTemplateEntity.class, model.getId()); 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 (data == null)
if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale()));
if (data.getStatus() == DescriptionTemplateStatus.Finalized) throw new MyForbiddenException("Can not update finalized template"); 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 { } else {
data = new DescriptionTemplateEntity(); data = new DescriptionTemplateEntity();
data.setId(UUID.randomUUID()); data.setId(UUID.randomUUID());
@ -159,7 +186,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
data.setCreatedAt(Instant.now()); data.setCreatedAt(Instant.now());
data.setGroupId(UUID.randomUUID()); data.setGroupId(UUID.randomUUID());
data.setVersionStatus(DescriptionTemplateVersionStatus.Current); data.setVersionStatus(DescriptionTemplateVersionStatus.Current);
data.setVersion((short)1); data.setVersion((short) 1);
} }
data.setDescription(model.getDescription()); data.setDescription(model.getDescription());
@ -175,7 +202,8 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
this.entityManager.persist(data); this.entityManager.persist(data);
this.persistUsers(data.getId(), model.getUsers()); this.persistUsers(data.getId(), model.getUsers());
if (!isUpdate) this.addOwner(data); if (!isUpdate)
this.addOwner(data);
this.entityManager.flush(); this.entityManager.flush();
@ -183,12 +211,13 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
} }
private void persistUsers(UUID id, List<UserDescriptionTemplatePersist> users) throws InvalidApplicationException { private void persistUsers(UUID id, List<UserDescriptionTemplatePersist> users) throws InvalidApplicationException {
if (users == null) users = new ArrayList<>(); if (users == null)
users = new ArrayList<>();
List<UserDescriptionTemplateEntity> items = this.queryFactory.query(UserDescriptionTemplateQuery.class).isActive(IsActive.Active).descriptionTemplateIds(id).collect(); List<UserDescriptionTemplateEntity> items = this.queryFactory.query(UserDescriptionTemplateQuery.class).isActive(IsActive.Active).descriptionTemplateIds(id).collect();
List<UUID> updatedCreatedIds = new ArrayList<>(); List<UUID> updatedCreatedIds = new ArrayList<>();
for (UserDescriptionTemplatePersist user : users) { for (UserDescriptionTemplatePersist user : users) {
UserDescriptionTemplateEntity data = items.stream().filter(x -> x.getUserId().equals(user.getUserId()) && x.getRole().equals(user.getRole())).findFirst().orElse(null); 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 = new UserDescriptionTemplateEntity();
data.setId(UUID.randomUUID()); data.setId(UUID.randomUUID());
data.setIsActive(IsActive.Active); data.setIsActive(IsActive.Active);
@ -202,10 +231,11 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
} }
updatedCreatedIds.add(data.getId()); updatedCreatedIds.add(data.getId());
} }
List<UserDescriptionTemplateEntity> toDelete = items.stream().filter(x-> updatedCreatedIds.stream().noneMatch(y-> y.equals(x.getId()))).collect(Collectors.toList()); List<UserDescriptionTemplateEntity> toDelete = items.stream().filter(x -> updatedCreatedIds.stream().noneMatch(y -> y.equals(x.getId()))).collect(Collectors.toList());
this.deleterFactory.deleter(UserDescriptionTemplateDeleter.class).delete(toDelete); this.deleterFactory.deleter(UserDescriptionTemplateDeleter.class).delete(toDelete);
} }
private void sendJoinMail(UserDescriptionTemplateEntity userDescriptionTemplate) throws InvalidApplicationException { private void sendJoinMail(UserDescriptionTemplateEntity userDescriptionTemplate) throws InvalidApplicationException {
NotificationIntegrationEvent event = new NotificationIntegrationEvent(); NotificationIntegrationEvent event = new NotificationIntegrationEvent();
event.setTenant(tenantScope.getTenant()); event.setTenant(tenantScope.getTenant());
@ -233,6 +263,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
eventHandler.handle(event); eventHandler.handle(event);
} }
private void addOwner(DescriptionTemplateEntity descriptionTemplateEntity) throws InvalidApplicationException { private void addOwner(DescriptionTemplateEntity descriptionTemplateEntity) throws InvalidApplicationException {
UserDescriptionTemplateEntity data = new UserDescriptionTemplateEntity(); UserDescriptionTemplateEntity data = new UserDescriptionTemplateEntity();
data.setId(UUID.randomUUID()); data.setId(UUID.randomUUID());
@ -245,18 +276,19 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
this.entityManager.persist(data); this.entityManager.persist(data);
} }
private @NotNull DefinitionEntity buildDefinitionEntity(DefinitionPersist persist){ private @NotNull DefinitionEntity buildDefinitionEntity(DefinitionPersist persist) {
DefinitionEntity data = new DefinitionEntity(); DefinitionEntity data = new DefinitionEntity();
if (persist == null) return data; if (persist == null)
if (!this.conventionService.isListNullOrEmpty(persist.getSections())){ return data;
if (!this.conventionService.isListNullOrEmpty(persist.getSections())) {
data.setSections(new ArrayList<>()); data.setSections(new ArrayList<>());
for (SectionPersist sectionPersist: persist.getSections()) { for (SectionPersist sectionPersist : persist.getSections()) {
data.getSections().add(this.buildSectionEntity(sectionPersist)); data.getSections().add(this.buildSectionEntity(sectionPersist));
} }
} }
if (!this.conventionService.isListNullOrEmpty(persist.getPages())){ if (!this.conventionService.isListNullOrEmpty(persist.getPages())) {
data.setPages(new ArrayList<>()); data.setPages(new ArrayList<>());
for (PagePersist pagePersist: persist.getPages()) { for (PagePersist pagePersist : persist.getPages()) {
data.getPages().add(this.buildPageEntity(pagePersist)); data.getPages().add(this.buildPageEntity(pagePersist));
} }
} }
@ -264,9 +296,10 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
return data; return data;
} }
private @NotNull SectionEntity buildSectionEntity(SectionPersist persist){ private @NotNull SectionEntity buildSectionEntity(SectionPersist persist) {
SectionEntity data = new SectionEntity(); SectionEntity data = new SectionEntity();
if (persist == null) return data; if (persist == null)
return data;
data.setId(persist.getId()); data.setId(persist.getId());
data.setDescription(persist.getDescription()); data.setDescription(persist.getDescription());
@ -276,16 +309,16 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
data.setPage(persist.getPage()); data.setPage(persist.getPage());
data.setTitle(persist.getTitle()); data.setTitle(persist.getTitle());
if (!this.conventionService.isListNullOrEmpty(persist.getSections())){ if (!this.conventionService.isListNullOrEmpty(persist.getSections())) {
data.setSections(new ArrayList<>()); data.setSections(new ArrayList<>());
for (SectionPersist sectionPersist: persist.getSections()) { for (SectionPersist sectionPersist : persist.getSections()) {
data.getSections().add(this.buildSectionEntity(sectionPersist)); data.getSections().add(this.buildSectionEntity(sectionPersist));
} }
} }
if (!this.conventionService.isListNullOrEmpty(persist.getFieldSets())){ if (!this.conventionService.isListNullOrEmpty(persist.getFieldSets())) {
data.setFieldSets(new ArrayList<>()); data.setFieldSets(new ArrayList<>());
for (FieldSetPersist fieldSetPersist: persist.getFieldSets()) { for (FieldSetPersist fieldSetPersist : persist.getFieldSets()) {
data.getFieldSets().add(this.buildFieldSetEntity(fieldSetPersist)); data.getFieldSets().add(this.buildFieldSetEntity(fieldSetPersist));
} }
} }
@ -293,9 +326,10 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
return data; return data;
} }
private @NotNull FieldSetEntity buildFieldSetEntity(FieldSetPersist persist){ private @NotNull FieldSetEntity buildFieldSetEntity(FieldSetPersist persist) {
FieldSetEntity data = new FieldSetEntity(); FieldSetEntity data = new FieldSetEntity();
if (persist == null) return data; if (persist == null)
return data;
data.setId(persist.getId()); data.setId(persist.getId());
data.setDescription(persist.getDescription()); data.setDescription(persist.getDescription());
@ -304,22 +338,24 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
data.setNumbering(persist.getNumbering()); data.setNumbering(persist.getNumbering());
data.setAdditionalInformation(persist.getAdditionalInformation()); data.setAdditionalInformation(persist.getAdditionalInformation());
data.setTitle(persist.getTitle()); 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.setHasCommentField(persist.getHasCommentField());
data.setTitle(persist.getTitle()); data.setTitle(persist.getTitle());
if (!this.conventionService.isListNullOrEmpty(persist.getFields())){ if (!this.conventionService.isListNullOrEmpty(persist.getFields())) {
data.setFields(new ArrayList<>()); data.setFields(new ArrayList<>());
for (FieldPersist fieldPersist: persist.getFields()) { for (FieldPersist fieldPersist : persist.getFields()) {
data.getFields().add(this.buildFieldEntity(fieldPersist)); data.getFields().add(this.buildFieldEntity(fieldPersist));
} }
} }
return data; return data;
} }
private @NotNull FieldEntity buildFieldEntity(FieldPersist persist){ private @NotNull FieldEntity buildFieldEntity(FieldPersist persist) {
FieldEntity data = new FieldEntity(); FieldEntity data = new FieldEntity();
if (persist == null) return data; if (persist == null)
return data;
data.setId(persist.getId()); data.setId(persist.getId());
data.setOrdinal(persist.getOrdinal()); data.setOrdinal(persist.getOrdinal());
@ -328,45 +364,54 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
data.setDefaultValue(persist.getDefaultValue()); data.setDefaultValue(persist.getDefaultValue());
data.setValidations(persist.getValidations()); data.setValidations(persist.getValidations());
data.setIncludeInExport(persist.getIncludeInExport()); 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<>()); data.setVisibilityRules(new ArrayList<>());
for (RulePersist fieldPersist: persist.getVisibilityRules()) { for (RulePersist fieldPersist : persist.getVisibilityRules()) {
data.getVisibilityRules().add(this.buildRuleEntity(fieldPersist)); data.getVisibilityRules().add(this.buildRuleEntity(fieldPersist));
} }
} }
return data; return data;
} }
private BaseFieldDataEntity<?> buildFieldDataEntity(BaseFieldDataPersist persist){ private BaseFieldDataEntity<?> buildFieldDataEntity(BaseFieldDataPersist persist) {
if (persist == null) return null; if (persist == null)
return null;
return this.fieldDataHelperServiceProvider.get(persist.getFieldType()).applyPersist(persist); return this.fieldDataHelperServiceProvider.get(persist.getFieldType()).applyPersist(persist);
} }
private @NotNull RuleEntity buildRuleEntity(RulePersist persist){ private @NotNull RuleEntity buildRuleEntity(RulePersist persist) {
RuleEntity data = new RuleEntity(); RuleEntity data = new RuleEntity();
if (persist == null) return data; if (persist == null)
return data;
data.setTarget(persist.getTarget()); data.setTarget(persist.getTarget());
data.setValue(persist.getValue()); data.setValue(persist.getValue());
return data; return data;
} }
private @NotNull MultiplicityEntity buildMultiplicityEntity(MultiplicityPersist persist){ private @NotNull MultiplicityEntity buildMultiplicityEntity(MultiplicityPersist persist) {
MultiplicityEntity data = new MultiplicityEntity(); MultiplicityEntity data = new MultiplicityEntity();
if (persist == null) return data; if (persist == null)
return data;
if (persist.getMax() != null) data.setMax(persist.getMax()); if (persist.getMax() != null)
if (persist.getMin() != null) data.setMin(persist.getMin()); data.setMax(persist.getMax());
if (persist.getPlaceholder() != null) data.setPlaceholder(persist.getPlaceholder()); if (persist.getMin() != null)
if (persist.getTableView() != null) data.setTableView(persist.getTableView()); data.setMin(persist.getMin());
if (persist.getPlaceholder() != null)
data.setPlaceholder(persist.getPlaceholder());
if (persist.getTableView() != null)
data.setTableView(persist.getTableView());
return data; return data;
} }
private @NotNull PageEntity buildPageEntity(PagePersist persist){ private @NotNull PageEntity buildPageEntity(PagePersist persist) {
PageEntity data = new PageEntity(); PageEntity data = new PageEntity();
if (persist == null) return data; if (persist == null)
return data;
data.setId(persist.getId()); data.setId(persist.getId());
data.setOrdinal(persist.getOrdinal()); data.setOrdinal(persist.getOrdinal());
@ -397,7 +442,8 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
DescriptionTemplateQuery query = this.queryFactory.query(DescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); 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)); 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.setLabel(model.getLabel() + " new ");
model.setId(null); model.setId(null);
@ -408,56 +454,61 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
return model; return model;
} }
private void reassignDefinition(Definition model){ private void reassignDefinition(Definition model) {
if (model == null) return; if (model == null)
return;
if (model.getSections() != null){ if (model.getSections() != null) {
for (Section section : model.getSections()) { for (Section section : model.getSections()) {
this.reassignSection(section); this.reassignSection(section);
} }
} }
if (model.getPages() != null){ if (model.getPages() != null) {
for (Page page : model.getPages()) { for (Page page : model.getPages()) {
this.reassignPage(page); this.reassignPage(page);
} }
} }
} }
private void reassignPage(Page model){ private void reassignPage(Page model) {
if (model == null) return; if (model == null)
return;
model.setId(UUID.randomUUID().toString()); model.setId(UUID.randomUUID().toString());
} }
private void reassignSection(Section model){ private void reassignSection(Section model) {
if (model == null) return; if (model == null)
return;
model.setId(UUID.randomUUID().toString()); model.setId(UUID.randomUUID().toString());
if (model.getSections() != null){ if (model.getSections() != null) {
for (Section section : model.getSections()) { for (Section section : model.getSections()) {
this.reassignSection(section); this.reassignSection(section);
} }
} }
if (model.getFieldSets() != null){ if (model.getFieldSets() != null) {
for (eu.eudat.model.descriptiontemplatedefinition.FieldSet fieldSet : model.getFieldSets()) { for (eu.eudat.model.descriptiontemplatedefinition.FieldSet fieldSet : model.getFieldSets()) {
this.reassignFieldSet(fieldSet); this.reassignFieldSet(fieldSet);
} }
} }
} }
private void reassignFieldSet(eu.eudat.model.descriptiontemplatedefinition.FieldSet model){ private void reassignFieldSet(eu.eudat.model.descriptiontemplatedefinition.FieldSet model) {
if (model == null) return; if (model == null)
return;
model.setId(UUID.randomUUID().toString()); model.setId(UUID.randomUUID().toString());
if (model.getFields() != null){ if (model.getFields() != null) {
for (Field field : model.getFields()) { for (Field field : model.getFields()) {
this.reassignField(field); this.reassignField(field);
} }
} }
} }
private void reassignField(Field model){ private void reassignField(Field model) {
if (model == null) return; if (model == null)
return;
model.setId(UUID.randomUUID().toString()); model.setId(UUID.randomUUID().toString());
} }
@ -471,14 +522,18 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
this.authorizationService.authorizeForce(Permission.CreateNewVersionDescriptionTemplate); this.authorizationService.authorizeForce(Permission.CreateNewVersionDescriptionTemplate);
DescriptionTemplateEntity oldDescriptionTemplateEntity = this.entityManager.find(DescriptionTemplateEntity.class, model.getId()); 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 (oldDescriptionTemplateEntity == null)
if (!this.conventionService.hashValue(oldDescriptionTemplateEntity.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); 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()); DescriptionTemplateQuery latestVersionDescriptionTemplateEntityQuery = this.queryFactory.query(DescriptionTemplateQuery.class).versionStatuses(DescriptionTemplateVersionStatus.Current).groupIds(oldDescriptionTemplateEntity.getGroupId());
List<DescriptionTemplateEntity> latestVersionDescriptionTemplates = latestVersionDescriptionTemplateEntityQuery.collect(); List<DescriptionTemplateEntity> latestVersionDescriptionTemplates = latestVersionDescriptionTemplateEntityQuery.collect();
if (latestVersionDescriptionTemplates.isEmpty()) throw new MyValidationException("Previous template not found"); if (latestVersionDescriptionTemplates.isEmpty())
if (latestVersionDescriptionTemplates.size() > 1) throw new MyValidationException("Multiple previous template found"); throw new MyValidationException("Previous template not found");
if (!latestVersionDescriptionTemplates.get(0).getVersion().equals(oldDescriptionTemplateEntity.getVersion())){ 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()); throw new MyValidationException(this.errors.getDescriptionTemplateNewVersionConflict().getCode(), this.errors.getDescriptionTemplateNewVersionConflict().getMessage());
} }
@ -489,7 +544,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
data.setUpdatedAt(Instant.now()); data.setUpdatedAt(Instant.now());
data.setVersionStatus(DescriptionTemplateVersionStatus.Current); data.setVersionStatus(DescriptionTemplateVersionStatus.Current);
data.setGroupId(oldDescriptionTemplateEntity.getGroupId()); data.setGroupId(oldDescriptionTemplateEntity.getGroupId());
data.setVersion((short)(oldDescriptionTemplateEntity.getVersion() + 1)); data.setVersion((short) (oldDescriptionTemplateEntity.getVersion() + 1));
data.setDescription(model.getDescription()); data.setDescription(model.getDescription());
data.setLabel(model.getLabel()); data.setLabel(model.getLabel());
data.setTypeId(model.getType()); data.setTypeId(model.getType());
@ -529,7 +584,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
persist.setLanguage(importXml.getLanguage()); persist.setLanguage(importXml.getLanguage());
persist.setType(importXml.getType()); persist.setType(importXml.getType());
persist.setDefinition(this.xmlDefinitionToPersist(importXml)); persist.setDefinition(this.xmlDefinitionToPersist(importXml));
this.validationService.validateForce(persist); this.validatorFactory.validator(DescriptionTemplatePersist.DescriptionTemplatePersistValidator.class).validateForce(persist);
return this.persist(persist, fields); return this.persist(persist, fields);
} else { } else {
NewVersionDescriptionTemplatePersist persist = new NewVersionDescriptionTemplatePersist(); NewVersionDescriptionTemplatePersist persist = new NewVersionDescriptionTemplatePersist();
@ -542,16 +597,18 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
persist.setType(importXml.getType()); persist.setType(importXml.getType());
DescriptionTemplateEntity oldDescriptionTemplateEntity = this.entityManager.find(DescriptionTemplateEntity.class, id); 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())); persist.setHash(this.conventionService.hashValue(oldDescriptionTemplateEntity.getUpdatedAt()));
this.validationService.validateForce(persist); this.validatorFactory.validator(DescriptionTemplatePersist.DescriptionTemplatePersistValidator.class).validateForce(persist);
return this.createNewVersion(persist, fields); return this.createNewVersion(persist, fields);
} }
} }
public DefinitionPersist xmlDefinitionToPersist(DescriptionTemplateImportExport importExport){ public DefinitionPersist xmlDefinitionToPersist(DescriptionTemplateImportExport importExport) {
DefinitionPersist definitionPersist = new DefinitionPersist(); DefinitionPersist definitionPersist = new DefinitionPersist();
if(importExport == null) return null; if (importExport == null)
return null;
List<PagePersist> pagesDatasetEntity = new LinkedList<>(); List<PagePersist> pagesDatasetEntity = new LinkedList<>();
List<SectionPersist> sectionDatasetEntity = new LinkedList<>(); List<SectionPersist> sectionDatasetEntity = new LinkedList<>();
@ -571,7 +628,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
return definitionPersist; return definitionPersist;
} }
public PagePersist xmlPageToPersist(PageImportExport importExport){ public PagePersist xmlPageToPersist(PageImportExport importExport) {
PagePersist pageEntity = new PagePersist(); PagePersist pageEntity = new PagePersist();
pageEntity.setId(importExport.getId()); pageEntity.setId(importExport.getId());
pageEntity.setOrdinal(importExport.getOrdinal()); pageEntity.setOrdinal(importExport.getOrdinal());
@ -594,7 +651,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
sectionEntity.setPage(importExport.getPage()); sectionEntity.setPage(importExport.getPage());
sectionEntity.setDescription(importExport.getDescription()); sectionEntity.setDescription(importExport.getDescription());
List<FieldSetPersist> fieldSetEntity = new LinkedList<>(); List<FieldSetPersist> fieldSetEntity = new LinkedList<>();
if(!this.conventionService.isListNullOrEmpty(importExport.getFieldSets())) { if (!this.conventionService.isListNullOrEmpty(importExport.getFieldSets())) {
for (FieldSetImportExport xmlFieldSet : importExport.getFieldSets()) { for (FieldSetImportExport xmlFieldSet : importExport.getFieldSets()) {
fieldSetEntity.add(this.toFieldSetModel(xmlFieldSet)); fieldSetEntity.add(this.toFieldSetModel(xmlFieldSet));
} }
@ -606,7 +663,6 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
return sectionEntity; return sectionEntity;
} }
public FieldSetPersist toFieldSetModel(FieldSetImportExport importExport) { public FieldSetPersist toFieldSetModel(FieldSetImportExport importExport) {
FieldSetPersist fieldSet1Entity = new FieldSetPersist(); FieldSetPersist fieldSet1Entity = new FieldSetPersist();
fieldSet1Entity.setId(importExport.getId()); fieldSet1Entity.setId(importExport.getId());
@ -619,7 +675,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
fieldSet1Entity.setAdditionalInformation(importExport.getAdditionalInformation()); fieldSet1Entity.setAdditionalInformation(importExport.getAdditionalInformation());
List<FieldPersist> fieldsEntity = new LinkedList<>(); List<FieldPersist> fieldsEntity = new LinkedList<>();
if (!this.conventionService.isListNullOrEmpty(importExport.getFields())){ if (!this.conventionService.isListNullOrEmpty(importExport.getFields())) {
for (FieldImportExport xmlField : importExport.getFields()) { for (FieldImportExport xmlField : importExport.getFields()) {
fieldsEntity.add(this.xmlFieldToPersist(xmlField)); fieldsEntity.add(this.xmlFieldToPersist(xmlField));
} }
@ -628,7 +684,6 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
return fieldSet1Entity; return fieldSet1Entity;
} }
public FieldPersist xmlFieldToPersist(FieldImportExport importExport) { public FieldPersist xmlFieldToPersist(FieldImportExport importExport) {
FieldPersist fieldEntity = new FieldPersist(); FieldPersist fieldEntity = new FieldPersist();
fieldEntity.setId(importExport.getId()); fieldEntity.setId(importExport.getId());
@ -636,7 +691,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
fieldEntity.setValidations(importExport.getValidations()); fieldEntity.setValidations(importExport.getValidations());
fieldEntity.setDefaultValue(importExport.getDefaultValue()); fieldEntity.setDefaultValue(importExport.getDefaultValue());
List<RulePersist> rulePersists = new ArrayList<>(); List<RulePersist> rulePersists = new ArrayList<>();
if(importExport.getVisibilityRules() !=null) { if (importExport.getVisibilityRules() != null) {
for (RuleImportExport xmlRule : importExport.getVisibilityRules()) { for (RuleImportExport xmlRule : importExport.getVisibilityRules()) {
rulePersists.add(this.toRuleModel(xmlRule)); rulePersists.add(this.toRuleModel(xmlRule));
} }
@ -652,14 +707,13 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
return fieldEntity; return fieldEntity;
} }
public RulePersist toRuleModel(RuleImportExport importExport){ public RulePersist toRuleModel(RuleImportExport importExport) {
RulePersist ruleEntity = new RulePersist(); RulePersist ruleEntity = new RulePersist();
ruleEntity.setTarget(importExport.getTarget()); ruleEntity.setTarget(importExport.getTarget());
ruleEntity.setValue(importExport.getValue()); ruleEntity.setValue(importExport.getValue());
return ruleEntity; return ruleEntity;
} }
public MultiplicityPersist xmlMultiplicityToPersist(MultiplicityImportXml importXml) { public MultiplicityPersist xmlMultiplicityToPersist(MultiplicityImportXml importXml) {
MultiplicityPersist multiplicityEntity = new MultiplicityPersist(); MultiplicityPersist multiplicityEntity = new MultiplicityPersist();
multiplicityEntity.setMax(importXml.getMax()); multiplicityEntity.setMax(importXml.getMax());
@ -679,20 +733,21 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
this.authorizationService.authorizeForce(Permission.ExportDescriptionTemplate); this.authorizationService.authorizeForce(Permission.ExportDescriptionTemplate);
DescriptionTemplateEntity data = this.entityManager.find(DescriptionTemplateEntity.class, id); 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()); DefinitionEntity definition = this.xmlHandlingService.fromXml(DefinitionEntity.class, data.getDefinition());
String xml = this.xmlHandlingService.toXml(this.definitionXmlToExport(data, definition)); String xml = this.xmlHandlingService.toXml(this.definitionXmlToExport(data, definition));
return this.responseUtilsService.buildResponseFileFromText(xml, data.getLabel() + ".xml"); 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(); DescriptionTemplateImportExport xml = new DescriptionTemplateImportExport();
xml.setType(data.getTypeId()); xml.setType(data.getTypeId());
xml.setLanguage(data.getLanguage()); xml.setLanguage(data.getLanguage());
xml.setDescription(data.getDescription()); xml.setDescription(data.getDescription());
List<PageImportExport> pagesDatasetEntity = new LinkedList<>(); List<PageImportExport> pagesDatasetEntity = new LinkedList<>();
for (PageEntity xmlPage: entity.getPages()) { for (PageEntity xmlPage : entity.getPages()) {
pagesDatasetEntity.add(this.pageXmlToExport(xmlPage, entity.getSections())); pagesDatasetEntity.add(this.pageXmlToExport(xmlPage, entity.getSections()));
} }
xml.setPages(pagesDatasetEntity); xml.setPages(pagesDatasetEntity);
@ -700,7 +755,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
return xml; return xml;
} }
private PageImportExport pageXmlToExport(PageEntity entity, List<SectionEntity> sectionEntities){ private PageImportExport pageXmlToExport(PageEntity entity, List<SectionEntity> sectionEntities) {
PageImportExport xml = new PageImportExport(); PageImportExport xml = new PageImportExport();
xml.setId(entity.getId()); xml.setId(entity.getId());
xml.setOrdinal(entity.getOrdinal()); xml.setOrdinal(entity.getOrdinal());
@ -735,7 +790,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
xml.setPage(entity.getPage()); xml.setPage(entity.getPage());
xml.setDescription(entity.getDescription()); xml.setDescription(entity.getDescription());
List<FieldSetImportExport> fieldSetEntity = new LinkedList<>(); List<FieldSetImportExport> fieldSetEntity = new LinkedList<>();
if(!this.conventionService.isListNullOrEmpty(entity.getFieldSets())) { if (!this.conventionService.isListNullOrEmpty(entity.getFieldSets())) {
for (FieldSetEntity xmlFieldSet : entity.getFieldSets()) { for (FieldSetEntity xmlFieldSet : entity.getFieldSets()) {
fieldSetEntity.add(this.fieldSetXmlToExport(xmlFieldSet)); fieldSetEntity.add(this.fieldSetXmlToExport(xmlFieldSet));
} }
@ -746,7 +801,6 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
return xml; return xml;
} }
private FieldSetImportExport fieldSetXmlToExport(FieldSetEntity entity) { private FieldSetImportExport fieldSetXmlToExport(FieldSetEntity entity) {
FieldSetImportExport fieldSet1Entity = new FieldSetImportExport(); FieldSetImportExport fieldSet1Entity = new FieldSetImportExport();
fieldSet1Entity.setId(entity.getId()); fieldSet1Entity.setId(entity.getId());
@ -759,7 +813,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
fieldSet1Entity.setAdditionalInformation(entity.getAdditionalInformation()); fieldSet1Entity.setAdditionalInformation(entity.getAdditionalInformation());
List<FieldImportExport> fieldsEntity = new LinkedList<>(); List<FieldImportExport> fieldsEntity = new LinkedList<>();
if (entity.getFields() != null){ if (entity.getFields() != null) {
for (FieldEntity xmlField : entity.getFields()) { for (FieldEntity xmlField : entity.getFields()) {
fieldsEntity.add(this.fieldXmlToExport(xmlField)); fieldsEntity.add(this.fieldXmlToExport(xmlField));
} }
@ -768,7 +822,6 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
return fieldSet1Entity; return fieldSet1Entity;
} }
private FieldImportExport fieldXmlToExport(FieldEntity entity) { private FieldImportExport fieldXmlToExport(FieldEntity entity) {
FieldImportExport xml = new FieldImportExport(); FieldImportExport xml = new FieldImportExport();
xml.setId(entity.getId()); xml.setId(entity.getId());
@ -776,7 +829,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
xml.setValidations(entity.getValidations()); xml.setValidations(entity.getValidations());
xml.setDefaultValue(entity.getDefaultValue()); xml.setDefaultValue(entity.getDefaultValue());
List<RuleImportExport> rulePersists = new ArrayList<>(); List<RuleImportExport> rulePersists = new ArrayList<>();
if(!this.conventionService.isListNullOrEmpty(entity.getVisibilityRules())) { if (!this.conventionService.isListNullOrEmpty(entity.getVisibilityRules())) {
for (RuleEntity xmlRule : entity.getVisibilityRules()) { for (RuleEntity xmlRule : entity.getVisibilityRules()) {
rulePersists.add(this.toRuleModel(xmlRule)); rulePersists.add(this.toRuleModel(xmlRule));
} }
@ -792,14 +845,13 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
return xml; return xml;
} }
private RuleImportExport toRuleModel(RuleEntity entity){ private RuleImportExport toRuleModel(RuleEntity entity) {
RuleImportExport xml = new RuleImportExport(); RuleImportExport xml = new RuleImportExport();
xml.setTarget(entity.getTarget()); xml.setTarget(entity.getTarget());
xml.setValue(entity.getValue()); xml.setValue(entity.getValue());
return xml; return xml;
} }
private MultiplicityImportXml multiplicityXmlToExport(MultiplicityEntity entity) { private MultiplicityImportXml multiplicityXmlToExport(MultiplicityEntity entity) {
MultiplicityImportXml xml = new MultiplicityImportXml(); MultiplicityImportXml xml = new MultiplicityImportXml();
xml.setMax(entity.getMax()); xml.setMax(entity.getMax());
@ -817,7 +869,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
public List<String> getSemantics(String query) throws IOException { public List<String> getSemantics(String query) throws IOException {
List<Semantic> semantics = this.getSemantics(); List<Semantic> semantics = this.getSemantics();
List<String> filteredSemantics = semantics.stream().map(Semantic::getName).collect(Collectors.toList()); List<String> 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()); filteredSemantics = semantics.stream().filter(x -> x.getCategory().contains(query) || x.getName().contains(query)).map(Semantic::getName).collect(Collectors.toList());
} }
return filteredSemantics; return filteredSemantics;
@ -840,8 +892,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic
try { try {
String json = new String(bytes, StandardCharsets.UTF_8); String json = new String(bytes, StandardCharsets.UTF_8);
semantics = List.of(jsonHandlingService.fromJson(Semantic[].class, json)); semantics = List.of(jsonHandlingService.fromJson(Semantic[].class, json));
} } catch (IOException e) {
catch (IOException e) {
logger.error(e.getMessage(), e); logger.error(e.getMessage(), e);
} }
} }

View File

@ -4,9 +4,13 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.authorization.AuthorizationFlags;
import eu.eudat.authorization.Permission; import eu.eudat.authorization.Permission;
import eu.eudat.commons.XmlHandlingService; 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.*;
import eu.eudat.commons.types.dmpblueprint.importexport.*; import eu.eudat.commons.types.dmpblueprint.importexport.*;
import eu.eudat.commons.validation.ValidatorFactory;
import eu.eudat.convention.ConventionService; import eu.eudat.convention.ConventionService;
import eu.eudat.data.DmpBlueprintEntity; import eu.eudat.data.DmpBlueprintEntity;
import eu.eudat.errorcode.ErrorThesaurusProperties; 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.fieldset.FieldSet;
import gr.cite.tools.logging.LoggerService; import gr.cite.tools.logging.LoggerService;
import gr.cite.tools.logging.MapLogEntry; import gr.cite.tools.logging.MapLogEntry;
import gr.cite.tools.validation.ValidationService;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import jakarta.xml.bind.JAXBException; import jakarta.xml.bind.JAXBException;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -70,12 +73,18 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
private final BuilderFactory builderFactory; private final BuilderFactory builderFactory;
private final ConventionService conventionService; private final ConventionService conventionService;
private final MessageSource messageSource; private final MessageSource messageSource;
private final QueryFactory queryFactory; private final QueryFactory queryFactory;
private final ResponseUtilsService responseUtilsService; private final ResponseUtilsService responseUtilsService;
private final XmlHandlingService xmlHandlingService; private final XmlHandlingService xmlHandlingService;
private final ErrorThesaurusProperties errors; private final ErrorThesaurusProperties errors;
private final ValidationService validationService;
private final ValidatorFactory validatorFactory;
@Autowired @Autowired
public DmpBlueprintServiceImpl( public DmpBlueprintServiceImpl(
@ -88,7 +97,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
ResponseUtilsService responseUtilsService, ResponseUtilsService responseUtilsService,
XmlHandlingService xmlHandlingService, XmlHandlingService xmlHandlingService,
ErrorThesaurusProperties errors, ErrorThesaurusProperties errors,
ValidationService validationService) { ValidatorFactory validatorFactory) {
this.entityManager = entityManager; this.entityManager = entityManager;
this.authorizationService = authorizationService; this.authorizationService = authorizationService;
this.deleterFactory = deleterFactory; this.deleterFactory = deleterFactory;
@ -99,7 +108,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
this.responseUtilsService = responseUtilsService; this.responseUtilsService = responseUtilsService;
this.xmlHandlingService = xmlHandlingService; this.xmlHandlingService = xmlHandlingService;
this.errors = errors; this.errors = errors;
this.validationService = validationService; this.validatorFactory = validatorFactory;
} }
//region Persist //region Persist
@ -114,8 +123,10 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
DmpBlueprintEntity data; DmpBlueprintEntity data;
if (isUpdate) { if (isUpdate) {
data = this.entityManager.find(DmpBlueprintEntity.class, model.getId()); 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 (data == null)
if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); 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 { } else {
data = new DmpBlueprintEntity(); data = new DmpBlueprintEntity();
data.setId(UUID.randomUUID()); data.setId(UUID.randomUUID());
@ -128,45 +139,50 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
data.setUpdatedAt(Instant.now()); data.setUpdatedAt(Instant.now());
data.setDefinition(this.xmlHandlingService.toXml(this.buildDefinitionEntity(model.getDefinition()))); data.setDefinition(this.xmlHandlingService.toXml(this.buildDefinitionEntity(model.getDefinition())));
if (isUpdate) this.entityManager.merge(data); if (isUpdate)
else this.entityManager.persist(data); this.entityManager.merge(data);
else
this.entityManager.persist(data);
this.entityManager.flush(); this.entityManager.flush();
return this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).build(BaseFieldSet.build(fields, DmpBlueprint._id), data); 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(); DefinitionEntity data = new DefinitionEntity();
if (persist == null) return data; if (persist == null)
if (!this.conventionService.isListNullOrEmpty(persist.getSections())){ return data;
if (!this.conventionService.isListNullOrEmpty(persist.getSections())) {
data.setSections(new ArrayList<>()); data.setSections(new ArrayList<>());
for (SectionPersist sectionPersist: persist.getSections()) { for (SectionPersist sectionPersist : persist.getSections()) {
data.getSections().add(this.buildSectionEntity(sectionPersist)); data.getSections().add(this.buildSectionEntity(sectionPersist));
} }
} }
return data; return data;
} }
private @NotNull SectionEntity buildSectionEntity(SectionPersist persist){
private @NotNull SectionEntity buildSectionEntity(SectionPersist persist) {
SectionEntity data = new SectionEntity(); SectionEntity data = new SectionEntity();
if (persist == null) return data; if (persist == null)
return data;
data.setId(persist.getId()); data.setId(persist.getId());
data.setDescription(persist.getDescription()); data.setDescription(persist.getDescription());
data.setLabel(persist.getLabel()); data.setLabel(persist.getLabel());
data.setOrdinal(persist.getOrdinal()); data.setOrdinal(persist.getOrdinal());
data.setHasTemplates(persist.getHasTemplates()); data.setHasTemplates(persist.getHasTemplates());
if (!this.conventionService.isListNullOrEmpty(persist.getFields())){ if (!this.conventionService.isListNullOrEmpty(persist.getFields())) {
data.setFields(new ArrayList<>()); data.setFields(new ArrayList<>());
for (FieldPersist fieldPersist: persist.getFields()) { for (FieldPersist fieldPersist : persist.getFields()) {
data.getFields().add(this.buildExtraFieldEntity(fieldPersist)); data.getFields().add(this.buildExtraFieldEntity(fieldPersist));
} }
} }
if (!this.conventionService.isListNullOrEmpty(persist.getDescriptionTemplates())){ if (!this.conventionService.isListNullOrEmpty(persist.getDescriptionTemplates())) {
data.setDescriptionTemplates(new ArrayList<>()); data.setDescriptionTemplates(new ArrayList<>());
for (DescriptionTemplatePersist descriptionTemplatePersist: persist.getDescriptionTemplates()) { for (DescriptionTemplatePersist descriptionTemplatePersist : persist.getDescriptionTemplates()) {
data.getDescriptionTemplates().add(this.buildDescriptionTemplateEntity(descriptionTemplatePersist)); data.getDescriptionTemplates().add(this.buildDescriptionTemplateEntity(descriptionTemplatePersist));
} }
} }
@ -174,9 +190,10 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
return data; return data;
} }
private @NotNull DescriptionTemplateEntity buildDescriptionTemplateEntity(DescriptionTemplatePersist persist){ private @NotNull DescriptionTemplateEntity buildDescriptionTemplateEntity(DescriptionTemplatePersist persist) {
DescriptionTemplateEntity data = new DescriptionTemplateEntity(); DescriptionTemplateEntity data = new DescriptionTemplateEntity();
if (persist == null) return data; if (persist == null)
return data;
data.setId(persist.getId()); data.setId(persist.getId());
data.setDescriptionTemplateId(persist.getDescriptionTemplateId()); data.setDescriptionTemplateId(persist.getDescriptionTemplateId());
@ -187,16 +204,17 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
return data; return data;
} }
private @NotNull FieldEntity buildExtraFieldEntity(FieldPersist persist){ private @NotNull FieldEntity buildExtraFieldEntity(FieldPersist persist) {
if (persist == null) return new ExtraFieldEntity(); if (persist == null)
return new ExtraFieldEntity();
FieldEntity data; FieldEntity data;
if (DmpBlueprintFieldCategory.Extra.equals(persist.getCategory())){ if (DmpBlueprintFieldCategory.Extra.equals(persist.getCategory())) {
ExtraFieldEntity dataTyped = new ExtraFieldEntity(); ExtraFieldEntity dataTyped = new ExtraFieldEntity();
dataTyped.setType(((ExtraFieldPersist)persist).getDataType()); dataTyped.setType(((ExtraFieldPersist) persist).getDataType());
data = dataTyped; data = dataTyped;
} else { } else {
SystemFieldEntity dataTyped = new SystemFieldEntity(); SystemFieldEntity dataTyped = new SystemFieldEntity();
dataTyped.setType(((SystemFieldPersist)persist).getSystemFieldType()); dataTyped.setType(((SystemFieldPersist) persist).getSystemFieldType());
data = dataTyped; data = dataTyped;
} }
data.setId(persist.getId()); data.setId(persist.getId());
@ -229,14 +247,16 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
public boolean fieldInBlueprint(DmpBlueprintEntity dmpBlueprintEntity, DmpBlueprintSystemFieldType type) { public boolean fieldInBlueprint(DmpBlueprintEntity dmpBlueprintEntity, DmpBlueprintSystemFieldType type) {
DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(DefinitionEntity.class, dmpBlueprintEntity.getDefinition()); DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(DefinitionEntity.class, dmpBlueprintEntity.getDefinition());
if (definition == null || definition.getSections() == null) return false; if (definition == null || definition.getSections() == null)
return false;
for(SectionEntity section: definition.getSections()){ for (SectionEntity section : definition.getSections()) {
if (section.getFields() == null) continue; if (section.getFields() == null)
for(FieldEntity field: section.getFields()){ continue;
if(field.getCategory().equals(DmpBlueprintFieldCategory.System)){ for (FieldEntity field : section.getFields()) {
SystemFieldEntity systemField = (SystemFieldEntity)field; if (field.getCategory().equals(DmpBlueprintFieldCategory.System)) {
if(systemField.getType().equals(type)){ SystemFieldEntity systemField = (SystemFieldEntity) field;
if (systemField.getType().equals(type)) {
return true; return true;
} }
} }
@ -247,7 +267,8 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
public boolean fieldInBlueprint(UUID id, DmpBlueprintSystemFieldType type) { public boolean fieldInBlueprint(UUID id, DmpBlueprintSystemFieldType type) {
DmpBlueprintEntity data = this.entityManager.find(DmpBlueprintEntity.class, id); 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); return this.fieldInBlueprint(data, type);
} }
@ -262,7 +283,8 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
DmpBlueprintQuery query = this.queryFactory.query(DmpBlueprintQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).ids(id); 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)); 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.setLabel(model.getLabel() + " new ");
model.setId(null); model.setId(null);
@ -273,39 +295,43 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
return model; return model;
} }
private void reassignDefinition(Definition model){ private void reassignDefinition(Definition model) {
if (model == null) return; if (model == null)
return;
if (model.getSections() != null){ if (model.getSections() != null) {
for (Section section : model.getSections()) { for (Section section : model.getSections()) {
this.reassignSection(section); this.reassignSection(section);
} }
} }
} }
private void reassignSection(Section model){ private void reassignSection(Section model) {
if (model == null) return; if (model == null)
return;
model.setId(UUID.randomUUID()); model.setId(UUID.randomUUID());
if (model.getFields() != null){ if (model.getFields() != null) {
for (Field field : model.getFields()) { for (Field field : model.getFields()) {
this.reassignField(field); this.reassignField(field);
} }
} }
if (model.getDescriptionTemplates() != null){ if (model.getDescriptionTemplates() != null) {
for (DescriptionTemplate descriptionTemplate : model.getDescriptionTemplates()) { for (DescriptionTemplate descriptionTemplate : model.getDescriptionTemplates()) {
this.reassignDescriptionTemplate(descriptionTemplate); this.reassignDescriptionTemplate(descriptionTemplate);
} }
} }
} }
private void reassignField(Field model){ private void reassignField(Field model) {
if (model == null) return; if (model == null)
return;
model.setId(UUID.randomUUID()); model.setId(UUID.randomUUID());
} }
private void reassignDescriptionTemplate(DescriptionTemplate model){ private void reassignDescriptionTemplate(DescriptionTemplate model) {
if (model == null) return; if (model == null)
return;
model.setId(UUID.randomUUID()); model.setId(UUID.randomUUID());
} }
@ -318,15 +344,17 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
this.authorizationService.authorizeForce(Permission.ExportDmpBlueprint); this.authorizationService.authorizeForce(Permission.ExportDmpBlueprint);
DmpBlueprintEntity data = this.entityManager.find(DmpBlueprintEntity.class, id); 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()); DefinitionEntity dmpDefinition = this.xmlHandlingService.fromXml(DefinitionEntity.class, data.getDefinition());
String xml = this.xmlHandlingService.toXml(this.definitionXmlToExport(dmpDefinition)); String xml = this.xmlHandlingService.toXml(this.definitionXmlToExport(dmpDefinition));
return this.responseUtilsService.buildResponseFileFromText(xml, data.getLabel() + ".xml"); return this.responseUtilsService.buildResponseFileFromText(xml, data.getLabel() + ".xml");
} }
private DefinitionImportExport definitionXmlToExport(DefinitionEntity entity){ private DefinitionImportExport definitionXmlToExport(DefinitionEntity entity) {
if (entity == null) return null; if (entity == null)
return null;
DefinitionImportExport xml = new DefinitionImportExport(); DefinitionImportExport xml = new DefinitionImportExport();
List<SectionImportExport> dmpBlueprintSections = new ArrayList<>(); List<SectionImportExport> dmpBlueprintSections = new ArrayList<>();
if (!this.conventionService.isListNullOrEmpty(entity.getSections())) { if (!this.conventionService.isListNullOrEmpty(entity.getSections())) {
@ -347,14 +375,14 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
xml.setHasTemplates(entity.getHasTemplates()); xml.setHasTemplates(entity.getHasTemplates());
List<SystemFieldImportExport> dmpBlueprintSystemFieldModels = new LinkedList<>(); List<SystemFieldImportExport> dmpBlueprintSystemFieldModels = new LinkedList<>();
if (!this.conventionService.isListNullOrEmpty(entity.getFields())) { 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)); dmpBlueprintSystemFieldModels.add(this.systemFieldXmlToExport(systemField));
} }
} }
xml.setSystemFields(dmpBlueprintSystemFieldModels); xml.setSystemFields(dmpBlueprintSystemFieldModels);
List<ExtraFieldImportExport> dmpBlueprintExtraFieldModels = new LinkedList<>(); List<ExtraFieldImportExport> dmpBlueprintExtraFieldModels = new LinkedList<>();
if (!this.conventionService.isListNullOrEmpty(entity.getFields())) { 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)); dmpBlueprintExtraFieldModels.add(this.extraFieldXmlToExport(systemField));
} }
} }
@ -404,7 +432,6 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
return xml; return xml;
} }
//endregion //endregion
//region Import //region Import
@ -420,14 +447,16 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService {
persist.setStatus(DmpBlueprintStatus.Draft); persist.setStatus(DmpBlueprintStatus.Draft);
BlueprintImportExport dmpDefinition = this.xmlHandlingService.fromXml(BlueprintImportExport.class, new String(bytes, StandardCharsets.UTF_8)); BlueprintImportExport dmpDefinition = this.xmlHandlingService.fromXml(BlueprintImportExport.class, new String(bytes, StandardCharsets.UTF_8));
if(dmpDefinition != null) persist.setDefinition(this.xmlDefinitionToPersist(dmpDefinition.getDmpBlueprintDefinition())); if (dmpDefinition != null)
persist.setDefinition(this.xmlDefinitionToPersist(dmpDefinition.getDmpBlueprintDefinition()));
this.validationService.validateForce(persist); this.validatorFactory.validator(DmpBlueprintPersist.DmpBlueprintPersistValidator.class).validateForce(persist);
return this.persist(persist, fields); return this.persist(persist, fields);
} }
private DefinitionPersist xmlDefinitionToPersist(DefinitionImportExport importXml){ private DefinitionPersist xmlDefinitionToPersist(DefinitionImportExport importXml) {
if (importXml == null) return null; if (importXml == null)
return null;
DefinitionPersist persist = new DefinitionPersist(); DefinitionPersist persist = new DefinitionPersist();
List<SectionPersist> dmpBlueprintSections = new ArrayList<>(); List<SectionPersist> dmpBlueprintSections = new ArrayList<>();
if (!this.conventionService.isListNullOrEmpty(importXml.getSections())) { if (!this.conventionService.isListNullOrEmpty(importXml.getSections())) {