From ebbc92b90899be4e6b01cb709bec2caaeb461120 Mon Sep 17 00:00:00 2001 From: Thomas Georgios Giannos Date: Mon, 29 Apr 2024 14:30:56 +0300 Subject: [PATCH 1/3] Adding docs for field types and semantics, site name fix --- .../administration/blueprints/index.md | 2 +- .../commons/_markdown-field-types.md | 45 +++++- .../commons/_markdown-semantics.md | 138 +++++++++++++++++- .../administration/tenant-configuration.md | 2 +- docs/docusaurus.config.ts | 12 +- docs/src/css/custom.css | 4 + 6 files changed, 193 insertions(+), 10 deletions(-) diff --git a/docs/docs/documentation/administration/blueprints/index.md b/docs/docs/documentation/administration/blueprints/index.md index fcab26347..2795b8b6b 100644 --- a/docs/docs/documentation/administration/blueprints/index.md +++ b/docs/docs/documentation/administration/blueprints/index.md @@ -75,7 +75,7 @@ You can add one or more **fields** by clicking the `Add Field` button. For every For a field you can specify: -- **Field Type**: There are three field types available. `System`, `External Reference` and `Custom`. There is more information available in the [Field Types](/docs/documentation/administration/blueprints/field-types) section. +- **Field Type**: There are three field types available. `System`, `External Reference` and `Custom`. There is more information available in the [Field Types](/docs/documentation/administration/blueprints/field-types?t=blueprint) section. - **System Field**: The specific system field we want to add.
*Only applicable if we add a field of type `System`.* - **Reference Type**: The type of external reference we want to add. For more information, you can refer to the [Reference Types](/docs/documentation/administration/reference-types) section of our docs.
*Only applicable if we add a field of type `External Reference`.* - **Label**: A label for the field. diff --git a/docs/docs/documentation/administration/commons/_markdown-field-types.md b/docs/docs/documentation/administration/commons/_markdown-field-types.md index 8647d59b7..719b2f54a 100644 --- a/docs/docs/documentation/administration/commons/_markdown-field-types.md +++ b/docs/docs/documentation/administration/commons/_markdown-field-types.md @@ -1 +1,44 @@ -TODO: Add info about field types \ No newline at end of file +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +In general, there are tree categories of fields that can be used. + +- **System**: These are predefined fields that refer to system or specification information when filled by the end users. The available system fields are the following: + - **Title**: Refers to a title of an entity. + - **Description**: Refers to a description of an entity. + - **Language**: Refers to the language to be used. The languages being displayed to the end user are discussed [here](/docs/documentation/administration/languages). + - **Contact**: Refers to contact information about who should be responsible for the entity. + - **Access**: Indicates if an entity is publicly available. The end user will have to select between `Public` or `Restricted`. + - **User**: Refers to users registered to the platform. +- **External Reference**: These are fields that connect to a locally defined or an external source (an external API in most cases). There is more information available in the [Reference Types](/docs/documentation/administration/reference-types) section. +- **Custom**: These are generic fields that can be added to provide any type of information. The available data types are the following: + - **Text** + - **Rich Text** + - **Date** + - **Number** + +:::info + +Let's explore some specifics based on where these fields are getting setup. + + + In the case of [plan blueprints](/docs/documentation/administration/blueprints/) you define the field you want by making two choices, what is the field category and then what is the system field type or the reference type or the data type respectively. + + + In the case of [description templates](/docs/documentation/administration/templates/) the field type options are 'combined' in one dropdown control. The only difference here is that the options are separated inside that single dropdown based on the field category. + + In the case of custom fields, you can specify the UI control that will be used in the forms. The elements that are supported are the following: + + - **Text Area**: A regular text area (multiple lines) + - **Rich Text Area**: A rich text editor + - **Free Text**: A regular text box (one line) + - **File Upload** + - **Switch** + - **Radio Box** + - **Select** + - **Checkbox** + - **Date Picker** + + + +::: \ No newline at end of file diff --git a/docs/docs/documentation/administration/commons/_markdown-semantics.md b/docs/docs/documentation/administration/commons/_markdown-semantics.md index 0b0a9e858..5df96a13f 100644 --- a/docs/docs/documentation/administration/commons/_markdown-semantics.md +++ b/docs/docs/documentation/administration/commons/_markdown-semantics.md @@ -1 +1,137 @@ -TODO: Add info about semantics \ No newline at end of file +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +:::info + +By **Semantics** we mean a relation a field can have with a part of a data archive specification. When the users try to add semantics, a list of suggestions drops down, containing semantics for `RDA` and `Zenodo`. + +::: + +These are the semantics suggestions. + + + + + + - `rda.dmp.contact` + - `rda.dmp.contact.contact_id.identifier` + - `rda.dmp.contact.contact_id.type` + - `rda.dmp.contact.mbox` + - `rda.dmp.contact.name` + - `rda.dmp.contributor` + - `rda.dmp.contributor.contributor_id.identifier` + - `rda.dmp.contributor.contributor_id.type` + - `rda.dmp.contributor.mbox` + - `rda.dmp.contributor.name` + - `rda.dmp.contributor.role` + - `rda.dmp.cost` + - `rda.dmp.cost.currency_code` + - `rda.dmp.cost.description` + - `rda.dmp.cost.title` + - `rda.dmp.cost.value` + - `rda.dmp.created` + - `rda.dmp.description` + - `rda.dmp.dmp_id` + - `rda.dmp.dmp_id.identifier` + - `rda.dmp.dmp_id.type` + - `rda.dmp.ethical_issues_description` + - `rda.dmp.ethical_issues_exist` + - `rda.dmp.ethical_issues_report` + - `rda.dmp.language` + - `rda.dmp.modified` + - `rda.dmp.project` + - `rda.dmp.project.description` + - `rda.dmp.project.end` + - `rda.dmp.project.funding` + - `rda.dmp.project.funding.funder_id.identifier` + - `rda.dmp.project.funding.funder_id.type` + - `rda.dmp.project.funding.funding_status` + - `rda.dmp.project.funding.grant_id.identifier` + - `rda.dmp.project.funding.grant_id.type` + - `rda.dmp.project.start` + - `rda.dmp.dmp.project.title` + - `rda.dmp.title` + + + - `rda.dataset.data_quality_assurance` + - `rda.dataset.distribution.access_url` + - `rda.dataset.distribution.available_until` + - `rda.dataset.distribution.byte_size` + - `rda.dataset.distribution.data_access` + - `rda.dataset.distribution.description` + - `rda.dataset.distribution.download_url` + - `rda.dataset.distribution.format` + - `rda.dataset.distribution.host.availability` + - `rda.dataset.distribution.host.backup_frequency` + - `rda.dataset.distribution.host.backup_type` + - `rda.dataset.distribution.host.certified_with` + - `rda.dataset.distribution.host.description` + - `rda.dataset.distribution.host.geo_location` + - `rda.dataset.distribution.host.pid_system` + - `rda.dataset.distribution.host.storage_type` + - `rda.dataset.distribution.host.supports_versioning` + - `rda.dataset.distribution.host.title` + - `rda.dataset.distribution.host.url` + - `rda.dataset.distribution.license.license_ref` + - `rda.dataset.distribution.license.start_date` + - `rda.dataset.distribution.title` + - `rda.dataset.keyword` + - `rda.dataset.language` + - `rda.dataset.metadata.description` + - `rda.dataset.metadata.language` + - `rda.dataset.metadata.metadata_standard_id` + - `rda.dataset.metadata.metadata_standard_id.identifier` + - `rda.dataset.metadata.metadata_standard_id.type` + - `rda.dataset.personal_data` + - `rda.dataset.preservation_statement` + - `rda.dataset.security_and_privacy` + - `rda.dataset.security_and_privacy.description` + - `rda.dataset.security_and_privacy.title` + - `rda.dataset.sensitive_data` + - `rda.dataset.technical_resource.description` + - `rda.dataset.technical_resource.name` + - `rda.dataset.title` + - `rda.dataset.type` + - `rda.dataset.issued` + - `rda.dataset.dataset_id` + - `rda.dataset.dataset_id.identifier` + - `rda.dataset.dataset_id.type` + - `rda.dataset.description` + + + + + - `zenodo.related_identifiers.isCitedBy` + - `zenodo.related_identifiers.cites` + - `zenodo.related_identifiers.isSupplementTo` + - `zenodo.related_identifiers.isSupplementedBy` + - `zenodo.related_identifiers.isContinuedBy` + - `zenodo.related_identifiers.continues` + - `zenodo.related_identifiers.isDescribedBy` + - `zenodo.related_identifiers.describes` + - `zenodo.related_identifiers.hasMetadata` + - `zenodo.related_identifiers.isMetadataFor` + - `zenodo.related_identifiers.isNewVersionOf` + - `zenodo.related_identifiers.isPreviousVersionOf` + - `zenodo.related_identifiers.isPartOf` + - `zenodo.related_identifiers.hasPart` + - `zenodo.related_identifiers.isReferencedBy` + - `zenodo.related_identifiers.references` + - `zenodo.related_identifiers.isDocumentedBy` + - `zenodo.related_identifiers.documents` + - `zenodo.related_identifiers.isCompiledBy` + - `zenodo.related_identifiers.compiles` + - `zenodo.related_identifiers.isVariantFormOf` + - `zenodo.related_identifiers.isOriginalFormof` + - `zenodo.related_identifiers.isIdenticalTo` + - `zenodo.related_identifiers.isAlternateIdentifier` + - `zenodo.related_identifiers.isReviewedBy` + - `zenodo.related_identifiers.reviews` + - `zenodo.related_identifiers.isDerivedFrom` + - `zenodo.related_identifiers.isSourceOf` + - `zenodo.related_identifiers.requires` + - `zenodo.related_identifiers.isRequiredBy` + - `zenodo.related_identifiers.isObsoletedBy` + - `zenodo.related_identifiers.obsoletes` + + \ No newline at end of file diff --git a/docs/docs/documentation/administration/tenant-configuration.md b/docs/docs/documentation/administration/tenant-configuration.md index 10e0d03ee..3199e9e44 100644 --- a/docs/docs/documentation/administration/tenant-configuration.md +++ b/docs/docs/documentation/administration/tenant-configuration.md @@ -3,4 +3,4 @@ sidebar_position: 11 description: Configure the tenant you are logged in with --- -# Tenant configuration \ No newline at end of file +# Tenant Configuration \ No newline at end of file diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts index 0a1e90f91..e8ee9765a 100644 --- a/docs/docusaurus.config.ts +++ b/docs/docusaurus.config.ts @@ -3,8 +3,8 @@ import type { Config } from '@docusaurus/types'; import type * as Preset from '@docusaurus/preset-classic'; const config: Config = { - title: 'OpenDMP', - tagline: 'OpenDMP', + title: 'OpenCDMP', + tagline: 'OpenCDMP Docs', favicon: 'img/favicon.ico', // Set the production url of your site here @@ -58,9 +58,9 @@ const config: Config = { // Replace with your project's social card image: 'img/docusaurus-social-card.jpg', navbar: { - title: 'OpenDMP', + title: 'OpenCDMP', logo: { - alt: 'OpenDMP Logo', + alt: 'OpenCDMP Logo', src: 'img/logo.svg', }, items: [ @@ -78,7 +78,7 @@ const config: Config = { }, { href: 'https://test4.opendmp.eu/splash/', - label: 'Visit OpenDMP', + label: 'Visit OpenCDMP', position: 'right', }, ], @@ -138,7 +138,7 @@ const config: Config = { ], }, ], - copyright: `Copyright © ${new Date().getFullYear()} OpenDMP. Built with Docusaurus.`, + copyright: `Copyright © ${new Date().getFullYear()} OpenCDMP. Built with Docusaurus.`, }, prism: { theme: prismThemes.github, diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 2bc6a4cfd..e34952506 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -28,3 +28,7 @@ --ifm-color-primary-lightest: #4fddbf; --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); } + +.outer-tab { + margin-left: 1rem; +} From e871068443d6fcfecb089dca1f55c9d6ffd572c2 Mon Sep 17 00:00:00 2001 From: amentis Date: Mon, 29 Apr 2024 14:35:11 +0300 Subject: [PATCH 2/3] new version small fix --- .../src/main/java/org/opencdmp/service/dmp/DmpServiceImpl.java | 1 + 1 file changed, 1 insertion(+) 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 413212986..c429b52f2 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 @@ -383,6 +383,7 @@ public class DmpServiceImpl implements DmpService { newDmp.setStatus(DmpStatus.Draft); newDmp.setProperties(oldDmpEntity.getProperties()); newDmp.setBlueprintId(model.getBlueprintId()); + newDmp.setAccessType(oldDmpEntity.getAccessType()); newDmp.setCreatorId(this.userScope.getUserId()); this.entityManager.persist(newDmp); From e8be226a0b8a2b426d042664480fdf1df07005f0 Mon Sep 17 00:00:00 2001 From: sgiannopoulos Date: Mon, 29 Apr 2024 14:56:32 +0300 Subject: [PATCH 3/3] dmp export --- .../description/ExternalIdentifierEntity.java | 4 +- .../types/description/FieldEntity.java | 8 +- .../description/PropertyDefinitionEntity.java | 2 +- .../PropertyDefinitionFieldSetEntity.java | 2 +- .../PropertyDefinitionFieldSetItemEntity.java | 6 +- .../commons/types/dmp/DmpContactEntity.java | 8 +- .../types/dmp/DmpPropertiesEntity.java | 4 +- .../DmpBlueprintValueImportExport.java | 35 +++ .../importexport/DmpContactImportExport.java | 66 +++++ .../DmpDescriptionTemplateImportExport.java | 33 +++ .../dmp/importexport/DmpImportExport.java | 164 +++++++++++ .../DmpReferenceImportExport.java | 62 ++++ .../DmpReferenceTypeImportExport.java | 45 +++ .../dmp/importexport/DmpUserImportExport.java | 56 ++++ .../importexport/BlueprintImportExport.java | 29 +- .../DmpDescriptionTemplatePersist.java | 8 +- .../opencdmp/model/persist/DmpPersist.java | 44 +-- .../DmpBlueprintValuePersist.java | 26 +- .../org/opencdmp/service/dmp/DmpService.java | 7 +- .../opencdmp/service/dmp/DmpServiceImpl.java | 267 +++++++++++++++--- .../dmpblueprint/DmpBlueprintService.java | 3 + .../dmpblueprint/DmpBlueprintServiceImpl.java | 57 +++- .../FileTransformerServiceImpl.java | 24 +- .../src/app/core/services/dmp/dmp.service.ts | 4 - .../file-transformer.service.ts | 44 ++- .../ui/dmp/overview/dmp-overview.component.ts | 12 - 26 files changed, 871 insertions(+), 149 deletions(-) create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpBlueprintValueImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpContactImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpDescriptionTemplateImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpReferenceImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpReferenceTypeImportExport.java create mode 100644 backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpUserImportExport.java diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/ExternalIdentifierEntity.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/ExternalIdentifierEntity.java index 2e6d07639..94092a7e0 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/description/ExternalIdentifierEntity.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/ExternalIdentifierEntity.java @@ -7,7 +7,7 @@ public class ExternalIdentifierEntity { private String type; public String getIdentifier() { - return identifier; + return this.identifier; } public void setIdentifier(String identifier) { @@ -15,7 +15,7 @@ public class ExternalIdentifierEntity { } public String getType() { - return type; + return this.type; } public void setType(String type) { diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/FieldEntity.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/FieldEntity.java index 969056255..a748ac2ad 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/description/FieldEntity.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/FieldEntity.java @@ -11,7 +11,7 @@ public class FieldEntity { private ExternalIdentifierEntity externalIdentifier; public String getTextValue() { - return textValue; + return this.textValue; } public void setTextValue(String textValue) { @@ -19,7 +19,7 @@ public class FieldEntity { } public List getTextListValue() { - return textListValue; + return this.textListValue; } public void setTextListValue(List textListValue) { @@ -27,7 +27,7 @@ public class FieldEntity { } public Instant getDateValue() { - return dateValue; + return this.dateValue; } public void setDateValue(Instant dateValue) { @@ -35,7 +35,7 @@ public class FieldEntity { } public ExternalIdentifierEntity getExternalIdentifier() { - return externalIdentifier; + return this.externalIdentifier; } public void setExternalIdentifier(ExternalIdentifierEntity externalIdentifier) { diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/PropertyDefinitionEntity.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/PropertyDefinitionEntity.java index 561e3df3c..641077563 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/description/PropertyDefinitionEntity.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/PropertyDefinitionEntity.java @@ -6,7 +6,7 @@ public class PropertyDefinitionEntity { private Map fieldSets; public Map getFieldSets() { - return fieldSets; + return this.fieldSets; } public void setFieldSets(Map fieldSets) { diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/PropertyDefinitionFieldSetEntity.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/PropertyDefinitionFieldSetEntity.java index b0207e859..ea90ad4f5 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/description/PropertyDefinitionFieldSetEntity.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/PropertyDefinitionFieldSetEntity.java @@ -6,7 +6,7 @@ public class PropertyDefinitionFieldSetEntity { private List items; public List getItems() { - return items; + return this.items; } public void setItems(List items) { diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/description/PropertyDefinitionFieldSetItemEntity.java b/backend/core/src/main/java/org/opencdmp/commons/types/description/PropertyDefinitionFieldSetItemEntity.java index c17232466..9ca9d98de 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/description/PropertyDefinitionFieldSetItemEntity.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/description/PropertyDefinitionFieldSetItemEntity.java @@ -8,7 +8,7 @@ public class PropertyDefinitionFieldSetItemEntity { private int ordinal; public Map getFields() { - return fields; + return this.fields; } public void setFields(Map fields) { @@ -16,7 +16,7 @@ public class PropertyDefinitionFieldSetItemEntity { } public String getComment() { - return comment; + return this.comment; } public void setComment(String comment) { @@ -24,7 +24,7 @@ public class PropertyDefinitionFieldSetItemEntity { } public int getOrdinal() { - return ordinal; + return this.ordinal; } public void setOrdinal(int ordinal) { diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmp/DmpContactEntity.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/DmpContactEntity.java index 2d1a66595..979236c0b 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/dmp/DmpContactEntity.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/DmpContactEntity.java @@ -13,7 +13,7 @@ public class DmpContactEntity { private String email; public UUID getUserId() { - return userId; + return this.userId; } public void setUserId(UUID userId) { @@ -21,7 +21,7 @@ public class DmpContactEntity { } public String getFirstName() { - return firstName; + return this.firstName; } public void setFirstName(String firstName) { @@ -29,7 +29,7 @@ public class DmpContactEntity { } public String getLastName() { - return lastName; + return this.lastName; } public void setLastName(String lastName) { @@ -37,7 +37,7 @@ public class DmpContactEntity { } public String getEmail() { - return email; + return this.email; } public void setEmail(String email) { diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmp/DmpPropertiesEntity.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/DmpPropertiesEntity.java index 8d200344c..f32378fec 100644 --- a/backend/core/src/main/java/org/opencdmp/commons/types/dmp/DmpPropertiesEntity.java +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/DmpPropertiesEntity.java @@ -9,7 +9,7 @@ public class DmpPropertiesEntity { private List contacts; public List getDmpBlueprintValues() { - return dmpBlueprintValues; + return this.dmpBlueprintValues; } public void setDmpBlueprintValues(List dmpBlueprintValues) { @@ -17,7 +17,7 @@ public class DmpPropertiesEntity { } public List getContacts() { - return contacts; + return this.contacts; } public void setContacts(List contacts) { diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpBlueprintValueImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpBlueprintValueImportExport.java new file mode 100644 index 000000000..8970bab98 --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpBlueprintValueImportExport.java @@ -0,0 +1,35 @@ +package org.opencdmp.commons.types.dmp.importexport; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; + +import java.util.UUID; + +@XmlAccessorType(XmlAccessType.FIELD) + +public class DmpBlueprintValueImportExport { + + @XmlElement(name = "fieldId") + private UUID fieldId; + + @XmlElement(name = "value") + private String value; + + public UUID getFieldId() { + return this.fieldId; + } + + public void setFieldId(UUID fieldId) { + this.fieldId = fieldId; + } + + public String getValue() { + return this.value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpContactImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpContactImportExport.java new file mode 100644 index 000000000..d127d8719 --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpContactImportExport.java @@ -0,0 +1,66 @@ +package org.opencdmp.commons.types.dmp.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 DmpContactImportExport { + + @XmlElement(name = "userId") + private UUID userId; + + @XmlElement(name = "name") + private String name; + + + @XmlElement(name = "firstName") + private String firstName; + + @XmlElement(name = "lastName") + private String lastName; + @XmlElement(name = "email") + private String email; + + public UUID getUserId() { + return this.userId; + } + + public void setUserId(UUID userId) { + this.userId = userId; + } + + public String getFirstName() { + return this.firstName; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return this.lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return this.email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpDescriptionTemplateImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpDescriptionTemplateImportExport.java new file mode 100644 index 000000000..b066aed0d --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpDescriptionTemplateImportExport.java @@ -0,0 +1,33 @@ +package org.opencdmp.commons.types.dmp.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 DmpDescriptionTemplateImportExport { + + @XmlElement(name = "descriptionTemplateGroupId") + private UUID descriptionTemplateGroupId; + + @XmlElement(name = "sectionId") + private UUID sectionId; + + public UUID getDescriptionTemplateGroupId() { + return this.descriptionTemplateGroupId; + } + + public void setDescriptionTemplateGroupId(UUID descriptionTemplateGroupId) { + this.descriptionTemplateGroupId = descriptionTemplateGroupId; + } + + public UUID getSectionId() { + return this.sectionId; + } + + public void setSectionId(UUID sectionId) { + this.sectionId = sectionId; + } +} 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 new file mode 100644 index 000000000..93c5d0379 --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpImportExport.java @@ -0,0 +1,164 @@ +package org.opencdmp.commons.types.dmp.importexport; + +import jakarta.xml.bind.annotation.*; +import org.opencdmp.commons.enums.DmpAccessType; +import org.opencdmp.commons.types.dmpblueprint.importexport.BlueprintImportExport; + +import java.time.Instant; +import java.util.List; +import java.util.UUID; + +@XmlRootElement(name = "dmp") +@XmlAccessorType(XmlAccessType.FIELD) +public class DmpImportExport { + + @XmlElement(name = "id") + private UUID id; + + @XmlElement(name = "description") + private String description; + + @XmlElement(name = "title") + private String title; + + @XmlElement(name = "language") + private String language; + + @XmlElement(name = "access") + private DmpAccessType access; + + @XmlElementWrapper(name = "contacts") + @XmlElement(name = "contact") + private List contacts; + + @XmlElementWrapper(name = "users") + @XmlElement(name = "user") + private List users; + + @XmlElement(name = "finalizedAt") + private Instant finalizedAt; + + @XmlElement(name = "publicAfter") + private Instant publicAfter; + + @XmlElement(name = "blueprint") + private BlueprintImportExport blueprint; + + @XmlElementWrapper(name = "blueprintValues") + @XmlElement(name = "blueprintValue") + private List blueprintValues; + + @XmlElementWrapper(name = "descriptionTemplates") + @XmlElement(name = "descriptionTemplate") + private List descriptionTemplates; + + @XmlElementWrapper(name = "references") + @XmlElement(name = "reference") + private List references; + + 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 getTitle() { + return this.title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getLanguage() { + return this.language; + } + + public void setLanguage(String language) { + this.language = language; + } + + + public DmpAccessType getAccess() { + return this.access; + } + + public void setAccess(DmpAccessType access) { + this.access = access; + } + + public List getContacts() { + return this.contacts; + } + + public void setContacts(List contacts) { + this.contacts = contacts; + } + + public List getUsers() { + return this.users; + } + + public void setUsers(List users) { + this.users = users; + } + + public Instant getFinalizedAt() { + return this.finalizedAt; + } + + public void setFinalizedAt(Instant finalizedAt) { + this.finalizedAt = finalizedAt; + } + + public Instant getPublicAfter() { + return this.publicAfter; + } + + public void setPublicAfter(Instant publicAfter) { + this.publicAfter = publicAfter; + } + + public BlueprintImportExport getBlueprint() { + return this.blueprint; + } + + public void setBlueprint(BlueprintImportExport blueprint) { + this.blueprint = blueprint; + } + + public List getBlueprintValues() { + return this.blueprintValues; + } + + public void setBlueprintValues(List blueprintValues) { + this.blueprintValues = blueprintValues; + } + + public List getDescriptionTemplates() { + return this.descriptionTemplates; + } + + public void setDescriptionTemplates(List descriptionTemplates) { + this.descriptionTemplates = descriptionTemplates; + } + + public List getReferences() { + return this.references; + } + + public void setReferences(List references) { + this.references = references; + } +} + diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpReferenceImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpReferenceImportExport.java new file mode 100644 index 000000000..d4ea6da53 --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpReferenceImportExport.java @@ -0,0 +1,62 @@ +package org.opencdmp.commons.types.dmp.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 DmpReferenceImportExport { + + @XmlElement(name = "id") + private UUID id; + @XmlElement(name = "label") + private String label; + @XmlElement(name = "reference") + private String reference; + @XmlElement(name = "fieldId") + private UUID fieldId; + @XmlElement(name = "type") + private DmpReferenceTypeImportExport 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 DmpReferenceTypeImportExport getType() { + return this.type; + } + + public void setType(DmpReferenceTypeImportExport type) { + this.type = type; + } + + public UUID getFieldId() { + return this.fieldId; + } + + public void setFieldId(UUID fieldId) { + this.fieldId = fieldId; + } +} diff --git a/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpReferenceTypeImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpReferenceTypeImportExport.java new file mode 100644 index 000000000..c1f4de9ea --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpReferenceTypeImportExport.java @@ -0,0 +1,45 @@ +package org.opencdmp.commons.types.dmp.importexport; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlAttribute; +import jakarta.xml.bind.annotation.XmlElement; +import org.opencdmp.commons.enums.DmpUserRole; + +import java.util.UUID; + +@XmlAccessorType(XmlAccessType.FIELD) +public class DmpReferenceTypeImportExport { + + @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/dmp/importexport/DmpUserImportExport.java b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpUserImportExport.java new file mode 100644 index 000000000..49c5a6d4c --- /dev/null +++ b/backend/core/src/main/java/org/opencdmp/commons/types/dmp/importexport/DmpUserImportExport.java @@ -0,0 +1,56 @@ +package org.opencdmp.commons.types.dmp.importexport; + +import jakarta.xml.bind.annotation.XmlAccessType; +import jakarta.xml.bind.annotation.XmlAccessorType; +import jakarta.xml.bind.annotation.XmlElement; +import org.opencdmp.commons.enums.DmpUserRole; + +import java.util.UUID; + +@XmlAccessorType(XmlAccessType.FIELD) +public class DmpUserImportExport { + + @XmlElement(name = "id") + private UUID id; + + @XmlElement(name = "name") + private String name; + + @XmlElement(name = "role") + private DmpUserRole role; + + @XmlElement(name = "sectionId") + private UUID sectionId; + + 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 DmpUserRole getRole() { + return this.role; + } + + public void setRole(DmpUserRole role) { + this.role = role; + } + + public UUID getSectionId() { + return this.sectionId; + } + + public void setSectionId(UUID sectionId) { + this.sectionId = sectionId; + } +} 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 5c4aeb13c..40ad66f33 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,19 +1,46 @@ 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; @XmlRootElement(name = "root") @XmlAccessorType(XmlAccessType.FIELD) public class BlueprintImportExport { + @XmlElement(name = "id") + private UUID id; + + @XmlElement(name = "label") + private String label; + @XmlElement(name = "definition") private DefinitionImportExport dmpBlueprintDefinition; + 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 DefinitionImportExport getDmpBlueprintDefinition() { - return dmpBlueprintDefinition; + return this.dmpBlueprintDefinition; } public void setDmpBlueprintDefinition(DefinitionImportExport dmpBlueprintDefinition) { diff --git a/backend/core/src/main/java/org/opencdmp/model/persist/DmpDescriptionTemplatePersist.java b/backend/core/src/main/java/org/opencdmp/model/persist/DmpDescriptionTemplatePersist.java index 610ff1176..c70e08de1 100644 --- a/backend/core/src/main/java/org/opencdmp/model/persist/DmpDescriptionTemplatePersist.java +++ b/backend/core/src/main/java/org/opencdmp/model/persist/DmpDescriptionTemplatePersist.java @@ -26,7 +26,7 @@ public class DmpDescriptionTemplatePersist { public static final String _sectionId = "sectionId"; public UUID getDescriptionTemplateGroupId() { - return descriptionTemplateGroupId; + return this.descriptionTemplateGroupId; } public void setDescriptionTemplateGroupId(UUID descriptionTemplateGroupId) { @@ -34,7 +34,7 @@ public class DmpDescriptionTemplatePersist { } public UUID getSectionId() { - return sectionId; + return this.sectionId; } public void setSectionId(UUID sectionId) { @@ -66,10 +66,10 @@ public class DmpDescriptionTemplatePersist { return Arrays.asList( this.spec() .must(() -> this.isValidGuid(item.getDescriptionTemplateGroupId())) - .failOn(DmpDescriptionTemplatePersist._descriptionTemplateGroupId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpDescriptionTemplatePersist._descriptionTemplateGroupId}, LocaleContextHolder.getLocale())), + .failOn(DmpDescriptionTemplatePersist._descriptionTemplateGroupId).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{DmpDescriptionTemplatePersist._descriptionTemplateGroupId}, LocaleContextHolder.getLocale())), this.spec() .must(() -> this.isValidGuid(item.getSectionId())) - .failOn(DmpDescriptionTemplatePersist._sectionId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpDescriptionTemplatePersist._sectionId}, LocaleContextHolder.getLocale())) + .failOn(DmpDescriptionTemplatePersist._sectionId).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{DmpDescriptionTemplatePersist._sectionId}, LocaleContextHolder.getLocale())) ); } diff --git a/backend/core/src/main/java/org/opencdmp/model/persist/DmpPersist.java b/backend/core/src/main/java/org/opencdmp/model/persist/DmpPersist.java index 676c437aa..9e0707482 100644 --- a/backend/core/src/main/java/org/opencdmp/model/persist/DmpPersist.java +++ b/backend/core/src/main/java/org/opencdmp/model/persist/DmpPersist.java @@ -74,7 +74,7 @@ public class DmpPersist { public static final String _hash = "hash"; public UUID getId() { - return id; + return this.id; } public void setId(UUID id) { @@ -82,7 +82,7 @@ public class DmpPersist { } public String getLabel() { - return label; + return this.label; } public void setLabel(String label) { @@ -90,7 +90,7 @@ public class DmpPersist { } public DmpStatus getStatus() { - return status; + return this.status; } public void setStatus(DmpStatus status) { @@ -98,7 +98,7 @@ public class DmpPersist { } public DmpPropertiesPersist getProperties() { - return properties; + return this.properties; } public void setProperties(DmpPropertiesPersist properties) { @@ -106,7 +106,7 @@ public class DmpPersist { } public String getDescription() { - return description; + return this.description; } public void setDescription(String description) { @@ -114,7 +114,7 @@ public class DmpPersist { } public String getLanguage() { - return language; + return this.language; } public void setLanguage(String language) { @@ -122,7 +122,7 @@ public class DmpPersist { } public UUID getBlueprint() { - return blueprint; + return this.blueprint; } public void setBlueprint(UUID blueprint) { @@ -130,7 +130,7 @@ public class DmpPersist { } public DmpAccessType getAccessType() { - return accessType; + return this.accessType; } public void setAccessType(DmpAccessType accessType) { @@ -138,7 +138,7 @@ public class DmpPersist { } public List getDescriptionTemplates() { - return descriptionTemplates; + return this.descriptionTemplates; } public void setDescriptionTemplates(List descriptionTemplates) { @@ -146,7 +146,7 @@ public class DmpPersist { } public List getUsers() { - return users; + return this.users; } public void setUsers(List users) { @@ -154,7 +154,7 @@ public class DmpPersist { } public String getHash() { - return hash; + return this.hash; } public void setHash(String hash) { @@ -212,34 +212,34 @@ public class DmpPersist { this.spec() .iff(() -> this.isValidGuid(item.getId())) .must(() -> this.isValidHash(item.getHash())) - .failOn(DmpPersist._hash).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._hash}, LocaleContextHolder.getLocale())), + .failOn(DmpPersist._hash).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._hash}, LocaleContextHolder.getLocale())), this.spec() .iff(() -> !this.isValidGuid(item.getId())) .must(() -> !this.isValidHash(item.getHash())) - .failOn(DmpPersist._hash).failWith(messageSource.getMessage("Validation_OverPosting", new Object[]{}, LocaleContextHolder.getLocale())), + .failOn(DmpPersist._hash).failWith(this.messageSource.getMessage("Validation_OverPosting", new Object[]{}, LocaleContextHolder.getLocale())), this.spec() .must(() -> !this.isEmpty(item.getLabel())) - .failOn(DmpPersist._label).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._label}, LocaleContextHolder.getLocale())), + .failOn(DmpPersist._label).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._label}, LocaleContextHolder.getLocale())), this.spec() .iff(() -> !this.isEmpty(item.getLabel())) .must(() -> this.lessEqualLength(item.getLabel(), DmpEntity._labelLength)) - .failOn(DmpPersist._label).failWith(messageSource.getMessage("Validation_MaxLength", new Object[]{DmpPersist._label}, LocaleContextHolder.getLocale())), + .failOn(DmpPersist._label).failWith(this.messageSource.getMessage("Validation_MaxLength", new Object[]{DmpPersist._label}, LocaleContextHolder.getLocale())), this.spec() .must(() -> !this.isNull(item.getStatus())) - .failOn(DmpPersist._status).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._status}, LocaleContextHolder.getLocale())), + .failOn(DmpPersist._status).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._status}, LocaleContextHolder.getLocale())), this.spec() .iff(() -> item.getStatus() == DmpStatus.Finalized) .must(() -> this.isValidGuid(item.getBlueprint())) - .failOn(DmpPersist._blueprint).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._blueprint}, LocaleContextHolder.getLocale())), + .failOn(DmpPersist._blueprint).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._blueprint}, LocaleContextHolder.getLocale())), this.spec() .iff(() -> item.getStatus() == DmpStatus.Finalized) .must(() -> !this.isNull(item.getProperties())) - .failOn(DmpPersist._properties).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._properties}, LocaleContextHolder.getLocale())), + .failOn(DmpPersist._properties).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._properties}, LocaleContextHolder.getLocale())), this.spec() .iff(() -> item.getStatus() == DmpStatus.Finalized) .must(() -> this.isDescriptionTemplateMultiplicityValid(finalDmpBlueprintEntity, item.getId())) - .failOn(DmpPersist._descriptionTemplates).failWith(messageSource.getMessage("Validation.InvalidDescriptionTemplateMultiplicityOnDMP", new Object[]{DmpPersist._descriptionTemplates}, LocaleContextHolder.getLocale())), + .failOn(DmpPersist._descriptionTemplates).failWith(this.messageSource.getMessage("Validation.InvalidDescriptionTemplateMultiplicityOnDMP", new Object[]{DmpPersist._descriptionTemplates}, LocaleContextHolder.getLocale())), this.refSpec() .iff(() -> !this.isNull(item.getProperties())) .on(DmpPersist._properties) @@ -248,15 +248,15 @@ public class DmpPersist { this.spec() .iff(() -> item.getStatus() == DmpStatus.Finalized) .must(() -> !this.isNull(item.getLanguage())) - .failOn(DmpPersist._language).failWith(messageSource.getMessage("Validation_Required", new Object[]{languageFieldLabel != null ? languageFieldLabel : DmpBlueprintSystemFieldType.Language.name()}, LocaleContextHolder.getLocale())), + .failOn(DmpPersist._language).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{languageFieldLabel != null ? languageFieldLabel : DmpBlueprintSystemFieldType.Language.name()}, LocaleContextHolder.getLocale())), this.spec() .iff(() -> item.getStatus() == DmpStatus.Finalized) .must(() -> !this.isNull(item.getAccessType())) - .failOn(DmpPersist._accessType).failWith(messageSource.getMessage("Validation_Required", new Object[]{accessFieldLabel != null ? accessFieldLabel : DmpBlueprintSystemFieldType.AccessRights.name()}, LocaleContextHolder.getLocale())), + .failOn(DmpPersist._accessType).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{accessFieldLabel != null ? accessFieldLabel : DmpBlueprintSystemFieldType.AccessRights.name()}, LocaleContextHolder.getLocale())), this.spec() .iff(() -> item.getStatus() == DmpStatus.Finalized) .must(() -> !this.isListNullOrEmpty(item.getDescriptionTemplates())) - .failOn(DmpPersist._descriptionTemplates).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._descriptionTemplates}, LocaleContextHolder.getLocale())), + .failOn(DmpPersist._descriptionTemplates).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{DmpPersist._descriptionTemplates}, LocaleContextHolder.getLocale())), this.navSpec() .iff(() -> !this.isListNullOrEmpty(item.getDescriptionTemplates())) .on(DmpPersist._descriptionTemplates) diff --git a/backend/core/src/main/java/org/opencdmp/model/persist/dmpproperties/DmpBlueprintValuePersist.java b/backend/core/src/main/java/org/opencdmp/model/persist/dmpproperties/DmpBlueprintValuePersist.java index 30008855f..3c9012e5d 100644 --- a/backend/core/src/main/java/org/opencdmp/model/persist/dmpproperties/DmpBlueprintValuePersist.java +++ b/backend/core/src/main/java/org/opencdmp/model/persist/dmpproperties/DmpBlueprintValuePersist.java @@ -37,7 +37,7 @@ public class DmpBlueprintValuePersist { public static final String _reference = "reference"; public UUID getFieldId() { - return fieldId; + return this.fieldId; } public void setFieldId(UUID fieldId) { @@ -45,7 +45,7 @@ public class DmpBlueprintValuePersist { } public String getFieldValue() { - return fieldValue; + return this.fieldValue; } public void setFieldValue(String fieldValue) { @@ -53,7 +53,7 @@ public class DmpBlueprintValuePersist { } public List getReferences() { - return references; + return this.references; } public void setReferences(List references) { @@ -61,7 +61,7 @@ public class DmpBlueprintValuePersist { } public ReferencePersist getReference() { - return reference; + return this.reference; } public void setReference(ReferencePersist reference) { @@ -95,29 +95,29 @@ public class DmpBlueprintValuePersist { @Override protected List specifications(DmpBlueprintValuePersist item) { - fieldEntity = definition != null && this.isValidGuid(item.getFieldId())? definition.getFieldById(item.getFieldId()).stream().findFirst().orElse(null) : null; - boolean required = fieldEntity != null && fieldEntity.isRequired(); + this.fieldEntity = this.definition != null && this.isValidGuid(item.getFieldId())? this.definition.getFieldById(item.getFieldId()).stream().findFirst().orElse(null) : null; + boolean required = this.fieldEntity != null && this.fieldEntity.isRequired(); return Arrays.asList( this.spec() .must(() -> this.isValidGuid(item.getFieldId())) - .failOn(DmpBlueprintValuePersist._fieldId).failWith(messageSource.getMessage("Validation_Required", new Object[]{DmpBlueprintValuePersist._fieldId}, LocaleContextHolder.getLocale())), + .failOn(DmpBlueprintValuePersist._fieldId).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{DmpBlueprintValuePersist._fieldId}, LocaleContextHolder.getLocale())), this.spec() - .iff(() -> fieldEntity.getCategory().equals(DmpBlueprintFieldCategory.Extra) && this.isListNullOrEmpty(item.getReferences()) && required) + .iff(() -> this.fieldEntity.getCategory().equals(DmpBlueprintFieldCategory.Extra) && this.isListNullOrEmpty(item.getReferences()) && required) .must(() -> !this.isEmpty(item.getFieldValue())) - .failOn(DmpBlueprintValuePersist._fieldValue).failWith(messageSource.getMessage("Validation_Required", new Object[]{fieldEntity.getLabel()}, LocaleContextHolder.getLocale())), + .failOn(DmpBlueprintValuePersist._fieldValue).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{this.fieldEntity.getLabel()}, LocaleContextHolder.getLocale())), this.spec() - .iff(() -> fieldEntity.getCategory().equals(DmpBlueprintFieldCategory.ReferenceType) && this.isEmpty(item.getFieldValue()) && ((ReferenceTypeFieldEntity)fieldEntity).getMultipleSelect() && required) + .iff(() -> this.fieldEntity.getCategory().equals(DmpBlueprintFieldCategory.ReferenceType) && this.isEmpty(item.getFieldValue()) && ((ReferenceTypeFieldEntity) this.fieldEntity).getMultipleSelect() && required) .must(() -> !this.isListNullOrEmpty(item.getReferences())) // TODO: Cast Exception // .failOn(DmpBlueprintValuePersist._references).failWith(messageSource.getMessage("Validation_Required", new Object[]{!this.isEmpty(fieldEntity.getLabel()) ? fieldEntity.getLabel() : this.getReferenceTypeName(fieldEntity)}, LocaleContextHolder.getLocale())), - .failOn(DmpBlueprintValuePersist._references).failWith(messageSource.getMessage("Validation_Required", new Object[]{!this.isEmpty(fieldEntity.getLabel()) ? fieldEntity.getLabel() : DmpBlueprintValuePersist._references}, LocaleContextHolder.getLocale())), + .failOn(DmpBlueprintValuePersist._references).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{!this.isEmpty(this.fieldEntity.getLabel()) ? this.fieldEntity.getLabel() : DmpBlueprintValuePersist._references}, LocaleContextHolder.getLocale())), this.spec() - .iff(() -> fieldEntity.getCategory().equals(DmpBlueprintFieldCategory.ReferenceType) && this.isEmpty(item.getFieldValue()) && !((ReferenceTypeFieldEntity)fieldEntity).getMultipleSelect() && required) + .iff(() -> this.fieldEntity.getCategory().equals(DmpBlueprintFieldCategory.ReferenceType) && this.isEmpty(item.getFieldValue()) && !((ReferenceTypeFieldEntity) this.fieldEntity).getMultipleSelect() && required) .must(() -> !this.isNull(item.getReference())) // TODO: Cast Exception // .failOn(DmpBlueprintValuePersist._references).failWith(messageSource.getMessage("Validation_Required", new Object[]{!this.isEmpty(fieldEntity.getLabel()) ? fieldEntity.getLabel() : this.getReferenceTypeName(fieldEntity)}, LocaleContextHolder.getLocale())), - .failOn(DmpBlueprintValuePersist._reference).failWith(messageSource.getMessage("Validation_Required", new Object[]{!this.isEmpty(fieldEntity.getLabel()) ? fieldEntity.getLabel() : DmpBlueprintValuePersist._reference}, LocaleContextHolder.getLocale())), + .failOn(DmpBlueprintValuePersist._reference).failWith(this.messageSource.getMessage("Validation_Required", new Object[]{!this.isEmpty(this.fieldEntity.getLabel()) ? this.fieldEntity.getLabel() : DmpBlueprintValuePersist._reference}, LocaleContextHolder.getLocale())), this.navSpec() .iff(() -> !this.isListNullOrEmpty(item.getReferences())) .on(DmpBlueprintValuePersist._references) diff --git a/backend/core/src/main/java/org/opencdmp/service/dmp/DmpService.java b/backend/core/src/main/java/org/opencdmp/service/dmp/DmpService.java index b192c9ac3..89a6006fc 100644 --- a/backend/core/src/main/java/org/opencdmp/service/dmp/DmpService.java +++ b/backend/core/src/main/java/org/opencdmp/service/dmp/DmpService.java @@ -1,5 +1,6 @@ package org.opencdmp.service.dmp; +import org.opencdmp.commons.types.dmp.importexport.DmpImportExport; import org.opencdmp.model.Dmp; import org.opencdmp.model.DmpUser; import org.opencdmp.model.DmpValidationResult; @@ -11,6 +12,7 @@ import gr.cite.tools.exception.MyValidationException; import gr.cite.tools.fieldset.FieldSet; import jakarta.xml.bind.JAXBException; import org.springframework.http.ResponseEntity; +import org.xml.sax.SAXException; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; @@ -50,4 +52,7 @@ public interface DmpService { void dmpInvitationAccept(String token) throws InvalidApplicationException, IOException; - } + DmpImportExport 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/dmp/DmpServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/dmp/DmpServiceImpl.java index 413212986..cafae94a3 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 @@ -14,6 +14,7 @@ import org.opencdmp.commons.types.actionconfirmation.DmpInvitationEntity; import org.opencdmp.commons.types.dmp.DmpBlueprintValueEntity; import org.opencdmp.commons.types.dmp.DmpContactEntity; import org.opencdmp.commons.types.dmp.DmpPropertiesEntity; +import org.opencdmp.commons.types.dmp.importexport.*; import org.opencdmp.commons.types.dmpblueprint.ReferenceTypeFieldEntity; import org.opencdmp.commons.types.dmpblueprint.SectionEntity; import org.opencdmp.commons.types.dmpreference.DmpReferenceDataEntity; @@ -47,6 +48,7 @@ import org.opencdmp.model.persist.referencedefinition.FieldPersist; import org.opencdmp.query.*; import org.opencdmp.service.actionconfirmation.ActionConfirmationService; import org.opencdmp.service.description.DescriptionService; +import org.opencdmp.service.dmpblueprint.DmpBlueprintService; import org.opencdmp.service.elastic.ElasticService; import org.opencdmp.service.filetransformer.FileTransformerService; import gr.cite.commons.web.authz.service.AuthorizationService; @@ -66,6 +68,7 @@ import gr.cite.tools.validation.ValidationFailure; import gr.cite.tools.validation.ValidatorFactory; import jakarta.xml.bind.JAXBException; import org.jetbrains.annotations.NotNull; +import org.opencdmp.service.responseutils.ResponseUtilsService; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; @@ -75,11 +78,13 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +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; @@ -135,6 +140,8 @@ public class DmpServiceImpl implements DmpService { private final AnnotationEntityRemovalIntegrationEventHandler annotationEntityRemovalIntegrationEventHandler; private final AuthorizationContentResolver authorizationContentResolver; private final TenantScope tenantScope; + private final ResponseUtilsService responseUtilsService; + private final DmpBlueprintService dmpBlueprintService; @Autowired public DmpServiceImpl( TenantEntityManager entityManager, @@ -156,7 +163,7 @@ public class DmpServiceImpl implements DmpService { FileTransformerService fileTransformerService, ValidatorFactory validatorFactory, ElasticService elasticService, - AnnotationEntityTouchedIntegrationEventHandler annotationEntityTouchedIntegrationEventHandler, AnnotationEntityRemovalIntegrationEventHandler annotationEntityRemovalIntegrationEventHandler, AuthorizationContentResolver authorizationContentResolver, TenantScope tenantScope) { + AnnotationEntityTouchedIntegrationEventHandler annotationEntityTouchedIntegrationEventHandler, AnnotationEntityRemovalIntegrationEventHandler annotationEntityRemovalIntegrationEventHandler, AuthorizationContentResolver authorizationContentResolver, TenantScope tenantScope, ResponseUtilsService responseUtilsService, DmpBlueprintService dmpBlueprintService) { this.entityManager = entityManager; this.authorizationService = authorizationService; this.deleterFactory = deleterFactory; @@ -180,6 +187,8 @@ public class DmpServiceImpl implements DmpService { this.annotationEntityRemovalIntegrationEventHandler = annotationEntityRemovalIntegrationEventHandler; this.authorizationContentResolver = authorizationContentResolver; this.tenantScope = tenantScope; + this.responseUtilsService = responseUtilsService; + this.dmpBlueprintService = dmpBlueprintService; } public Dmp persist(DmpPersist model, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException, InvalidApplicationException, JAXBException, IOException { @@ -191,9 +200,9 @@ public class DmpServiceImpl implements DmpService { DmpEntity data = this.patchAndSave(model); DmpBlueprintEntity blueprintEntity = this.entityManager.find(DmpBlueprintEntity.class, data.getBlueprintId()); - if (blueprintEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{data.getBlueprintId(), DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (blueprintEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{data.getBlueprintId(), DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); org.opencdmp.commons.types.dmpblueprint.DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(org.opencdmp.commons.types.dmpblueprint.DefinitionEntity.class, blueprintEntity.getDefinition()); - if (definition == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{data.getBlueprintId(), org.opencdmp.commons.types.dmpblueprint.DefinitionEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (definition == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{data.getBlueprintId(), org.opencdmp.commons.types.dmpblueprint.DefinitionEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.patchAndSaveReferences(this.buildDmpReferencePersists(model.getProperties()), data.getId(), definition); @@ -201,7 +210,7 @@ public class DmpServiceImpl implements DmpService { this.patchAndSaveTemplates(data.getId(), model.getDescriptionTemplates()); - if (!isUpdate && userScope.isSet()) { + if (!isUpdate && this.userScope.isSet()) { this.addOwner(data); if (model.getUsers() == null) model.setUsers(new ArrayList<>()); if (model.getUsers().stream().noneMatch(x-> x.getUser() != null && x.getUser().equals(this.userScope.getUserIdSafe()) && DmpUserRole.Owner.equals(x.getRole()))) model.getUsers().add(this.createOwnerPersist()); @@ -233,7 +242,7 @@ public class DmpServiceImpl implements DmpService { private DmpUserPersist createOwnerPersist() { DmpUserPersist persist = new DmpUserPersist(); persist.setRole(DmpUserRole.Owner); - persist.setUser(userScope.getUserIdSafe()); + persist.setUser(this.userScope.getUserIdSafe()); return persist; } @@ -244,7 +253,7 @@ public class DmpServiceImpl implements DmpService { data.setCreatedAt(Instant.now()); data.setUpdatedAt(Instant.now()); data.setRole(DmpUserRole.Owner); - data.setUserId(userScope.getUserId()); + data.setUserId(this.userScope.getUserId()); data.setDmpId(dmpEntity.getId()); this.entityManager.persist(data); @@ -279,7 +288,7 @@ public class DmpServiceImpl implements DmpService { 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)); this.applyNotificationType(dmp.getStatus(), event); NotificationFieldData data = new NotificationFieldData(); @@ -289,18 +298,18 @@ public class DmpServiceImpl implements DmpService { fieldInfoList.add(new FieldInfo("{name}", DataType.String, dmp.getLabel())); fieldInfoList.add(new FieldInfo("{id}", DataType.String, dmp.getId().toString())); data.setFields(fieldInfoList); - event.setData(jsonHandlingService.toJsonSafe(data)); + event.setData(this.jsonHandlingService.toJsonSafe(data)); - eventHandler.handle(event); + this.eventHandler.handle(event); } private void applyNotificationType(DmpStatus status, NotifyIntegrationEvent event) { switch (status) { case Draft: - event.setNotificationType(notificationProperties.getDmpModifiedType()); + event.setNotificationType(this.notificationProperties.getDmpModifiedType()); break; case Finalized: - event.setNotificationType(notificationProperties.getDmpFinalisedType()); + event.setNotificationType(this.notificationProperties.getDmpFinalisedType()); break; default: throw new MyApplicationException("Unsupported Dmp Status."); @@ -313,7 +322,7 @@ public class DmpServiceImpl implements DmpService { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.dmpAffiliation(id)), Permission.DeleteDmp); DmpEntity data = this.entityManager.find(DmpEntity.class, id); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); EntityDoiQuery entityDoiQuery = this.queryFactory.query(EntityDoiQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).types(EntityType.DMP).entityIds(data.getId()); if (entityDoiQuery.count() > 0) throw new MyApplicationException("DMP is deposited can not deleted"); @@ -349,7 +358,7 @@ public class DmpServiceImpl implements DmpService { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.dmpAffiliation( model.getId())), Permission.CreateNewVersionDmp); DmpEntity oldDmpEntity = this.entityManager.find(DmpEntity.class, model.getId()); - if (oldDmpEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (oldDmpEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.conventionService.hashValue(oldDmpEntity.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); List latestVersionDmps = this.queryFactory.query(DmpQuery.class) @@ -500,7 +509,7 @@ public class DmpServiceImpl implements DmpService { DmpEntity existingDmpEntity = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(model.getId()).firstAs(fields); if (!this.conventionService.isValidGuid(model.getId()) || existingDmpEntity == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); DmpEntity newDmp = new DmpEntity(); newDmp.setId(UUID.randomUUID()); @@ -582,7 +591,7 @@ public class DmpServiceImpl implements DmpService { DmpEntity resultingDmpEntity = this.queryFactory.query(DmpQuery.class).ids(newDmp.getId()).firstAs(fields); if (!this.conventionService.isListNullOrEmpty(model.getDescriptions())){ for (UUID description: model.getDescriptions()) { - descriptionService.clone(newDmp.getId(), description); + this.descriptionService.clone(newDmp.getId(), description); } } return this.builderFactory.builder(DmpBuilder.class).build(fields, resultingDmpEntity); @@ -595,7 +604,7 @@ public class DmpServiceImpl implements DmpService { if (!disableDelete && (model == null || model.stream().noneMatch(x-> x.getUser() != null && DmpUserRole.Owner.equals(x.getRole())))) throw new MyApplicationException("At least one owner required"); DmpEntity dmpEntity = this.entityManager.find(DmpEntity.class, dmpId); - if (dmpEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{dmpId, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (dmpEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{dmpId, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); List existingUsers = this.queryFactory.query(DmpUserQuery.class) .dmpIds(dmpId) @@ -641,7 +650,7 @@ public class DmpServiceImpl implements DmpService { public Dmp removeUser(DmpUserRemovePersist model, FieldSet fields) throws InvalidApplicationException, IOException { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.dmpAffiliation(model.getDmpId())), Permission.AssignDmpUsers); DmpEntity data = this.entityManager.find(DmpEntity.class, model.getDmpId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); List existingUsers = this.queryFactory.query(DmpUserQuery.class) .dmpIds(model.getDmpId()).ids(model.getId()).userRoles(model.getRole()) @@ -652,7 +661,7 @@ public class DmpServiceImpl implements DmpService { this.entityManager.flush(); DmpEntity dmpEntity = this.entityManager.find(DmpEntity.class, model.getDmpId()); - if (dmpEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDmpId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (dmpEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDmpId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.elasticService.persistDmp(dmpEntity); this.annotationEntityTouchedIntegrationEventHandler.handleDmp(dmpEntity.getId()); @@ -677,7 +686,7 @@ public class DmpServiceImpl implements DmpService { DmpEntity data; if (isUpdate) { data = this.entityManager.find(DmpEntity.class, model.getId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Dmp.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 (model.getStatus() != null && model.getStatus() == DmpStatus.Finalized && data.getStatus() != DmpStatus.Finalized) { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.dmpAffiliation(model.getId())), Permission.FinalizeDmp); @@ -691,7 +700,7 @@ public class DmpServiceImpl implements DmpService { data.setVersion((short) 1); data.setStatus(DmpStatus.Draft); data.setVersionStatus(DmpVersionStatus.NotFinalized); - data.setCreatorId(userScope.getUserId()); + data.setCreatorId(this.userScope.getUserId()); data.setBlueprintId(model.getBlueprint()); data.setIsActive(IsActive.Active); data.setCreatedAt(Instant.now()); @@ -804,10 +813,10 @@ public class DmpServiceImpl implements DmpService { ReferenceEntity referenceEntity; 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 { ReferenceTypeFieldEntity fieldEntity = blueprintDefinition.getFieldById(model.getData().getBlueprintFieldId()).stream().filter(x-> x.getCategory().equals(DmpBlueprintFieldCategory.ReferenceType)).map(x-> (ReferenceTypeFieldEntity)x).findFirst().orElse(null); - if (fieldEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getData().getBlueprintFieldId(), ReferenceTypeFieldEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (fieldEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getData().getBlueprintFieldId(), ReferenceTypeFieldEntity.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){ @@ -826,14 +835,14 @@ public class DmpServiceImpl implements DmpService { 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()); } } } @@ -930,7 +939,7 @@ public class DmpServiceImpl implements DmpService { DmpEntity dmp = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id).isActive(IsActive.Active).first(); if (dmp == null){ - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); } if (dmp.getStatus().equals(DmpStatus.Finalized)){ @@ -985,7 +994,7 @@ public class DmpServiceImpl implements DmpService { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.dmpAffiliation(id)), Permission.UndoFinalizeDmp); DmpEntity dmp = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id).isActive(IsActive.Active).firstAs(fields); - if (dmp == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (dmp == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!dmp.getStatus().equals(DmpStatus.Finalized)) throw new MyApplicationException("DMP is already drafted"); @@ -1009,7 +1018,7 @@ public class DmpServiceImpl implements DmpService { DmpEntity dmp = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id).isActive(IsActive.Active).first(); - if (dmp == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (dmp == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); DmpValidationResult dmpValidationResult = new DmpValidationResult(dmp.getId(), DmpValidationOutput.Invalid); @@ -1028,7 +1037,7 @@ public class DmpServiceImpl implements DmpService { if (data == null) return persist; DmpBlueprintEntity dmpBlueprintEntity = this.entityManager.find(DmpBlueprintEntity.class, data.getBlueprintId()); - if (dmpBlueprintEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{data.getBlueprintId(), DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (dmpBlueprintEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{data.getBlueprintId(), DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); persist.setId(data.getId()); persist.setHash(data.getId().toString()); @@ -1046,9 +1055,9 @@ public class DmpServiceImpl implements DmpService { for (DmpUserEntity user: dmpUserEntities) { persist.getUsers().add(this.buildDmpUserPersist(user)); } - }; + } - List dmpReferenceEntities = this.queryFactory.query(DmpReferenceQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(data.getId()).isActives(IsActive.Active).collect(); + List dmpReferenceEntities = this.queryFactory.query(DmpReferenceQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(data.getId()).isActives(IsActive.Active).collect(); org.opencdmp.commons.types.dmpblueprint.DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(org.opencdmp.commons.types.dmpblueprint.DefinitionEntity.class, dmpBlueprintEntity.getDefinition()); @@ -1058,8 +1067,8 @@ public class DmpServiceImpl implements DmpService { for (DmpDescriptionTemplateEntity descriptionTemplateEntity: dmpDescriptionTemplateEntities) { persist.getDescriptionTemplates().add(this.buildDmpDescriptionTemplatePersists(descriptionTemplateEntity, definition.getSections())); } - }; - persist.setProperties(this.buildDmpPropertyDefinitionPersist( this.jsonHandlingService.fromJsonSafe(DmpPropertiesEntity.class, data.getProperties()), dmpReferenceEntities, definition.getSections())); + } + persist.setProperties(this.buildDmpPropertyDefinitionPersist( this.jsonHandlingService.fromJsonSafe(DmpPropertiesEntity.class, data.getProperties()), dmpReferenceEntities, definition.getSections())); return persist; } @@ -1250,8 +1259,8 @@ public class DmpServiceImpl implements DmpService { List contactPairs = new ArrayList<>(); contactPairs.add(new ContactPair(ContactInfoType.Email, email)); NotificationContactData contactData = new NotificationContactData(contactPairs, null, null); - event.setContactHint(jsonHandlingService.toJsonSafe(contactData)); - event.setNotificationType(notificationProperties.getDmpInvitationExistingUserType()); + event.setContactHint(this.jsonHandlingService.toJsonSafe(contactData)); + event.setNotificationType(this.notificationProperties.getDmpInvitationExistingUserType()); NotificationFieldData data = new NotificationFieldData(); List fieldInfoList = new ArrayList<>(); fieldInfoList.add(new FieldInfo("{recipient}", DataType.String, recipient.getName())); @@ -1260,8 +1269,8 @@ public class DmpServiceImpl implements DmpService { fieldInfoList.add(new FieldInfo("{dmprole}", DataType.String, role.toString())); fieldInfoList.add(new FieldInfo("{id}", DataType.String, dmp.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 sendDmpInvitationExternalUser(String email, DmpEntity dmp, DmpUserRole role) throws JAXBException, InvalidApplicationException { @@ -1272,9 +1281,9 @@ public class DmpServiceImpl implements DmpService { List contactPairs = new ArrayList<>(); contactPairs.add(new ContactPair(ContactInfoType.Email, email)); NotificationContactData contactData = new NotificationContactData(contactPairs, null, null); - event.setContactHint(jsonHandlingService.toJsonSafe(contactData)); + event.setContactHint(this.jsonHandlingService.toJsonSafe(contactData)); event.setContactTypeHint(NotificationContactType.EMAIL); - event.setNotificationType(notificationProperties.getDmpInvitationExternalUserType()); + event.setNotificationType(this.notificationProperties.getDmpInvitationExternalUserType()); NotificationFieldData data = new NotificationFieldData(); List fieldInfoList = new ArrayList<>(); fieldInfoList.add(new FieldInfo("{recipient}", DataType.String, email)); @@ -1282,8 +1291,8 @@ public class DmpServiceImpl implements DmpService { fieldInfoList.add(new FieldInfo("{dmpname}", DataType.String, dmp.getLabel())); fieldInfoList.add(new FieldInfo("{dmprole}", DataType.String, role.toString())); data.setFields(fieldInfoList); - event.setData(jsonHandlingService.toJsonSafe(data)); - eventHandler.handle(event); + event.setData(this.jsonHandlingService.toJsonSafe(data)); + this.eventHandler.handle(event); } private String createActionConfirmation(String email, DmpEntity dmp, DmpUserRole role) throws JAXBException, InvalidApplicationException { @@ -1293,7 +1302,7 @@ public class DmpServiceImpl implements DmpService { persist.setToken(UUID.randomUUID().toString()); persist.setDmpInvitation(new DmpInvitationPersist(email, dmp.getId(), role)); persist.setExpiresAt(Instant.now().plusSeconds(this.notificationProperties.getEmailExpirationTimeSeconds())); - validatorFactory.validator(ActionConfirmationPersist.ActionConfirmationPersistValidator.class).validateForce(persist); + this.validatorFactory.validator(ActionConfirmationPersist.ActionConfirmationPersistValidator.class).validateForce(persist); this.actionConfirmationService.persist(persist, null); return persist.getToken(); @@ -1330,4 +1339,180 @@ public class DmpServiceImpl implements DmpService { this.annotationEntityTouchedIntegrationEventHandler.handleDmp(dmpInvitation.getDmpId()); } + //region Export + + @Override + public DmpImportExport 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.ExportDmp); + DmpEntity data = this.entityManager.find(DmpEntity.class, id); + if (data == null) + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + + DmpPropertiesEntity definition = this.jsonHandlingService.fromJson(DmpPropertiesEntity.class, data.getProperties()); + 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("export xml").And("id", id)); + + this.authorizationService.authorizeForce(Permission.ExportDmp); + DmpEntity data = this.entityManager.find(DmpEntity.class, id); + if (data == null) + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + + String xml = this.xmlHandlingService.toXml(this.exportXmlEntity(data.getId())); + return this.responseUtilsService.buildResponseFileFromText(xml, data.getLabel() + ".xml"); + } + + private DmpImportExport definitionXmlToExport(DmpEntity data, DmpPropertiesEntity propertiesEntity) throws InvalidApplicationException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException { + DmpImportExport xml = new DmpImportExport(); + xml.setId(data.getId()); + xml.setDescription(data.getDescription()); + xml.setTitle(data.getLabel()); + xml.setLanguage(data.getLanguage()); + xml.setAccess(data.getAccessType()); + xml.setFinalizedAt(data.getFinalizedAt()); + xml.setPublicAfter(data.getPublicAfter()); + + 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(); + 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)); + } + xml.setContacts(dmpContactImportExports); + } + + List dmpUsers = this.queryFactory.query(DmpUserQuery.class).dmpIds(data.getId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActives(IsActive.Active).collect(); + if (!this.conventionService.isListNullOrEmpty(dmpUsers)) { + List users = this.queryFactory.query(UserQuery.class).ids(dmpUsers.stream().map(DmpUserEntity::getUserId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).collect(); + Map usersMap = users == null ? new HashMap<>() : users.stream().collect(Collectors.toMap(UserEntity::getId, x-> x)); + List dmpUserImportExports = new LinkedList<>(); + for (DmpUserEntity dmpUserEntity : dmpUsers) { + dmpUserImportExports.add(this.dmpUserToExport(dmpUserEntity, usersMap)); + } + xml.setUsers(dmpUserImportExports); + } + DmpBlueprintEntity blueprintEntity = this.queryFactory.query(DmpBlueprintQuery.class).ids(data.getBlueprintId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).first(); + if (blueprintEntity != null) { + xml.setBlueprint(this.dmpBlueprintService.getExportXmlEntity(blueprintEntity.getId())); + } + + List dmpDescriptionTemplateEntities = this.queryFactory.query(DmpDescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(data.getId()).isActive(IsActive.Active).collect(); + if (!this.conventionService.isListNullOrEmpty(dmpDescriptionTemplateEntities)) { + List dmpDescriptionTemplateImportExports = new LinkedList<>(); + for (DmpDescriptionTemplateEntity descriptionTemplateEntity : dmpDescriptionTemplateEntities) { + dmpDescriptionTemplateImportExports.add(this.dmpDescriptionTemplateToExport(descriptionTemplateEntity)); + } + xml.setDescriptionTemplates(dmpDescriptionTemplateImportExports); + } + + if (propertiesEntity != null && !this.conventionService.isListNullOrEmpty(propertiesEntity.getDmpBlueprintValues())) { + List dmpDescriptionTemplateImportExports = new LinkedList<>(); + for (DmpBlueprintValueEntity dmpBlueprintValueEntity : propertiesEntity.getDmpBlueprintValues()) { + dmpDescriptionTemplateImportExports.add(this.dmpBlueprintValueToExport(dmpBlueprintValueEntity)); + } + xml.setBlueprintValues(dmpDescriptionTemplateImportExports); + } + + List dmpReferences = this.queryFactory.query(DmpReferenceQuery.class).dmpIds(data.getId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActives(IsActive.Active).collect(); + if (!this.conventionService.isListNullOrEmpty(dmpReferences)) { + List references = this.queryFactory.query(ReferenceQuery.class).ids(dmpReferences.stream().map(DmpReferenceEntity::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 (DmpReferenceEntity descriptionTemplateEntity : dmpReferences) { + dmpReferenceImportExports.add(this.dmpReferenceToExport(descriptionTemplateEntity, referenceEntityMap, referenceTypeEntityMap)); + } + xml.setReferences(dmpReferenceImportExports); + } + return xml; + } + + private DmpReferenceImportExport dmpReferenceToExport(DmpReferenceEntity entity, Map referenceEntityMap, Map referenceTypeEntityMap) { + DmpReferenceImportExport xml = new DmpReferenceImportExport(); + if (entity == null) return xml; + DmpReferenceDataEntity referenceData = this.jsonHandlingService.fromJsonSafe(DmpReferenceDataEntity.class, entity.getData()); + if (referenceData != null) xml.setFieldId(referenceData.getBlueprintFieldId()); + 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.dmpReferenceTypeToExport(referenceType)); + } + + return xml; + } + + private DmpReferenceTypeImportExport dmpReferenceTypeToExport(ReferenceTypeEntity entity) { + DmpReferenceTypeImportExport xml = new DmpReferenceTypeImportExport(); + if (entity == null) return xml; + xml.setId(entity.getId()); + xml.setCode(entity.getCode()); + xml.setName(entity.getName()); + + return xml; + } + + private DmpBlueprintValueImportExport dmpBlueprintValueToExport(DmpBlueprintValueEntity entity) { + DmpBlueprintValueImportExport xml = new DmpBlueprintValueImportExport(); + if (entity == null) return xml; + + xml.setFieldId(entity.getFieldId()); + xml.setValue(entity.getValue()); + + return xml; + } + + private DmpDescriptionTemplateImportExport dmpDescriptionTemplateToExport(DmpDescriptionTemplateEntity entity) { + DmpDescriptionTemplateImportExport xml = new DmpDescriptionTemplateImportExport(); + if (entity == null) return xml; + + xml.setDescriptionTemplateGroupId(entity.getDescriptionTemplateGroupId()); + xml.setSectionId(entity.getSectionId()); + + return xml; + } + + private DmpUserImportExport dmpUserToExport(DmpUserEntity entity, Map usersMap) { + DmpUserImportExport xml = new DmpUserImportExport(); + if (entity == null) return xml; + + xml.setId(entity.getUserId()); + UserEntity userEntity = usersMap.getOrDefault(entity.getUserId(), null); + if (userEntity != null){ + xml.setName(userEntity.getName()); + } + xml.setRole(entity.getRole()); + xml.setSectionId(entity.getSectionId()); + + return xml; + } + + private DmpContactImportExport dmpContactToExport(DmpContactEntity entity, Map usersMap) { + DmpContactImportExport xml = new DmpContactImportExport(); + if (entity == null) return xml; + + UserEntity userEntity = entity.getUserId() == null ? null : usersMap.getOrDefault(entity.getUserId(), null); + if (userEntity != null){ + xml.setName(userEntity.getName()); + } + xml.setUserId(entity.getUserId()); + xml.setEmail(entity.getEmail()); + xml.setFirstName(entity.getFirstName()); + xml.setLastName(entity.getLastName()); + + return xml; + } + + //endregion + } diff --git a/backend/core/src/main/java/org/opencdmp/service/dmpblueprint/DmpBlueprintService.java b/backend/core/src/main/java/org/opencdmp/service/dmpblueprint/DmpBlueprintService.java index c354f526a..d573608e1 100644 --- a/backend/core/src/main/java/org/opencdmp/service/dmpblueprint/DmpBlueprintService.java +++ b/backend/core/src/main/java/org/opencdmp/service/dmpblueprint/DmpBlueprintService.java @@ -2,6 +2,7 @@ package org.opencdmp.service.dmpblueprint; import com.fasterxml.jackson.core.JsonProcessingException; import org.opencdmp.commons.enums.DmpBlueprintSystemFieldType; +import org.opencdmp.commons.types.dmpblueprint.importexport.BlueprintImportExport; import org.opencdmp.data.DmpBlueprintEntity; import org.opencdmp.model.DmpBlueprint; import org.opencdmp.model.persist.DmpBlueprintPersist; @@ -34,6 +35,8 @@ public interface DmpBlueprintService { DmpBlueprint createNewVersion(NewVersionDmpBlueprintPersist model, FieldSet fieldSet) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException, InvalidApplicationException, JAXBException, ParserConfigurationException, JsonProcessingException, TransformerException; + BlueprintImportExport getExportXmlEntity(UUID id) throws MyForbiddenException, MyNotFoundException, InvalidApplicationException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException; + ResponseEntity exportXml(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, TransformerException, InvalidApplicationException; DmpBlueprint importXml(byte[] bytes, String label, FieldSet fields) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, TransformerException, InvalidApplicationException, IOException, InstantiationException, IllegalAccessException, SAXException; } 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 f7afa09e4..1ab08685a 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 @@ -120,7 +120,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { if (isUpdate) { data = this.entityManager.find(DmpBlueprintEntity.class, model.getId()); if (data == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); if (data.getStatus().equals(DmpBlueprintStatus.Finalized)) @@ -138,7 +138,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { DmpBlueprintStatus previousStatus = data.getStatus(); - if (model.getDefinition() != null && !model.getDefinition().getSections().stream().anyMatch(x -> x.getHasTemplates())) { + if (model.getDefinition() != null && model.getDefinition().getSections().stream().noneMatch(SectionPersist::getHasTemplates)) { throw new MyValidationException(this.errors.getDmpBlueprintHasNoDescriptionTemplates().getCode(), this.errors.getDmpBlueprintHasNoDescriptionTemplates().getMessage()); } @@ -323,7 +323,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { public boolean fieldInBlueprint(UUID id, DmpBlueprintSystemFieldType type) throws InvalidApplicationException { DmpBlueprintEntity data = this.entityManager.find(DmpBlueprintEntity.class, id); if (data == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); return this.fieldInBlueprint(data, type); } @@ -339,7 +339,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { DmpBlueprintQuery query = this.queryFactory.query(DmpBlueprintQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); DmpBlueprint model = this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fields, query.firstAs(fields)); if (model == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); model.setLabel(model.getLabel() + " new "); model.setId(null); @@ -391,7 +391,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { DmpBlueprintEntity oldDmpBlueprintEntity = this.entityManager.find(DmpBlueprintEntity.class, model.getId()); if (oldDmpBlueprintEntity == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.conventionService.hashValue(oldDmpBlueprintEntity.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); if (!this.tenantScope.isSet() || !Objects.equals(oldDmpBlueprintEntity.getTenantId(), this.tenantScope.getTenant())) throw new MyForbiddenException(this.errors.getTenantTampering().getCode(), this.errors.getTenantTampering().getMessage()); @@ -443,19 +443,44 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { //region Export - public ResponseEntity exportXml(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, TransformerException, InvalidApplicationException { - logger.debug(new MapLogEntry("persisting data").And("id", id)); + + @Override + public BlueprintImportExport getExportXmlEntity(UUID id) throws MyForbiddenException, MyNotFoundException, InvalidApplicationException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException { + logger.debug(new MapLogEntry("export xml").And("id", id)); this.authorizationService.authorizeForce(Permission.ExportDmpBlueprint); DmpBlueprintEntity data = this.entityManager.find(DmpBlueprintEntity.class, id); if (data == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); - DefinitionEntity dmpDefinition = this.xmlHandlingService.fromXml(DefinitionEntity.class, data.getDefinition()); - String xml = this.xmlHandlingService.toXml(this.definitionXmlToExport(dmpDefinition)); + return this.definitionXmlToExport(data); + } + + + @Override + public ResponseEntity exportXml(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, TransformerException, InvalidApplicationException { + logger.debug(new MapLogEntry("export xml").And("id", id)); + DmpBlueprintEntity data = this.entityManager.find(DmpBlueprintEntity.class, id); + if (data == null) + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + + String xml = this.xmlHandlingService.toXml(this.getExportXmlEntity(id)); return this.responseUtilsService.buildResponseFileFromText(xml, data.getLabel() + ".xml"); } + + + private BlueprintImportExport definitionXmlToExport(DmpBlueprintEntity entity) throws JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException { + if (entity == null) + return null; + BlueprintImportExport xml = new BlueprintImportExport(); + xml.setId(entity.getId()); + xml.setLabel(entity.getLabel()); + DefinitionEntity dmpDefinition = this.xmlHandlingService.fromXml(DefinitionEntity.class, entity.getDefinition()); + xml.setDmpBlueprintDefinition(this.definitionXmlToExport(dmpDefinition)); + return xml; + } + private DefinitionImportExport definitionXmlToExport(DefinitionEntity entity) { if (entity == null) return null; @@ -572,8 +597,18 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { persist.setStatus(DmpBlueprintStatus.Draft); BlueprintImportExport dmpDefinition = this.xmlHandlingService.fromXml(BlueprintImportExport.class, new String(bytes, StandardCharsets.UTF_8)); - if (dmpDefinition != null) + if (dmpDefinition != null) { persist.setDefinition(this.xmlDefinitionToPersist(dmpDefinition.getDmpBlueprintDefinition())); + if (dmpDefinition.getId() != null) { + persist.setId(dmpDefinition.getId()); + DmpBlueprintEntity data = this.entityManager.find(DmpBlueprintEntity.class, dmpDefinition.getId()); + if (data == null) { + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{dmpDefinition.getId(), DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); + } + persist.setHash(this.conventionService.hashValue(data.getUpdatedAt())); + } + persist.setLabel(dmpDefinition.getLabel()); + } this.validatorFactory.validator(DmpBlueprintPersist.DmpBlueprintPersistValidator.class).validateForce(persist); return this.persist(persist, fields); diff --git a/backend/core/src/main/java/org/opencdmp/service/filetransformer/FileTransformerServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/filetransformer/FileTransformerServiceImpl.java index 4f3dfad0a..72d8bbdbf 100644 --- a/backend/core/src/main/java/org/opencdmp/service/filetransformer/FileTransformerServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/filetransformer/FileTransformerServiceImpl.java @@ -121,7 +121,7 @@ public class FileTransformerServiceImpl implements FileTransformerService { String tenantCode = this.tenantScope.isSet() && this.tenantScope.isMultitenant() ? this.tenantScope.getTenantCode() : ""; FileTransformerSourcesCacheService.FileTransformerSourceCacheValue cacheValue = this.fileTransformerSourcesCacheService.lookup(this.fileTransformerSourcesCacheService.buildKey(tenantCode)); if (cacheValue == null) { - List fileTransformerSourceEntities = new ArrayList<>(fileTransformerProperties.getSources()); + List fileTransformerSourceEntities = new ArrayList<>(this.fileTransformerProperties.getSources()); if (this.tenantScope.isSet() && this.tenantScope.isMultitenant()) { TenantConfigurationQuery tenantConfigurationQuery = this.queryFactory.query(TenantConfigurationQuery.class).isActive(IsActive.Active).types(TenantConfigurationType.FileTransformerPlugins); if (this.tenantScope.isDefaultTenant()) tenantConfigurationQuery.tenantIsSet(false); @@ -165,7 +165,7 @@ public class FileTransformerServiceImpl implements FileTransformerService { item.setUrl(source.getUrl()); item.setIssuerUrl(source.getIssuerUrl()); item.setClientId(source.getClientId()); - if (!this.conventionService.isNullOrEmpty(source.getClientSecret())) item.setClientSecret(this.encryptionService.decryptAES(source.getClientSecret(), tenantProperties.getConfigEncryptionAesKey(), tenantProperties.getConfigEncryptionAesIv())); + if (!this.conventionService.isNullOrEmpty(source.getClientSecret())) item.setClientSecret(this.encryptionService.decryptAES(source.getClientSecret(), this.tenantProperties.getConfigEncryptionAesKey(), this.tenantProperties.getConfigEncryptionAesIv())); item.setScope(source.getScope()); items.add(item); } @@ -201,8 +201,8 @@ public class FileTransformerServiceImpl implements FileTransformerService { FileTransformerConfigurationCacheService.FileTransformerConfigurationCacheValue cacheValue = this.fileTransformerConfigurationCacheService.lookup(this.fileTransformerConfigurationCacheService.buildKey(transformerSource.getTransformerId(), tenantCode)); if (cacheValue == null){ try { - FileTransformerRepository fileTransformerRepository = getRepository(transformerSource.getTransformerId()); - if (fileTransformerRepository == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{transformerSource.getTransformerId(), FileTransformerRepository.class.getSimpleName()}, LocaleContextHolder.getLocale())); + FileTransformerRepository fileTransformerRepository = this.getRepository(transformerSource.getTransformerId()); + if (fileTransformerRepository == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{transformerSource.getTransformerId(), FileTransformerRepository.class.getSimpleName()}, LocaleContextHolder.getLocale())); FileTransformerConfiguration configuration = fileTransformerRepository.getConfiguration(); cacheValue = new FileTransformerConfigurationCacheService.FileTransformerConfigurationCacheValue(transformerSource.getTransformerId(), tenantCode, configuration); @@ -223,17 +223,17 @@ public class FileTransformerServiceImpl implements FileTransformerService { public org.opencdmp.model.file.FileEnvelope exportDmp(UUID dmpId, String repositoryId, String format) throws InvalidAlgorithmParameterException, NoSuchPaddingException, IllegalBlockSizeException, InvalidApplicationException, NoSuchAlgorithmException, BadPaddingException, InvalidKeyException { this.authorizationService.authorize(Permission.EditDmp); //GK: First get the right client - FileTransformerRepository repository = getRepository(repositoryId); - if (repository == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{format, FileTransformerRepository.class.getSimpleName()}, LocaleContextHolder.getLocale())); + FileTransformerRepository repository = this.getRepository(repositoryId); + if (repository == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{format, FileTransformerRepository.class.getSimpleName()}, LocaleContextHolder.getLocale())); //GK: Second get the Target Data Management Plan DmpQuery query = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(dmpId); DmpModel dmpFileTransformerModel = this.builderFactory.builder(DmpCommonModelBuilder.class).useSharedStorage(repository.getConfiguration().isUseSharedStorage()).setRepositoryId(repository.getConfiguration().getFileTransformerId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(query.first()); - if (dmpFileTransformerModel == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{dmpId, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (dmpFileTransformerModel == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{dmpId, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); FileEnvelopeModel fileEnvelope = repository.exportDmp(dmpFileTransformerModel, format); org.opencdmp.model.file.FileEnvelope result = new org.opencdmp.model.file.FileEnvelope(); - byte[] data = repository.getConfiguration().isUseSharedStorage() ? storageFileService.readByFileRefAsBytesSafe(fileEnvelope.getFileRef(), StorageType.Transformer) : fileEnvelope.getFile(); + byte[] data = repository.getConfiguration().isUseSharedStorage() ? this.storageFileService.readByFileRefAsBytesSafe(fileEnvelope.getFileRef(), StorageType.Transformer) : fileEnvelope.getFile(); result.setFile(data); result.setFilename(fileEnvelope.getFilename()); return result; @@ -243,17 +243,17 @@ public class FileTransformerServiceImpl implements FileTransformerService { public org.opencdmp.model.file.FileEnvelope exportDescription(UUID descriptionId, String repositoryId, String format) throws InvalidAlgorithmParameterException, NoSuchPaddingException, IllegalBlockSizeException, InvalidApplicationException, NoSuchAlgorithmException, BadPaddingException, InvalidKeyException { this.authorizationService.authorize(Permission.EditDmp); //GK: First get the right client - FileTransformerRepository repository = getRepository(repositoryId); - if (repository == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{format, FileTransformerRepository.class.getSimpleName()}, LocaleContextHolder.getLocale())); + FileTransformerRepository repository = this.getRepository(repositoryId); + if (repository == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{format, FileTransformerRepository.class.getSimpleName()}, LocaleContextHolder.getLocale())); //GK: Second get the Target Data Management Plan DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(descriptionId); DescriptionModel descriptionFileTransformerModel = this.builderFactory.builder(DescriptionCommonModelBuilder.class).setRepositoryId(repository.getConfiguration().getFileTransformerId()).useSharedStorage(repository.getConfiguration().isUseSharedStorage()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(query.first()); - if (descriptionFileTransformerModel == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{descriptionId, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (descriptionFileTransformerModel == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{descriptionId, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); FileEnvelopeModel fileEnvelope = repository.exportDescription(descriptionFileTransformerModel, format); org.opencdmp.model.file.FileEnvelope result = new org.opencdmp.model.file.FileEnvelope(); - byte[] data = repository.getConfiguration().isUseSharedStorage() ? storageFileService.readByFileRefAsBytesSafe(fileEnvelope.getFileRef(), StorageType.Transformer) : fileEnvelope.getFile(); //TODO: shared storage should be per repository + byte[] data = repository.getConfiguration().isUseSharedStorage() ? this.storageFileService.readByFileRefAsBytesSafe(fileEnvelope.getFileRef(), StorageType.Transformer) : fileEnvelope.getFile(); //TODO: shared storage should be per repository result.setFile(data); result.setFilename(fileEnvelope.getFilename()); return result; diff --git a/dmp-frontend/src/app/core/services/dmp/dmp.service.ts b/dmp-frontend/src/app/core/services/dmp/dmp.service.ts index e195c7532..f0cc30820 100644 --- a/dmp-frontend/src/app/core/services/dmp/dmp.service.ts +++ b/dmp-frontend/src/app/core/services/dmp/dmp.service.ts @@ -173,10 +173,6 @@ export class DmpService { return this.httpClient.get(`${this.apiBase}/${id}/export/${format}`, { responseType: 'blob', observe: 'response', headers: this.headers }); } - public downloadPDF(id: string): Observable> { - let headerPdf: HttpHeaders = this.headers.set('Content-Type', 'application/pdf') - return this.httpClient.get(`${this.apiBase}/${id}/export/Pdf`, { responseType: 'blob', observe: 'response', headers: headerPdf }); - } // public downloadJson(id: string): Observable> { // return this.httpClient.get(this.actionUrl + 'rda/' + id, { responseType: 'blob', observe: 'response' }); 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 2d38d04dc..3346342c9 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 @@ -9,6 +9,7 @@ import { FileUtils } from '../utilities/file-utils.service'; 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'; @Injectable() export class FileTransformerService extends BaseService { @@ -17,12 +18,21 @@ export class FileTransformerService extends BaseService { private fileTransformerHttpService: FileTransformerHttpService, private matomoService: MatomoService, private fileUtils: FileUtils, + private dmpService: DmpService, private authentication: AuthService, ) { super(); } private _initialized: boolean = false; private _loading: boolean = false; + private xmlExportRepo: RepositoryFileFormat = { + entityTypes: [FileTransformerEntityType.Description, FileTransformerEntityType.Dmp], + format: "xml", + hasLogo: true, + icon: "fa-file-code-o", + repositoryId: "app_xml_export" + } + private _availableFormats: RepositoryFileFormat[] = []; get availableFormats(): RepositoryFileFormat[] { if (!this.authentication.currentAccountIsAuthenticated()){ @@ -49,6 +59,7 @@ export class FileTransformerService extends BaseService { return []; })).subscribe(items => { this._availableFormats = items; + this._availableFormats.push(this.xmlExportRepo) this._loading = false; this._initialized = true; }); @@ -56,18 +67,29 @@ export class FileTransformerService extends BaseService { exportDmp(id: Guid, repositoryId: string, format: string) { this._loading = true; - this.fileTransformerHttpService.exportDmp(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')); - + if (repositoryId == this.xmlExportRepo.repositoryId) { + this.dmpService.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); - this.matomoService.trackDownload('dmps', format, id.toString()); - } - }); + }); + } else { + this.fileTransformerHttpService.exportDmp(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('dmps', format, id.toString()); + } + }); + + } } exportDescription(id: Guid, repositoryId: string, format: string) { diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts index 25f8806ef..1c7c3f324 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts @@ -434,18 +434,6 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { }); } - downloadPDF(id: string) { - this.dmpService.downloadPDF(id) - .pipe(takeUntil(this._destroyed)) - .subscribe(response => { - const blob = new Blob([response.body], { type: 'application/pdf' }); - const filename = this.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); - - FileSaver.saveAs(blob, filename); - this.matomoService.trackDownload('dmps', "pdf", id); - }); - } - downloadJson(id: string) { //TODO: add this // this.dmpService.downloadJson(id)