diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionImportExport.java index 0ea00e47c..0963ef745 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionImportExport.java @@ -26,6 +26,10 @@ public class DescriptionImportExport { @XmlElement(name = "sectionId") private UUID sectionId; + @XmlElementWrapper(name = "tags") + @XmlElement(name = "tag") + private List tags; + @XmlElement(name = "descriptionTemplate") private DescriptionTemplateImportExport descriptionTemplate; @@ -99,5 +103,13 @@ public class DescriptionImportExport { public void setProperties(DescriptionPropertyDefinitionImportExport properties) { this.properties = properties; } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } } diff --git a/backend/core/src/main/java/org/opencdmp/query/TagQuery.java b/backend/core/src/main/java/org/opencdmp/query/TagQuery.java index d7b05b684..c02bd1ef6 100644 --- a/backend/core/src/main/java/org/opencdmp/query/TagQuery.java +++ b/backend/core/src/main/java/org/opencdmp/query/TagQuery.java @@ -39,6 +39,8 @@ public class TagQuery extends QueryBase { private Collection createdByIds; + private DescriptionTagQuery descriptionTagQuery; + private EnumSet authorize = EnumSet.of(AuthorizationFlags.None); private final UserScope userScope; @@ -146,6 +148,11 @@ public class TagQuery extends QueryBase { return this; } + public TagQuery descriptionTagSubQuery(DescriptionTagQuery subQuery) { + this.descriptionTagQuery = subQuery; + return this; + } + public TagQuery authorize(EnumSet values) { this.authorize = values; return this; @@ -169,7 +176,8 @@ public class TagQuery extends QueryBase { this.isEmpty(this.tags) || this.isEmpty(this.excludedTags) || this.isEmpty(this.excludedIds) || - this.isEmpty(this.createdByIds); + this.isEmpty(this.createdByIds) || + this.isFalseQuery(this.descriptionTagQuery); } @Override @@ -250,6 +258,10 @@ public class TagQuery extends QueryBase { inClause.value(item); predicates.add(inClause); } + if (this.descriptionTagQuery != null) { + QueryContext subQuery = this.applySubQuery(this.descriptionTagQuery, queryContext, UUID.class, descriptionTagEntityRoot -> descriptionTagEntityRoot.get(DescriptionTagEntity._tagId)); + predicates.add(queryContext.CriteriaBuilder.in(queryContext.Root.get(TagEntity._id)).value(subQuery.Query)); + } if (!predicates.isEmpty()) { Predicate[] predicatesArray = predicates.toArray(new Predicate[0]); return queryContext.CriteriaBuilder.and(predicatesArray); diff --git a/backend/core/src/main/java/org/opencdmp/service/description/DescriptionServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/description/DescriptionServiceImpl.java index e6ab79222..5ca1a29fa 100644 --- a/backend/core/src/main/java/org/opencdmp/service/description/DescriptionServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/description/DescriptionServiceImpl.java @@ -1102,6 +1102,13 @@ public class DescriptionServiceImpl implements DescriptionService { DmpDescriptionTemplateEntity dmpDescriptionTemplateEntity = this.queryFactory.query(DmpDescriptionTemplateQuery.class).disableTracking().ids(data.getDmpDescriptionTemplateId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); if (dmpDescriptionTemplateEntity != null) xml.setSectionId(dmpDescriptionTemplateEntity.getSectionId()); + DescriptionTagQuery descriptionTagQuery = new DescriptionTagQuery(); + descriptionTagQuery.descriptionIds(data.getId()); + descriptionTagQuery.isActive(IsActive.Active); + + List tagsEntities = this.queryFactory.query(TagQuery.class).disableTracking().descriptionTagSubQuery(descriptionTagQuery).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); + if (!this.conventionService.isListNullOrEmpty(tagsEntities)) xml.setTags(tagsEntities.stream().map(x -> x.getLabel()).collect(Collectors.toList())); + DescriptionTemplateEntity descriptionTemplateEntity = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking().ids(data.getDescriptionTemplateId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); if (descriptionTemplateEntity != null) { xml.setDescriptionTemplate(this.descriptionTemplateService.exportXmlEntity(descriptionTemplateEntity.getId(), true)); @@ -1254,6 +1261,7 @@ public class DescriptionServiceImpl implements DescriptionService { if (dmpDescriptionTemplate != null) persist.setDmpDescriptionTemplateId(dmpDescriptionTemplate.getId()); } } + persist.setTags(descriptionXml.getTags()); persist.setProperties(this.xmlToPropertyDefinitionToPersist(descriptionXml));