From 85b2258e192b8945f4b1afcbecfbbc9d88fc9d91 Mon Sep 17 00:00:00 2001 From: sgiannopoulos Date: Mon, 29 Apr 2024 17:08:24 +0300 Subject: [PATCH] Description export --- .../opencdmp/authorization/Permission.java | 1 + ...riptionExternalIdentifierImportExport.java | 32 +++ .../DescriptionFieldImportExport.java | 66 +++++ .../importexport/DescriptionImportExport.java | 103 +++++++ ...ropertyDefinitionFieldSetImportExport.java | 34 +++ ...rtyDefinitionFieldSetItemImportExport.java | 45 +++ ...riptionPropertyDefinitionImportExport.java | 27 ++ .../DescriptionReferenceImportExport.java | 62 ++++ .../DescriptionReferenceTypeImportExport.java | 43 +++ ...mplateExternalIdentifierImportExport.java} | 2 +- ...DescriptionTemplateFieldImportExport.java} | 8 +- ...criptionTemplateFieldSetImportExport.java} | 14 +- .../DescriptionTemplateImportExport.java | 37 +-- ...tionTemplateMultiplicityImportExport.java} | 2 +- ... DescriptionTemplatePageImportExport.java} | 11 +- ... DescriptionTemplateRuleImportExport.java} | 8 +- ...scriptionTemplateSectionImportExport.java} | 14 +- .../dmp/importexport/DmpImportExport.java | 13 + ...a => BlueprintDefinitionImportExport.java} | 8 +- ...printDescriptionTemplateImportExport.java} | 13 +- ...a => BlueprintExtraFieldImportExport.java} | 3 +- .../importexport/BlueprintImportExport.java | 9 +- ...eprintReferenceTypeFieldImportExport.java} | 2 +- ...java => BlueprintSectionImportExport.java} | 26 +- ... => BlueprintSystemFieldImportExport.java} | 2 +- .../description/DescriptionService.java | 7 + .../description/DescriptionServiceImpl.java | 267 +++++++++++++++--- .../DescriptionTemplateService.java | 4 + .../DescriptionTemplateServiceImpl.java | 122 ++++---- .../opencdmp/service/dmp/DmpServiceImpl.java | 24 +- .../dmpblueprint/DmpBlueprintServiceImpl.java | 56 ++-- .../controllers/DescriptionController.java | 22 +- .../opencdmp/controllers/DmpController.java | 13 + .../src/main/resources/config/permissions.yml | 12 + .../description/description.service.ts | 14 +- .../file-transformer.service.ts | 28 +- 36 files changed, 924 insertions(+), 230 deletions(-) create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionExternalIdentifierImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionFieldImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionPropertyDefinitionFieldSetImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionPropertyDefinitionFieldSetItemImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionPropertyDefinitionImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionReferenceImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionReferenceTypeImportExport.java rename backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/{ExternalIdentifierImportExport.java => DescriptionTemplateExternalIdentifierImportExport.java} (90%) rename backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/{FieldImportExport.java => DescriptionTemplateFieldImportExport.java} (91%) rename backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/{FieldSetImportExport.java => DescriptionTemplateFieldSetImportExport.java} (84%) rename backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/{MultiplicityImportExport.java => DescriptionTemplateMultiplicityImportExport.java} (94%) rename backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/{PageImportExport.java => DescriptionTemplatePageImportExport.java} (67%) rename backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/{RuleImportExport.java => DescriptionTemplateRuleImportExport.java} (80%) rename backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/{SectionImportExport.java => DescriptionTemplateSectionImportExport.java} (80%) rename backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/{DefinitionImportExport.java => BlueprintDefinitionImportExport.java} (58%) rename backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/{DescriptionTemplateImportExport.java => BlueprintDescriptionTemplateImportExport.java} (85%) rename backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/{ExtraFieldImportExport.java => BlueprintExtraFieldImportExport.java} (94%) rename backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/{ReferenceTypeFieldImportExport.java => BlueprintReferenceTypeFieldImportExport.java} (97%) rename backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/{SectionImportExport.java => BlueprintSectionImportExport.java} (66%) rename backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/{SystemFieldImportExport.java => BlueprintSystemFieldImportExport.java} (97%) diff --git a/backend/core/src/main/java/org/opencdmp/authorization/Permission.java b/backend/core/src/main/java/org/opencdmp/authorization/Permission.java index 23498eccf..865cb5981 100644 --- a/backend/core/src/main/java/org/opencdmp/authorization/Permission.java +++ b/backend/core/src/main/java/org/opencdmp/authorization/Permission.java @@ -109,6 +109,7 @@ public final class Permission { public static String FinalizeDescription = "FinalizeDescription"; public static String DeleteDescription = "DeleteDescription"; public static String CloneDescription = "CloneDescription"; + public static String ExportDescription = "ExportDescription"; //DescriptionTag public static String BrowseDescriptionTag = "BrowseDescriptionTag"; diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionExternalIdentifierImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionExternalIdentifierImportExport.java new file mode 100644 index 000000000..81d3baf33 --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionExternalIdentifierImportExport.java @@ -0,0 +1,32 @@ +package org.opencdmp.commons.types.description.importexport; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; + +@XmlAccessorType(XmlAccessType.FIELD) +public class DescriptionExternalIdentifierImportExport { + + @XmlElement(name = "identifier") + private String identifier; + + @XmlElement(name = "type") + private String type; + + public String getIdentifier() { + return this.identifier; + } + + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + public String getType() { + return this.type; + } + + public void setType(String type) { + this.type = type; + } + +} diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionFieldImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionFieldImportExport.java new file mode 100644 index 000000000..6467afd43 --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionFieldImportExport.java @@ -0,0 +1,66 @@ +package org.opencdmp.commons.types.description.importexport; + + + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElementWrapper; + +import java.time.Instant; +import java.util.List; + +@XmlAccessorType(XmlAccessType.FIELD) +public class DescriptionFieldImportExport { + @XmlElement(name = "fieldId") + private String fieldId; + @XmlElement(name = "textValue") + private String textValue; + @XmlElementWrapper(name = "textListValues") + @XmlElement(name = "textListValue") + private List textListValue; + @XmlElement(name = "dateValue") + private Instant dateValue; + @XmlElement(name = "externalIdentifier") + private DescriptionExternalIdentifierImportExport externalIdentifier; + + public String getFieldId() { + return this.fieldId; + } + + public void setFieldId(String fieldId) { + this.fieldId = fieldId; + } + + public String getTextValue() { + return this.textValue; + } + + public void setTextValue(String textValue) { + this.textValue = textValue; + } + + public List getTextListValue() { + return this.textListValue; + } + + public void setTextListValue(List textListValue) { + this.textListValue = textListValue; + } + + public Instant getDateValue() { + return this.dateValue; + } + + public void setDateValue(Instant dateValue) { + this.dateValue = dateValue; + } + + public DescriptionExternalIdentifierImportExport getExternalIdentifier() { + return this.externalIdentifier; + } + + public void setExternalIdentifier(DescriptionExternalIdentifierImportExport externalIdentifier) { + this.externalIdentifier = externalIdentifier; + } +} 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 new file mode 100644 index 000000000..0ea00e47c --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionImportExport.java @@ -0,0 +1,103 @@ +package org.opencdmp.commons.types.description.importexport; + +import jakarta.xml.bind.annotation.*; +import org.opencdmp.commons.types.descriptiontemplate.importexport.DescriptionTemplateImportExport; + +import java.time.Instant; +import java.util.List; +import java.util.UUID; + +@XmlRootElement(name = "description") +@XmlAccessorType(XmlAccessType.FIELD) +public class DescriptionImportExport { + + @XmlElement(name = "id") + private UUID id; + + @XmlElement(name = "description") + private String description; + + @XmlElement(name = "label") + private String label; + + @XmlElement(name = "finalizedAt") + private Instant finalizedAt; + + @XmlElement(name = "sectionId") + private UUID sectionId; + + @XmlElement(name = "descriptionTemplate") + private DescriptionTemplateImportExport descriptionTemplate; + + @XmlElementWrapper(name = "references") + @XmlElement(name = "reference") + private List references; + + @XmlElement(name = "properties") + private DescriptionPropertyDefinitionImportExport properties; + + public UUID getId() { + return this.id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getDescription() { + return this.description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getLabel() { + return this.label; + } + + public void setLabel(String label) { + this.label = label; + } + + public Instant getFinalizedAt() { + return this.finalizedAt; + } + + public void setFinalizedAt(Instant finalizedAt) { + this.finalizedAt = finalizedAt; + } + + public UUID getSectionId() { + return this.sectionId; + } + + public void setSectionId(UUID sectionId) { + this.sectionId = sectionId; + } + + public DescriptionTemplateImportExport getDescriptionTemplate() { + return this.descriptionTemplate; + } + + public void setDescriptionTemplate(DescriptionTemplateImportExport descriptionTemplate) { + this.descriptionTemplate = descriptionTemplate; + } + + public List getReferences() { + return this.references; + } + + public void setReferences(List references) { + this.references = references; + } + + public DescriptionPropertyDefinitionImportExport getProperties() { + return this.properties; + } + + public void setProperties(DescriptionPropertyDefinitionImportExport properties) { + this.properties = properties; + } +} + diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionPropertyDefinitionFieldSetImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionPropertyDefinitionFieldSetImportExport.java new file mode 100644 index 000000000..c8a500b34 --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionPropertyDefinitionFieldSetImportExport.java @@ -0,0 +1,34 @@ +package org.opencdmp.commons.types.description.importexport; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElementWrapper; + +import java.util.List; + +@XmlAccessorType(XmlAccessType.FIELD) +public class DescriptionPropertyDefinitionFieldSetImportExport { + + @XmlElement(name = "fieldSetId") + private String fieldSetId; + @XmlElementWrapper(name = "items") + @XmlElement(name = "item") + private List items; + + public List getItems() { + return this.items; + } + + public void setItems(List items) { + this.items = items; + } + + public String getFieldSetId() { + return this.fieldSetId; + } + + public void setFieldSetId(String fieldSetId) { + this.fieldSetId = fieldSetId; + } +} diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionPropertyDefinitionFieldSetItemImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionPropertyDefinitionFieldSetItemImportExport.java new file mode 100644 index 000000000..73f3d45b2 --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionPropertyDefinitionFieldSetItemImportExport.java @@ -0,0 +1,45 @@ +package org.opencdmp.commons.types.description.importexport; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElementWrapper; + +import java.util.List; + +@XmlAccessorType(XmlAccessType.FIELD) +public class DescriptionPropertyDefinitionFieldSetItemImportExport { + + + @XmlElementWrapper(name = "fields") + @XmlElement(name = "field") + private List fields; + @XmlElement(name = "comment") + private String comment; + @XmlElement(name = "ordinal") + private int ordinal; + + public List getFields() { + return this.fields; + } + + public void setFields(List fields) { + this.fields = fields; + } + + public String getComment() { + return this.comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public int getOrdinal() { + return this.ordinal; + } + + public void setOrdinal(int ordinal) { + this.ordinal = ordinal; + } +} diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionPropertyDefinitionImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionPropertyDefinitionImportExport.java new file mode 100644 index 000000000..045af737d --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionPropertyDefinitionImportExport.java @@ -0,0 +1,27 @@ +package org.opencdmp.commons.types.description.importexport; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElementWrapper; + +import java.util.List; + +@XmlAccessorType(XmlAccessType.FIELD) +public class DescriptionPropertyDefinitionImportExport { + + @XmlElementWrapper(name = "fieldSets") + @XmlElement(name = "fieldSet") + private List fieldSets; + + public List getFieldSets() { + return this.fieldSets; + } + + public void setFieldSets(List fieldSets) { + this.fieldSets = fieldSets; + } +} + + + diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionReferenceImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionReferenceImportExport.java new file mode 100644 index 000000000..98eaa716f --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionReferenceImportExport.java @@ -0,0 +1,62 @@ +package org.opencdmp.commons.types.description.importexport; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; + +import java.util.UUID; + +@XmlAccessorType(XmlAccessType.FIELD) +public class DescriptionReferenceImportExport { + + @XmlElement(name = "id") + private UUID id; + @XmlElement(name = "label") + private String label; + @XmlElement(name = "reference") + private String reference; + @XmlElement(name = "fieldId") + private String fieldId; + @XmlElement(name = "type") + private DescriptionReferenceTypeImportExport type; + + public UUID getId() { + return this.id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getLabel() { + return this.label; + } + + public void setLabel(String label) { + this.label = label; + } + + public String getReference() { + return this.reference; + } + + public void setReference(String reference) { + this.reference = reference; + } + + public DescriptionReferenceTypeImportExport getType() { + return this.type; + } + + public void setType(DescriptionReferenceTypeImportExport type) { + this.type = type; + } + + public String getFieldId() { + return this.fieldId; + } + + public void setFieldId(String fieldId) { + this.fieldId = fieldId; + } +} diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionReferenceTypeImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionReferenceTypeImportExport.java new file mode 100644 index 000000000..6eb8857e6 --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/importexport/DescriptionReferenceTypeImportExport.java @@ -0,0 +1,43 @@ +package org.opencdmp.commons.types.description.importexport; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; + +import java.util.UUID; + +@XmlAccessorType(XmlAccessType.FIELD) +public class DescriptionReferenceTypeImportExport { + + @XmlElement(name = "id") + private UUID id; + @XmlElement(name = "name") + private String name; + @XmlElement(name = "code") + private String code; + + public UUID getId() { + return this.id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return this.code; + } + + public void setCode(String code) { + this.code = code; + } +} + diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/ExternalIdentifierImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateExternalIdentifierImportExport.java similarity index 90% rename from backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/ExternalIdentifierImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateExternalIdentifierImportExport.java index e78d8606b..84fb3abab 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/ExternalIdentifierImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateExternalIdentifierImportExport.java @@ -5,7 +5,7 @@ import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlAttribute; @XmlAccessorType(XmlAccessType.FIELD) -public class ExternalIdentifierImportExport { +public class DescriptionTemplateExternalIdentifierImportExport { @XmlAttribute(name="identifier") private String identifier; diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/FieldImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateFieldImportExport.java similarity index 91% rename from backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/FieldImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateFieldImportExport.java index 483811a79..47366c931 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/FieldImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateFieldImportExport.java @@ -8,7 +8,7 @@ import jakarta.xml.bind.annotation.*; import java.util.List; @XmlAccessorType(XmlAccessType.FIELD) -public class FieldImportExport { +public class DescriptionTemplateFieldImportExport { @XmlAttribute(name = "id") private String id; @@ -28,7 +28,7 @@ public class FieldImportExport { @XmlElementWrapper(name = "visibilityRules") @XmlElement(name = "visibilityRule") - private List visibilityRules; + private List visibilityRules; @XmlElement(name = "fieldType") private FieldType fieldType; @@ -111,11 +111,11 @@ public class FieldImportExport { this.schematics = schematics; } - public List getVisibilityRules() { + public List getVisibilityRules() { return visibilityRules; } - public void setVisibilityRules(List visibilityRules) { + public void setVisibilityRules(List visibilityRules) { this.visibilityRules = visibilityRules; } diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/FieldSetImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateFieldSetImportExport.java similarity index 84% rename from backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/FieldSetImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateFieldSetImportExport.java index da8914ed7..5c24d43e4 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/FieldSetImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateFieldSetImportExport.java @@ -5,7 +5,7 @@ import jakarta.xml.bind.annotation.*; import java.util.List; @XmlAccessorType(XmlAccessType.FIELD) -public class FieldSetImportExport { +public class DescriptionTemplateFieldSetImportExport { @XmlAttribute(name="id") private String id; @@ -14,7 +14,7 @@ public class FieldSetImportExport { @XmlElementWrapper(name = "fields") @XmlElement(name = "field") - private List fields; + private List fields; @XmlAttribute(name="numbering") private String numbering; @XmlAttribute(name="title") @@ -26,7 +26,7 @@ public class FieldSetImportExport { @XmlAttribute(name="additionalInformation") private String additionalInformation; @XmlElement(name="multiplicity") - private MultiplicityImportExport multiplicity; + private DescriptionTemplateMultiplicityImportExport multiplicity; @XmlAttribute(name="hasMultiplicity") private boolean hasMultiplicity; @@ -49,11 +49,11 @@ public class FieldSetImportExport { this.ordinal = ordinal; } - public List getFields() { + public List getFields() { return fields; } - public void setFields(List fields) { + public void setFields(List fields) { this.fields = fields; } @@ -72,11 +72,11 @@ public class FieldSetImportExport { this.hasCommentField = hasCommentField; } - public MultiplicityImportExport getMultiplicity() { + public DescriptionTemplateMultiplicityImportExport getMultiplicity() { return multiplicity; } - public void setMultiplicity(MultiplicityImportExport multiplicity) { + public void setMultiplicity(DescriptionTemplateMultiplicityImportExport multiplicity) { this.multiplicity = multiplicity; } diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateImportExport.java index f6ac730e1..82c61d937 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateImportExport.java @@ -1,23 +1,17 @@ package org.opencdmp.commons.types.descriptiontemplate.importexport; -import org.opencdmp.commons.enums.DescriptionTemplateStatus; - -import org.opencdmp.model.persist.DescriptionTemplatePersist; -import org.opencdmp.model.persist.NewVersionDescriptionTemplatePersist; -import org.opencdmp.model.persist.descriptiontemplatedefinition.DefinitionPersist; -import org.opencdmp.model.persist.descriptiontemplatedefinition.PagePersist; -import org.opencdmp.model.persist.descriptiontemplatedefinition.SectionPersist; -import org.opencdmp.service.fielddatahelper.FieldDataHelperServiceProvider; import jakarta.xml.bind.annotation.*; -import java.util.LinkedList; import java.util.List; import java.util.UUID; -@XmlRootElement(name = "root") +@XmlRootElement(name = "descriptionTemplate") @XmlAccessorType(XmlAccessType.FIELD) public class DescriptionTemplateImportExport { + + @XmlElement(name = "id") + private UUID id; @XmlAttribute(name = "description") private String description; @XmlAttribute(name = "language") @@ -26,20 +20,27 @@ public class DescriptionTemplateImportExport { private UUID type; @XmlElementWrapper(name = "pages") @XmlElement(name = "page") - private List pages; + private List pages; - - public List getPages() { - return pages; + public UUID getId() { + return this.id; } - public void setPages(List pages) { + public void setId(UUID id) { + this.id = id; + } + + public List getPages() { + return this.pages; + } + + public void setPages(List pages) { this.pages = pages; } public String getDescription() { - return description; + return this.description; } public void setDescription(String description) { @@ -48,7 +49,7 @@ public class DescriptionTemplateImportExport { public String getLanguage() { - return language; + return this.language; } public void setLanguage(String language) { @@ -57,7 +58,7 @@ public class DescriptionTemplateImportExport { public UUID getType() { - return type; + return this.type; } public void setType(UUID type) { diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/MultiplicityImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateMultiplicityImportExport.java similarity index 94% rename from backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/MultiplicityImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateMultiplicityImportExport.java index a73e64fde..2cb64b0db 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/MultiplicityImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateMultiplicityImportExport.java @@ -6,7 +6,7 @@ import jakarta.xml.bind.annotation.XmlAttribute; @XmlAccessorType(XmlAccessType.FIELD) -public class MultiplicityImportExport { +public class DescriptionTemplateMultiplicityImportExport { @XmlAttribute(name="min") private int min; @XmlAttribute(name="max") diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/PageImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplatePageImportExport.java similarity index 67% rename from backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/PageImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplatePageImportExport.java index eecb3fa9c..4833eb7d7 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/PageImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplatePageImportExport.java @@ -1,14 +1,11 @@ package org.opencdmp.commons.types.descriptiontemplate.importexport; -import org.opencdmp.model.persist.descriptiontemplatedefinition.PagePersist; -import org.opencdmp.model.persist.descriptiontemplatedefinition.SectionPersist; -import org.opencdmp.service.fielddatahelper.FieldDataHelperServiceProvider; import jakarta.xml.bind.annotation.*; import java.util.List; @XmlAccessorType(XmlAccessType.FIELD) -public class PageImportExport { +public class DescriptionTemplatePageImportExport { @XmlAttribute(name = "id") private String id; @XmlAttribute(name = "ordinal") @@ -18,7 +15,7 @@ public class PageImportExport { private String title; @XmlElementWrapper(name = "sections") @XmlElement(name = "section") - private List sections; + private List sections; public String getId() { @@ -44,11 +41,11 @@ public class PageImportExport { this.title = title; } - public List getSections() { + public List getSections() { return sections; } - public void setSections(List sections) { + public void setSections(List sections) { this.sections = sections; } diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/RuleImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateRuleImportExport.java similarity index 80% rename from backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/RuleImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateRuleImportExport.java index 05125f3d2..f6ec1c133 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/RuleImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateRuleImportExport.java @@ -6,7 +6,7 @@ import java.time.Instant; import java.util.List; @XmlAccessorType(XmlAccessType.FIELD) -public class RuleImportExport { +public class DescriptionTemplateRuleImportExport { @XmlAttribute(name="target") private String target; @@ -20,7 +20,7 @@ public class RuleImportExport { private Instant dateValue; @XmlElement(name="externalIdentifier") - private ExternalIdentifierImportExport externalIdentifier; + private DescriptionTemplateExternalIdentifierImportExport externalIdentifier; public String getTarget() { return target; @@ -54,11 +54,11 @@ public class RuleImportExport { this.dateValue = dateValue; } - public ExternalIdentifierImportExport getExternalIdentifier() { + public DescriptionTemplateExternalIdentifierImportExport getExternalIdentifier() { return externalIdentifier; } - public void setExternalIdentifier(ExternalIdentifierImportExport externalIdentifier) { + public void setExternalIdentifier(DescriptionTemplateExternalIdentifierImportExport externalIdentifier) { this.externalIdentifier = externalIdentifier; } } \ No newline at end of file diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/SectionImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateSectionImportExport.java similarity index 80% rename from backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/SectionImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateSectionImportExport.java index afcb35924..111b80d3b 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/SectionImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/descriptiontemplate/importexport/DescriptionTemplateSectionImportExport.java @@ -5,7 +5,7 @@ import jakarta.xml.bind.annotation.*; import java.util.List; @XmlAccessorType(XmlAccessType.FIELD) -public class SectionImportExport { +public class DescriptionTemplateSectionImportExport { @XmlAttribute(name = "id") private String id; @XmlAttribute(name = "ordinal") @@ -14,7 +14,7 @@ public class SectionImportExport { private Boolean defaultVisibility; @XmlElementWrapper(name = "fieldSets") @XmlElement(name = "fieldSet") - private List fieldSets; + private List fieldSets; @XmlElement(name = "numbering") private String numbering; @XmlElement(name = "description") @@ -23,7 +23,7 @@ public class SectionImportExport { private String title; @XmlElementWrapper(name = "sections") @XmlElement(name = "section") - private List sections; + private List sections; @XmlAttribute(name = "multiplicity") private Boolean multiplicity; @@ -51,11 +51,11 @@ public class SectionImportExport { this.defaultVisibility = defaultVisibility; } - public List getFieldSets() { + public List getFieldSets() { return fieldSets; } - public void setFieldSets(List fieldSets) { + public void setFieldSets(List fieldSets) { this.fieldSets = fieldSets; } @@ -83,11 +83,11 @@ public class SectionImportExport { this.title = title; } - public List getSections() { + public List getSections() { return sections; } - public void setSections(List sections) { + public void setSections(List sections) { this.sections = sections; } diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpImportExport.java index 93c5d0379..2c007cca5 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpImportExport.java @@ -2,6 +2,7 @@ package org.opencdmp.commons.types.dmp.importexport; import jakarta.xml.bind.annotation.*; import org.opencdmp.commons.enums.DmpAccessType; +import org.opencdmp.commons.types.description.importexport.DescriptionImportExport; import org.opencdmp.commons.types.dmpblueprint.importexport.BlueprintImportExport; import java.time.Instant; @@ -56,6 +57,10 @@ public class DmpImportExport { @XmlElement(name = "reference") private List references; + @XmlElementWrapper(name = "descriptions") + @XmlElement(name = "description") + private List descriptions; + public UUID getId() { return this.id; } @@ -160,5 +165,13 @@ public class DmpImportExport { public void setReferences(List references) { this.references = references; } + + public List getDescriptions() { + return this.descriptions; + } + + public void setDescriptions(List descriptions) { + this.descriptions = descriptions; + } } diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/DefinitionImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintDefinitionImportExport.java similarity index 58% rename from backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/DefinitionImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintDefinitionImportExport.java index 917c209e7..aaee62c59 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/DefinitionImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintDefinitionImportExport.java @@ -6,17 +6,17 @@ import java.util.List; @XmlRootElement(name = "root") @XmlAccessorType(XmlAccessType.FIELD) -public class DefinitionImportExport { +public class BlueprintDefinitionImportExport { @XmlElementWrapper(name = "sections") @XmlElement(name = "section") - private List sections; + private List sections; - public List getSections() { + public List getSections() { return sections; } - public void setSections(List sections) { + public void setSections(List sections) { this.sections = sections; } } \ No newline at end of file diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/DescriptionTemplateImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintDescriptionTemplateImportExport.java similarity index 85% rename from backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/DescriptionTemplateImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintDescriptionTemplateImportExport.java index 5e6865a80..cb63f44de 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/DescriptionTemplateImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintDescriptionTemplateImportExport.java @@ -7,8 +7,7 @@ import jakarta.xml.bind.annotation.XmlAttribute; import java.util.UUID; @XmlAccessorType(XmlAccessType.FIELD) -public class DescriptionTemplateImportExport { - +public class BlueprintDescriptionTemplateImportExport { @XmlAttribute(name = "descriptionTemplateGroupId") private UUID descriptionTemplateGroupId; @XmlAttribute(name = "label") @@ -19,7 +18,7 @@ public class DescriptionTemplateImportExport { private int maxMultiplicity; public UUID getDescriptionTemplateGroupId() { - return descriptionTemplateGroupId; + return this.descriptionTemplateGroupId; } public void setDescriptionTemplateGroupId(UUID descriptionTemplateGroupId) { @@ -27,7 +26,7 @@ public class DescriptionTemplateImportExport { } public String getLabel() { - return label; + return this.label; } public void setLabel(String label) { @@ -35,7 +34,7 @@ public class DescriptionTemplateImportExport { } public int getMinMultiplicity() { - return minMultiplicity; + return this.minMultiplicity; } public void setMinMultiplicity(int minMultiplicity) { @@ -43,12 +42,10 @@ public class DescriptionTemplateImportExport { } public int getMaxMultiplicity() { - return maxMultiplicity; + return this.maxMultiplicity; } public void setMaxMultiplicity(int maxMultiplicity) { this.maxMultiplicity = maxMultiplicity; } - - } diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/ExtraFieldImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintExtraFieldImportExport.java similarity index 94% rename from backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/ExtraFieldImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintExtraFieldImportExport.java index a3f331fde..ca781b382 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/ExtraFieldImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintExtraFieldImportExport.java @@ -1,7 +1,6 @@ package org.opencdmp.commons.types.dmpblueprint.importexport; import org.opencdmp.commons.enums.DmpBlueprintExtraFieldDataType; -import org.opencdmp.commons.enums.DmpBlueprintSystemFieldType; import jakarta.xml.bind.annotation.XmlAccessType; import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlAttribute; @@ -9,7 +8,7 @@ import jakarta.xml.bind.annotation.XmlAttribute; import java.util.UUID; @XmlAccessorType(XmlAccessType.FIELD) -public class ExtraFieldImportExport { +public class BlueprintExtraFieldImportExport { @XmlAttribute(name = "id") private UUID id; diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintImportExport.java index 40ad66f33..497da10de 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintImportExport.java @@ -1,12 +1,9 @@ package org.opencdmp.commons.types.dmpblueprint.importexport; -import jakarta.persistence.Column; -import jakarta.persistence.Id; import jakarta.xml.bind.annotation.XmlAccessType; import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlRootElement; -import org.opencdmp.data.DmpBlueprintEntity; import java.util.UUID; @@ -21,7 +18,7 @@ public class BlueprintImportExport { private String label; @XmlElement(name = "definition") - private DefinitionImportExport dmpBlueprintDefinition; + private BlueprintDefinitionImportExport dmpBlueprintDefinition; public UUID getId() { return this.id; @@ -39,11 +36,11 @@ public class BlueprintImportExport { this.label = label; } - public DefinitionImportExport getDmpBlueprintDefinition() { + public BlueprintDefinitionImportExport getDmpBlueprintDefinition() { return this.dmpBlueprintDefinition; } - public void setDmpBlueprintDefinition(DefinitionImportExport dmpBlueprintDefinition) { + public void setDmpBlueprintDefinition(BlueprintDefinitionImportExport dmpBlueprintDefinition) { this.dmpBlueprintDefinition = dmpBlueprintDefinition; } } diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/ReferenceTypeFieldImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintReferenceTypeFieldImportExport.java similarity index 97% rename from backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/ReferenceTypeFieldImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintReferenceTypeFieldImportExport.java index 681168178..7d4cb7819 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/ReferenceTypeFieldImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintReferenceTypeFieldImportExport.java @@ -7,7 +7,7 @@ import jakarta.xml.bind.annotation.XmlAttribute; import java.util.UUID; @XmlAccessorType(XmlAccessType.FIELD) -public class ReferenceTypeFieldImportExport { +public class BlueprintReferenceTypeFieldImportExport { @XmlAttribute(name = "id") private UUID id; diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/SectionImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintSectionImportExport.java similarity index 66% rename from backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/SectionImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintSectionImportExport.java index f6bf88a8a..0d3c721d5 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/SectionImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintSectionImportExport.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.UUID; @XmlAccessorType(XmlAccessType.FIELD) -public class SectionImportExport { +public class BlueprintSectionImportExport { @XmlAttribute(name = "id") private UUID id; @@ -18,18 +18,18 @@ public class SectionImportExport { private int ordinal; @XmlElementWrapper(name = "systemFields") @XmlElement(name = "systemField") - private List systemFields; + private List systemFields; @XmlElementWrapper(name = "extraFields") @XmlElement(name = "extraField") - private List extraFields; + private List extraFields; @XmlElementWrapper(name = "referenceFields") @XmlElement(name = "referenceField") - private List referenceFields; + private List referenceFields; @XmlAttribute(name = "hasTemplates") private boolean hasTemplates; @XmlElementWrapper(name = "descriptionTemplates") @XmlElement(name = "descriptionTemplate") - private List descriptionTemplates; + private List descriptionTemplates; public UUID getId() { return id; @@ -63,27 +63,27 @@ public class SectionImportExport { this.ordinal = ordinal; } - public List getSystemFields() { + public List getSystemFields() { return systemFields; } - public void setSystemFields(List systemFields) { + public void setSystemFields(List systemFields) { this.systemFields = systemFields; } - public List getExtraFields() { + public List getExtraFields() { return extraFields; } - public void setExtraFields(List extraFields) { + public void setExtraFields(List extraFields) { this.extraFields = extraFields; } - public List getReferenceFields() { + public List getReferenceFields() { return referenceFields; } - public void setReferenceFields(List referenceFields) { + public void setReferenceFields(List referenceFields) { this.referenceFields = referenceFields; } @@ -95,11 +95,11 @@ public class SectionImportExport { this.hasTemplates = hasTemplates; } - public List getDescriptionTemplates() { + public List getDescriptionTemplates() { return descriptionTemplates; } - public void setDescriptionTemplates(List descriptionTemplates) { + public void setDescriptionTemplates(List descriptionTemplates) { this.descriptionTemplates = descriptionTemplates; } diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/SystemFieldImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintSystemFieldImportExport.java similarity index 97% rename from backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/SystemFieldImportExport.java rename to backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintSystemFieldImportExport.java index dc33cd2dd..178340a26 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/SystemFieldImportExport.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmpblueprint/importexport/BlueprintSystemFieldImportExport.java @@ -8,7 +8,7 @@ import jakarta.xml.bind.annotation.XmlAttribute; import java.util.UUID; @XmlAccessorType(XmlAccessType.FIELD) -public class SystemFieldImportExport { +public class BlueprintSystemFieldImportExport { @XmlAttribute(name = "id") private UUID id; diff --git a/backend/core/src/main/java/org/opencdmp/service/description/DescriptionService.java b/backend/core/src/main/java/org/opencdmp/service/description/DescriptionService.java index 145991ad9..8ab684aae 100644 --- a/backend/core/src/main/java/org/opencdmp/service/description/DescriptionService.java +++ b/backend/core/src/main/java/org/opencdmp/service/description/DescriptionService.java @@ -1,5 +1,6 @@ package org.opencdmp.service.description; +import org.opencdmp.commons.types.description.importexport.DescriptionImportExport; import org.opencdmp.data.StorageFileEntity; import org.opencdmp.model.Description; import org.opencdmp.model.DescriptionValidationResult; @@ -14,11 +15,13 @@ import jakarta.xml.bind.JAXBException; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.multipart.MultipartFile; +import org.xml.sax.SAXException; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.management.InvalidApplicationException; +import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; @@ -45,4 +48,8 @@ public interface DescriptionService { StorageFile uploadFieldFile(DescriptionFieldFilePersist model, MultipartFile file, FieldSet fields) throws IOException; StorageFileEntity getFieldFile(UUID descriptionId, UUID storageFileId); void updateDescriptionTemplate(UpdateDescriptionTemplatePersist model) throws InvalidApplicationException, IOException, JAXBException; + + DescriptionImportExport exportXmlEntity(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException; + + ResponseEntity exportXml(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException; } 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 2fc627f06..3db0df3e5 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 @@ -10,10 +10,14 @@ import org.opencdmp.commons.enums.*; import org.opencdmp.commons.scope.tenant.TenantScope; import org.opencdmp.commons.scope.user.UserScope; import org.opencdmp.commons.types.description.*; +import org.opencdmp.commons.types.description.importexport.*; import org.opencdmp.commons.types.descriptionreference.DescriptionReferenceDataEntity; import org.opencdmp.commons.types.descriptiontemplate.FieldSetEntity; import org.opencdmp.commons.types.descriptiontemplate.fielddata.ReferenceTypeDataEntity; import org.opencdmp.commons.types.descriptiontemplate.fielddata.UploadDataEntity; +import org.opencdmp.commons.types.dmp.DmpBlueprintValueEntity; +import org.opencdmp.commons.types.dmp.DmpContactEntity; +import org.opencdmp.commons.types.dmp.importexport.*; import org.opencdmp.commons.types.notification.*; import org.opencdmp.commons.types.reference.DefinitionEntity; import org.opencdmp.commons.notification.NotificationProperties; @@ -37,7 +41,9 @@ import org.opencdmp.model.persist.descriptionproperties.*; import org.opencdmp.model.persist.descriptionreference.DescriptionReferenceDataPersist; import org.opencdmp.model.persist.referencedefinition.DefinitionPersist; import org.opencdmp.query.*; +import org.opencdmp.service.descriptiontemplate.DescriptionTemplateService; import org.opencdmp.service.elastic.ElasticService; +import org.opencdmp.service.responseutils.ResponseUtilsService; import org.opencdmp.service.storage.StorageFileProperties; import org.opencdmp.service.storage.StorageFileService; import org.opencdmp.service.filetransformer.FileTransformerService; @@ -66,11 +72,13 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.util.unit.DataSize; import org.springframework.web.multipart.MultipartFile; +import org.xml.sax.SAXException; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.management.InvalidApplicationException; +import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.net.URLConnection; import java.security.InvalidAlgorithmParameterException; @@ -108,6 +116,8 @@ public class DescriptionServiceImpl implements DescriptionService { private final AnnotationEntityTouchedIntegrationEventHandler annotationEntityTouchedIntegrationEventHandler; private final AnnotationEntityRemovalIntegrationEventHandler annotationEntityRemovalIntegrationEventHandler; private final TenantScope tenantScope; + private final ResponseUtilsService responseUtilsService; + private final DescriptionTemplateService descriptionTemplateService; @Autowired public DescriptionServiceImpl( @@ -122,7 +132,7 @@ public class DescriptionServiceImpl implements DescriptionService { QueryFactory queryFactory, JsonHandlingService jsonHandlingService, UserScope userScope, - XmlHandlingService xmlHandlingService, NotifyIntegrationEventHandler eventHandler, NotificationProperties notificationProperties, FileTransformerService fileTransformerService, ElasticService elasticService, ValidatorFactory validatorFactory, StorageFileProperties storageFileConfig, StorageFileService storageFileService, AuthorizationContentResolver authorizationContentResolver, AnnotationEntityTouchedIntegrationEventHandler annotationEntityTouchedIntegrationEventHandler, AnnotationEntityRemovalIntegrationEventHandler annotationEntityRemovalIntegrationEventHandler, TenantScope tenantScope) { + XmlHandlingService xmlHandlingService, NotifyIntegrationEventHandler eventHandler, NotificationProperties notificationProperties, FileTransformerService fileTransformerService, ElasticService elasticService, ValidatorFactory validatorFactory, StorageFileProperties storageFileConfig, StorageFileService storageFileService, AuthorizationContentResolver authorizationContentResolver, AnnotationEntityTouchedIntegrationEventHandler annotationEntityTouchedIntegrationEventHandler, AnnotationEntityRemovalIntegrationEventHandler annotationEntityRemovalIntegrationEventHandler, TenantScope tenantScope, ResponseUtilsService responseUtilsService, DescriptionTemplateService descriptionTemplateService) { this.entityManager = entityManager; this.authorizationService = authorizationService; this.deleterFactory = deleterFactory; @@ -146,6 +156,8 @@ public class DescriptionServiceImpl implements DescriptionService { this.annotationEntityTouchedIntegrationEventHandler = annotationEntityTouchedIntegrationEventHandler; this.annotationEntityRemovalIntegrationEventHandler = annotationEntityRemovalIntegrationEventHandler; this.tenantScope = tenantScope; + this.responseUtilsService = responseUtilsService; + this.descriptionTemplateService = descriptionTemplateService; } @Override @@ -175,7 +187,7 @@ public class DescriptionServiceImpl implements DescriptionService { Boolean isUpdate = this.conventionService.isValidGuid(model.getId()); DmpDescriptionTemplateEntity dmpDescriptionTemplate = this.entityManager.find(DmpDescriptionTemplateEntity.class, model.getDmpDescriptionTemplateId()); - if (dmpDescriptionTemplate == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDmpDescriptionTemplateId(), DmpDescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (dmpDescriptionTemplate == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDmpDescriptionTemplateId(), DmpDescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (isUpdate) this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionAffiliation(model.getId())), Permission.EditDescription); else this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionsAffiliationBySection(model.getDmpId(), dmpDescriptionTemplate.getSectionId())), Permission.EditDescription); @@ -183,7 +195,7 @@ public class DescriptionServiceImpl implements DescriptionService { DescriptionEntity data; if (isUpdate) { data = this.entityManager.find(DescriptionEntity.class, model.getId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); if (data.getStatus().equals(DescriptionStatus.Finalized)) throw new MyValidationException(this.errors.getDescriptionIsFinalized().getCode(), this.errors.getDescriptionIsFinalized().getMessage()); if (!data.getDmpId().equals(model.getDmpId())) throw new MyValidationException(this.errors.getDmpCanNotChange().getCode(), this.errors.getDmpCanNotChange().getMessage()); @@ -199,12 +211,12 @@ public class DescriptionServiceImpl implements DescriptionService { } DescriptionTemplateEntity descriptionTemplateEntity = this.entityManager.find(DescriptionTemplateEntity.class, model.getDescriptionTemplateId()); - if (descriptionTemplateEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (descriptionTemplateEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!dmpDescriptionTemplate.getDescriptionTemplateGroupId().equals(descriptionTemplateEntity.getGroupId())) throw new MyValidationException(this.errors.getInvalidDescriptionTemplate().getCode(), this.errors.getInvalidDescriptionTemplate().getMessage()); DmpEntity dmp = this.entityManager.find(DmpEntity.class, data.getDmpId()); - if (dmp == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{data.getDmpId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (dmp == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{data.getDmpId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (dmp.getStatus().equals(DmpStatus.Finalized) && isUpdate) throw new MyValidationException(this.errors.getDmpIsFinalized().getCode(), this.errors.getDmpIsFinalized().getMessage()); @@ -251,14 +263,14 @@ public class DescriptionServiceImpl implements DescriptionService { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionAffiliation(model.getId())), Permission.EditDescription); DescriptionEntity data = this.entityManager.find(DescriptionEntity.class, model.getId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); DescriptionTemplateEntity oldDescriptionTemplateEntity = this.entityManager.find(DescriptionTemplateEntity.class, data.getDescriptionTemplateId()); - if (oldDescriptionTemplateEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{data.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (oldDescriptionTemplateEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{data.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); DmpDescriptionTemplateEntity dmpDescriptionTemplateEntity = this.entityManager.find(DmpDescriptionTemplateEntity.class, data.getDmpDescriptionTemplateId()); - if (dmpDescriptionTemplateEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{data.getDmpDescriptionTemplateId(), DmpDescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (dmpDescriptionTemplateEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{data.getDmpDescriptionTemplateId(), DmpDescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); List latestVersionDescriptionTemplates = this.queryFactory.query(DescriptionTemplateQuery.class) @@ -367,9 +379,9 @@ public class DescriptionServiceImpl implements DescriptionService { List contactPairs = new ArrayList<>(); contactPairs.add(new ContactPair(ContactInfoType.Email, query.first().getValue())); NotificationContactData contactData = new NotificationContactData(contactPairs, null, null); - event.setContactHint(jsonHandlingService.toJsonSafe(contactData)); + event.setContactHint(this.jsonHandlingService.toJsonSafe(contactData)); - event = this.applyNotificationType(description.getStatus(), event); + this.applyNotificationType(description.getStatus(), event); NotificationFieldData data = new NotificationFieldData(); List fieldInfoList = new ArrayList<>(); fieldInfoList.add(new FieldInfo("{recipient}", DataType.String, user.getName())); @@ -377,18 +389,18 @@ public class DescriptionServiceImpl implements DescriptionService { fieldInfoList.add(new FieldInfo("{name}", DataType.String, description.getLabel())); fieldInfoList.add(new FieldInfo("{id}", DataType.String, description.getId().toString())); data.setFields(fieldInfoList); - event.setData(jsonHandlingService.toJsonSafe(data)); + event.setData(this.jsonHandlingService.toJsonSafe(data)); - eventHandler.handle(event); + this.eventHandler.handle(event); } private NotifyIntegrationEvent applyNotificationType(DescriptionStatus status, NotifyIntegrationEvent event) { switch (status) { case Draft: - event.setNotificationType(notificationProperties.getDescriptionModifiedType()); + event.setNotificationType(this.notificationProperties.getDescriptionModifiedType()); break; case Finalized: - event.setNotificationType(notificationProperties.getDescriptionFinalisedType()); + event.setNotificationType(this.notificationProperties.getDescriptionFinalisedType()); break; default: throw new MyApplicationException("Unsupported Description Status."); @@ -403,13 +415,13 @@ public class DescriptionServiceImpl implements DescriptionService { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionAffiliation(model.getId())), Permission.EditDescription); DescriptionEntity data = this.entityManager.find(DescriptionEntity.class, model.getId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); if (!data.getStatus().equals(model.getStatus())){ if (data.getStatus().equals(DescriptionStatus.Finalized)){ this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionAffiliation(model.getId())), Permission.FinalizeDescription); DmpEntity dmpEntity = this.entityManager.find(DmpEntity.class, data.getDmpId()); - if (dmpEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{data.getDmpId(), DmpEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (dmpEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{data.getDmpId(), DmpEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); if(!dmpEntity.getStatus().equals(DmpStatus.Draft)) throw new MyValidationException(this.errors.getDmpIsFinalized().getCode(), this.errors.getDmpIsFinalized().getMessage()); } @@ -442,8 +454,8 @@ public class DescriptionServiceImpl implements DescriptionService { DescriptionPersist.DescriptionPersistValidator validator = this.validatorFactory.validator(DescriptionPersist.DescriptionPersistValidator.class); validator.validate(this.buildDescriptionPersist(description)); - if (validator.result().isValid()) descriptionValidationResult.setResult(DescriptionValidationOutput.Valid);; - descriptionValidationResults.add(descriptionValidationResult); + if (validator.result().isValid()) descriptionValidationResult.setResult(DescriptionValidationOutput.Valid); + descriptionValidationResults.add(descriptionValidationResult); } return descriptionValidationResults; @@ -523,10 +535,10 @@ public class DescriptionServiceImpl implements DescriptionService { if (!this.conventionService.isListNullOrEmpty(persist.getTextListValue())) persist.getTextListValue().stream().map(UUID::fromString).toList(); else if (!this.conventionService.isNullOrEmpty(persist.getTextValue())) ids.add(UUID.fromString(persist.getTextValue())); - if (ids.size() > 0){ + if (!ids.isEmpty()){ Set existingIds = this.queryFactory.query(DmpQuery.class).ids(ids).collectAs(new BaseFieldSet().ensure(Dmp._id)).stream().map(DmpEntity::getId).collect(Collectors.toSet()); for (UUID id : ids){ - if (!existingIds.contains(id)) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (!existingIds.contains(id)) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); } } @@ -534,10 +546,10 @@ public class DescriptionServiceImpl implements DescriptionService { if ( !this.conventionService.isListNullOrEmpty(persist.getTextListValue())) ids = persist.getTextListValue().stream().map(UUID::fromString).toList(); else if (!this.conventionService.isNullOrEmpty(persist.getTextValue())) ids.add(UUID.fromString(persist.getTextValue())); - if (ids.size() > 0) { + if (!ids.isEmpty()) { Set existingIds = this.queryFactory.query(DescriptionQuery.class).ids(ids).collectAs(new BaseFieldSet().ensure(Description._id)).stream().map(DescriptionEntity::getId).collect(Collectors.toSet()); for (UUID id : ids){ - if (!existingIds.contains(id)) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (!existingIds.contains(id)) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); } } } @@ -581,7 +593,7 @@ public class DescriptionServiceImpl implements DescriptionService { if (definitionFieldSetItemPersist.getFields() != null && !definitionFieldSetItemPersist.getFields().isEmpty()) { for (String key : definitionFieldSetItemPersist.getFields().keySet()) { FieldPersist fieldPersist = definitionFieldSetItemPersist.getFields().get(key); - BuildDescriptionReferencePersist(key, fieldPersist, descriptionReferencePersists); + this.BuildDescriptionReferencePersist(key, fieldPersist, descriptionReferencePersists); } } } @@ -634,10 +646,10 @@ public class DescriptionServiceImpl implements DescriptionService { ReferenceEntity referenceEntity = null; if (this.conventionService.isValidGuid(referencePersist.getId())){ referenceEntity = this.entityManager.find(ReferenceEntity.class, referencePersist.getId()); - if (referenceEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{referencePersist.getId(), Reference.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (referenceEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{referencePersist.getId(), Reference.class.getSimpleName()}, LocaleContextHolder.getLocale())); } else { ReferenceTypeDataEntity fieldEntity = definition.getFieldById(model.getData().getFieldId()).stream().filter(x-> x.getData() != null && x.getData().getFieldType().equals(FieldType.REFERENCE_TYPES)).map(x-> (ReferenceTypeDataEntity)x.getData()).findFirst().orElse(null); - if (fieldEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getData().getFieldId(), ReferenceTypeDataEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (fieldEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getData().getFieldId(), ReferenceTypeDataEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); referenceEntity = this.queryFactory.query(ReferenceQuery.class).sourceTypes(referencePersist.getSourceType()).typeIds(fieldEntity.getReferenceTypeId()).sources(referencePersist.getSource()).isActive(IsActive.Active).references(referencePersist.getReference()).first(); if (referenceEntity == null){ @@ -656,14 +668,14 @@ public class DescriptionServiceImpl implements DescriptionService { referenceEntity.setSourceType(referencePersist.getSourceType()); try { ReferenceTypeEntity referenceType = this.queryFactory.query(ReferenceTypeQuery.class).ids(fieldEntity.getReferenceTypeId()).firstAs(new BaseFieldSet().ensure(ReferenceType._id).ensure(ReferenceTypeEntity._tenantId)); - if (referenceType == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{fieldEntity.getReferenceTypeId(), ReferenceType.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (referenceType == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{fieldEntity.getReferenceTypeId(), ReferenceType.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (referenceEntity.getSourceType().equals(ReferenceSourceType.External) && !this.tenantScope.isDefaultTenant() && referenceType.getTenantId() == null){ this.tenantScope.setTempTenant(this.entityManager.getEntityManager(), null, this.tenantScope.getDefaultTenantCode()); } this.entityManager.persist(referenceEntity); } finally { - tenantScope.removeTempTenant(this.entityManager.getEntityManager()); + this.tenantScope.removeTempTenant(this.entityManager.getEntityManager()); } } } @@ -816,7 +828,7 @@ public class DescriptionServiceImpl implements DescriptionService { newDescription.setDmpId(dmpId); newDescription.setDmpDescriptionTemplateId(existing.getDmpDescriptionTemplateId()); newDescription.setDescriptionTemplateId(existing.getDescriptionTemplateId()); - newDescription.setCreatedById(userScope.getUserId()); + newDescription.setCreatedById(this.userScope.getUserId()); newDescription.setCreatedAt(Instant.now()); newDescription.setUpdatedAt(Instant.now()); newDescription.setIsActive(IsActive.Active); @@ -889,13 +901,13 @@ public class DescriptionServiceImpl implements DescriptionService { this.authorizationService.authorizeForce(Permission.EditDescription);//TODO: Missing Description or dmp for authz DescriptionTemplateEntity descriptionTemplate = this.queryFactory.query(DescriptionTemplateQuery.class).ids(model.getDescriptionTemplateId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).first(); - if (descriptionTemplate == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (descriptionTemplate == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); org.opencdmp.commons.types.descriptiontemplate.DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(org.opencdmp.commons.types.descriptiontemplate.DefinitionEntity.class, descriptionTemplate.getDefinition()); - if (definition == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDescriptionTemplateId(), org.opencdmp.commons.types.descriptiontemplate.DefinitionEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (definition == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDescriptionTemplateId(), org.opencdmp.commons.types.descriptiontemplate.DefinitionEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); org.opencdmp.commons.types.descriptiontemplate.FieldEntity fieldEntity = definition.getFieldById(model.getFieldId()).stream().filter(x -> x != null && x.getData() != null && x.getData().getFieldType().equals(FieldType.UPLOAD)).findFirst().orElse(null); - if (fieldEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getFieldId(), org.opencdmp.commons.types.descriptiontemplate.FieldEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (fieldEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getFieldId(), org.opencdmp.commons.types.descriptiontemplate.FieldEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); UploadDataEntity uploadDataEntity = (UploadDataEntity)fieldEntity.getData(); if (DataSize.ofBytes(file.getSize()).equals(DataSize.ofMegabytes(uploadDataEntity.getMaxFileSizeInMB()))) { @@ -929,13 +941,13 @@ public class DescriptionServiceImpl implements DescriptionService { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionAffiliation(descriptionId)), Permission.BrowseDescription); DescriptionEntity descriptionEntity = this.queryFactory.query(DescriptionQuery.class).isActive(IsActive.Active).ids(descriptionId).first(); - if (descriptionEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{descriptionId, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (descriptionEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{descriptionId, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); DmpDescriptionTemplateEntity dmpDescriptionTemplateEntity = this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first(); - if (dmpDescriptionTemplateEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{descriptionEntity.getDmpDescriptionTemplateId(), DmpDescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (dmpDescriptionTemplateEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{descriptionEntity.getDmpDescriptionTemplateId(), DmpDescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); DmpEntity dmpEntity = this.queryFactory.query(DmpQuery.class).ids(dmpDescriptionTemplateEntity.getDmpId()).isActive(IsActive.Active).first(); - if (dmpEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{dmpDescriptionTemplateEntity.getDmpId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (dmpEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{dmpDescriptionTemplateEntity.getDmpId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!dmpEntity.getAccessType().equals(DmpAccessType.Public)) { @@ -944,7 +956,7 @@ public class DescriptionServiceImpl implements DescriptionService { } StorageFileEntity storageFile = this.queryFactory.query(StorageFileQuery.class).ids(storageFileId).first(); - if (storageFile == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{storageFileId, StorageFile.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (storageFile == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{storageFileId, StorageFile.class.getSimpleName()}, LocaleContextHolder.getLocale())); return storageFile; } @@ -957,7 +969,7 @@ public class DescriptionServiceImpl implements DescriptionService { if (data == null) return persist; DescriptionTemplateEntity descriptionTemplateEntity = this.entityManager.find(DescriptionTemplateEntity.class, data.getDescriptionTemplateId()); - if (descriptionTemplateEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{data.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (descriptionTemplateEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{data.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); persist.setLabel(data.getLabel()); persist.setStatus(DescriptionStatus.Finalized); @@ -997,13 +1009,15 @@ public class DescriptionServiceImpl implements DescriptionService { if (data.getFieldSets() != null && !data.getFieldSets().isEmpty()){ for (PropertyDefinitionFieldSetEntity fieldSet: data.getFieldSets().values()) { - if (!this.conventionService.isListNullOrEmpty(fieldSet.getItems())); - for (PropertyDefinitionFieldSetItemEntity item: fieldSet.getItems()) { - if (item.getFields() != null && !item.getFields().isEmpty()); - for (String key: item.getFields().keySet()) { - if (definition.getFieldById(key).getFirst() != null && FieldType.isReferenceType(definition.getFieldById(key).getFirst().getData().getFieldType())){ - if (!this.conventionService.isListNullOrEmpty(item.getFields().get(key).getTextListValue())){ - referenceIds.addAll(item.getFields().get(key).getTextListValue()); + if (!this.conventionService.isListNullOrEmpty(fieldSet.getItems())){ + for (PropertyDefinitionFieldSetItemEntity item: fieldSet.getItems()) { + if (item.getFields() != null && !item.getFields().isEmpty()) { + for (String key : item.getFields().keySet()) { + if (definition.getFieldById(key).getFirst() != null && FieldType.isReferenceType(definition.getFieldById(key).getFirst().getData().getFieldType())) { + if (!this.conventionService.isListNullOrEmpty(item.getFields().get(key).getTextListValue())) { + referenceIds.addAll(item.getFields().get(key).getTextListValue()); + } + } } } } @@ -1013,7 +1027,7 @@ public class DescriptionServiceImpl implements DescriptionService { if (!this.conventionService.isListNullOrEmpty(referenceIds)) { referenceIds = referenceIds.stream().distinct().collect(Collectors.toList()); - return referenceIds.stream().filter(x -> this.conventionService.isValidGuid(UUID.fromString(x))).collect(Collectors.toList()).stream().map(x -> UUID.fromString(x)).collect(Collectors.toList()); + return referenceIds.stream().filter(x -> this.conventionService.isValidGuid(UUID.fromString(x))).toList().stream().map(UUID::fromString).collect(Collectors.toList()); } @@ -1059,7 +1073,7 @@ public class DescriptionServiceImpl implements DescriptionService { else if (FieldType.isExternalIdentifierType(fieldType) && data.getExternalIdentifier() != null) persist.setExternalIdentifier(this.buildExternalIdentifierPersist(data.getExternalIdentifier())); else if (FieldType.isReferenceType(fieldType) && fieldEntity != null ) { if (!this.conventionService.isListNullOrEmpty(data.getTextListValue()) && !this.conventionService.isListNullOrEmpty(references)){ - List referenceIdsInField = data.getTextListValue().stream().filter(x -> this.conventionService.isValidGuid(UUID.fromString(x))).collect(Collectors.toList()).stream().map(x -> UUID.fromString(x)).collect(Collectors.toList()); + List referenceIdsInField = data.getTextListValue().stream().filter(x -> this.conventionService.isValidGuid(UUID.fromString(x))).toList().stream().map(UUID::fromString).collect(Collectors.toList()); if (!this.conventionService.isListNullOrEmpty(referenceIdsInField)){ List referencesInField = references.stream().filter(x -> referenceIdsInField.contains(x.getId())).collect(Collectors.toList()); if (!this.conventionService.isListNullOrEmpty(referencesInField)){ @@ -1101,4 +1115,167 @@ public class DescriptionServiceImpl implements DescriptionService { return referencesPersist; } + + //region Export + + @Override + public DescriptionImportExport exportXmlEntity(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException { + logger.debug(new MapLogEntry("export xml").And("id", id)); + + this.authorizationService.authorizeForce(Permission.ExportDescription); + DescriptionEntity data = this.entityManager.find(DescriptionEntity.class, id); + if (data == null) + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); + + PropertyDefinitionEntity definition = this.jsonHandlingService.fromJson(PropertyDefinitionEntity.class, data.getProperties()); + return this.toExport(data, definition); + } + + @Override + public ResponseEntity exportXml(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException { + logger.debug(new MapLogEntry("export xml").And("id", id)); + + this.authorizationService.authorizeForce(Permission.ExportDescription); + DescriptionEntity data = this.entityManager.find(DescriptionEntity.class, id); + if (data == null) + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); + + String xml = this.xmlHandlingService.toXml(this.exportXmlEntity(data.getId())); + return this.responseUtilsService.buildResponseFileFromText(xml, data.getLabel() + ".xml"); + } + + private DescriptionImportExport toExport(DescriptionEntity data, PropertyDefinitionEntity propertiesEntity) throws InvalidApplicationException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException { + DescriptionImportExport xml = new DescriptionImportExport(); + xml.setId(data.getId()); + xml.setDescription(data.getDescription()); + xml.setLabel(data.getLabel()); + xml.setFinalizedAt(data.getFinalizedAt()); + + DescriptionTemplateEntity blueprintEntity = this.queryFactory.query(DescriptionTemplateQuery.class).ids(data.getDescriptionTemplateId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).first(); + if (blueprintEntity != null) { + xml.setDescriptionTemplate(this.descriptionTemplateService.exportXmlEntity(blueprintEntity.getId())); + } + + if (propertiesEntity != null) { + xml.setProperties(this.descriptionPropertyDefinitionToExport(propertiesEntity)); + } + + List dmpReferences = this.queryFactory.query(DescriptionReferenceQuery.class).descriptionIds(data.getId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).collect(); + if (!this.conventionService.isListNullOrEmpty(dmpReferences)) { + List references = this.queryFactory.query(ReferenceQuery.class).ids(dmpReferences.stream().map(DescriptionReferenceEntity::getReferenceId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).collect(); + Map referenceEntityMap = references == null ? new HashMap<>() : references.stream().collect(Collectors.toMap(ReferenceEntity::getId, x-> x)); + List referenceTypes = references == null ? new ArrayList<>() : this.queryFactory.query(ReferenceTypeQuery.class).ids(references.stream().map(ReferenceEntity::getTypeId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).collect(); + Map referenceTypeEntityMap = referenceTypes == null ? new HashMap<>() : referenceTypes.stream().collect(Collectors.toMap(ReferenceTypeEntity::getId, x-> x)); + List dmpReferenceImportExports = new LinkedList<>(); + for (DescriptionReferenceEntity descriptionTemplateEntity : dmpReferences) { + dmpReferenceImportExports.add(this.descriptionReferenceToExport(descriptionTemplateEntity, referenceEntityMap, referenceTypeEntityMap)); + } + xml.setReferences(dmpReferenceImportExports); + } + return xml; + } + + private DescriptionReferenceImportExport descriptionReferenceToExport(DescriptionReferenceEntity entity, Map referenceEntityMap, Map referenceTypeEntityMap) { + DescriptionReferenceImportExport xml = new DescriptionReferenceImportExport(); + if (entity == null) return xml; + DescriptionReferenceDataEntity referenceData = this.jsonHandlingService.fromJsonSafe(DescriptionReferenceDataEntity.class, entity.getData()); + if (referenceData != null) xml.setFieldId(referenceData.getFieldId()); + ReferenceEntity reference = referenceEntityMap.getOrDefault(entity.getReferenceId(), null); + + if (reference != null){ + xml.setId(reference.getId()); + xml.setLabel(reference.getLabel()); + xml.setReference(reference.getReference()); + ReferenceTypeEntity referenceType = referenceTypeEntityMap.getOrDefault(reference.getTypeId(), null); + if (referenceType != null) xml.setType(this.descriptionReferenceTypeToExport(referenceType)); + } + + return xml; + } + + private DescriptionReferenceTypeImportExport descriptionReferenceTypeToExport(ReferenceTypeEntity entity) { + DescriptionReferenceTypeImportExport xml = new DescriptionReferenceTypeImportExport(); + if (entity == null) return xml; + xml.setId(entity.getId()); + xml.setCode(entity.getCode()); + xml.setName(entity.getName()); + + return xml; + } + + + private DescriptionPropertyDefinitionImportExport descriptionPropertyDefinitionToExport(PropertyDefinitionEntity entity) { + DescriptionPropertyDefinitionImportExport xml = new DescriptionPropertyDefinitionImportExport(); + if (entity == null) return xml; + + if (entity.getFieldSets() != null && !entity.getFieldSets().isEmpty()) { + List exports = new LinkedList<>(); + for (Map.Entry fieldSetEntityEntry : entity.getFieldSets().entrySet()) { + exports.add(this.descriptionPropertyDefinitionFieldSetToExport(fieldSetEntityEntry.getValue(), fieldSetEntityEntry.getKey())); + } + xml.setFieldSets(exports); + } + + return xml; + } + + private DescriptionPropertyDefinitionFieldSetImportExport descriptionPropertyDefinitionFieldSetToExport(PropertyDefinitionFieldSetEntity entity, String fieldSetId) { + DescriptionPropertyDefinitionFieldSetImportExport xml = new DescriptionPropertyDefinitionFieldSetImportExport(); + xml.setFieldSetId(fieldSetId); + if (entity == null) return xml; + + if (entity.getItems() != null && !entity.getItems().isEmpty()) { + List exports = new LinkedList<>(); + for (PropertyDefinitionFieldSetItemEntity propertyDefinitionFieldSetItemEntity : entity.getItems()) { + exports.add(this.descriptionPropertyDefinitionFieldSetItemToExport(propertyDefinitionFieldSetItemEntity)); + } + xml.setItems(exports); + } + + return xml; + } + + private DescriptionPropertyDefinitionFieldSetItemImportExport descriptionPropertyDefinitionFieldSetItemToExport(PropertyDefinitionFieldSetItemEntity entity) { + DescriptionPropertyDefinitionFieldSetItemImportExport xml = new DescriptionPropertyDefinitionFieldSetItemImportExport(); + if (entity == null) return xml; + + xml.setComment(entity.getComment()); + xml.setOrdinal(entity.getOrdinal()); + if (entity.getFields() != null && !entity.getFields().isEmpty()) { + List exports = new LinkedList<>(); + for (Map.Entry fieldSetEntityEntry : entity.getFields().entrySet()) { + exports.add(this.descriptionFieldImportExportToExport(fieldSetEntityEntry.getValue(), fieldSetEntityEntry.getKey())); + } + xml.setFields(exports); + } + + return xml; + } + + private DescriptionFieldImportExport descriptionFieldImportExportToExport(FieldEntity entity, String fieldId) { + DescriptionFieldImportExport xml = new DescriptionFieldImportExport(); + xml.setFieldId(fieldId); + if (entity == null) return xml; + + xml.setDateValue(entity.getDateValue()); + xml.setTextValue(entity.getTextValue()); + xml.setTextListValue(entity.getTextListValue()); + if (entity.getExternalIdentifier() != null) { + xml.setExternalIdentifier(this.descriptionExternalIdentifierToExport(entity.getExternalIdentifier())); + } + + return xml; + } + + private DescriptionExternalIdentifierImportExport descriptionExternalIdentifierToExport(ExternalIdentifierEntity entity) { + DescriptionExternalIdentifierImportExport xml = new DescriptionExternalIdentifierImportExport(); + if (entity == null) return xml; + + xml.setIdentifier(entity.getIdentifier()); + xml.setType(entity.getType()); + + return xml; + } + + //endregion } diff --git a/backend/core/src/main/java/org/opencdmp/service/descriptiontemplate/DescriptionTemplateService.java b/backend/core/src/main/java/org/opencdmp/service/descriptiontemplate/DescriptionTemplateService.java index 49b782a9c..c3aa84fd3 100644 --- a/backend/core/src/main/java/org/opencdmp/service/descriptiontemplate/DescriptionTemplateService.java +++ b/backend/core/src/main/java/org/opencdmp/service/descriptiontemplate/DescriptionTemplateService.java @@ -1,6 +1,7 @@ package org.opencdmp.service.descriptiontemplate; import com.fasterxml.jackson.core.JsonProcessingException; +import org.opencdmp.commons.types.descriptiontemplate.importexport.DescriptionTemplateImportExport; import org.opencdmp.model.DescriptionTemplate; import org.opencdmp.model.persist.DescriptionTemplatePersist; import org.opencdmp.model.persist.NewVersionDescriptionTemplatePersist; @@ -26,6 +27,9 @@ public interface DescriptionTemplateService { DescriptionTemplate buildClone(UUID id, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException; DescriptionTemplate createNewVersion(NewVersionDescriptionTemplatePersist model, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException, InvalidApplicationException, JAXBException, ParserConfigurationException, JsonProcessingException, TransformerException; DescriptionTemplate importXml(byte[] bytes, UUID id, String label, FieldSet fields) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, TransformerException, InvalidApplicationException, IOException, InstantiationException, IllegalAccessException, SAXException; + + DescriptionTemplateImportExport exportXmlEntity(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException; + ResponseEntity exportXml(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, TransformerException, InvalidApplicationException; } diff --git a/backend/core/src/main/java/org/opencdmp/service/descriptiontemplate/DescriptionTemplateServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/descriptiontemplate/DescriptionTemplateServiceImpl.java index f8b94c169..fc7662ffe 100644 --- a/backend/core/src/main/java/org/opencdmp/service/descriptiontemplate/DescriptionTemplateServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/descriptiontemplate/DescriptionTemplateServiceImpl.java @@ -6,7 +6,6 @@ import org.opencdmp.authorization.Permission; import org.opencdmp.commons.JsonHandlingService; import org.opencdmp.commons.XmlHandlingService; import org.opencdmp.commons.enums.*; -import org.opencdmp.commons.enums.notification.NotificationContactType; import org.opencdmp.commons.scope.tenant.TenantScope; import org.opencdmp.commons.scope.user.UserScope; import org.opencdmp.commons.types.descriptiontemplate.*; @@ -158,7 +157,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic if (isUpdate) { data = this.entityManager.find(DescriptionTemplateEntity.class, model.getId()); if (data == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); if (data.getStatus().equals(DescriptionTemplateStatus.Finalized)) @@ -260,11 +259,11 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic UserEntity user = this.entityManager.find(UserEntity.class, userDescriptionTemplate.getUserId()); if (user == null){ - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{userDescriptionTemplate.getUserId(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{userDescriptionTemplate.getUserId(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); } DescriptionTemplateEntity descriptionTemplate = this.queryFactory.query(DescriptionTemplateQuery.class).isActive(IsActive.Active).ids(userDescriptionTemplate.getDescriptionTemplateId()).first(); if (descriptionTemplate == null){ - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{userDescriptionTemplate.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{userDescriptionTemplate.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); } event.setUserId(user.getId()); UserContactInfoQuery query = this.queryFactory.query(UserContactInfoQuery.class).userIds(user.getId()); @@ -273,16 +272,16 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic List contactPairs = new ArrayList<>(); contactPairs.add(new ContactPair(ContactInfoType.Email, query.first().getValue())); NotificationContactData contactData = new NotificationContactData(contactPairs, null, null); - event.setContactHint(jsonHandlingService.toJsonSafe(contactData)); - event.setNotificationType(notificationProperties.getDescriptionTemplateInvitationType()); + event.setContactHint(this.jsonHandlingService.toJsonSafe(contactData)); + event.setNotificationType(this.notificationProperties.getDescriptionTemplateInvitationType()); NotificationFieldData data = new NotificationFieldData(); List fieldInfoList = new ArrayList<>(); fieldInfoList.add(new FieldInfo("{recipient}", DataType.String, user.getName())); fieldInfoList.add(new FieldInfo("{templateName}", DataType.String, descriptionTemplate.getLabel())); fieldInfoList.add(new FieldInfo("{templateID}", DataType.String, descriptionTemplate.getId().toString())); data.setFields(fieldInfoList); - event.setData(jsonHandlingService.toJsonSafe(data)); - eventHandler.handle(event); + event.setData(this.jsonHandlingService.toJsonSafe(data)); + this.eventHandler.handle(event); } private void addOwner(DescriptionTemplateEntity descriptionTemplateEntity) throws InvalidApplicationException { @@ -292,7 +291,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic data.setCreatedAt(Instant.now()); data.setUpdatedAt(Instant.now()); data.setRole(UserDescriptionTemplateRole.Owner); - data.setUserId(userScope.getUserId()); + data.setUserId(this.userScope.getUserId()); data.setDescriptionTemplateId(descriptionTemplateEntity.getId()); this.entityManager.persist(data); } @@ -418,13 +417,13 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic List ids = persist.getTextListValue().stream().map(UUID::fromString).toList(); Set existingIds = this.queryFactory.query(DmpQuery.class).ids(ids).isActive(IsActive.Active).collectAs(new BaseFieldSet().ensure(Dmp._id)).stream().map(DmpEntity::getId).collect(Collectors.toSet()); for (UUID id : ids){ - if (!existingIds.contains(id)) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (!existingIds.contains(id)) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); } } if (FieldType.INTERNAL_ENTRIES_DESCRIPTIONS.equals(fieldType) && !this.conventionService.isListNullOrEmpty(persist.getTextListValue())){ List ids = persist.getTextListValue().stream().map(UUID::fromString).toList(); Set existingIds = this.queryFactory.query(DescriptionQuery.class).ids(ids).isActive(IsActive.Active).collectAs(new BaseFieldSet().ensure(Description._id)).stream().map(DescriptionEntity::getId).collect(Collectors.toSet()); for (UUID id : ids){ - if (!existingIds.contains(id)) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (!existingIds.contains(id)) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); } } data.setTextListValue(persist.getTextListValue()); @@ -456,7 +455,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic ReferenceEntity data; if (this.conventionService.isValidGuid(model.getId())){ data = this.entityManager.find(ReferenceEntity.class, model.getId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Reference.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Reference.class.getSimpleName()}, LocaleContextHolder.getLocale())); } else { ReferenceTypeDataEntity referenceTypeDataEntity = ((ReferenceTypeDataEntity)fieldEntity.getData()); data = this.queryFactory.query(ReferenceQuery.class).sourceTypes(model.getSourceType()).typeIds(referenceTypeDataEntity.getReferenceTypeId()).sources(model.getSource()).isActive(IsActive.Active).references(model.getReference()).first(); @@ -476,14 +475,14 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic try { ReferenceTypeEntity referenceType = this.queryFactory.query(ReferenceTypeQuery.class).ids(referenceTypeDataEntity.getReferenceTypeId()).firstAs(new BaseFieldSet().ensure(ReferenceType._id).ensure(ReferenceTypeEntity._tenantId)); - if (referenceType == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{referenceTypeDataEntity.getReferenceTypeId(), ReferenceType.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (referenceType == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{referenceTypeDataEntity.getReferenceTypeId(), ReferenceType.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (data.getSourceType().equals(ReferenceSourceType.External) && !this.tenantScope.isDefaultTenant() && referenceType.getTenantId() == null){ this.tenantScope.setTempTenant(this.entityManager.getEntityManager(), null, this.tenantScope.getDefaultTenantCode()); } this.entityManager.persist(data); } finally { - tenantScope.removeTempTenant(this.entityManager.getEntityManager()); + this.tenantScope.removeTempTenant(this.entityManager.getEntityManager()); } } } @@ -562,7 +561,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic this.authorizationService.authorizeForce(Permission.DeleteDescriptionTemplate); 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(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (data.getVersionStatus().equals(DescriptionTemplateVersionStatus.Current)){ DescriptionTemplateQuery descriptionTemplateQuery = this.queryFactory.query(DescriptionTemplateQuery.class) @@ -597,7 +596,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic DescriptionTemplateQuery query = this.queryFactory.query(DescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); DescriptionTemplate model = this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fields, query.firstAs(fields)); if (model == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); model.setLabel(model.getLabel() + " new "); model.setId(null); @@ -678,7 +677,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic 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())); + throw new MyNotFoundException(this.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()); @@ -742,6 +741,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic this.authorizationService.authorizeForce(Permission.ImportDescriptionTemplate); DescriptionTemplateImportExport importXml = this.xmlHandlingService.fromXml(DescriptionTemplateImportExport.class, new String(bytes, StandardCharsets.UTF_8)); + if (id == null) id = importXml.getId(); if (id == null) { DescriptionTemplatePersist persist = new DescriptionTemplatePersist(); persist.setLabel(label); @@ -764,7 +764,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic 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())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); persist.setHash(this.conventionService.hashValue(oldDescriptionTemplateEntity.getUpdatedAt())); this.validatorFactory.validator(DescriptionTemplatePersist.DescriptionTemplatePersistValidator.class).validateForce(persist); return this.createNewVersion(persist, fields); @@ -778,7 +778,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic List pagesDatasetEntity = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(importExport.getPages())) { - for (PageImportExport xmlPage : importExport.getPages()) { + for (DescriptionTemplatePageImportExport xmlPage : importExport.getPages()) { pagesDatasetEntity.add(this.xmlPageToPersist(xmlPage)); } } @@ -787,14 +787,14 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return definitionPersist; } - public PagePersist xmlPageToPersist(PageImportExport importExport) { + public PagePersist xmlPageToPersist(DescriptionTemplatePageImportExport importExport) { PagePersist pageEntity = new PagePersist(); pageEntity.setId(importExport.getId()); pageEntity.setOrdinal(importExport.getOrdinal()); pageEntity.setTitle(importExport.getTitle()); if (!this.conventionService.isListNullOrEmpty(importExport.getSections())) { List sectionsListEntity = new LinkedList<>(); - for (SectionImportExport xmlSection : importExport.getSections()) { + for (DescriptionTemplateSectionImportExport xmlSection : importExport.getSections()) { sectionsListEntity.add(this.xmlSectionToPersist(xmlSection)); } pageEntity.setSections(sectionsListEntity); @@ -803,12 +803,12 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return pageEntity; } - public SectionPersist xmlSectionToPersist(SectionImportExport importExport) { + public SectionPersist xmlSectionToPersist(DescriptionTemplateSectionImportExport importExport) { SectionPersist sectionEntity = new SectionPersist(); List sectionsListEntity = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(importExport.getSections())) { - for (SectionImportExport xmlSection : importExport.getSections()) { + for (DescriptionTemplateSectionImportExport xmlSection : importExport.getSections()) { sectionsListEntity.add(this.xmlSectionToPersist(xmlSection)); } } @@ -818,7 +818,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic sectionEntity.setDescription(importExport.getDescription()); List fieldSetEntity = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(importExport.getFieldSets())) { - for (FieldSetImportExport xmlFieldSet : importExport.getFieldSets()) { + for (DescriptionTemplateFieldSetImportExport xmlFieldSet : importExport.getFieldSets()) { fieldSetEntity.add(this.toFieldSetModel(xmlFieldSet)); } } @@ -829,7 +829,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return sectionEntity; } - public FieldSetPersist toFieldSetModel(FieldSetImportExport importExport) { + public FieldSetPersist toFieldSetModel(DescriptionTemplateFieldSetImportExport importExport) { FieldSetPersist fieldSet1Entity = new FieldSetPersist(); fieldSet1Entity.setId(importExport.getId()); fieldSet1Entity.setOrdinal(importExport.getOrdinal()); @@ -843,7 +843,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic List fieldsEntity = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(importExport.getFields())) { - for (FieldImportExport xmlField : importExport.getFields()) { + for (DescriptionTemplateFieldImportExport xmlField : importExport.getFields()) { fieldsEntity.add(this.xmlFieldToPersist(xmlField)); } } @@ -851,7 +851,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return fieldSet1Entity; } - public FieldPersist xmlFieldToPersist(FieldImportExport importExport) { + public FieldPersist xmlFieldToPersist(DescriptionTemplateFieldImportExport importExport) { FieldPersist fieldEntity = new FieldPersist(); fieldEntity.setId(importExport.getId()); fieldEntity.setOrdinal(importExport.getOrdinal()); @@ -859,7 +859,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic fieldEntity.setDefaultValue(importExport.getDefaultValue()); List rulePersists = new ArrayList<>(); if (importExport.getVisibilityRules() != null) { - for (RuleImportExport xmlRule : importExport.getVisibilityRules()) { + for (DescriptionTemplateRuleImportExport xmlRule : importExport.getVisibilityRules()) { rulePersists.add(this.toRuleModel(xmlRule)); } } @@ -874,7 +874,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return fieldEntity; } - public RulePersist toRuleModel(RuleImportExport importExport) { + public RulePersist toRuleModel(DescriptionTemplateRuleImportExport importExport) { RulePersist ruleEntity = new RulePersist(); ruleEntity.setTarget(importExport.getTarget()); ruleEntity.setDateValue(importExport.getDateValue()); @@ -884,7 +884,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return ruleEntity; } - public MultiplicityPersist xmlMultiplicityToPersist(MultiplicityImportExport importXml) { + public MultiplicityPersist xmlMultiplicityToPersist(DescriptionTemplateMultiplicityImportExport importXml) { MultiplicityPersist multiplicityEntity = new MultiplicityPersist(); multiplicityEntity.setMax(importXml.getMax()); multiplicityEntity.setMin(importXml.getMin()); @@ -898,25 +898,41 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic //region Export @Override - public ResponseEntity exportXml(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException { - logger.debug(new MapLogEntry("persisting data").And("id", id)); + public DescriptionTemplateImportExport exportXmlEntity(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException { + logger.debug(new MapLogEntry("exportXml").And("id", id)); this.authorizationService.authorizeForce(Permission.ExportDescriptionTemplate); DescriptionTemplateEntity data = this.entityManager.find(DescriptionTemplateEntity.class, id); if (data == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); DefinitionEntity definition = this.xmlHandlingService.fromXml(DefinitionEntity.class, data.getDefinition()); - String xml = this.xmlHandlingService.toXml(this.definitionXmlToExport(data, definition)); + return this.definitionXmlToExport(data, definition); + } + + + @Override + public ResponseEntity exportXml(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException { + logger.debug(new MapLogEntry("exportXml").And("id", id)); + + this.authorizationService.authorizeForce(Permission.ExportDescriptionTemplate); + DescriptionTemplateEntity data = this.entityManager.find(DescriptionTemplateEntity.class, id); + if (data == null) + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); + + DefinitionEntity definition = this.xmlHandlingService.fromXml(DefinitionEntity.class, data.getDefinition()); + String xml = this.xmlHandlingService.toXml(this.exportXmlEntity(id)); return this.responseUtilsService.buildResponseFileFromText(xml, data.getLabel() + ".xml"); } private DescriptionTemplateImportExport definitionXmlToExport(DescriptionTemplateEntity data, DefinitionEntity entity) { DescriptionTemplateImportExport xml = new DescriptionTemplateImportExport(); + xml.setId(data.getId()); + xml.setType(data.getTypeId()); xml.setType(data.getTypeId()); xml.setLanguage(data.getLanguage()); xml.setDescription(data.getDescription()); - List pagesDatasetEntity = new LinkedList<>(); + List pagesDatasetEntity = new LinkedList<>(); for (PageEntity xmlPage : entity.getPages()) { pagesDatasetEntity.add(this.pageXmlToExport(xmlPage)); } @@ -925,12 +941,12 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return xml; } - private PageImportExport pageXmlToExport(PageEntity entity) { - PageImportExport xml = new PageImportExport(); + private DescriptionTemplatePageImportExport pageXmlToExport(PageEntity entity) { + DescriptionTemplatePageImportExport xml = new DescriptionTemplatePageImportExport(); xml.setId(entity.getId()); xml.setOrdinal(entity.getOrdinal()); xml.setTitle(entity.getTitle()); - List sectionsListEntity = new LinkedList<>(); + List sectionsListEntity = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getSections())) { for (SectionEntity section : entity.getSections()) { sectionsListEntity.add(this.sectionXmlToExport(section)); @@ -941,9 +957,9 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return xml; } - private SectionImportExport sectionXmlToExport(SectionEntity entity) { - SectionImportExport xml = new SectionImportExport(); - List sectionsListEntity = new LinkedList<>(); + private DescriptionTemplateSectionImportExport sectionXmlToExport(SectionEntity entity) { + DescriptionTemplateSectionImportExport xml = new DescriptionTemplateSectionImportExport(); + List sectionsListEntity = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getSections())) { for (SectionEntity xmlSection : entity.getSections()) { @@ -956,7 +972,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic xml.setOrdinal(entity.getOrdinal()); xml.setTitle(entity.getTitle()); xml.setDescription(entity.getDescription()); - List fieldSetEntity = new LinkedList<>(); + List fieldSetEntity = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getFieldSets())) { for (FieldSetEntity xmlFieldSet : entity.getFieldSets()) { fieldSetEntity.add(this.fieldSetXmlToExport(xmlFieldSet)); @@ -968,8 +984,8 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return xml; } - private FieldSetImportExport fieldSetXmlToExport(FieldSetEntity entity) { - FieldSetImportExport fieldSet1Entity = new FieldSetImportExport(); + private DescriptionTemplateFieldSetImportExport fieldSetXmlToExport(FieldSetEntity entity) { + DescriptionTemplateFieldSetImportExport fieldSet1Entity = new DescriptionTemplateFieldSetImportExport(); fieldSet1Entity.setId(entity.getId()); fieldSet1Entity.setOrdinal(entity.getOrdinal()); fieldSet1Entity.setHasCommentField(entity.getHasCommentField()); @@ -980,7 +996,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic fieldSet1Entity.setExtendedDescription(entity.getExtendedDescription()); fieldSet1Entity.setAdditionalInformation(entity.getAdditionalInformation()); - List fieldsEntity = new LinkedList<>(); + List fieldsEntity = new LinkedList<>(); if (entity.getFields() != null) { for (FieldEntity xmlField : entity.getFields()) { fieldsEntity.add(this.fieldXmlToExport(xmlField)); @@ -990,13 +1006,13 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return fieldSet1Entity; } - private FieldImportExport fieldXmlToExport(FieldEntity entity) { - FieldImportExport xml = new FieldImportExport(); + private DescriptionTemplateFieldImportExport fieldXmlToExport(FieldEntity entity) { + DescriptionTemplateFieldImportExport xml = new DescriptionTemplateFieldImportExport(); xml.setId(entity.getId()); xml.setOrdinal(entity.getOrdinal()); xml.setValidations(entity.getValidations()); xml.setDefaultValue(entity.getDefaultValue()); - List rulePersists = new ArrayList<>(); + List rulePersists = new ArrayList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getVisibilityRules())) { for (RuleEntity xmlRule : entity.getVisibilityRules()) { rulePersists.add(this.toRuleModel(xmlRule)); @@ -1013,22 +1029,22 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic return xml; } - private RuleImportExport toRuleModel(RuleEntity entity) { - RuleImportExport xml = new RuleImportExport(); + private DescriptionTemplateRuleImportExport toRuleModel(RuleEntity entity) { + DescriptionTemplateRuleImportExport xml = new DescriptionTemplateRuleImportExport(); xml.setTarget(entity.getTarget()); xml.setDateValue(entity.getDateValue()); xml.setTextListValue(entity.getTextListValue()); xml.setTextValue(entity.getTextValue()); if (entity.getExternalIdentifier() != null){ - xml.setExternalIdentifier(new ExternalIdentifierImportExport()); + xml.setExternalIdentifier(new DescriptionTemplateExternalIdentifierImportExport()); xml.getExternalIdentifier().setIdentifier(entity.getExternalIdentifier().getIdentifier()); xml.getExternalIdentifier().setType(entity.getExternalIdentifier().getType()); } return xml; } - private MultiplicityImportExport multiplicityXmlToExport(MultiplicityEntity entity) { - MultiplicityImportExport xml = new MultiplicityImportExport(); + private DescriptionTemplateMultiplicityImportExport multiplicityXmlToExport(MultiplicityEntity entity) { + DescriptionTemplateMultiplicityImportExport xml = new DescriptionTemplateMultiplicityImportExport(); xml.setMax(entity.getMax()); xml.setMin(entity.getMin()); xml.setPlaceholder(entity.getPlaceholder()); diff --git a/backend/core/src/main/java/org/opencdmp/service/dmp/DmpServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/dmp/DmpServiceImpl.java index c20e5ede4..bfa92e2ce 100644 --- a/backend/core/src/main/java/org/opencdmp/service/dmp/DmpServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/dmp/DmpServiceImpl.java @@ -11,6 +11,7 @@ import org.opencdmp.commons.enums.notification.NotificationContactType; import org.opencdmp.commons.scope.tenant.TenantScope; import org.opencdmp.commons.scope.user.UserScope; import org.opencdmp.commons.types.actionconfirmation.DmpInvitationEntity; +import org.opencdmp.commons.types.description.importexport.DescriptionImportExport; import org.opencdmp.commons.types.dmp.DmpBlueprintValueEntity; import org.opencdmp.commons.types.dmp.DmpContactEntity; import org.opencdmp.commons.types.dmp.DmpPropertiesEntity; @@ -142,6 +143,7 @@ public class DmpServiceImpl implements DmpService { private final TenantScope tenantScope; private final ResponseUtilsService responseUtilsService; private final DmpBlueprintService dmpBlueprintService; + @Autowired public DmpServiceImpl( TenantEntityManager entityManager, @@ -231,8 +233,8 @@ public class DmpServiceImpl implements DmpService { private void checkIfDescriptionTemplateIsUse (List descriptionTemplates, UUID id){ List existingDmpDescriptionTemplates = this.queryFactory.query(DmpDescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(id).isActive(IsActive.Active).collect(); - List removedDescriptionTemplates = existingDmpDescriptionTemplates.stream().filter(x -> descriptionTemplates.stream().noneMatch(y -> y.getDescriptionTemplateGroupId().equals(x.getDescriptionTemplateGroupId()))).collect(Collectors.toList()); - DmpDescriptionTemplateQuery dmpDescriptionTemplateQuery = this.queryFactory.query(DmpDescriptionTemplateQuery.class).isActive(IsActive.Active).dmpIds(id).descriptionTemplateGroupIds(removedDescriptionTemplates.stream().map(x -> x.getDescriptionTemplateGroupId()).collect(Collectors.toList())); + List removedDescriptionTemplates = existingDmpDescriptionTemplates.stream().filter(x -> descriptionTemplates.stream().noneMatch(y -> y.getDescriptionTemplateGroupId().equals(x.getDescriptionTemplateGroupId()))).toList(); + DmpDescriptionTemplateQuery dmpDescriptionTemplateQuery = this.queryFactory.query(DmpDescriptionTemplateQuery.class).isActive(IsActive.Active).dmpIds(id).descriptionTemplateGroupIds(removedDescriptionTemplates.stream().map(DmpDescriptionTemplateEntity::getDescriptionTemplateGroupId).collect(Collectors.toList())); DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpDescriptionTemplateSubQuery(dmpDescriptionTemplateQuery).isActive(IsActive.Active); if (query != null && query.count() > 0) throw new MyValidationException(this.errors.getDmpDescriptionTemplateCanNotRemove().getCode(), this.errors.getDmpDescriptionTemplateCanNotRemove().getMessage()); @@ -1066,7 +1068,7 @@ public class DmpServiceImpl implements DmpService { if (!this.conventionService.isListNullOrEmpty(dmpDescriptionTemplateEntities)){ persist.setDescriptionTemplates(new ArrayList<>()); for (DmpDescriptionTemplateEntity descriptionTemplateEntity: dmpDescriptionTemplateEntities) { - persist.getDescriptionTemplates().add(this.buildDmpDescriptionTemplatePersists(descriptionTemplateEntity, definition.getSections())); + persist.getDescriptionTemplates().add(this.buildDmpDescriptionTemplatePersists(descriptionTemplateEntity)); } } persist.setProperties(this.buildDmpPropertyDefinitionPersist( this.jsonHandlingService.fromJsonSafe(DmpPropertiesEntity.class, data.getProperties()), dmpReferenceEntities, definition.getSections())); @@ -1100,7 +1102,7 @@ public class DmpServiceImpl implements DmpService { for (DmpReferenceEntity dmpReferenceEntity : dmpReferenceEntities) { DmpReferenceData referenceData = this.jsonHandlingService.fromJsonSafe(DmpReferenceData.class, dmpReferenceEntity.getData()); - ReferenceEntity reference = referencesFromAllFields.stream().filter(x -> x.getId().equals(dmpReferenceEntity.getReferenceId())).collect(Collectors.toList()).getFirst(); + ReferenceEntity reference = referencesFromAllFields.stream().filter(x -> x.getId().equals(dmpReferenceEntity.getReferenceId())).toList().getFirst(); if (referenceData.getBlueprintFieldId().equals(fieldEntity.getId()) && reference != null) { referencePersists.add(this.buildReferencePersist(reference)); } @@ -1152,7 +1154,7 @@ public class DmpServiceImpl implements DmpService { return persist; } - private @NotNull DmpDescriptionTemplatePersist buildDmpDescriptionTemplatePersists(DmpDescriptionTemplateEntity data, List sectionEntities){ + private @NotNull DmpDescriptionTemplatePersist buildDmpDescriptionTemplatePersists(DmpDescriptionTemplateEntity data){ DmpDescriptionTemplatePersist persist = new DmpDescriptionTemplatePersist(); if (data == null) return persist; @@ -1234,7 +1236,7 @@ public class DmpServiceImpl implements DmpService { if (userId != null){ user.setUser(userId); usersToAssign.add(user); - if (this.userScope.getUserId() != userId && !existingUsers.stream().map(x -> x.getUserId()).collect(Collectors.toList()).contains(userId)){ + if (this.userScope.getUserId() != userId && !existingUsers.stream().map(DmpUserEntity::getUserId).toList().contains(userId)){ this.sendDmpInvitationExistingUser(user.getUser(), dmp, user.getRole()); } }else if (user.getEmail() != null) { @@ -1380,7 +1382,7 @@ public class DmpServiceImpl implements DmpService { if (propertiesEntity != null && !this.conventionService.isListNullOrEmpty(propertiesEntity.getContacts())) { List dmpContactImportExports = new LinkedList<>(); - List users = this.queryFactory.query(UserQuery.class).ids(propertiesEntity.getContacts().stream().filter(x-> x.getUserId() != null).map(DmpContactEntity::getUserId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).collect(); + List users = this.queryFactory.query(UserQuery.class).ids(propertiesEntity.getContacts().stream().map(DmpContactEntity::getUserId).filter(Objects::nonNull).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).collect(); Map usersMap = users == null ? new HashMap<>() : users.stream().collect(Collectors.toMap(UserEntity::getId, x-> x)); for (DmpContactEntity contactEntity : propertiesEntity.getContacts()) { dmpContactImportExports.add(this.dmpContactToExport(contactEntity, usersMap)); @@ -1432,6 +1434,14 @@ public class DmpServiceImpl implements DmpService { } xml.setReferences(dmpReferenceImportExports); } + List descriptions = this.queryFactory.query(DescriptionQuery.class).dmpIds(data.getId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(data.getId()).isActive(IsActive.Active).collect(); + if (!this.conventionService.isListNullOrEmpty(descriptions)) { + List descriptionImportExports = new LinkedList<>(); + for (DescriptionEntity description : descriptions) { + descriptionImportExports.add(this.descriptionService.exportXmlEntity(description.getId())); + } + xml.setDescriptions(descriptionImportExports); + } return xml; } diff --git a/backend/core/src/main/java/org/opencdmp/service/dmpblueprint/DmpBlueprintServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/dmpblueprint/DmpBlueprintServiceImpl.java index 1ab08685a..6fa867a7e 100644 --- a/backend/core/src/main/java/org/opencdmp/service/dmpblueprint/DmpBlueprintServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/dmpblueprint/DmpBlueprintServiceImpl.java @@ -481,11 +481,11 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return xml; } - private DefinitionImportExport definitionXmlToExport(DefinitionEntity entity) { + private BlueprintDefinitionImportExport definitionXmlToExport(DefinitionEntity entity) { if (entity == null) return null; - DefinitionImportExport xml = new DefinitionImportExport(); - List dmpBlueprintSections = new ArrayList<>(); + BlueprintDefinitionImportExport xml = new BlueprintDefinitionImportExport(); + List dmpBlueprintSections = new ArrayList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getSections())) { for (SectionEntity section : entity.getSections()) { dmpBlueprintSections.add(this.sectionXmlToExport(section)); @@ -495,14 +495,14 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return xml; } - private SectionImportExport sectionXmlToExport(SectionEntity entity) { - SectionImportExport xml = new SectionImportExport(); + private BlueprintSectionImportExport sectionXmlToExport(SectionEntity entity) { + BlueprintSectionImportExport xml = new BlueprintSectionImportExport(); xml.setId(entity.getId()); xml.setLabel(entity.getLabel()); xml.setDescription(entity.getDescription()); xml.setOrdinal(entity.getOrdinal()); xml.setHasTemplates(entity.getHasTemplates()); - List dmpBlueprintSystemFieldModels = new LinkedList<>(); + List dmpBlueprintSystemFieldModels = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getFields())) { for (SystemFieldEntity systemField : entity.getFields().stream().filter(x -> x.getCategory() == DmpBlueprintFieldCategory.System).map(x -> (SystemFieldEntity) x).toList()) { dmpBlueprintSystemFieldModels.add(this.systemFieldXmlToExport(systemField)); @@ -510,7 +510,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { } xml.setSystemFields(dmpBlueprintSystemFieldModels); - List dmpBlueprintExtraFieldModels = new LinkedList<>(); + List dmpBlueprintExtraFieldModels = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getFields())) { for (ExtraFieldEntity systemField : entity.getFields().stream().filter(x -> x.getCategory() == DmpBlueprintFieldCategory.Extra).map(x -> (ExtraFieldEntity) x).toList()) { dmpBlueprintExtraFieldModels.add(this.extraFieldXmlToExport(systemField)); @@ -518,7 +518,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { } xml.setExtraFields(dmpBlueprintExtraFieldModels); - List dmpBlueprintReferenceFieldModels = new LinkedList<>(); + List dmpBlueprintReferenceFieldModels = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getFields())) { for (ReferenceTypeFieldEntity referenceTypeFieldEntity : entity.getFields().stream().filter(x -> x.getCategory() == DmpBlueprintFieldCategory.ReferenceType).map(x -> (ReferenceTypeFieldEntity) x).toList()) { dmpBlueprintReferenceFieldModels.add(this.referenceFieldXmlToExport(referenceTypeFieldEntity)); @@ -526,7 +526,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { } xml.setReferenceFields(dmpBlueprintReferenceFieldModels); - List dmpBlueprintDescriptionTemplates = new LinkedList<>(); + List dmpBlueprintDescriptionTemplates = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(entity.getDescriptionTemplates())) { for (DescriptionTemplateEntity descriptionTemplate : entity.getDescriptionTemplates()) { dmpBlueprintDescriptionTemplates.add(this.descriptionTemplateXmlToExport(descriptionTemplate)); @@ -536,8 +536,8 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return xml; } - private DescriptionTemplateImportExport descriptionTemplateXmlToExport(DescriptionTemplateEntity entity) { - DescriptionTemplateImportExport xml = new DescriptionTemplateImportExport(); + private BlueprintDescriptionTemplateImportExport descriptionTemplateXmlToExport(DescriptionTemplateEntity entity) { + BlueprintDescriptionTemplateImportExport xml = new BlueprintDescriptionTemplateImportExport(); xml.setDescriptionTemplateGroupId(entity.getDescriptionTemplateGroupId()); xml.setLabel(entity.getLabel()); if (entity.getMinMultiplicity() != null ) xml.setMinMultiplicity(entity.getMinMultiplicity()); @@ -545,8 +545,8 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return xml; } - private ExtraFieldImportExport extraFieldXmlToExport(ExtraFieldEntity entity) { - ExtraFieldImportExport xml = new ExtraFieldImportExport(); + private BlueprintExtraFieldImportExport extraFieldXmlToExport(ExtraFieldEntity entity) { + BlueprintExtraFieldImportExport xml = new BlueprintExtraFieldImportExport(); xml.setId(entity.getId()); xml.setType(entity.getType()); xml.setLabel(entity.getLabel()); @@ -557,8 +557,8 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return xml; } - private ReferenceTypeFieldImportExport referenceFieldXmlToExport(ReferenceTypeFieldEntity entity) { - ReferenceTypeFieldImportExport xml = new ReferenceTypeFieldImportExport(); + private BlueprintReferenceTypeFieldImportExport referenceFieldXmlToExport(ReferenceTypeFieldEntity entity) { + BlueprintReferenceTypeFieldImportExport xml = new BlueprintReferenceTypeFieldImportExport(); xml.setId(entity.getId()); xml.setReferenceTypeId(entity.getReferenceTypeId()); xml.setLabel(entity.getLabel()); @@ -570,8 +570,8 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return xml; } - private SystemFieldImportExport systemFieldXmlToExport(SystemFieldEntity entity) { - SystemFieldImportExport xml = new SystemFieldImportExport(); + private BlueprintSystemFieldImportExport systemFieldXmlToExport(SystemFieldEntity entity) { + BlueprintSystemFieldImportExport xml = new BlueprintSystemFieldImportExport(); xml.setId(entity.getId()); xml.setType(entity.getType()); xml.setLabel(entity.getLabel()); @@ -614,13 +614,13 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return this.persist(persist, fields); } - private DefinitionPersist xmlDefinitionToPersist(DefinitionImportExport importXml) { + private DefinitionPersist xmlDefinitionToPersist(BlueprintDefinitionImportExport importXml) { if (importXml == null) return null; DefinitionPersist persist = new DefinitionPersist(); List dmpBlueprintSections = new ArrayList<>(); if (!this.conventionService.isListNullOrEmpty(importXml.getSections())) { - for (SectionImportExport section : importXml.getSections()) { + for (BlueprintSectionImportExport section : importXml.getSections()) { dmpBlueprintSections.add(this.xmlSectionToPersist(section)); } } @@ -628,7 +628,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return persist; } - private SectionPersist xmlSectionToPersist(SectionImportExport importXml) { + private SectionPersist xmlSectionToPersist(BlueprintSectionImportExport importXml) { SectionPersist persist = new SectionPersist(); persist.setId(importXml.getId()); persist.setLabel(importXml.getLabel()); @@ -637,24 +637,24 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { persist.setHasTemplates(importXml.isHasTemplates()); List dmpBlueprintFieldModels = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(importXml.getSystemFields())) { - for (SystemFieldImportExport systemField : importXml.getSystemFields()) { + for (BlueprintSystemFieldImportExport systemField : importXml.getSystemFields()) { dmpBlueprintFieldModels.add(this.xmlSystemFieldToPersist(systemField)); } } if (!this.conventionService.isListNullOrEmpty(importXml.getReferenceFields())) { - for (ReferenceTypeFieldImportExport referenceField : importXml.getReferenceFields()) { + for (BlueprintReferenceTypeFieldImportExport referenceField : importXml.getReferenceFields()) { dmpBlueprintFieldModels.add(this.xmlReferenceFieldToPersist(referenceField)); } } if (!this.conventionService.isListNullOrEmpty(importXml.getExtraFields())) { - for (ExtraFieldImportExport extraField : importXml.getExtraFields()) { + for (BlueprintExtraFieldImportExport extraField : importXml.getExtraFields()) { dmpBlueprintFieldModels.add(this.xmlExtraFieldToPersist(extraField)); } } persist.setFields(dmpBlueprintFieldModels); List dmpBlueprintDescriptionTemplates = new LinkedList<>(); if (!this.conventionService.isListNullOrEmpty(importXml.getDescriptionTemplates())) { - for (DescriptionTemplateImportExport descriptionTemplate : importXml.getDescriptionTemplates()) { + for (BlueprintDescriptionTemplateImportExport descriptionTemplate : importXml.getDescriptionTemplates()) { dmpBlueprintDescriptionTemplates.add(this.xmlDescriptionTemplateToPersist(descriptionTemplate)); } } @@ -662,7 +662,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return persist; } - private DescriptionTemplatePersist xmlDescriptionTemplateToPersist(DescriptionTemplateImportExport importXml) { + private DescriptionTemplatePersist xmlDescriptionTemplateToPersist(BlueprintDescriptionTemplateImportExport importXml) { DescriptionTemplatePersist persist = new DescriptionTemplatePersist(); persist.setDescriptionTemplateGroupId(importXml.getDescriptionTemplateGroupId()); persist.setLabel(importXml.getLabel()); @@ -671,7 +671,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return persist; } - private FieldPersist xmlExtraFieldToPersist(ExtraFieldImportExport importXml) { + private FieldPersist xmlExtraFieldToPersist(BlueprintExtraFieldImportExport importXml) { ExtraFieldPersist persist = new ExtraFieldPersist(); persist.setId(importXml.getId()); persist.setCategory(DmpBlueprintFieldCategory.Extra); @@ -684,7 +684,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return persist; } - private FieldPersist xmlSystemFieldToPersist(SystemFieldImportExport importXml) { + private FieldPersist xmlSystemFieldToPersist(BlueprintSystemFieldImportExport importXml) { SystemFieldPersist persist = new SystemFieldPersist(); persist.setId(importXml.getId()); persist.setCategory(DmpBlueprintFieldCategory.System); @@ -697,7 +697,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { return persist; } - private FieldPersist xmlReferenceFieldToPersist(ReferenceTypeFieldImportExport importXml) { + private FieldPersist xmlReferenceFieldToPersist(BlueprintReferenceTypeFieldImportExport importXml) { ReferenceTypeFieldPersist persist = new ReferenceTypeFieldPersist(); persist.setId(importXml.getId()); persist.setCategory(DmpBlueprintFieldCategory.ReferenceType); diff --git a/backend/web/src/main/java/org/opencdmp/controllers/DescriptionController.java b/backend/web/src/main/java/org/opencdmp/controllers/DescriptionController.java index 42f40c4f5..457ce85e4 100644 --- a/backend/web/src/main/java/org/opencdmp/controllers/DescriptionController.java +++ b/backend/web/src/main/java/org/opencdmp/controllers/DescriptionController.java @@ -46,11 +46,13 @@ import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import org.xml.sax.SAXException; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.management.InvalidApplicationException; +import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; @@ -121,7 +123,7 @@ public class DescriptionController { DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(EnumSet.of(Public)).ids(id).dmpSubQuery(this.queryFactory.query(DmpQuery.class).isActive(IsActive.Active).statuses(DmpStatus.Finalized).accessTypes(DmpAccessType.Public)); PublicDescription model = this.builderFactory.builder(PublicDescriptionBuilder.class).authorize(EnumSet.of(Public)).build(fieldSet, query.firstAs(fieldSet)); - if (model == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, PublicDescription.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (model == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, PublicDescription.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.auditService.track(AuditableAction.Description_PublicLookup, Map.ofEntries( new AbstractMap.SimpleEntry("id", id), @@ -154,7 +156,7 @@ public class DescriptionController { DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); Description model = this.builderFactory.builder(DescriptionBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fieldSet, query.firstAs(fieldSet)); if (model == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.auditService.track(AuditableAction.Description_Lookup, Map.ofEntries( new AbstractMap.SimpleEntry("id", id), @@ -208,7 +210,7 @@ public class DescriptionController { } @GetMapping("validate") - public List validate(@RequestParam(value="descriptionIds") List descriptionIds) throws MyApplicationException, MyForbiddenException, MyNotFoundException, InvalidApplicationException { + public List validate(@RequestParam("descriptionIds") List descriptionIds) throws MyApplicationException, MyForbiddenException, MyNotFoundException, InvalidApplicationException { logger.debug(new MapLogEntry("validating" + Description.class.getSimpleName()).And("descriptionIds", descriptionIds)); this.censorFactory.censor(DescriptionCensor.class).censor(null, null); @@ -261,7 +263,7 @@ public class DescriptionController { StorageFileEntity storageFile = this.descriptionService.getFieldFile(id, fileId); byte[] file = this.storageFileService.readAsBytesSafe(id); - if (file == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, StorageFile.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (file == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, StorageFile.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.auditService.track(AuditableAction.Description_GetFieldFile, Map.ofEntries( new AbstractMap.SimpleEntry("id", id) @@ -289,4 +291,16 @@ public class DescriptionController { return true; } + + @RequestMapping(method = RequestMethod.GET, value = {"/xml/export/{id}"}, produces = "application/xml") + public @ResponseBody ResponseEntity getXml(@PathVariable UUID id) throws JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException { + logger.debug(new MapLogEntry("export" + DmpBlueprint.class.getSimpleName()).And("id", id)); + + ResponseEntity response = this.descriptionService.exportXml(id); + + this.auditService.track(AuditableAction.DmpBlueprint_GetXml, Map.ofEntries( + new AbstractMap.SimpleEntry("id", id) + )); + return response; + } } diff --git a/backend/web/src/main/java/org/opencdmp/controllers/DmpController.java b/backend/web/src/main/java/org/opencdmp/controllers/DmpController.java index 23d400959..1e939793a 100644 --- a/backend/web/src/main/java/org/opencdmp/controllers/DmpController.java +++ b/backend/web/src/main/java/org/opencdmp/controllers/DmpController.java @@ -34,6 +34,7 @@ import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import org.xml.sax.SAXException; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; @@ -331,4 +332,16 @@ public class DmpController { return true; } + @RequestMapping(method = RequestMethod.GET, value = {"/xml/export/{id}"}, produces = "application/xml") + public @ResponseBody ResponseEntity getXml(@PathVariable UUID id) throws JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException { + logger.debug(new MapLogEntry("export" + DmpBlueprint.class.getSimpleName()).And("id", id)); + + ResponseEntity response = this.dmpService.exportXml(id); + + this.auditService.track(AuditableAction.DmpBlueprint_GetXml, Map.ofEntries( + new AbstractMap.SimpleEntry("id", id) + )); + return response; + } + } diff --git a/backend/web/src/main/resources/config/permissions.yml b/backend/web/src/main/resources/config/permissions.yml index 378438232..8bee5db97 100644 --- a/backend/web/src/main/resources/config/permissions.yml +++ b/backend/web/src/main/resources/config/permissions.yml @@ -221,6 +221,18 @@ permissions: clients: [ ] allowAnonymous: false allowAuthenticated: false + ExportDescription: + roles: + - TenantAdmin + dmp: + roles: + - Owner + - User + - DescriptionContributor + - Reviewer + clients: [ ] + allowAnonymous: false + allowAuthenticated: false # Tag BrowseTag: roles: diff --git a/dmp-frontend/src/app/core/services/description/description.service.ts b/dmp-frontend/src/app/core/services/description/description.service.ts index 305022023..ef300bf0a 100644 --- a/dmp-frontend/src/app/core/services/description/description.service.ts +++ b/dmp-frontend/src/app/core/services/description/description.service.ts @@ -105,6 +105,18 @@ export class DescriptionService { catchError((error: any) => throwError(error))); } + + + downloadXML(id: Guid): Observable> { + const url = `${this.apiBase}/xml/export/${id}`; + let headerXml: HttpHeaders = this.headers.set('Content-Type', 'application/xml'); + const params = new BaseHttpParams(); + params.interceptorContext = { + excludedInterceptors: [InterceptorType.JSONContentType] + }; + return this.httpClient.get(url, { params: params, responseType: 'blob', observe: 'response', headers: headerXml }); + } + // public downloadPDF(id: string): Observable> { // return this.httpClient.get(`${this.apiBase}/${id}/export/Pdf`, { responseType: 'blob', observe: 'response', headers: this.headers }); // } @@ -116,7 +128,7 @@ export class DescriptionService { public updateDescriptionTemplate(item: UpdateDescriptionTemplatePersist): Observable { const url = `${this.apiBase}/update-description-template`; - + return this.http.post(url, item).pipe( catchError((error: any) => throwError(error))); } diff --git a/dmp-frontend/src/app/core/services/file-transformer/file-transformer.service.ts b/dmp-frontend/src/app/core/services/file-transformer/file-transformer.service.ts index 3346342c9..b24142ced 100644 --- a/dmp-frontend/src/app/core/services/file-transformer/file-transformer.service.ts +++ b/dmp-frontend/src/app/core/services/file-transformer/file-transformer.service.ts @@ -10,6 +10,7 @@ import { AuthService } from '../auth/auth.service'; import { RepositoryFileFormat } from '@app/core/model/file/file-format.model'; import { FileTransformerEntityType } from '@app/core/common/enum/file-transformer-entity-type'; import { DmpService } from '../dmp/dmp.service'; +import { DescriptionService } from '../description/description.service'; @Injectable() export class FileTransformerService extends BaseService { @@ -19,6 +20,7 @@ export class FileTransformerService extends BaseService { private matomoService: MatomoService, private fileUtils: FileUtils, private dmpService: DmpService, + private descriptionService: DescriptionService, private authentication: AuthService, ) { super(); } @@ -94,17 +96,27 @@ export class FileTransformerService extends BaseService { exportDescription(id: Guid, repositoryId: string, format: string) { this._loading = true; - this.fileTransformerHttpService.exportDescription(id, repositoryId, format).pipe(takeUntil(this._destroyed), catchError((error) => { - this._loading = false; - return null; - })).subscribe(result => { - if (result !== null) { - const blob = new Blob([result.body], { type: 'application/octet-stream' }); + if (repositoryId == this.xmlExportRepo.repositoryId) { + this.descriptionService.downloadXML(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/xml' }); + const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + FileSaver.saveAs(blob, filename); + }); + } else { + this.fileTransformerHttpService.exportDescription(id, repositoryId, format).pipe(takeUntil(this._destroyed), catchError((error) => { + this._loading = false; + return null; + })).subscribe(result => { + if (result !== null) { + const blob = new Blob([result.body], { type: 'application/octet-stream' }); const filename = this.fileUtils.getFilenameFromContentDispositionHeader(result.headers.get('Content-Disposition')); FileSaver.saveAs(blob, filename); this.matomoService.trackDownload('descriptions', format, id.toString()); - } - }); + } + }); + } } }