From 4de68e34b25efeaef8591c35ac5f9c77973bc1f1 Mon Sep 17 00:00:00 2001 From: amentis Date: Thu, 4 Apr 2024 17:07:04 +0300 Subject: [PATCH] description template fixes --- .../eu/eudat/model/persist/DmpPersist.java | 68 ++++++++++++++++++- .../dmpblueprint/DmpBlueprintServiceImpl.java | 4 +- .../final-preview/final-preview.component.ts | 16 +++-- ...description-template-editor.component.html | 8 +-- .../description-template-editor.component.ts | 37 +++++++++- .../description-template-editor.model.ts | 2 +- 6 files changed, 117 insertions(+), 18 deletions(-) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpPersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpPersist.java index 9f15c7215..5c8b4c39d 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpPersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DmpPersist.java @@ -1,12 +1,19 @@ package eu.eudat.model.persist; +import eu.eudat.authorization.AuthorizationFlags; +import eu.eudat.commons.XmlHandlingService; import eu.eudat.commons.enums.DmpAccessType; import eu.eudat.commons.enums.DmpStatus; +import eu.eudat.commons.enums.IsActive; +import eu.eudat.commons.types.dmpblueprint.SectionEntity; import eu.eudat.commons.validation.BaseValidator; +import eu.eudat.data.*; +import eu.eudat.query.DescriptionQuery; +import eu.eudat.query.DmpDescriptionTemplateQuery; +import gr.cite.tools.data.query.QueryFactory; import gr.cite.tools.validation.ValidatorFactory; import gr.cite.tools.validation.specification.Specification; import eu.eudat.convention.ConventionService; -import eu.eudat.data.DmpEntity; import eu.eudat.errorcode.ErrorThesaurusProperties; import eu.eudat.model.persist.dmpproperties.DmpPropertiesPersist; import org.springframework.beans.factory.config.ConfigurableBeanFactory; @@ -15,6 +22,7 @@ import org.springframework.context.annotation.Scope; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Component; +import javax.management.InvalidApplicationException; import java.util.Arrays; import java.util.List; import java.util.UUID; @@ -160,11 +168,17 @@ public class DmpPersist { private final MessageSource messageSource; private final ValidatorFactory validatorFactory; + private final TenantEntityManager entityManager; + private final XmlHandlingService xmlHandlingService; + private final QueryFactory queryFactory; - protected DmpPersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource, ValidatorFactory validatorFactory) { + protected DmpPersistValidator(ConventionService conventionService, ErrorThesaurusProperties errors, MessageSource messageSource, ValidatorFactory validatorFactory, TenantEntityManager entityManager, XmlHandlingService xmlHandlingService, QueryFactory queryFactory) { super(conventionService, errors); this.messageSource = messageSource; this.validatorFactory = validatorFactory; + this.entityManager = entityManager; + this.xmlHandlingService = xmlHandlingService; + this.queryFactory = queryFactory; } @Override @@ -174,6 +188,16 @@ public class DmpPersist { @Override protected List specifications(DmpPersist item) { + DmpEntity dmpEntity = null; + DmpBlueprintEntity dmpBlueprintEntity = null; + try { + dmpEntity = this.isValidGuid(item.getId()) ? this.entityManager.find(DmpEntity.class, item.getId()) : null; + if(dmpEntity != null) dmpBlueprintEntity = this.isValidGuid(item.getBlueprint()) ? this.entityManager.find(DmpBlueprintEntity.class, dmpEntity.getBlueprintId()) : null; + + } catch (InvalidApplicationException e) { + throw new RuntimeException(e); + } + DmpBlueprintEntity finalDmpBlueprintEntity = dmpBlueprintEntity; return Arrays.asList( this.spec() .iff(() -> this.isValidGuid(item.getId())) @@ -202,6 +226,10 @@ public class DmpPersist { .iff(() -> item.getStatus() == DmpStatus.Finalized) .must(() -> !this.isNull(item.getProperties())) .failOn(DmpPersist._properties).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._properties}, LocaleContextHolder.getLocale())), + this.spec() + .iff(() -> item.getStatus() == DmpStatus.Finalized) + .must(() -> this.isDescriptionTemplateMultiplicityValid(finalDmpBlueprintEntity, item.getId())) + .failOn(DmpPersist._descriptionTemplates).failWith(messageSource.getMessage("Validation.InvalidDescriptionTemplateMultiplicity", new Object[]{DmpPersist._descriptionTemplates}, LocaleContextHolder.getLocale())), this.refSpec() .iff(() -> !this.isNull(item.getProperties())) .on(DmpPersist._properties) @@ -231,6 +259,42 @@ public class DmpPersist { .using((itm) -> this.validatorFactory.validator(DmpUserPersist.DmpUserPersistValidator.class)) ); } + + private boolean isDescriptionTemplateMultiplicityValid(DmpBlueprintEntity dmpBlueprintEntity, UUID dmpId){ + 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; + + List dmpDescriptionTemplateEntities = this.queryFactory.query(DmpDescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).dmpIds(dmpId).collect(); + List descriptionEntities = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(dmpId).isActive(IsActive.Active).collect(); + + for (SectionEntity section: definition.getSections()) { + if (section.getHasTemplates() && !this.isListNullOrEmpty(section.getDescriptionTemplates())){ + + for (eu.eudat.commons.types.dmpblueprint.DescriptionTemplateEntity sectionDescriptionTemplate: section.getDescriptionTemplates()) { + if (sectionDescriptionTemplate.getMaxMultiplicity() == null && sectionDescriptionTemplate.getMinMultiplicity() == null ) continue; + + int descriptionsCount = 0; + for (DmpDescriptionTemplateEntity dmpDescriptionTemplate: dmpDescriptionTemplateEntities) { + + if(dmpDescriptionTemplate.getSectionId().equals(section.getId())) { + for (DescriptionEntity description: descriptionEntities){ + if (sectionDescriptionTemplate.getDescriptionTemplateGroupId().equals(dmpDescriptionTemplate.getDescriptionTemplateGroupId())) { + if (description.getDmpDescriptionTemplateId().equals(dmpDescriptionTemplate.getId()) && dmpDescriptionTemplate.getSectionId().equals(section.getId())) + 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/service/dmpblueprint/DmpBlueprintServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/dmpblueprint/DmpBlueprintServiceImpl.java index b09cd918c..fe41debe1 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/dmpblueprint/DmpBlueprintServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/dmpblueprint/DmpBlueprintServiceImpl.java @@ -514,8 +514,8 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { DescriptionTemplateImportExport xml = new DescriptionTemplateImportExport(); xml.setDescriptionTemplateGroupId(entity.getDescriptionTemplateGroupId()); xml.setLabel(entity.getLabel()); - xml.setMinMultiplicity(entity.getMinMultiplicity()); - xml.setMaxMultiplicity(entity.getMaxMultiplicity()); + if (entity.getMinMultiplicity() != null ) xml.setMinMultiplicity(entity.getMinMultiplicity()); + if (entity.getMaxMultiplicity() != null ) xml.setMaxMultiplicity(entity.getMaxMultiplicity()); return xml; } diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/final-preview/final-preview.component.ts b/dmp-frontend/src/app/ui/admin/description-template/editor/components/final-preview/final-preview.component.ts index dfd1b102c..0f2bd158b 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/final-preview/final-preview.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/final-preview/final-preview.component.ts @@ -37,15 +37,17 @@ export class FinalPreviewComponent implements OnInit { private generatePreviewForm() { - this.descriptionTemplate = this.buildDescriptionTemplate(this.descriptionTemplatePersist); + if(this.descriptionTemplatePersist){ + this.descriptionTemplate = this.buildDescriptionTemplate(this.descriptionTemplatePersist); - const mockDescription: Description = { - descriptionTemplate: this.descriptionTemplate + const mockDescription: Description = { + descriptionTemplate: this.descriptionTemplate + } + const descriptionEditorModel = new DescriptionEditorModel().fromModel(mockDescription, mockDescription.descriptionTemplate); + this.previewPropertiesFormGroup = descriptionEditorModel.properties.buildForm() as UntypedFormGroup; + + this.visibilityRulesService.setContext(this.descriptionTemplate.definition, this.previewPropertiesFormGroup); } - const descriptionEditorModel = new DescriptionEditorModel().fromModel(mockDescription, mockDescription.descriptionTemplate); - this.previewPropertiesFormGroup = descriptionEditorModel.properties.buildForm() as UntypedFormGroup; - - this.visibilityRulesService.setContext(this.descriptionTemplate.definition, this.previewPropertiesFormGroup); } diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.html index dcece46a4..10778779d 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.html @@ -225,7 +225,7 @@ [datasetProfileId]="datasetProfileId" [validationErrorModel]="editorModel.validationErrorModel" [validationRootPath]="selectedTocEntry.validationRootPath" - (addNewFieldSet)="addNewEntry({childType: tocEntryEnumValues.FieldSet,parent: {formGroup: $event}})" (removeFieldSet)="onRemoveEntry(_findTocEntryById($event, toCEntries))" (cloneFieldSet)="cloneFieldSet($event)" (selectedEntryId)="displayItem(_findTocEntryById($event, toCEntries))" (dataNeedsRefresh)="onDataNeedsRefresh()" + (addNewFieldSet)="addNewEntry({childType: tocEntryEnumValues.FieldSet,parent: {formGroup: $event}})" (removeFieldSet)="onRemoveEntry(_findTocEntryById($event, toCEntries))" (cloneFieldSet)="cloneFieldSet($event, selectedTocEntry.validationRootPath)" (selectedEntryId)="displayItem(_findTocEntryById($event, toCEntries))" (dataNeedsRefresh)="onDataNeedsRefresh()" > @@ -305,7 +305,7 @@
- - - + +