diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionPersist.java index 11758939f..0bc911d14 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionPersist.java @@ -1,15 +1,19 @@ package eu.eudat.model.persist; +import eu.eudat.authorization.AuthorizationFlags; import eu.eudat.commons.XmlHandlingService; import eu.eudat.commons.enums.DescriptionStatus; +import eu.eudat.commons.enums.IsActive; import eu.eudat.commons.types.descriptiontemplate.DefinitionEntity; +import eu.eudat.commons.types.dmpblueprint.SectionEntity; import eu.eudat.commons.validation.BaseValidator; import eu.eudat.convention.ConventionService; -import eu.eudat.data.DescriptionEntity; -import eu.eudat.data.DescriptionTemplateEntity; -import eu.eudat.data.TenantEntityManager; +import eu.eudat.data.*; import eu.eudat.errorcode.ErrorThesaurusProperties; import eu.eudat.model.persist.descriptionproperties.PropertyDefinitionPersist; +import eu.eudat.query.DescriptionQuery; +import eu.eudat.query.DmpDescriptionTemplateQuery; +import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.validation.specification.Specification; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.MessageSource; @@ -21,6 +25,7 @@ import javax.management.InvalidApplicationException; import java.util.Arrays; import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; public class DescriptionPersist { @@ -151,12 +156,14 @@ public class DescriptionPersist { private final TenantEntityManager entityManager; private final XmlHandlingService xmlHandlingService; + private final QueryFactory queryFactory; - protected DescriptionPersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource, TenantEntityManager entityManager, XmlHandlingService xmlHandlingService) { + protected DescriptionPersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource, TenantEntityManager entityManager, XmlHandlingService xmlHandlingService, QueryFactory queryFactory) { super(conventionService, errors); this.messageSource = messageSource; this.entityManager = entityManager; this.xmlHandlingService = xmlHandlingService; + this.queryFactory = queryFactory; } @Override @@ -167,12 +174,18 @@ public class DescriptionPersist { @Override protected List specifications(DescriptionPersist item) { DescriptionTemplateEntity descriptionTemplate = null; - try { + DmpEntity dmpEntity = null; + DmpBlueprintEntity dmpBlueprintEntity = null; + try { descriptionTemplate = this.isValidGuid(item.getDescriptionTemplateId()) ? this.entityManager.find(DescriptionTemplateEntity.class, item.getDescriptionTemplateId()) : null; - } catch (InvalidApplicationException e) { + dmpEntity = this.isValidGuid(item.getDmpId()) ? this.entityManager.find(DmpEntity.class, item.getDmpId()) : null; + dmpBlueprintEntity = this.entityManager.find(DmpBlueprintEntity.class, dmpEntity.getBlueprintId()); + + } catch (InvalidApplicationException e) { throw new RuntimeException(e); } DefinitionEntity definition = descriptionTemplate == null ? null : this.xmlHandlingService.fromXmlSafe(DefinitionEntity.class, descriptionTemplate.getDefinition()); + DmpBlueprintEntity finalDmpBlueprintEntity = dmpBlueprintEntity; return Arrays.asList( this.spec() .iff(() -> this.isValidGuid(item.getId())) @@ -204,7 +217,11 @@ public class DescriptionPersist { this.spec() .iff(() -> item.getStatus() == DescriptionStatus.Finalized) .must(() -> !this.isNull(item.getProperties())) - .failOn(DescriptionPersist._properties).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._properties}, LocaleContextHolder.getLocale())) + .failOn(DescriptionPersist._properties).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionPersist._properties}, LocaleContextHolder.getLocale())), + this.spec() + .iff(() -> item.getStatus() == DescriptionStatus.Finalized) + .must(() -> this.isDescriptionTemplateMultiplicityValid(finalDmpBlueprintEntity, item.getDmpId(), item.getDescriptionTemplateId())) + .failOn(DescriptionPersist._descriptionTemplateId).failWith(messageSource.getMessage("Validation.InvalidDescriptionTemplateMultiplicity", new Object[]{DescriptionPersist._descriptionTemplateId}, LocaleContextHolder.getLocale())) // this.refSpec() // .iff(() -> !this.isNull(item.getProperties())) // .on(DescriptionPersist._properties) @@ -217,6 +234,35 @@ public class DescriptionPersist { // .using((itm) -> this.validatorFactory.validator(TagPersist.TagPersistValidator.class)) ); } + + private boolean isDescriptionTemplateMultiplicityValid(DmpBlueprintEntity dmpBlueprintEntity, UUID dmpId, UUID descriptionTemplateId){ + eu.eudat.commons.types.dmpblueprint.DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(eu.eudat.commons.types.dmpblueprint.DefinitionEntity.class, dmpBlueprintEntity.getDefinition()); + if (definition == null || this.isListNullOrEmpty(definition.getSections())) return true; + + for (SectionEntity section: definition.getSections()) { + if (section.getHasTemplates() && !this.isListNullOrEmpty(section.getDescriptionTemplates())){ + int descriptionsCount = 0; + + for (eu.eudat.commons.types.dmpblueprint.DescriptionTemplateEntity sectionDescriptionTemplate: section.getDescriptionTemplates()) { + if (sectionDescriptionTemplate.getMaxMultiplicity() == null && sectionDescriptionTemplate.getMinMultiplicity() == null ) continue; + + DmpDescriptionTemplateQuery dmpDescriptionTemplateQuery = this.queryFactory.query(DmpDescriptionTemplateQuery.class).isActive(IsActive.Active).dmpIds(dmpId).sectionIds(section.getId()); + List descriptionEntities = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(dmpId).dmpDescriptionTemplateSubQuery(dmpDescriptionTemplateQuery).isActive(IsActive.Active).collect(); + if (this.isListNullOrEmpty(descriptionEntities)) continue; + + for (DescriptionEntity description: descriptionEntities){ + if (description.getDescriptionTemplateId().equals(descriptionTemplateId)) descriptionsCount++; + } + if (sectionDescriptionTemplate.getMinMultiplicity() != null && sectionDescriptionTemplate.getMinMultiplicity() >= descriptionsCount) return false; + if (sectionDescriptionTemplate.getMaxMultiplicity() != null && sectionDescriptionTemplate.getMaxMultiplicity() <= descriptionsCount) return false; + + } + + } + + } + return true; + } } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpblueprintdefinition/DescriptionTemplatePersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpblueprintdefinition/DescriptionTemplatePersist.java index 3959a8750..783d7fb4f 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpblueprintdefinition/DescriptionTemplatePersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpblueprintdefinition/DescriptionTemplatePersist.java @@ -95,11 +95,7 @@ public class DescriptionTemplatePersist { this.spec() .iff(() -> !this.isNull(item.getMaxMultiplicity())) .must(() -> item.getMaxMultiplicity() > 0) - .failOn(DescriptionTemplatePersist._maxMultiplicity).failWith(messageSource.getMessage("Validation_UnexpectedValue", new Object[]{DescriptionTemplatePersist._maxMultiplicity}, LocaleContextHolder.getLocale())), - this.spec() - .iff(() -> !this.isNull(item.getMaxMultiplicity())) - .must(() -> !this.isNull(item.getMinMultiplicity()) && (item.getMaxMultiplicity() >= item.getMinMultiplicity())) - .failOn(DescriptionTemplatePersist._maxMultiplicity).failWith(messageSource.getMessage("Validation.LowerThanMin", new Object[]{DescriptionTemplatePersist._minMultiplicity}, LocaleContextHolder.getLocale())) + .failOn(DescriptionTemplatePersist._maxMultiplicity).failWith(messageSource.getMessage("Validation_UnexpectedValue", new Object[]{DescriptionTemplatePersist._maxMultiplicity}, LocaleContextHolder.getLocale())) ); } } diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpblueprintdefinition/SectionPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpblueprintdefinition/SectionPersist.java index 46ae7a356..88c0cf5b4 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpblueprintdefinition/SectionPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/dmpblueprintdefinition/SectionPersist.java @@ -149,9 +149,6 @@ public class SectionPersist { this.spec() .must(() -> !this.isNull(item.getHasTemplates())) .failOn(SectionPersist._hasTemplates).failWith(messageSource.getMessage("Validation_Required", new Object[]{SectionPersist._hasTemplates}, LocaleContextHolder.getLocale())), - this.spec() - .must(() -> !this.isListNullOrEmpty(item.getFields())) - .failOn(SectionPersist._fields).failWith(messageSource.getMessage("Validation_Required", new Object[]{SectionPersist._fields}, LocaleContextHolder.getLocale())), this.navSpec() .iff(() -> !this.isListNullOrEmpty(item.getFields())) .on(SectionPersist._fields) diff --git a/dmp-backend/web/src/main/resources/messages.properties b/dmp-backend/web/src/main/resources/messages.properties index cb7a992e0..204587682 100644 --- a/dmp-backend/web/src/main/resources/messages.properties +++ b/dmp-backend/web/src/main/resources/messages.properties @@ -24,4 +24,5 @@ Validation_Unique= {0} must be unique Validation.LowerThanMin= value must be equal or larger than {0} Validation.LessThenEqual= value {0} must be equal or less than {1} Validation.LargerThenEqual= value {0} must be equal or larger than {1} -Validation.MissingFields= missing fields: {0} \ No newline at end of file +Validation.MissingFields= missing fields: {0} +Validation.InvalidDescriptionTemplateMultiplicity= {0} can not be used \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts index d9ee7ef17..b7bc41f0f 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts @@ -295,7 +295,6 @@ export class DmpBlueprintEditorComponent extends BaseEditor 0) { - sectionTempaltesFromDmp.forEach(blueprintDefinedDescriptionTemplate => { + section.descriptionTemplates.forEach(blueprintDefinedDescriptionTemplate => { this.descriptionTemplates.push(new DmpDescriptionTemplateEditorModel(this.validationErrorModel).fromModel( { sectionId: section.id,