From 75f466937bec104646a220b8fba80078acac964c Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Thu, 31 Oct 2024 09:35:52 -0400 Subject: [PATCH 01/65] Version creation note column, flag, api --- .../harvard/iq/dataverse/DatasetVersion.java | 13 +++++++ .../harvard/iq/dataverse/api/Datasets.java | 38 +++++++++++++++++++ .../iq/dataverse/settings/FeatureFlags.java | 9 +++++ src/main/webapp/dataset.xhtml | 2 + 4 files changed, 62 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index ac5923b95bf..cd4c3d712c0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -133,10 +133,16 @@ public enum VersionState { private Long versionNumber; private Long minorVersionNumber; + //This is used for the deaccession reason @Size(min=0, max=VERSION_NOTE_MAX_LENGTH) @Column(length = VERSION_NOTE_MAX_LENGTH) private String versionNote; + //This is a plain text, optional reason for the version's creation + @Size(min=0, max=VERSION_NOTE_MAX_LENGTH) + @Column(length = VERSION_NOTE_MAX_LENGTH) + private String creationNote; + /* * @todo versionState should never be null so when we are ready, uncomment * the `nullable = false` below. @@ -2154,4 +2160,11 @@ public void setExternalStatusLabel(String externalStatusLabel) { this.externalStatusLabel = externalStatusLabel; } + public String getCreationNote() { + return creationNote; + } + + public void setCreationNote(String creationNote) { + this.creationNote = creationNote; + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 369a22fe8d7..4bd403bc358 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -5230,5 +5230,43 @@ public Response deleteDatasetType(@Context ContainerRequestContext crc, @PathPar return error(BAD_REQUEST, ex.getMessage()); } } + + @PUT + @AuthRequired + @Path("{id}/versions/{versionId}/creationNote") + public Response addVersionCreationNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, String note, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { + if (!(DS_VERSION_DRAFT.equals(versionId) || DS_VERSION_LATEST.equals(versionId))) { + AuthenticatedUser user = getRequestAuthenticatedUserOrDie(crc); + if (!user.isSuperuser()) { + return forbidden(BundleUtil.getStringFromBundle("datasets.api.addCreationNote.forbidden")); + } + } + return response(req -> { + DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetOrDie(datasetId), uriInfo, headers); + datasetVersion.setCreationNote(note); + execCommand(new UpdateDatasetVersionCommand(datasetVersion.getDataset(), req)); + + return ok("Note added"); + }, getRequestUser(crc)); + } + + @DELETE + @AuthRequired + @Path("{id}/versions/{versionId}/creationNote") + public Response deleteVersionCreationNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { + if (!(DS_VERSION_DRAFT.equals(versionId) || DS_VERSION_LATEST.equals(versionId))) { + AuthenticatedUser user = getRequestAuthenticatedUserOrDie(crc); + if (!user.isSuperuser()) { + return forbidden(BundleUtil.getStringFromBundle("datasets.api.addCreationNote.forbidden")); + } + } + return response(req -> { + DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetOrDie(datasetId), uriInfo, headers); + datasetVersion.setCreationNote(null); + execCommand(new UpdateDatasetVersionCommand(datasetVersion.getDataset(), req)); + + return ok("Note deleted"); + }, getRequestUser(crc)); + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java b/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java index 20632c170e4..6f4592f3143 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java @@ -109,6 +109,15 @@ public enum FeatureFlags { * @since Dataverse 6.4 */ GLOBUS_USE_EXPERIMENTAL_ASYNC_FRAMEWORK("globus-use-experimental-async-framework"), + /** + * This flag adds a note field to input/display a reason explaining why a version was created. + * + * @apiNote Raise flag by setting + * "dataverse.feature.version-creation-note" + * @since Dataverse 6.5 + */ + VERSION_CREATION_NOTE("disable-dataset-thumbnail-autoselect"), + ; final String flag; diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 6de0f00e94e..f8558e3ab91 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -1884,6 +1884,8 @@ + +

#{bundle['dataset.publish.terms.help.tip']}

From 3eda85428d41017678afee0289de8f8bda68c3ba Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Thu, 31 Oct 2024 10:46:04 -0400 Subject: [PATCH 02/65] check for flag in apis --- src/main/java/edu/harvard/iq/dataverse/api/Datasets.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 4bd403bc358..f75f62182f4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -5235,6 +5235,9 @@ public Response deleteDatasetType(@Context ContainerRequestContext crc, @PathPar @AuthRequired @Path("{id}/versions/{versionId}/creationNote") public Response addVersionCreationNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, String note, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { + if(!FeatureFlags.VERSION_CREATION_NOTE.enabled()) { + return notFound(BundleUtil.getStringFromBundle("datasets.api.addCreationNote.notEnabled")); + } if (!(DS_VERSION_DRAFT.equals(versionId) || DS_VERSION_LATEST.equals(versionId))) { AuthenticatedUser user = getRequestAuthenticatedUserOrDie(crc); if (!user.isSuperuser()) { @@ -5254,6 +5257,9 @@ public Response addVersionCreationNote(@Context ContainerRequestContext crc, @Pa @AuthRequired @Path("{id}/versions/{versionId}/creationNote") public Response deleteVersionCreationNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { + if(!FeatureFlags.VERSION_CREATION_NOTE.enabled()) { + return notFound(BundleUtil.getStringFromBundle("datasets.api.addCreationNote.notEnabled")); + } if (!(DS_VERSION_DRAFT.equals(versionId) || DS_VERSION_LATEST.equals(versionId))) { AuthenticatedUser user = getRequestAuthenticatedUserOrDie(crc); if (!user.isSuperuser()) { From 464aad47e2d55456204e4dc3b8e77ad41f575fcd Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Thu, 31 Oct 2024 10:57:07 -0400 Subject: [PATCH 03/65] fix flag string --- .../java/edu/harvard/iq/dataverse/settings/FeatureFlags.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java b/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java index 6f4592f3143..9db46c9bc47 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java @@ -113,10 +113,10 @@ public enum FeatureFlags { * This flag adds a note field to input/display a reason explaining why a version was created. * * @apiNote Raise flag by setting - * "dataverse.feature.version-creation-note" + * "dataverse.feature.enable-version-creation-note" * @since Dataverse 6.5 */ - VERSION_CREATION_NOTE("disable-dataset-thumbnail-autoselect"), + VERSION_CREATION_NOTE("enable-version-creation-note"), ; From 6ae9a529e34622710a8f99d40d6e0adc2f1a83da Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Thu, 31 Oct 2024 15:24:18 -0400 Subject: [PATCH 04/65] basic creationNote in version table --- src/main/java/propertyFiles/Bundle.properties | 4 ++++ src/main/webapp/dataset-versions.xhtml | 7 +++++++ src/main/webapp/dataset.xhtml | 14 ++++++++++++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 149e6a7e828..d608ba23f6d 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2025,6 +2025,7 @@ file.dataFilesTab.button.direct=Direct file.dataFilesTab.versions=Versions file.dataFilesTab.versions.headers.dataset=Dataset Version file.dataFilesTab.versions.headers.summary=Summary +file.dataFilesTab.versions.headers.creationNote=Creation Note file.dataFilesTab.versions.headers.contributors=Contributors file.dataFilesTab.versions.headers.contributors.withheld=Contributor name(s) withheld file.dataFilesTab.versions.headers.published=Published on @@ -2579,6 +2580,9 @@ datasetversion.update.archive.failure=Dataset Version Update succeeded, but the datasetversion.update.success=The published version of your Dataset has been updated. datasetversion.update.archive.success=The published version of your Dataset, and its archival copy, have been updated. dataset.license.custom.blankterms=When selecting Custom Dataset Terms, you must provide some Terms of Use. +dataset.version.creationNote.addEdit=Version Creation Note +dataset.version.creationNote.title=The reason this version was created + #ThemeWidgetFragment.java theme.validateTagline=Tagline must be at most 140 characters. diff --git a/src/main/webapp/dataset-versions.xhtml b/src/main/webapp/dataset-versions.xhtml index fe0758d74f0..5c8680ab3fc 100644 --- a/src/main/webapp/dataset-versions.xhtml +++ b/src/main/webapp/dataset-versions.xhtml @@ -129,6 +129,13 @@ update=":datasetForm" value="#{bundle['file.dataFilesTab.versions.viewDetails.btn']}"> + + + + + + + diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index f8558e3ab91..1a45dd44638 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -102,6 +102,9 @@ + + + @@ -1884,7 +1887,15 @@ - + +
+ + +
@@ -1943,7 +1954,6 @@
-

#{bundle['dataset.rejectMessage']} #{disableReasonField ? '':bundle['dataset.rejectMessageReason']} From 6a52b7c44b07a2b00b8134286819c1f3c16e0a36 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 10:37:12 -0400 Subject: [PATCH 05/65] creationNote dialog --- src/main/java/propertyFiles/Bundle.properties | 7 +++-- src/main/webapp/dataset.xhtml | 27 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index d608ba23f6d..7623a7b5ba0 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2148,6 +2148,11 @@ file.auxfiles.types.NcML=XML from NetCDF/HDF5 (NcML) # Add more types here file.auxfiles.unspecifiedTypes=Other Auxiliary Files +dataset.version.creationNote.addEdit=Version Creation Note +dataset.version.creationNote.title=The reason this version was created +dataset.creationNote.header=Add/Edit a Version Creation Note +dataset.creationNote.tip=Enter the reason this version was created. To learn more about Creation Notes, visit the Creation Notes section of the User Guide. + # dataset-widgets.xhtml dataset.widgets.title=Dataset Thumbnail + Widgets dataset.widgets.notPublished.why.header=Why Use Widgets? @@ -2580,8 +2585,6 @@ datasetversion.update.archive.failure=Dataset Version Update succeeded, but the datasetversion.update.success=The published version of your Dataset has been updated. datasetversion.update.archive.success=The published version of your Dataset, and its archival copy, have been updated. dataset.license.custom.blankterms=When selecting Custom Dataset Terms, you must provide some Terms of Use. -dataset.version.creationNote.addEdit=Version Creation Note -dataset.version.creationNote.title=The reason this version was created #ThemeWidgetFragment.java diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 1a45dd44638..93a06cba5ad 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -1983,6 +1983,33 @@

+ + +

+ + + + +

+
+ + +
+
+ + +
+
+
From 4407cb756a61c52bd6fdb021f1fa8f5a0928f7c4 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 11:55:24 -0400 Subject: [PATCH 06/65] typo on hides --- src/main/webapp/dataset.xhtml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 93a06cba5ad..d1d21bccc5b 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -2001,9 +2001,9 @@
- From 3de69562324e6f8721a2cf3fa1b63dce7434ded0 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 11:58:27 -0400 Subject: [PATCH 07/65] Add separate method/success msg --- src/main/java/edu/harvard/iq/dataverse/DatasetPage.java | 4 ++++ src/main/java/propertyFiles/Bundle.properties | 1 + 2 files changed, 5 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 8522f2733c7..053263051c5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -6737,5 +6737,9 @@ public String getSignpostingLinkHeader() { public boolean isDOI() { return AbstractDOIProvider.DOI_PROTOCOL.equals(dataset.getGlobalId().getProtocol()); } + + public void saveCreationNote() { + JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataset.message.creationNoteSuccess")); + } } diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 7623a7b5ba0..db0f54dbbd5 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -1669,6 +1669,7 @@ dataset.message.createFailure=The dataset could not be created. dataset.message.termsFailure=The dataset terms could not be updated. dataset.message.label.fileAccess=Publicly-accessible storage dataset.message.publicInstall=Files in this dataset may be readable outside Dataverse, restricted and embargoed access are disabled +dataset.message.creationNoteSuccess=Creation note successfully updated. dataset.metadata.publicationDate=Publication Date dataset.metadata.publicationDate.tip=The publication date of a Dataset. dataset.metadata.citationDate=Citation Date From 1e8da09f9d71b850eb4fbf50d2c5cc22a574fc2b Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 12:34:02 -0400 Subject: [PATCH 08/65] add edit in table --- src/main/java/propertyFiles/Bundle.properties | 1 + src/main/webapp/dataset-versions.xhtml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index db0f54dbbd5..1580392c101 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2051,6 +2051,7 @@ file.dataFilesTab.versions.description.firstPublished=This is the first publishe file.dataFilesTab.versions.description.deaccessionedReason=Deaccessioned Reason: file.dataFilesTab.versions.description.beAccessedAt=The dataset can now be accessed at: file.dataFilesTab.versions.viewDetails.btn=View Details +file.dataFilesTab.versions.creationNote.edit.btn=Edit Creation Note file.dataFilesTab.versions.widget.viewMoreInfo=To view more information about the versions of this dataset, and to edit it if this is your dataset, please visit the full version of this dataset at the {2}. file.dataFilesTab.versions.preloadmessage=(Loading versions...) file.previewTab.externalTools.header=Available Previews diff --git a/src/main/webapp/dataset-versions.xhtml b/src/main/webapp/dataset-versions.xhtml index 5c8680ab3fc..7fcbdbb52ca 100644 --- a/src/main/webapp/dataset-versions.xhtml +++ b/src/main/webapp/dataset-versions.xhtml @@ -135,6 +135,9 @@ + From db08d5a0a2f6cf12177f6f5a5946bf28ba70d4c8 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 12:34:13 -0400 Subject: [PATCH 09/65] call save again --- src/main/java/edu/harvard/iq/dataverse/DatasetPage.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 053263051c5..8250f9d628b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -183,7 +183,7 @@ public class DatasetPage implements java.io.Serializable { public enum EditMode { - CREATE, INFO, FILE, METADATA, LICENSE + CREATE, INFO, FILE, METADATA, LICENSE, CREATIONNOTE }; public enum DisplayMode { @@ -4079,8 +4079,9 @@ public String save() { } if (editMode.equals(EditMode.FILE)) { JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataset.message.filesSuccess")); + } if (editMode.equals(EditMode.CREATIONNOTE)) { + JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataset.message.creationNoteSuccess")); } - } else { // must have been a bulk file update or delete: if (bulkFileDeleteInProgress) { @@ -6739,7 +6740,7 @@ public boolean isDOI() { } public void saveCreationNote() { - JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataset.message.creationNoteSuccess")); + this.editMode=EditMode.CREATIONNOTE; } } From f529c51680afe6d4cbd469fc7bbc61ca73546dd2 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 12:43:16 -0400 Subject: [PATCH 10/65] typo --- src/main/java/propertyFiles/Bundle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 1580392c101..c7f0cbdaf83 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2051,7 +2051,7 @@ file.dataFilesTab.versions.description.firstPublished=This is the first publishe file.dataFilesTab.versions.description.deaccessionedReason=Deaccessioned Reason: file.dataFilesTab.versions.description.beAccessedAt=The dataset can now be accessed at: file.dataFilesTab.versions.viewDetails.btn=View Details -file.dataFilesTab.versions.creationNote.edit.btn=Edit Creation Note +file.dataFilesTab.versions.creationNote.btn=Edit Creation Note file.dataFilesTab.versions.widget.viewMoreInfo=To view more information about the versions of this dataset, and to edit it if this is your dataset, please visit the full version of this dataset at the {2}. file.dataFilesTab.versions.preloadmessage=(Loading versions...) file.previewTab.externalTools.header=Available Previews From f6b8a98c377e771d2a947ee8b0aba1d97e219baf Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 12:45:20 -0400 Subject: [PATCH 11/65] really add save --- src/main/java/edu/harvard/iq/dataverse/DatasetPage.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 8250f9d628b..d111dcc3663 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -6741,6 +6741,7 @@ public boolean isDOI() { public void saveCreationNote() { this.editMode=EditMode.CREATIONNOTE; + save(); } } From fbda72ec920039e001dcad7eba7daa76130a066c Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 13:45:01 -0400 Subject: [PATCH 12/65] pass workingVersion, only allow edit when on draft page --- src/main/webapp/dataset-versions.xhtml | 2 +- src/main/webapp/dataset.xhtml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/webapp/dataset-versions.xhtml b/src/main/webapp/dataset-versions.xhtml index 7fcbdbb52ca..aac800e2079 100644 --- a/src/main/webapp/dataset-versions.xhtml +++ b/src/main/webapp/dataset-versions.xhtml @@ -135,7 +135,7 @@ - diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index d1d21bccc5b..c60dda14104 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -984,6 +984,7 @@ + From 13d181557bc4029252822a14d0c266fd7883a55f Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 13:47:14 -0400 Subject: [PATCH 13/65] shorten name --- src/main/java/propertyFiles/Bundle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index c7f0cbdaf83..2498b3bff0e 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2051,7 +2051,7 @@ file.dataFilesTab.versions.description.firstPublished=This is the first publishe file.dataFilesTab.versions.description.deaccessionedReason=Deaccessioned Reason: file.dataFilesTab.versions.description.beAccessedAt=The dataset can now be accessed at: file.dataFilesTab.versions.viewDetails.btn=View Details -file.dataFilesTab.versions.creationNote.btn=Edit Creation Note +file.dataFilesTab.versions.creationNote.btn=Edit Note file.dataFilesTab.versions.widget.viewMoreInfo=To view more information about the versions of this dataset, and to edit it if this is your dataset, please visit the full version of this dataset at the {2}. file.dataFilesTab.versions.preloadmessage=(Loading versions...) file.previewTab.externalTools.header=Available Previews From 41232ac8d439fbc85c538c6ab6adc2d6300a08ca Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 13:47:45 -0400 Subject: [PATCH 14/65] Add div to cause button to be on next line --- src/main/webapp/dataset-versions.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/dataset-versions.xhtml b/src/main/webapp/dataset-versions.xhtml index aac800e2079..b024f23b602 100644 --- a/src/main/webapp/dataset-versions.xhtml +++ b/src/main/webapp/dataset-versions.xhtml @@ -133,7 +133,7 @@ - +
Date: Fri, 1 Nov 2024 14:56:26 -0400 Subject: [PATCH 15/65] add note to json, ddi, datacite --- .../dataverse/api/dto/DatasetVersionDTO.java | 20 ++++++++++--------- .../dataverse/export/ddi/DdiExportUtil.java | 4 ++++ .../pidproviders/doi/XmlMetadataTemplate.java | 8 +++++++- .../iq/dataverse/util/json/JsonPrinter.java | 3 ++- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetVersionDTO.java b/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetVersionDTO.java index 37fe197280b..1d8329b4344 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetVersionDTO.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetVersionDTO.java @@ -47,6 +47,8 @@ public class DatasetVersionDTO { List fileMetadatas; List files; + String creationNote; + public boolean isInReview() { return inReview; } @@ -328,17 +330,17 @@ public List getDatasetFields() { return null; } + public String getCreationNote() { + return creationNote; + } + + public void setCreationNote(String creationNote) { + this.creationNote = creationNote; + } + @Override public String toString() { return "DatasetVersionDTO{" + "archiveNote=" + archiveNote + ", deacessionLink=" + deacessionLink + ", versionNumber=" + versionNumber + ", minorVersionNumber=" + versionMinorNumber + ", id=" + id + ", versionState=" + versionState + ", releaseDate=" + releaseDate + ", lastUpdateTime=" + lastUpdateTime + ", createTime=" + createTime + ", archiveTime=" + archiveTime + ", UNF=" + UNF + ", metadataBlocks=" + metadataBlocks + ", fileMetadatas=" + fileMetadatas + '}'; } - - - - - - - - - + } diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java index f5efc448090..ff775f8b44f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java @@ -377,6 +377,10 @@ private static void writeVersionStatement(XMLStreamWriter xmlw, DatasetVersionDT XmlWriterUtil.writeAttribute(xmlw,"type", datasetVersionDTO.getVersionState().toString()); xmlw.writeCharacters(datasetVersionDTO.getVersionNumber().toString()); xmlw.writeEndElement(); // version + xmlw.writeStartElement("notes"); + xmlw.writeCharacters(datasetVersionDTO.getCreationNote()); + xmlw.writeEndElement(); // version + xmlw.writeEndElement(); // verStmt } diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java index 8199b7d9c9f..0c4296845ba 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java @@ -1367,7 +1367,13 @@ private void writeDescriptions(XMLStreamWriter xmlw, DvObject dvObject, boolean } } - + String creationNote = dv.getCreationNote(); + if(!StringUtils.isBlank(creationNote)) { + attributes.clear(); + attributes.put("descriptionType", "TechnicalInfo"); + descriptionsWritten = XmlWriterUtil.writeOpenTagIfNeeded(xmlw, "descriptions", descriptionsWritten); + XmlWriterUtil.writeFullElementWithAttributes(xmlw, "description", attributes, creationNote); + } } if (descriptionsWritten) { diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 1bdee48b14d..6bd6d90d1c0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -445,7 +445,8 @@ public static JsonObjectBuilder json(DatasetVersion dsv, List anonymized .add("createTime", format(dsv.getCreateTime())) .add("alternativePersistentId", dataset.getAlternativePersistentIdentifier()) .add("publicationDate", dataset.getPublicationDateFormattedYYYYMMDD()) - .add("citationDate", dataset.getCitationDateFormattedYYYYMMDD()); + .add("citationDate", dataset.getCitationDateFormattedYYYYMMDD()) + .add("creationNote", dsv.getCreationNote()); License license = DatasetUtil.getLicense(dsv); if (license != null) { From 49a191a6c612d281a8657ee2f1ae24ece8891fc5 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 15:31:33 -0400 Subject: [PATCH 16/65] add null check --- .../harvard/iq/dataverse/export/ddi/DdiExportUtil.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java index ff775f8b44f..98e7bf58086 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java @@ -377,9 +377,11 @@ private static void writeVersionStatement(XMLStreamWriter xmlw, DatasetVersionDT XmlWriterUtil.writeAttribute(xmlw,"type", datasetVersionDTO.getVersionState().toString()); xmlw.writeCharacters(datasetVersionDTO.getVersionNumber().toString()); xmlw.writeEndElement(); // version - xmlw.writeStartElement("notes"); - xmlw.writeCharacters(datasetVersionDTO.getCreationNote()); - xmlw.writeEndElement(); // version + if (!StringUtils.isBlank(datasetVersionDTO.getCreationNote())) { + xmlw.writeStartElement("notes"); + xmlw.writeCharacters(datasetVersionDTO.getCreationNote()); + xmlw.writeEndElement(); // notes + } xmlw.writeEndElement(); // verStmt } From 95e71421f98dee43e655e9759feb13fbe5a89807 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 15:36:42 -0400 Subject: [PATCH 17/65] fix curate command handling of creation note --- .../command/impl/CuratePublishedDatasetVersionCommand.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java index e6e8279a314..d172fb728e4 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java @@ -72,6 +72,10 @@ public Dataset execute(CommandContext ctxt) throws CommandException { TermsOfUseAndAccess newTerms = newVersion.getTermsOfUseAndAccess(); newTerms.setDatasetVersion(updateVersion); updateVersion.setTermsOfUseAndAccess(newTerms); + + //Creation Note + updateVersion.setCreationNote(newVersion.getCreationNote()); + // Clear unnecessary terms relationships .... newVersion.setTermsOfUseAndAccess(null); oldTerms.setDatasetVersion(null); From 76e13f63946ff1d5c837cd5e5837e9be37c688ca Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 1 Nov 2024 16:21:34 -0400 Subject: [PATCH 18/65] fix update --- src/main/webapp/dataset.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index c60dda14104..9ac54b13416 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -2003,7 +2003,7 @@
+ PF('blockDatasetForm').hide();" action="#{DatasetPage.saveCreationNote()}" update=":datasetForm,:messagePanel"/>
From cd1cbefba605abf9017a083923e4ab4fe902c845 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Wed, 20 Nov 2024 13:53:09 -0500 Subject: [PATCH 24/65] changing api creationNote -> versionNote --- src/main/java/edu/harvard/iq/dataverse/api/Datasets.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 976fe317c31..9c794bed712 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -5233,7 +5233,7 @@ public Response deleteDatasetType(@Context ContainerRequestContext crc, @PathPar @PUT @AuthRequired - @Path("{id}/versions/{versionId}/creationNote") + @Path("{id}/versions/{versionId}/versionNote") public Response addVersionCreationNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, String note, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { if(!FeatureFlags.VERSION_CREATION_NOTE.enabled()) { return notFound(BundleUtil.getStringFromBundle("datasets.api.addCreationNote.notEnabled")); @@ -5255,7 +5255,7 @@ public Response addVersionCreationNote(@Context ContainerRequestContext crc, @Pa @DELETE @AuthRequired - @Path("{id}/versions/{versionId}/creationNote") + @Path("{id}/versions/{versionId}/versionNote") public Response deleteVersionCreationNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { if(!FeatureFlags.VERSION_CREATION_NOTE.enabled()) { return notFound(BundleUtil.getStringFromBundle("datasets.api.addCreationNote.notEnabled")); From 6eef228190fc97ea76cf46005e14a64c22a29c2c Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Wed, 20 Nov 2024 14:47:06 -0500 Subject: [PATCH 25/65] update flyway number before merge --- src/main/resources/db/migration/{V6.4.0.2.sql => V6.4.0.3.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V6.4.0.2.sql => V6.4.0.3.sql} (100%) diff --git a/src/main/resources/db/migration/V6.4.0.2.sql b/src/main/resources/db/migration/V6.4.0.3.sql similarity index 100% rename from src/main/resources/db/migration/V6.4.0.2.sql rename to src/main/resources/db/migration/V6.4.0.3.sql From adc9648010213605978905c8d92705a705f08f78 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 6 Dec 2024 09:04:12 -0500 Subject: [PATCH 26/65] versionN->deaccessionN, creationN->versionN --- .../edu/harvard/iq/dataverse/DatasetPage.java | 24 ++++++------ .../harvard/iq/dataverse/DatasetVersion.java | 37 +++++++++++-------- .../harvard/iq/dataverse/api/Datasets.java | 6 +-- .../CuratePublishedDatasetVersionCommand.java | 2 +- .../pidproviders/doi/XmlMetadataTemplate.java | 2 +- .../iq/dataverse/search/IndexServiceBean.java | 2 +- .../iq/dataverse/util/bagit/OREMap.java | 4 +- .../iq/dataverse/util/json/JsonPrinter.java | 4 +- 8 files changed, 44 insertions(+), 37 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 7f12f69b080..90f9851deb5 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -2117,7 +2117,7 @@ private String init(boolean initFull) { if (workingVersion.isDraft() && canUpdateDataset()) { readOnly = false; } - publishDialogCreationNote = workingVersion.getCreationNote(); + publishDialogCreationNote = workingVersion.getVersionNote(); // This will default to all the files in the version, if the search term // parameter hasn't been specified yet: fileMetadatasSearch = selectFileMetadatasForDisplay(); @@ -2765,7 +2765,7 @@ public String releaseDataset() { if(!dataset.getOwner().isReleased()){ releaseParentDV(); } - workingVersion.setCreationNote(publishDialogCreationNote); + workingVersion.setVersionNote(publishDialogCreationNote); if(publishDatasetPopup()|| publishBothPopup() || !dataset.getLatestVersion().isMinorUpdate()){ return releaseDataset(false); } @@ -2832,31 +2832,31 @@ private DatasetVersion setDatasetVersionDeaccessionReasonAndURL(DatasetVersion d String deacessionReasonDetail = getDeaccessionReasonText() != null ? ( getDeaccessionReasonText()).trim() : ""; switch (deaccessionReasonCode) { case 1: - dvIn.setVersionNote(BundleUtil.getStringFromBundle("file.deaccessionDialog.reason.selectItem.identifiable") ); + dvIn.setDeaccessionNote(BundleUtil.getStringFromBundle("file.deaccessionDialog.reason.selectItem.identifiable") ); break; case 2: - dvIn.setVersionNote(BundleUtil.getStringFromBundle("file.deaccessionDialog.reason.selectItem.beRetracted") ); + dvIn.setDeaccessionNote(BundleUtil.getStringFromBundle("file.deaccessionDialog.reason.selectItem.beRetracted") ); break; case 3: - dvIn.setVersionNote(BundleUtil.getStringFromBundle("file.deaccessionDialog.reason.selectItem.beTransferred") ); + dvIn.setDeaccessionNote(BundleUtil.getStringFromBundle("file.deaccessionDialog.reason.selectItem.beTransferred") ); break; case 4: - dvIn.setVersionNote(BundleUtil.getStringFromBundle("file.deaccessionDialog.reason.selectItem.IRB")); + dvIn.setDeaccessionNote(BundleUtil.getStringFromBundle("file.deaccessionDialog.reason.selectItem.IRB")); break; case 5: - dvIn.setVersionNote(BundleUtil.getStringFromBundle("file.deaccessionDialog.reason.selectItem.legalIssue")); + dvIn.setDeaccessionNote(BundleUtil.getStringFromBundle("file.deaccessionDialog.reason.selectItem.legalIssue")); break; case 6: - dvIn.setVersionNote(BundleUtil.getStringFromBundle("file.deaccessionDialog.reason.selectItem.notValid")); + dvIn.setDeaccessionNote(BundleUtil.getStringFromBundle("file.deaccessionDialog.reason.selectItem.notValid")); break; case 7: break; } if (!deacessionReasonDetail.isEmpty()){ - if (!StringUtil.isEmpty(dvIn.getVersionNote())){ - dvIn.setVersionNote(dvIn.getVersionNote() + " " + deacessionReasonDetail); + if (!StringUtil.isEmpty(dvIn.getDeaccessionNote())){ + dvIn.setDeaccessionNote(dvIn.getDeaccessionNote() + " " + deacessionReasonDetail); } else { - dvIn.setVersionNote(deacessionReasonDetail); + dvIn.setDeaccessionNote(deacessionReasonDetail); } } @@ -6743,7 +6743,7 @@ public boolean isDOI() { public void saveCreationNote() { this.editMode=EditMode.CREATIONNOTE; - publishDialogCreationNote = workingVersion.getCreationNote(); + publishDialogCreationNote = workingVersion.getVersionNote(); save(); } String publishDialogCreationNote = null; diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index cd4c3d712c0..2200a77f6bc 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -111,6 +111,7 @@ public enum VersionState { } public static final int ARCHIVE_NOTE_MAX_LENGTH = 1000; + public static final int DEACCESSION_NOTE_MAX_LENGTH = 1000; public static final int VERSION_NOTE_MAX_LENGTH = 1000; //Archival copies: Status message required components @@ -134,14 +135,14 @@ public enum VersionState { private Long minorVersionNumber; //This is used for the deaccession reason - @Size(min=0, max=VERSION_NOTE_MAX_LENGTH) - @Column(length = VERSION_NOTE_MAX_LENGTH) - private String versionNote; + @Size(min=0, max=DEACCESSION_NOTE_MAX_LENGTH) + @Column(length = DEACCESSION_NOTE_MAX_LENGTH) + private String deaccessionNote; //This is a plain text, optional reason for the version's creation @Size(min=0, max=VERSION_NOTE_MAX_LENGTH) @Column(length = VERSION_NOTE_MAX_LENGTH) - private String creationNote; + private String versionNote; /* * @todo versionState should never be null so when we are ready, uncomment @@ -492,8 +493,8 @@ public void setContributorNames(String contributorNames) { } - public String getVersionNote() { - return versionNote; + public String getDeaccessionNote() { + return deaccessionNote; } public DatasetVersionDifference getDefaultVersionDifference() { @@ -543,12 +544,12 @@ public VersionState getPriorVersionState() { return null; } - public void setVersionNote(String note) { - if (note != null && note.length() > VERSION_NOTE_MAX_LENGTH) { - throw new IllegalArgumentException("Error setting versionNote: String length is greater than maximum (" + VERSION_NOTE_MAX_LENGTH + ")." - + " StudyVersion id=" + id + ", versionNote=" + note); + public void setDeaccessionNote(String note) { + if (note != null && note.length() > DEACCESSION_NOTE_MAX_LENGTH) { + throw new IllegalArgumentException("Error setting deaccessionNote: String length is greater than maximum (" + DEACCESSION_NOTE_MAX_LENGTH + ")." + + " StudyVersion id=" + id + ", deaccessionNote=" + note); } - this.versionNote = note; + this.deaccessionNote = note; } public Long getVersionNumber() { @@ -2160,11 +2161,17 @@ public void setExternalStatusLabel(String externalStatusLabel) { this.externalStatusLabel = externalStatusLabel; } - public String getCreationNote() { - return creationNote; + public String getVersionNote() { + return versionNote; } - public void setCreationNote(String creationNote) { - this.creationNote = creationNote; + public void setVersionNote(String note) { + if (note != null && note.length() > VERSION_NOTE_MAX_LENGTH) { + throw new IllegalArgumentException("Error setting versionNote: String length is greater than maximum (" + VERSION_NOTE_MAX_LENGTH + ")." + + " StudyVersion id=" + id + ", versionNote=" + note); + } + + this.versionNote = note; } } + diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 9c794bed712..04759c20f2b 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -4873,7 +4873,7 @@ public Response deaccessionDataset(@Context ContainerRequestContext crc, @PathPa DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetOrDie(datasetId), uriInfo, headers); try { JsonObject jsonObject = JsonUtil.getJsonObject(jsonBody); - datasetVersion.setVersionNote(jsonObject.getString("deaccessionReason")); + datasetVersion.setDeaccessionNote(jsonObject.getString("deaccessionReason")); String deaccessionForwardURL = jsonObject.getString("deaccessionForwardURL", null); if (deaccessionForwardURL != null) { try { @@ -5246,7 +5246,7 @@ public Response addVersionCreationNote(@Context ContainerRequestContext crc, @Pa } return response(req -> { DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetOrDie(datasetId), uriInfo, headers); - datasetVersion.setCreationNote(note); + datasetVersion.setVersionNote(note); execCommand(new UpdateDatasetVersionCommand(datasetVersion.getDataset(), req)); return ok("Note added"); @@ -5268,7 +5268,7 @@ public Response deleteVersionCreationNote(@Context ContainerRequestContext crc, } return response(req -> { DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetOrDie(datasetId), uriInfo, headers); - datasetVersion.setCreationNote(null); + datasetVersion.setVersionNote(null); execCommand(new UpdateDatasetVersionCommand(datasetVersion.getDataset(), req)); return ok("Note deleted"); diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java index d172fb728e4..5ef5f388749 100644 --- a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CuratePublishedDatasetVersionCommand.java @@ -74,7 +74,7 @@ public Dataset execute(CommandContext ctxt) throws CommandException { updateVersion.setTermsOfUseAndAccess(newTerms); //Creation Note - updateVersion.setCreationNote(newVersion.getCreationNote()); + updateVersion.setVersionNote(newVersion.getVersionNote()); // Clear unnecessary terms relationships .... newVersion.setTermsOfUseAndAccess(null); diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java index 0c4296845ba..f86d055058c 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java @@ -1367,7 +1367,7 @@ private void writeDescriptions(XMLStreamWriter xmlw, DvObject dvObject, boolean } } - String creationNote = dv.getCreationNote(); + String creationNote = dv.getVersionNote(); if(!StringUtils.isBlank(creationNote)) { attributes.clear(); attributes.put("descriptionType", "TechnicalInfo"); diff --git a/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java index d0dcf3461cf..a65700fdad7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java @@ -1291,7 +1291,7 @@ public SolrInputDocuments toSolrDocs(IndexableDataset indexableDataset, Set anonymized .add("versionMinorNumber", dsv.getMinorVersionNumber()) .add("versionState", dsv.getVersionState().name()) .add("latestVersionPublishingState", dataset.getLatestVersion().getVersionState().name()) - .add("versionNote", dsv.getVersionNote()) + .add("versionNote", dsv.getDeaccessionNote()) .add("archiveNote", dsv.getArchiveNote()) .add("deaccessionLink", dsv.getDeaccessionLink()) .add("distributionDate", dsv.getDistributionDate()) @@ -448,7 +448,7 @@ public static JsonObjectBuilder json(DatasetVersion dsv, List anonymized .add("alternativePersistentId", dataset.getAlternativePersistentIdentifier()) .add("publicationDate", dataset.getPublicationDateFormattedYYYYMMDD()) .add("citationDate", dataset.getCitationDateFormattedYYYYMMDD()) - .add("creationNote", dsv.getCreationNote()); + .add("creationNote", dsv.getVersionNote()); License license = DatasetUtil.getLicense(dsv); if (license != null) { From d5704c51bd6be5d8788eb062c0f916893a547568 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 6 Dec 2024 09:48:21 -0500 Subject: [PATCH 27/65] update deaccession validator --- ...tor.java => DatasetDeaccessionNoteValidator.java} | 12 ++++++------ ...VersionNote.java => ValidateDeaccessionNote.java} | 0 2 files changed, 6 insertions(+), 6 deletions(-) rename src/main/java/edu/harvard/iq/dataverse/{DatasetVersionNoteValidator.java => DatasetDeaccessionNoteValidator.java} (76%) rename src/main/java/edu/harvard/iq/dataverse/{ValidateVersionNote.java => ValidateDeaccessionNote.java} (100%) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionNoteValidator.java b/src/main/java/edu/harvard/iq/dataverse/DatasetDeaccessionNoteValidator.java similarity index 76% rename from src/main/java/edu/harvard/iq/dataverse/DatasetVersionNoteValidator.java rename to src/main/java/edu/harvard/iq/dataverse/DatasetDeaccessionNoteValidator.java index a5ea487a68f..7c6263fe9b9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionNoteValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetDeaccessionNoteValidator.java @@ -13,28 +13,28 @@ * * @author skraffmi */ -public class DatasetVersionNoteValidator implements ConstraintValidator { +public class DatasetDeaccessionNoteValidator implements ConstraintValidator { private String versionState; - private String versionNote; + private String deaccessionNote; @Override - public void initialize(ValidateVersionNote constraintAnnotation) { + public void initialize(ValidateDeaccessionNote constraintAnnotation) { versionState = constraintAnnotation.versionState(); - versionNote = constraintAnnotation.versionNote(); + deaccessionNote = constraintAnnotation.deaccessionNote(); } @Override public boolean isValid(DatasetVersion value, ConstraintValidatorContext context) { - if (versionState.equals(DatasetVersion.VersionState.DEACCESSIONED) && versionNote.isEmpty()){ + if (versionState.equals(DatasetVersion.VersionState.DEACCESSIONED) && deaccessionNote.isEmpty()){ if (context != null) { context.buildConstraintViolationWithTemplate(value + " " + BundleUtil.getStringFromBundle("file.deaccessionDialog.dialog.textForReason.error")).addConstraintViolation(); } return false; } - if (versionState.equals(DatasetVersion.VersionState.DEACCESSIONED) && versionNote.length() > DatasetVersion.VERSION_NOTE_MAX_LENGTH){ + if (versionState.equals(DatasetVersion.VersionState.DEACCESSIONED) && deaccessionNote.length() > DatasetVersion.VERSION_NOTE_MAX_LENGTH){ if (context != null) { context.buildConstraintViolationWithTemplate(value + " " + BundleUtil.getStringFromBundle("file.deaccessionDialog.dialog.limitChar.error")).addConstraintViolation(); } diff --git a/src/main/java/edu/harvard/iq/dataverse/ValidateVersionNote.java b/src/main/java/edu/harvard/iq/dataverse/ValidateDeaccessionNote.java similarity index 100% rename from src/main/java/edu/harvard/iq/dataverse/ValidateVersionNote.java rename to src/main/java/edu/harvard/iq/dataverse/ValidateDeaccessionNote.java From c6fec23f698a0d03f831fd82c366942267c81862 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 6 Dec 2024 09:49:35 -0500 Subject: [PATCH 28/65] remove unused method --- .../dataverse/DatasetVersionServiceBean.java | 36 ------------------- 1 file changed, 36 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java index 762319884b9..7e9b778c6f3 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersionServiceBean.java @@ -1060,42 +1060,6 @@ public boolean doesChecksumExistInDatasetVersion(DatasetVersion datasetVersion, } - public List> getBasicDatasetVersionInfo(Dataset dataset){ - - if (dataset == null){ - throw new NullPointerException("dataset cannot be null"); - } - - String query = "SELECT id, dataset_id, releasetime, versionnumber," - + " minorversionnumber, versionstate, versionnote" - + " FROM datasetversion" - + " WHERE dataset_id = " + dataset.getId() - + " ORDER BY versionnumber DESC," - + " minorversionnumber DESC," - + " versionstate;"; - msg("query: " + query); - Query nativeQuery = em.createNativeQuery(query); - List datasetVersionInfoList = nativeQuery.getResultList(); - - List> hashList = new ArrayList<>(); - - HashMap mMap = new HashMap<>(); - for (Object[] dvInfo : datasetVersionInfoList) { - mMap = new HashMap<>(); - mMap.put("datasetVersionId", dvInfo[0]); - mMap.put("datasetId", dvInfo[1]); - mMap.put("releaseTime", dvInfo[2]); - mMap.put("versionnumber", dvInfo[3]); - mMap.put("minorversionnumber", dvInfo[4]); - mMap.put("versionstate", dvInfo[5]); - mMap.put("versionnote", dvInfo[6]); - hashList.add(mMap); - } - return hashList; - } // end getBasicDatasetVersionInfo - - - public HashMap getFileMetadataHistory(DataFile df){ if (df == null){ From 8c519480be415a1a385e5845ec8bff8991f4413b Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 6 Dec 2024 09:49:58 -0500 Subject: [PATCH 29/65] creationNote->versionNote changes --- .../edu/harvard/iq/dataverse/DatasetPage.java | 28 ++++++++--------- .../harvard/iq/dataverse/DatasetVersion.java | 2 +- .../iq/dataverse/ValidateDeaccessionNote.java | 8 ++--- .../harvard/iq/dataverse/api/Datasets.java | 14 ++++----- .../dataverse/api/dto/DatasetVersionDTO.java | 10 +++---- .../dataverse/export/ddi/DdiExportUtil.java | 4 +-- .../pidproviders/doi/XmlMetadataTemplate.java | 6 ++-- .../iq/dataverse/util/bagit/OREMap.java | 4 +-- .../iq/dataverse/util/json/JsonParser.java | 2 ++ .../iq/dataverse/util/json/JsonPrinter.java | 4 +-- src/main/java/propertyFiles/Bundle.properties | 14 ++++----- src/main/webapp/dataset-versions.xhtml | 18 +++++------ src/main/webapp/dataset.xhtml | 30 +++++++++---------- src/main/webapp/file-versions.xhtml | 2 +- src/main/webapp/file.xhtml | 2 +- 15 files changed, 75 insertions(+), 73 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 90f9851deb5..25906dda487 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -183,7 +183,7 @@ public class DatasetPage implements java.io.Serializable { public enum EditMode { - CREATE, INFO, FILE, METADATA, LICENSE, CREATIONNOTE + CREATE, INFO, FILE, METADATA, LICENSE, VERSIONNOTE }; public enum DisplayMode { @@ -2117,7 +2117,7 @@ private String init(boolean initFull) { if (workingVersion.isDraft() && canUpdateDataset()) { readOnly = false; } - publishDialogCreationNote = workingVersion.getVersionNote(); + publishDialogVersionNote = workingVersion.getVersionNote(); // This will default to all the files in the version, if the search term // parameter hasn't been specified yet: fileMetadatasSearch = selectFileMetadatasForDisplay(); @@ -2765,7 +2765,7 @@ public String releaseDataset() { if(!dataset.getOwner().isReleased()){ releaseParentDV(); } - workingVersion.setVersionNote(publishDialogCreationNote); + workingVersion.setVersionNote(publishDialogVersionNote); if(publishDatasetPopup()|| publishBothPopup() || !dataset.getLatestVersion().isMinorUpdate()){ return releaseDataset(false); } @@ -4081,8 +4081,8 @@ public String save() { } if (editMode.equals(EditMode.FILE)) { JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataset.message.filesSuccess")); - } if (editMode.equals(EditMode.CREATIONNOTE)) { - JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataset.message.creationNoteSuccess")); + } if (editMode.equals(EditMode.VERSIONNOTE)) { + JsfHelper.addSuccessMessage(BundleUtil.getStringFromBundle("dataset.message.versionNoteSuccess")); } } else { // must have been a bulk file update or delete: @@ -6741,20 +6741,20 @@ public boolean isDOI() { return AbstractDOIProvider.DOI_PROTOCOL.equals(dataset.getGlobalId().getProtocol()); } - public void saveCreationNote() { - this.editMode=EditMode.CREATIONNOTE; - publishDialogCreationNote = workingVersion.getVersionNote(); + public void saveVersionNote() { + this.editMode=EditMode.VERSIONNOTE; + publishDialogVersionNote = workingVersion.getVersionNote(); save(); } - String publishDialogCreationNote = null; + String publishDialogVersionNote = null; - // Make separate property for creationNote - can't have two p:dialogs changing the same property - public String getPublishDialogCreationNote() { - return publishDialogCreationNote; + // Make separate property for versionNote - can't have two p:dialogs changing the same property + public String getPublishDialogVersionNote() { + return publishDialogVersionNote; } - public void setPublishDialogCreationNote(String note) { - publishDialogCreationNote =note; + public void setPublishDialogVersionNote(String note) { + publishDialogVersionNote =note; } } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index 2200a77f6bc..3d9578b6db2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -80,7 +80,7 @@ @Entity @Table(indexes = {@Index(columnList="dataset_id")}, uniqueConstraints = @UniqueConstraint(columnNames = {"dataset_id,versionnumber,minorversionnumber"})) -@ValidateVersionNote(versionNote = "versionNote", versionState = "versionState") +@ValidateDeaccessionNote(deaccessionNote = "deaccessionNote", versionState = "versionState") public class DatasetVersion implements Serializable { private static final Logger logger = Logger.getLogger(DatasetVersion.class.getCanonicalName()); diff --git a/src/main/java/edu/harvard/iq/dataverse/ValidateDeaccessionNote.java b/src/main/java/edu/harvard/iq/dataverse/ValidateDeaccessionNote.java index c8d64d4a642..d6bf2b857d6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/ValidateDeaccessionNote.java +++ b/src/main/java/edu/harvard/iq/dataverse/ValidateDeaccessionNote.java @@ -22,17 +22,17 @@ @Target({TYPE, ANNOTATION_TYPE}) @Retention(RUNTIME) -@Constraint(validatedBy = {DatasetVersionNoteValidator.class}) +@Constraint(validatedBy = {DatasetDeaccessionNoteValidator.class}) @Documented -public @interface ValidateVersionNote { +public @interface ValidateDeaccessionNote { - String message() default "Failed Validation for DatasetVersionNote"; + String message() default "Failed Validation for DatasetsDeaccessionNote"; Class[] groups() default {}; Class[] payload() default {}; - String versionNote(); + String deaccessionNote(); String versionState(); diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 04759c20f2b..febc05ec2ec 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -5234,14 +5234,14 @@ public Response deleteDatasetType(@Context ContainerRequestContext crc, @PathPar @PUT @AuthRequired @Path("{id}/versions/{versionId}/versionNote") - public Response addVersionCreationNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, String note, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { + public Response addVersionNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, String note, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { if(!FeatureFlags.VERSION_CREATION_NOTE.enabled()) { - return notFound(BundleUtil.getStringFromBundle("datasets.api.addCreationNote.notEnabled")); + return notFound(BundleUtil.getStringFromBundle("datasets.api.addVersionNote.notEnabled")); } if (!DS_VERSION_DRAFT.equals(versionId)) { AuthenticatedUser user = getRequestAuthenticatedUserOrDie(crc); if (!user.isSuperuser()) { - return forbidden(BundleUtil.getStringFromBundle("datasets.api.addCreationNote.forbidden")); + return forbidden(BundleUtil.getStringFromBundle("datasets.api.addVersionNote.forbidden")); } } return response(req -> { @@ -5256,14 +5256,14 @@ public Response addVersionCreationNote(@Context ContainerRequestContext crc, @Pa @DELETE @AuthRequired @Path("{id}/versions/{versionId}/versionNote") - public Response deleteVersionCreationNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { - if(!FeatureFlags.VERSION_CREATION_NOTE.enabled()) { - return notFound(BundleUtil.getStringFromBundle("datasets.api.addCreationNote.notEnabled")); + public Response deleteVersionNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { + if(!FeatureFlags.VERSION_NOTE.enabled()) { + return notFound(BundleUtil.getStringFromBundle("datasets.api.addVersionNote.notEnabled")); } if (!DS_VERSION_DRAFT.equals(versionId)) { AuthenticatedUser user = getRequestAuthenticatedUserOrDie(crc); if (!user.isSuperuser()) { - return forbidden(BundleUtil.getStringFromBundle("datasets.api.addCreationNote.forbidden")); + return forbidden(BundleUtil.getStringFromBundle("datasets.api.addVersionNote.forbidden")); } } return response(req -> { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetVersionDTO.java b/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetVersionDTO.java index 1d8329b4344..236e43b9380 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetVersionDTO.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetVersionDTO.java @@ -47,7 +47,7 @@ public class DatasetVersionDTO { List fileMetadatas; List files; - String creationNote; + String versionNote; public boolean isInReview() { return inReview; @@ -330,12 +330,12 @@ public List getDatasetFields() { return null; } - public String getCreationNote() { - return creationNote; + public String getVersionNote() { + return versionNote; } - public void setCreationNote(String creationNote) { - this.creationNote = creationNote; + public void setVersionNote(String versionNote) { + this.versionNote = versionNote; } @Override diff --git a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java index 33777f2e04d..816a3fdda25 100644 --- a/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/export/ddi/DdiExportUtil.java @@ -379,9 +379,9 @@ private static void writeVersionStatement(XMLStreamWriter xmlw, DatasetVersionDT XmlWriterUtil.writeAttribute(xmlw,"type", datasetVersionDTO.getVersionState().toString()); xmlw.writeCharacters(datasetVersionDTO.getVersionNumber().toString()); xmlw.writeEndElement(); // version - if (!StringUtils.isBlank(datasetVersionDTO.getCreationNote())) { + if (!StringUtils.isBlank(datasetVersionDTO.getVersionNote())) { xmlw.writeStartElement("notes"); - xmlw.writeCharacters(datasetVersionDTO.getCreationNote()); + xmlw.writeCharacters(datasetVersionDTO.getVersionNote()); xmlw.writeEndElement(); // notes } diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java index f86d055058c..40bd79f78dd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/doi/XmlMetadataTemplate.java @@ -1367,12 +1367,12 @@ private void writeDescriptions(XMLStreamWriter xmlw, DvObject dvObject, boolean } } - String creationNote = dv.getVersionNote(); - if(!StringUtils.isBlank(creationNote)) { + String versionNote = dv.getVersionNote(); + if(!StringUtils.isBlank(versionNote)) { attributes.clear(); attributes.put("descriptionType", "TechnicalInfo"); descriptionsWritten = XmlWriterUtil.writeOpenTagIfNeeded(xmlw, "descriptions", descriptionsWritten); - XmlWriterUtil.writeFullElementWithAttributes(xmlw, "description", attributes, creationNote); + XmlWriterUtil.writeFullElementWithAttributes(xmlw, "description", attributes, versionNote); } } diff --git a/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java b/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java index c4ca475efee..e9c07a3726a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java @@ -50,7 +50,7 @@ public class OREMap { //NOTE: Update this value whenever the output of this class is changed private static final String DATAVERSE_ORE_FORMAT_VERSION = "Dataverse OREMap Format v1.0.1"; - //v1.0.1 - added version creationNote + //v1.0.1 - added versionNote private static final String DATAVERSE_SOFTWARE_NAME = "Dataverse"; private static final String DATAVERSE_SOFTWARE_URL = "https://github.com/iqss/dataverse"; @@ -123,7 +123,7 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { .add(JsonLDTerm.schemaOrg("name").getLabel(), version.getTitle()) .add(JsonLDTerm.schemaOrg("dateModified").getLabel(), version.getLastUpdateTime().toString()); addIfNotNull(aggBuilder, JsonLDTerm.schemaOrg("datePublished"), dataset.getPublicationDateFormattedYYYYMMDD()); - addIfNotNull(aggBuilder, JsonLDTerm.DVCore("creationReason"), version.getVersionNote()); + addIfNotNull(aggBuilder, JsonLDTerm.DVCore("versionNote"), version.getVersionNote()); //Add version state info - DRAFT, RELEASED, DEACCESSIONED, ARCHIVED with extra info for DEACCESIONED VersionState vs = version.getVersionState(); diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java index 8552389525d..2bb6971a391 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java @@ -402,6 +402,8 @@ public DatasetVersion parseDatasetVersion(JsonObject obj, DatasetVersion dsv) th } dsv.setDeaccessionLink(obj.getString("deaccessionLink", null)); + dsv.setDeaccessionNote(obj.getString("deaccessionNote", null)); + dsv.setVersionNote(obj.getString("versionNote", null)); int versionNumberInt = obj.getInt("versionNumber", -1); Long versionNumber = null; if (versionNumberInt !=-1) { diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 8b063cedd0d..635ed09a589 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -436,7 +436,7 @@ public static JsonObjectBuilder json(DatasetVersion dsv, List anonymized .add("versionMinorNumber", dsv.getMinorVersionNumber()) .add("versionState", dsv.getVersionState().name()) .add("latestVersionPublishingState", dataset.getLatestVersion().getVersionState().name()) - .add("versionNote", dsv.getDeaccessionNote()) + .add("deaccessionNote", dsv.getDeaccessionNote()) .add("archiveNote", dsv.getArchiveNote()) .add("deaccessionLink", dsv.getDeaccessionLink()) .add("distributionDate", dsv.getDistributionDate()) @@ -448,7 +448,7 @@ public static JsonObjectBuilder json(DatasetVersion dsv, List anonymized .add("alternativePersistentId", dataset.getAlternativePersistentIdentifier()) .add("publicationDate", dataset.getPublicationDateFormattedYYYYMMDD()) .add("citationDate", dataset.getCitationDateFormattedYYYYMMDD()) - .add("creationNote", dsv.getVersionNote()); + .add("versionNote", dsv.getVersionNote()); License license = DatasetUtil.getLicense(dsv); if (license != null) { diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index c457c90a209..84815c183a6 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -1669,7 +1669,7 @@ dataset.message.createFailure=The dataset could not be created. dataset.message.termsFailure=The dataset terms could not be updated. dataset.message.label.fileAccess=Publicly-accessible storage dataset.message.publicInstall=Files in this dataset may be readable outside Dataverse, restricted and embargoed access are disabled -dataset.message.creationNoteSuccess=Version note successfully updated. +dataset.message.versionNoteSuccess=Version note successfully updated. dataset.metadata.publicationDate=Publication Date dataset.metadata.publicationDate.tip=The publication date of a Dataset. dataset.metadata.citationDate=Citation Date @@ -2026,7 +2026,7 @@ file.dataFilesTab.button.direct=Direct file.dataFilesTab.versions=Versions file.dataFilesTab.versions.headers.dataset=Dataset Version file.dataFilesTab.versions.headers.summary=Summary -file.dataFilesTab.versions.headers.creationNote=Version Note +file.dataFilesTab.versions.headers.versionNote=Version Note file.dataFilesTab.versions.headers.contributors=Contributors file.dataFilesTab.versions.headers.contributors.withheld=Contributor name(s) withheld file.dataFilesTab.versions.headers.published=Published on @@ -2051,7 +2051,7 @@ file.dataFilesTab.versions.description.firstPublished=This is the first publishe file.dataFilesTab.versions.description.deaccessionedReason=Deaccessioned Reason: file.dataFilesTab.versions.description.beAccessedAt=The dataset can now be accessed at: file.dataFilesTab.versions.viewDetails.btn=View Details -file.dataFilesTab.versions.creationNote.btn=Edit Note +file.dataFilesTab.versions.versionNote.btn=Edit Note file.dataFilesTab.versions.widget.viewMoreInfo=To view more information about the versions of this dataset, and to edit it if this is your dataset, please visit the full version of this dataset at the {2}. file.dataFilesTab.versions.preloadmessage=(Loading versions...) file.previewTab.externalTools.header=Available Previews @@ -2150,10 +2150,10 @@ file.auxfiles.types.NcML=XML from NetCDF/HDF5 (NcML) # Add more types here file.auxfiles.unspecifiedTypes=Other Auxiliary Files -dataset.version.creationNote.addEdit=Version Note -dataset.version.creationNote.title=The reason this version was created -dataset.creationNote.header=Add/Edit a Version Note -dataset.creationNote.tip=Enter the reason this version was created. To learn more about Version Notes, visit the Version Notes section of the User Guide. +dataset.version.versionNote.addEdit=Version Note +dataset.version.versionNote.title=The reason this version was created +dataset.versionNote.header=Add/Edit a Version Note +dataset.versionNote.tip=Enter the reason this version was created. To learn more about Version Notes, visit the Version Notes section of the User Guide. # dataset-widgets.xhtml dataset.widgets.title=Dataset Thumbnail + Widgets diff --git a/src/main/webapp/dataset-versions.xhtml b/src/main/webapp/dataset-versions.xhtml index b024f23b602..9da74c4347f 100644 --- a/src/main/webapp/dataset-versions.xhtml +++ b/src/main/webapp/dataset-versions.xhtml @@ -120,7 +120,7 @@ #{bundle['file.dataFilesTab.versions.description.firstPublished']} - #{bundle['file.dataFilesTab.versions.description.deaccessionedReason']} #{versionTab.versionNote} #{bundle['file.dataFilesTab.versions.description.beAccessedAt']} #{versionTab.archiveNote} + #{bundle['file.dataFilesTab.versions.description.deaccessionedReason']} #{versionTab.deaccessionNote} #{bundle['file.dataFilesTab.versions.description.beAccessedAt']} #{versionTab.archiveNote}
- - - -
+ + + +
- -
+ +
diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 97c96572932..a76dbd431ab 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -103,7 +103,7 @@ - + @@ -629,7 +629,7 @@
#{bundle['dataset.deaccession.reason']}
-

#{DatasetPage.workingVersion.versionNote}

+

#{DatasetPage.workingVersion.deaccessionNote}

#{bundle['dataset.beAccessedAt']} #{DatasetPage.workingVersion.archiveNote}

@@ -1888,12 +1888,12 @@ - +
-
@@ -1984,27 +1984,27 @@
- - + +

- +

-
- diff --git a/src/main/webapp/file-versions.xhtml b/src/main/webapp/file-versions.xhtml index f7f259ce2e0..fd457e137c2 100644 --- a/src/main/webapp/file-versions.xhtml +++ b/src/main/webapp/file-versions.xhtml @@ -126,7 +126,7 @@ + value="#{bundle['file.dataFilesTab.versions.description.deaccessionedReason']} #{versionTab.datasetVersion.deaccessionNote}" escape="false"/> diff --git a/src/main/webapp/file.xhtml b/src/main/webapp/file.xhtml index 835764d9cf5..3ab46c81450 100644 --- a/src/main/webapp/file.xhtml +++ b/src/main/webapp/file.xhtml @@ -326,7 +326,7 @@
#{bundle['dataset.deaccession.reason']}
-

#{FilePage.fileMetadata.datasetVersion.versionNote}

+

#{FilePage.fileMetadata.datasetVersion.deaccessionNote}

#{bundle['dataset.beAccessedAt']} #{FilePage.fileMetadata.datasetVersion.archiveNote}

From a54a6fe0ed84a47d11705c738f076348e1749ac8 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 6 Dec 2024 10:52:20 -0500 Subject: [PATCH 30/65] merge archiveNote->deaccesionLink, handle non-URL vals --- .../edu/harvard/iq/dataverse/DatasetPage.java | 2 +- .../harvard/iq/dataverse/DatasetVersion.java | 34 +++++++------------ .../harvard/iq/dataverse/api/Datasets.java | 2 +- .../dataverse/api/dto/DatasetVersionDTO.java | 11 +----- .../iq/dataverse/util/bagit/OREMap.java | 2 +- .../iq/dataverse/util/json/JsonParser.java | 5 --- .../iq/dataverse/util/json/JsonPrinter.java | 1 - .../iq/dataverse/validation/URLValidator.java | 1 + .../iq/dataverse/validation/ValidateURL.java | 1 + src/main/webapp/dataset-versions.xhtml | 6 +++- src/main/webapp/dataset.xhtml | 7 ++-- src/main/webapp/file.xhtml | 8 +++-- 12 files changed, 34 insertions(+), 46 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 25906dda487..42fd447a840 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -2860,7 +2860,7 @@ private DatasetVersion setDatasetVersionDeaccessionReasonAndURL(DatasetVersion d } } - dvIn.setArchiveNote(getDeaccessionForwardURLFor()); + dvIn.setDeaccessionLink(getDeaccessionForwardURLFor()); return dvIn; } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index 3d9578b6db2..17745bc02d2 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -17,6 +17,10 @@ import edu.harvard.iq.dataverse.util.json.NullSafeJsonBuilder; import edu.harvard.iq.dataverse.workflows.WorkflowComment; import java.io.Serializable; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -110,7 +114,6 @@ public enum VersionState { DRAFT, RELEASED, ARCHIVED, DEACCESSIONED } - public static final int ARCHIVE_NOTE_MAX_LENGTH = 1000; public static final int DEACCESSION_NOTE_MAX_LENGTH = 1000; public static final int VERSION_NOTE_MAX_LENGTH = 1000; @@ -180,12 +183,6 @@ public enum VersionState { @Temporal(value = TemporalType.TIMESTAMP) private Date archiveTime; - @Size(min=0, max=ARCHIVE_NOTE_MAX_LENGTH) - @Column(length = ARCHIVE_NOTE_MAX_LENGTH) - //@ValidateURL() - this validation rule was making a bunch of older legacy datasets invalid; - // removed pending further investigation (v4.13) - private String archiveNote; - // Originally a simple string indicating the location of the archival copy. As // of v5.12, repurposed to provide a more general json archival status (failure, // pending, success) and message (serialized as a string). The archival copy @@ -364,19 +361,6 @@ public void setArchiveTime(Date archiveTime) { this.archiveTime = archiveTime; } - public String getArchiveNote() { - return archiveNote; - } - - public void setArchiveNote(String note) { - // @todo should this be using bean validation for trsting note length? - if (note != null && note.length() > ARCHIVE_NOTE_MAX_LENGTH) { - throw new IllegalArgumentException("Error setting archiveNote: String length is greater than maximum (" + ARCHIVE_NOTE_MAX_LENGTH + ")." - + " StudyVersion id=" + id + ", archiveNote=" + note); - } - this.archiveNote = note; - } - public String getArchivalCopyLocation() { return archivalCopyLocation; } @@ -423,8 +407,14 @@ public void setDeaccessionLink(String deaccessionLink) { this.deaccessionLink = deaccessionLink; } - public GlobalId getDeaccessionLinkAsGlobalId() { - return PidUtil.parseAsGlobalID(deaccessionLink); + public String getDeaccessionLinkAsURLString() { + String dLink = null; + try { + dLink = new URI(deaccessionLink).toURL().toExternalForm(); + } catch (URISyntaxException | MalformedURLException e) { + logger.fine("Invalid deaccessionLink - not a URL: " + deaccessionLink); + } + return dLink; } public Date getCreateTime() { diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index febc05ec2ec..a62602f4006 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -4877,7 +4877,7 @@ public Response deaccessionDataset(@Context ContainerRequestContext crc, @PathPa String deaccessionForwardURL = jsonObject.getString("deaccessionForwardURL", null); if (deaccessionForwardURL != null) { try { - datasetVersion.setArchiveNote(deaccessionForwardURL); + datasetVersion.setDeaccessionLink(deaccessionForwardURL); } catch (IllegalArgumentException iae) { return badRequest(BundleUtil.getStringFromBundle("datasets.api.deaccessionDataset.invalid.forward.url", List.of(iae.getMessage()))); } diff --git a/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetVersionDTO.java b/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetVersionDTO.java index 236e43b9380..1bc080b8858 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetVersionDTO.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/dto/DatasetVersionDTO.java @@ -10,7 +10,6 @@ * @author ellenk */ public class DatasetVersionDTO { - String archiveNote; String deacessionLink; // FIXME: Change to versionNumberMajor and versionNumberMinor? Some partial renaming of "minor" was done. Long versionNumber; @@ -217,14 +216,6 @@ public void setFiles(List files) { this.files = files; } - public String getArchiveNote() { - return archiveNote; - } - - public void setArchiveNote(String archiveNote) { - this.archiveNote = archiveNote; - } - public String getDeacessionLink() { return deacessionLink; } @@ -340,7 +331,7 @@ public void setVersionNote(String versionNote) { @Override public String toString() { - return "DatasetVersionDTO{" + "archiveNote=" + archiveNote + ", deacessionLink=" + deacessionLink + ", versionNumber=" + versionNumber + ", minorVersionNumber=" + versionMinorNumber + ", id=" + id + ", versionState=" + versionState + ", releaseDate=" + releaseDate + ", lastUpdateTime=" + lastUpdateTime + ", createTime=" + createTime + ", archiveTime=" + archiveTime + ", UNF=" + UNF + ", metadataBlocks=" + metadataBlocks + ", fileMetadatas=" + fileMetadatas + '}'; + return "DatasetVersionDTO{deacessionLink=" + deacessionLink + ", versionNumber=" + versionNumber + ", minorVersionNumber=" + versionMinorNumber + ", id=" + id + ", versionState=" + versionState + ", releaseDate=" + releaseDate + ", lastUpdateTime=" + lastUpdateTime + ", createTime=" + createTime + ", archiveTime=" + archiveTime + ", UNF=" + UNF + ", metadataBlocks=" + metadataBlocks + ", fileMetadatas=" + fileMetadatas + '}'; } } diff --git a/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java b/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java index e9c07a3726a..18a9e32a986 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/bagit/OREMap.java @@ -131,7 +131,7 @@ public JsonObjectBuilder getOREMapBuilder(boolean aggregationOnly) { JsonObjectBuilder deaccBuilder = Json.createObjectBuilder(); deaccBuilder.add(JsonLDTerm.schemaOrg("name").getLabel(), vs.name()); deaccBuilder.add(JsonLDTerm.DVCore("reason").getLabel(), version.getDeaccessionNote()); - addIfNotNull(deaccBuilder, JsonLDTerm.DVCore("forwardUrl"), version.getArchiveNote()); + addIfNotNull(deaccBuilder, JsonLDTerm.DVCore("forwardUrl"), version.getDeaccessionLink()); aggBuilder.add(JsonLDTerm.schemaOrg("creativeWorkStatus").getLabel(), deaccBuilder); } else { diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java index 2bb6971a391..eb1dd17aa82 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java @@ -396,11 +396,6 @@ public Dataset parseDataset(JsonObject obj) throws JsonParseException { public DatasetVersion parseDatasetVersion(JsonObject obj, DatasetVersion dsv) throws JsonParseException { try { - String archiveNote = obj.getString("archiveNote", null); - if (archiveNote != null) { - dsv.setArchiveNote(archiveNote); - } - dsv.setDeaccessionLink(obj.getString("deaccessionLink", null)); dsv.setDeaccessionNote(obj.getString("deaccessionNote", null)); dsv.setVersionNote(obj.getString("versionNote", null)); diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java index 635ed09a589..f3812b78213 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonPrinter.java @@ -437,7 +437,6 @@ public static JsonObjectBuilder json(DatasetVersion dsv, List anonymized .add("versionState", dsv.getVersionState().name()) .add("latestVersionPublishingState", dataset.getLatestVersion().getVersionState().name()) .add("deaccessionNote", dsv.getDeaccessionNote()) - .add("archiveNote", dsv.getArchiveNote()) .add("deaccessionLink", dsv.getDeaccessionLink()) .add("distributionDate", dsv.getDistributionDate()) .add("productionDate", dsv.getProductionDate()) diff --git a/src/main/java/edu/harvard/iq/dataverse/validation/URLValidator.java b/src/main/java/edu/harvard/iq/dataverse/validation/URLValidator.java index 8fde76d84e1..55f69ee1471 100644 --- a/src/main/java/edu/harvard/iq/dataverse/validation/URLValidator.java +++ b/src/main/java/edu/harvard/iq/dataverse/validation/URLValidator.java @@ -7,6 +7,7 @@ * * @author skraffmi */ +//Not currently used except in tests public class URLValidator implements ConstraintValidator { private String[] allowedSchemes; diff --git a/src/main/java/edu/harvard/iq/dataverse/validation/ValidateURL.java b/src/main/java/edu/harvard/iq/dataverse/validation/ValidateURL.java index 3834b119598..7c368ea3934 100644 --- a/src/main/java/edu/harvard/iq/dataverse/validation/ValidateURL.java +++ b/src/main/java/edu/harvard/iq/dataverse/validation/ValidateURL.java @@ -13,6 +13,7 @@ @Retention(RUNTIME) @Constraint(validatedBy = {URLValidator.class}) @Documented +//Not currently used except in tests public @interface ValidateURL { String message() default "'${validatedValue}' {url.invalid}"; String[] schemes() default {"http", "https", "ftp"}; diff --git a/src/main/webapp/dataset-versions.xhtml b/src/main/webapp/dataset-versions.xhtml index 9da74c4347f..fae4b868505 100644 --- a/src/main/webapp/dataset-versions.xhtml +++ b/src/main/webapp/dataset-versions.xhtml @@ -120,7 +120,11 @@ #{bundle['file.dataFilesTab.versions.description.firstPublished']} - #{bundle['file.dataFilesTab.versions.description.deaccessionedReason']} #{versionTab.deaccessionNote} #{bundle['file.dataFilesTab.versions.description.beAccessedAt']} #{versionTab.archiveNote} + #{bundle['file.dataFilesTab.versions.description.deaccessionedReason']} #{versionTab.deaccessionNote} + #{bundle['file.dataFilesTab.versions.description.beAccessedAt']} + #{versionTab.deaccessionLink} + +
#{bundle['dataset.deaccession.reason']}

#{DatasetPage.workingVersion.deaccessionNote}

- -

#{bundle['dataset.beAccessedAt']} #{DatasetPage.workingVersion.archiveNote}

+ +

#{bundle['dataset.beAccessedAt']} + #{DatasetPage.workingVersion.deaccessionLink} + +

diff --git a/src/main/webapp/file.xhtml b/src/main/webapp/file.xhtml index 3ab46c81450..5274f724f68 100644 --- a/src/main/webapp/file.xhtml +++ b/src/main/webapp/file.xhtml @@ -327,8 +327,12 @@
#{bundle['dataset.deaccession.reason']}

#{FilePage.fileMetadata.datasetVersion.deaccessionNote}

- -

#{bundle['dataset.beAccessedAt']} #{FilePage.fileMetadata.datasetVersion.archiveNote}

+ +

#{bundle['dataset.beAccessedAt']} + #{FilePage.fileMetadata.datasetVersion.deaccessionLink} + + +

From a3090829e99ead0ac26fe240f91493385e093bf2 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 6 Dec 2024 11:17:39 -0500 Subject: [PATCH 31/65] update flyway with additional changes --- src/main/resources/db/migration/V6.4.0.3.sql | 4 ---- src/main/resources/db/migration/V6.5.0.2.sql | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) delete mode 100644 src/main/resources/db/migration/V6.4.0.3.sql create mode 100644 src/main/resources/db/migration/V6.5.0.2.sql diff --git a/src/main/resources/db/migration/V6.4.0.3.sql b/src/main/resources/db/migration/V6.4.0.3.sql deleted file mode 100644 index bb32265009c..00000000000 --- a/src/main/resources/db/migration/V6.4.0.3.sql +++ /dev/null @@ -1,4 +0,0 @@ --- Add creationnote column --- - -ALTER TABLE datasetversion ADD COLUMN IF NOT EXISTS creationnote VARCHAR(1000); diff --git a/src/main/resources/db/migration/V6.5.0.2.sql b/src/main/resources/db/migration/V6.5.0.2.sql new file mode 100644 index 00000000000..23b5ab823e0 --- /dev/null +++ b/src/main/resources/db/migration/V6.5.0.2.sql @@ -0,0 +1,18 @@ +-- Add deaccessionnote column +-- + +ALTER TABLE datasetversion ADD COLUMN IF NOT EXISTS deaccessionnote VARCHAR(1000); + +-- Update deaccessionnote for existing datasetversions +-- + +UPDATE datasetversion set deaccessionnote = versionnote; +UPDATE datasetversion set versionnote = null; + +-- Move/merge archivenote contents and remove archivenote column +-- + +UPDATE datasetversion set deaccessionlink = CONCAT_WS(" ", deaccessionlink, archivenote); + +ALTER TABLE datasetversion DROP COLUMN archivenote; + From a3b9de970d39bc0bf9bc0ab85889f4d5015b0b63 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 6 Dec 2024 12:17:14 -0500 Subject: [PATCH 32/65] missed changes, cleanup --- src/main/java/edu/harvard/iq/dataverse/DatasetPage.java | 2 +- src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java | 2 -- src/main/java/edu/harvard/iq/dataverse/api/Datasets.java | 2 +- .../java/edu/harvard/iq/dataverse/settings/FeatureFlags.java | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 42fd447a840..91f2a19393f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -3923,7 +3923,7 @@ public void validateForwardURL(FacesContext context, UIComponent toValidate, Obj return; } - if (value.toString().length() <= DatasetVersion.ARCHIVE_NOTE_MAX_LENGTH) { + if (value.toString().length() <= DatasetVersion.DEACCESSION_NOTE_MAX_LENGTH) { ((UIInput) toValidate).setValid(true); } else { ((UIInput) toValidate).setValid(false); diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index 17745bc02d2..cc761e904f8 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -8,7 +8,6 @@ import edu.harvard.iq.dataverse.branding.BrandingUtil; import edu.harvard.iq.dataverse.dataset.DatasetUtil; import edu.harvard.iq.dataverse.license.License; -import edu.harvard.iq.dataverse.pidproviders.PidUtil; import edu.harvard.iq.dataverse.util.FileUtil; import edu.harvard.iq.dataverse.util.StringUtil; import edu.harvard.iq.dataverse.util.SystemConfig; @@ -20,7 +19,6 @@ import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; -import java.net.URL; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index a62602f4006..b4224a5fd55 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -5235,7 +5235,7 @@ public Response deleteDatasetType(@Context ContainerRequestContext crc, @PathPar @AuthRequired @Path("{id}/versions/{versionId}/versionNote") public Response addVersionNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, String note, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { - if(!FeatureFlags.VERSION_CREATION_NOTE.enabled()) { + if(!FeatureFlags.VERSION_NOTE.enabled()) { return notFound(BundleUtil.getStringFromBundle("datasets.api.addVersionNote.notEnabled")); } if (!DS_VERSION_DRAFT.equals(versionId)) { diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java b/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java index 9db46c9bc47..98ef27cb978 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/FeatureFlags.java @@ -116,7 +116,7 @@ public enum FeatureFlags { * "dataverse.feature.enable-version-creation-note" * @since Dataverse 6.5 */ - VERSION_CREATION_NOTE("enable-version-creation-note"), + VERSION_NOTE("enable-version-note"), ; From 986c75307d4d8b7b09841d85a7ca294d74dfd2ed Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 6 Dec 2024 12:19:21 -0500 Subject: [PATCH 33/65] add search --- conf/solr/schema.xml | 2 ++ .../edu/harvard/iq/dataverse/search/IndexServiceBean.java | 4 ++++ .../java/edu/harvard/iq/dataverse/search/SearchFields.java | 1 + 3 files changed, 7 insertions(+) diff --git a/conf/solr/schema.xml b/conf/solr/schema.xml index 2aed50e9998..ee2b0712afc 100644 --- a/conf/solr/schema.xml +++ b/conf/solr/schema.xml @@ -201,6 +201,8 @@ + + diff --git a/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java index a65700fdad7..a81084e5d59 100644 --- a/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/search/IndexServiceBean.java @@ -1296,6 +1296,10 @@ public SolrInputDocuments toSolrDocs(IndexableDataset indexableDataset, Set Date: Fri, 6 Dec 2024 12:19:30 -0500 Subject: [PATCH 34/65] release/change notes --- doc/release-notes/8431-versionNotes.md | 12 ++++++++++++ doc/sphinx-guides/source/api/changelog.rst | 8 ++++++++ 2 files changed, 20 insertions(+) create mode 100644 doc/release-notes/8431-versionNotes.md diff --git a/doc/release-notes/8431-versionNotes.md b/doc/release-notes/8431-versionNotes.md new file mode 100644 index 00000000000..b9804833548 --- /dev/null +++ b/doc/release-notes/8431-versionNotes.md @@ -0,0 +1,12 @@ +Dataverse now supports the option of adding a versionNote before/during publication of a dataset that can be used to indicate why a version was created and/or how it differs from the prior version. Whether this feature is enabled is controlled by a flag. Version notes are shown in the user interface (dataset page version table), indexed, available via the API, and have been added to the JSON, DDI, DataCite, and OAI-ORE exports. + +With the addition of this feature, work has been done to clean-up and rename fields that have been used for specifying the reason for deaccessioning a dataset and providing an optional link to a non-Dataverse location where the dataset still can be found. The former was listed in some JSON-based API calls and exports as "versionNote" and is now "deaccessionNote", while the latter was referred to as "archiveNote" and is now "deacccessionLink". These result in incompatibilities in the UI related to deaccessioned datasets. + +Further, some database consolidation has been done to combine the deaccessionlink and archivenote fields which appear to have both been used for the same purpose (the deaccessionlink db field is older and was not displayed in the current UI. Going forward, only the deaccessionlink column exists. + +New Feature Flags: + +VERSION_NOTE - false by default. + +Update of the solr schema (using the standard instructions) is needed. + diff --git a/doc/sphinx-guides/source/api/changelog.rst b/doc/sphinx-guides/source/api/changelog.rst index 92cd4fc941b..55147c8c221 100644 --- a/doc/sphinx-guides/source/api/changelog.rst +++ b/doc/sphinx-guides/source/api/changelog.rst @@ -7,6 +7,14 @@ This API changelog is experimental and we would love feedback on its usefulness. :local: :depth: 1 +v6.5 +---- + +- The JSON representation for a datasetVersion sent or received in API calls has changed such that + - "versionNote" -> "deaccessionNote" + - "archiveNote" --> "deaccessionLink" + that may be non-null for deaccessioned versions and an optional new "versionNote" field indicating the reason a version was created may be present on any datasetversion. + v6.4 ---- From 56988a0f36b6c494d0b17f83c333ce4db26c2ed4 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 6 Dec 2024 12:22:22 -0500 Subject: [PATCH 35/65] test fix --- src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index 10584f2df71..bfae2878afb 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -52,7 +52,7 @@ import java.util.*; import java.util.logging.Logger; -import static edu.harvard.iq.dataverse.DatasetVersion.ARCHIVE_NOTE_MAX_LENGTH; +import static edu.harvard.iq.dataverse.DatasetVersion.DEACCESSION_NOTE_MAX_LENGTH; import static edu.harvard.iq.dataverse.api.ApiConstants.*; import static edu.harvard.iq.dataverse.api.UtilIT.API_TOKEN_HTTP_HEADER; import static edu.harvard.iq.dataverse.api.UtilIT.equalToCI; @@ -4821,8 +4821,8 @@ public void deaccessionDataset() { Response publishDatasetResponse = UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken); publishDatasetResponse.then().assertThat().statusCode(OK.getStatusCode()); - // Test that a bad request error is received when the forward URL exceeds ARCHIVE_NOTE_MAX_LENGTH - String testInvalidDeaccessionForwardURL = RandomStringUtils.randomAlphabetic(ARCHIVE_NOTE_MAX_LENGTH + 1); + // Test that a bad request error is received when the forward URL exceeds DEACCESSION_NOTE_MAX_LENGTH + String testInvalidDeaccessionForwardURL = RandomStringUtils.randomAlphabetic(DEACCESSION_NOTE_MAX_LENGTH + 1); deaccessionDatasetResponse = UtilIT.deaccessionDataset(datasetId, DS_VERSION_LATEST_PUBLISHED, testDeaccessionReason, testInvalidDeaccessionForwardURL, apiToken); deaccessionDatasetResponse.then().assertThat().statusCode(BAD_REQUEST.getStatusCode()) From ef90fa34617cfb6015c2381dbd6b80362ec61b36 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 6 Dec 2024 13:32:17 -0500 Subject: [PATCH 36/65] docs --- doc/sphinx-guides/source/api/native-api.rst | 42 +++++++++++++++++++ .../source/installation/config.rst | 6 ++- .../source/user/dataset-management.rst | 21 +++++++++- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 691aa94c834..5a3de034c19 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -3217,6 +3217,48 @@ The fully expanded example above (without environment variables) looks like this .. code-block:: bash curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X DELETE "https://demo.dataverse.org/api/datasets/datasetTypes/3" + + .. _api-dataset-version-note: + +Dataset Version Notes +~~~~~~~~~~~~~~~~~~~~~ + +Intended as :ref:`provenance` information about why the version was created/how it differs from the prior version + +Depositors who can edit the dataset and curators can add a version note for the draft version. Superusers can add/delete version notes for any version. + +.. code-block:: bash + + export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + export SERVER_URL=https://demo.dataverse.org + export ID=3 + export VERSION=:draft + export NOTE=Files updated to correct typos + + curl -H "X-Dataverse-key:$API_TOKEN" -X PUT -d "$NOTE" "$SERVER_URL/api/datasets/$ID/versions/$VERSION/versionNote" + +The fully expanded example above (without environment variables) looks like this: + +.. code-block:: bash + + curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X PUT -d "Files updated to correct typos" "https://demo.dataverse.org/api/datasets/3/versions/:draft/versionNote" + + +.. code-block:: bash + + export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + export SERVER_URL=https://demo.dataverse.org + export ID=3 + export VERSION=2.0 + + curl -H "X-Dataverse-key:$API_TOKEN" -X DELETE "$SERVER_URL/api/datasets/$ID/versions/$VERSION/versionNote" + +The fully expanded example above (without environment variables) looks like this: + +.. code-block:: bash + + curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X DELETE "https://demo.dataverse.org/api/datasets/3/versions/2.0/versionNote" + Files ----- diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index e3965e3cd7c..c0a3ca2e377 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -3328,7 +3328,7 @@ This setting is required in conjunction with the ``globus-use-experimental-async Feature Flags ------------- -Certain features might be deactivated because they are experimental and/or opt-in previews. If you want to enable these, +Certain features might be deactivated because they are experimental and/or opt-in capabilities. If you want to enable these, please find all known feature flags below. Any of these flags can be activated using a boolean value (case-insensitive, one of "true", "1", "YES", "Y", "ON") for the setting. @@ -3364,6 +3364,10 @@ please find all known feature flags below. Any of these flags can be activated u * - globus-use-experimental-async-framework - Activates a new experimental implementation of Globus polling of ongoing remote data transfers that does not rely on the instance staying up continuously for the duration of the transfers and saves the state information about Globus upload requests in the database. Added in v6.4. Affects :ref:`:GlobusPollingInterval`. Note that the JVM option :ref:`dataverse.files.globus-monitoring-server` described above must also be enabled on one (and only one, in a multi-node installation) Dataverse instance. - ``Off`` + * - enable-version-note + - Turns on the ability to add/view per-dataset-version notes intended to provide :ref:`provenance` information about why the dataset/version was created. + - ``Off`` + **Note:** Feature flags can be set via any `supported MicroProfile Config API source`_, e.g. the environment variable ``DATAVERSE_FEATURE_XXX`` (e.g. ``DATAVERSE_FEATURE_API_SESSION_AUTH=1``). These environment variables can be set in your shell before starting Payara. If you are using :doc:`Docker for development `, you can set them in the `docker compose `_ file. diff --git a/doc/sphinx-guides/source/user/dataset-management.rst b/doc/sphinx-guides/source/user/dataset-management.rst index 2e5d84748a8..01d79ddcf94 100755 --- a/doc/sphinx-guides/source/user/dataset-management.rst +++ b/doc/sphinx-guides/source/user/dataset-management.rst @@ -572,7 +572,26 @@ When you access a dataset's file-level permissions page, you will see two sectio Data Provenance =============== -Data Provenance is a record of where your data came from and how it reached its current form. It describes the origin of a data file, any transformations that have been made to that file, and any persons or organizations associated with that file. A data file's provenance can aid in reproducibility and compliance with legal regulations. The Dataverse Software can help you keep track of your data's provenance. Currently, the Dataverse Software only makes provenance information available to those who have edit permissions on your dataset, but in the future we plan to expand this feature to make provenance information available to the public. +Dataset-Level +------------- +When configured, the Dataverse software can allow data depositors, curators, and administrators +to provide information about why a new version of a dataset was created and/or how its contents +differ from a prior version. These users can add an optional "Version Note" to a draft dataset +version in the dataset page/versions tab or during publication. This information is publicly +available via the user interface (dataset page/versions tab), API, and in metadata exports +(including the DataCite, JSON, DDI, and OAI_ORE exports). + +File-Level +---------- + +Data Provenance is a record of where your data came from and how it reached its current form. +It describes the origin of a data file, any transformations that have been made to that file, +and any persons or organizations associated with that file. A data file's provenance can aid in +reproducibility and compliance with legal regulations. When configured to support provenance, +the Dataverse Software can help you keep track of your data's provenance. Currently, the Dataverse +Software only makes provenance information available to those who have edit permissions on your +dataset, but in the future we plan to expand this feature to make provenance information available +to the public. .. COMMENTED OUT UNTIL PROV FILE DOWNLOAD IS ADDED: , and make it available to those who need it. From 92f4fa7934b937622ee0a6124c7ab699f76658d0 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 6 Dec 2024 14:15:24 -0500 Subject: [PATCH 37/65] use outputLink, typos --- src/main/webapp/dataset-versions.xhtml | 4 ++-- src/main/webapp/dataset.xhtml | 4 ++-- src/main/webapp/file.xhtml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/webapp/dataset-versions.xhtml b/src/main/webapp/dataset-versions.xhtml index fae4b868505..ec82addd71f 100644 --- a/src/main/webapp/dataset-versions.xhtml +++ b/src/main/webapp/dataset-versions.xhtml @@ -122,8 +122,8 @@ #{bundle['file.dataFilesTab.versions.description.deaccessionedReason']} #{versionTab.deaccessionNote} #{bundle['file.dataFilesTab.versions.description.beAccessedAt']} - #{versionTab.deaccessionLink} - + #{versionTab.deaccessionLink} + diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 1ba570fd55b..5ecee7e066c 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -633,8 +633,8 @@

#{DatasetPage.workingVersion.deaccessionNote}

#{bundle['dataset.beAccessedAt']} - #{DatasetPage.workingVersion.deaccessionLink} - + #{DatasetPage.workingVersion.deaccessionLink} +

diff --git a/src/main/webapp/file.xhtml b/src/main/webapp/file.xhtml index 5274f724f68..925daa3feb4 100644 --- a/src/main/webapp/file.xhtml +++ b/src/main/webapp/file.xhtml @@ -329,8 +329,8 @@

#{FilePage.fileMetadata.datasetVersion.deaccessionNote}

#{bundle['dataset.beAccessedAt']} - #{FilePage.fileMetadata.datasetVersion.deaccessionLink} - + #{FilePage.fileMetadata.datasetVersion.deaccessionLink} +

From ee2b1a17a9ffc2f5ee8d6b3726dc293857e126af Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 13 Dec 2024 08:42:39 -0500 Subject: [PATCH 38/65] single quotes --- src/main/resources/db/migration/V6.5.0.2.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/db/migration/V6.5.0.2.sql b/src/main/resources/db/migration/V6.5.0.2.sql index 23b5ab823e0..a94d81b5dbe 100644 --- a/src/main/resources/db/migration/V6.5.0.2.sql +++ b/src/main/resources/db/migration/V6.5.0.2.sql @@ -12,7 +12,7 @@ UPDATE datasetversion set versionnote = null; -- Move/merge archivenote contents and remove archivenote column -- -UPDATE datasetversion set deaccessionlink = CONCAT_WS(" ", deaccessionlink, archivenote); +UPDATE datasetversion set deaccessionlink = CONCAT_WS(' ', deaccessionlink, archivenote); ALTER TABLE datasetversion DROP COLUMN archivenote; From 622024f43d7bafdcd6bd97580a0d00830471dcd4 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 13 Dec 2024 10:06:44 -0500 Subject: [PATCH 39/65] check if archivenote exists --- src/main/resources/db/migration/V6.5.0.2.sql | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/db/migration/V6.5.0.2.sql b/src/main/resources/db/migration/V6.5.0.2.sql index a94d81b5dbe..3e7f0a674a6 100644 --- a/src/main/resources/db/migration/V6.5.0.2.sql +++ b/src/main/resources/db/migration/V6.5.0.2.sql @@ -9,10 +9,15 @@ ALTER TABLE datasetversion ADD COLUMN IF NOT EXISTS deaccessionnote VARCHAR(1000 UPDATE datasetversion set deaccessionnote = versionnote; UPDATE datasetversion set versionnote = null; --- Move/merge archivenote contents and remove archivenote column +-- Move/merge archivenote contents and remove archivenote column (on existing DBs that have this column) -- +IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'datasetversion'' AND COLUMN_NAME = 'archivenote'') + +BEGIN UPDATE datasetversion set deaccessionlink = CONCAT_WS(' ', deaccessionlink, archivenote); ALTER TABLE datasetversion DROP COLUMN archivenote; +END + From ffc71d85abcd8c953e5cfaab70536b5ffd48c61b Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 13 Dec 2024 14:07:06 -0500 Subject: [PATCH 40/65] use do --- src/main/resources/db/migration/V6.5.0.2.sql | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/resources/db/migration/V6.5.0.2.sql b/src/main/resources/db/migration/V6.5.0.2.sql index 3e7f0a674a6..4693ffe43a2 100644 --- a/src/main/resources/db/migration/V6.5.0.2.sql +++ b/src/main/resources/db/migration/V6.5.0.2.sql @@ -10,14 +10,11 @@ UPDATE datasetversion set deaccessionnote = versionnote; UPDATE datasetversion set versionnote = null; -- Move/merge archivenote contents and remove archivenote column (on existing DBs that have this column) --- -IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'datasetversion'' AND COLUMN_NAME = 'archivenote'') - +DO $$ BEGIN - +IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'datasetversion' AND COLUMN_NAME = 'archivenote') THEN UPDATE datasetversion set deaccessionlink = CONCAT_WS(' ', deaccessionlink, archivenote); - ALTER TABLE datasetversion DROP COLUMN archivenote; - +END IF; END - +$$ From 4faa5cdab6d7e65d9ca60e4ac63ccb1ac12ee3fb Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 13 Dec 2024 17:50:51 -0500 Subject: [PATCH 41/65] missing quote --- src/main/webapp/dataset.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index f47ec986ae0..df55f81ef0d 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -634,7 +634,7 @@

#{bundle['dataset.beAccessedAt']} #{DatasetPage.workingVersion.deaccessionLink} - +

From 58958ab78fb4d3a913e7cbe5112d7c36cdcf5e38 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 13 Dec 2024 17:51:31 -0500 Subject: [PATCH 42/65] add max length for deaccessionLink --- .../java/edu/harvard/iq/dataverse/DatasetVersion.java | 9 ++++++++- .../java/edu/harvard/iq/dataverse/api/DatasetsIT.java | 6 +++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java index 0c902e1786c..bfb2850944d 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetVersion.java @@ -117,6 +117,7 @@ public enum VersionState { } public static final int DEACCESSION_NOTE_MAX_LENGTH = 1000; + public static final int DEACCESSION_LINK_MAX_LENGTH = 1260; //Long enough to cover the case where a legacy deaccessionLink(256 char) and archiveNote (1000) are combined (with a space) public static final int VERSION_NOTE_MAX_LENGTH = 1000; //Archival copies: Status message required components @@ -193,7 +194,9 @@ public enum VersionState { @Column(nullable=true, columnDefinition = "TEXT") private String archivalCopyLocation; - + //This is used for the deaccession reason + @Size(min=0, max=DEACCESSION_LINK_MAX_LENGTH) + @Column(length = DEACCESSION_LINK_MAX_LENGTH) private String deaccessionLink; @Transient @@ -406,6 +409,10 @@ public String getDeaccessionLink() { } public void setDeaccessionLink(String deaccessionLink) { + if (deaccessionLink != null && deaccessionLink.length() > DEACCESSION_LINK_MAX_LENGTH) { + throw new IllegalArgumentException("Error setting deaccessionLink: String length is greater than maximum (" + DEACCESSION_LINK_MAX_LENGTH + ")." + + " StudyVersion id=" + id + ", deaccessionLink=" + deaccessionLink); + } this.deaccessionLink = deaccessionLink; } diff --git a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java index 66020482389..2d2dbdf9d61 100644 --- a/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java +++ b/src/test/java/edu/harvard/iq/dataverse/api/DatasetsIT.java @@ -52,7 +52,7 @@ import java.util.*; import java.util.logging.Logger; -import static edu.harvard.iq.dataverse.DatasetVersion.DEACCESSION_NOTE_MAX_LENGTH; +import static edu.harvard.iq.dataverse.DatasetVersion.DEACCESSION_LINK_MAX_LENGTH; import static edu.harvard.iq.dataverse.api.ApiConstants.*; import static edu.harvard.iq.dataverse.api.UtilIT.API_TOKEN_HTTP_HEADER; import static edu.harvard.iq.dataverse.api.UtilIT.equalToCI; @@ -4821,8 +4821,8 @@ public void deaccessionDataset() { Response publishDatasetResponse = UtilIT.publishDatasetViaNativeApi(datasetId, "major", apiToken); publishDatasetResponse.then().assertThat().statusCode(OK.getStatusCode()); - // Test that a bad request error is received when the forward URL exceeds DEACCESSION_NOTE_MAX_LENGTH - String testInvalidDeaccessionForwardURL = RandomStringUtils.randomAlphabetic(DEACCESSION_NOTE_MAX_LENGTH + 1); + // Test that a bad request error is received when the forward URL exceeds DEACCESSION_LINK_MAX_LENGTH + String testInvalidDeaccessionForwardURL = RandomStringUtils.randomAlphabetic(DEACCESSION_LINK_MAX_LENGTH + 1); deaccessionDatasetResponse = UtilIT.deaccessionDataset(datasetId, DS_VERSION_LATEST_PUBLISHED, testDeaccessionReason, testInvalidDeaccessionForwardURL, apiToken); deaccessionDatasetResponse.then().assertThat().statusCode(BAD_REQUEST.getStatusCode()) From 42d1332ca68ec10eed945deb8b9035e87601ba3c Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Sat, 14 Dec 2024 06:57:32 -0500 Subject: [PATCH 43/65] typo --- src/main/webapp/dataset-versions.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/dataset-versions.xhtml b/src/main/webapp/dataset-versions.xhtml index ec82addd71f..508b46a6b2a 100644 --- a/src/main/webapp/dataset-versions.xhtml +++ b/src/main/webapp/dataset-versions.xhtml @@ -123,7 +123,7 @@ #{bundle['file.dataFilesTab.versions.description.deaccessionedReason']} #{versionTab.deaccessionNote} #{bundle['file.dataFilesTab.versions.description.beAccessedAt']} #{versionTab.deaccessionLink} - +
From c53ba93ad180d6b394297a7c46efc1d88db19141 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Sat, 14 Dec 2024 08:25:16 -0500 Subject: [PATCH 44/65] avoid duplicate id --- src/main/webapp/dataset.xhtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index df55f81ef0d..78e1fb794c5 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -2066,10 +2066,10 @@

-
From 16f08302318ec416f4b4b833bf277df04e270c27 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Tue, 17 Dec 2024 14:15:58 -0500 Subject: [PATCH 45/65] add getVersionNote api call --- .../java/edu/harvard/iq/dataverse/api/Datasets.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index fb2f282e3d4..425995b8b81 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -5314,7 +5314,18 @@ public Response deleteDatasetType(@Context ContainerRequestContext crc, @PathPar return error(BAD_REQUEST, ex.getMessage()); } } - + + @GET + @AuthRequired + @Path("{id}/versions/{versionId}/versionNote") + public Response getVersionCreationNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, String note, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { + + return response(req -> { + DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetOrDie(datasetId), uriInfo, headers); + return ok(datasetVersion.getCreationNote()); + }, getRequestUser(crc)); + } + @PUT @AuthRequired @Path("{id}/versions/{versionId}/versionNote") From 43c56bf9c7886fe7a5274d8c099a3e29e6bb6ae0 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Tue, 17 Dec 2024 14:31:37 -0500 Subject: [PATCH 46/65] get version note api --- src/main/java/edu/harvard/iq/dataverse/api/Datasets.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 425995b8b81..9167b658ca9 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -5322,7 +5322,7 @@ public Response getVersionCreationNote(@Context ContainerRequestContext crc, @Pa return response(req -> { DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetOrDie(datasetId), uriInfo, headers); - return ok(datasetVersion.getCreationNote()); + return ok(datasetVersion.getVersionNote()); }, getRequestUser(crc)); } From d69b052551607ae9e2af75370442ba39b391b505 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Tue, 17 Dec 2024 14:35:30 -0500 Subject: [PATCH 47/65] doc update --- doc/sphinx-guides/source/api/native-api.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 367195d3e32..8fc93dfa25a 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -3258,6 +3258,25 @@ Intended as :ref:`provenance` information about why the version was created/how Depositors who can edit the dataset and curators can add a version note for the draft version. Superusers can add/delete version notes for any version. +Version notes can be retrieved via the following, with authorization required to see a note on the :draft version + +.. code-block:: bash + + export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + export SERVER_URL=https://demo.dataverse.org + export ID=3 + export VERSION=:draft + + curl -H "X-Dataverse-key:$API_TOKEN" "$SERVER_URL/api/datasets/$ID/versions/$VERSION/versionNote" + +The fully expanded example above (without environment variables) looks like this: + +.. code-block:: bash + + curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" "https://demo.dataverse.org/api/datasets/3/versions/:draft/versionNote" + +Notes can be set with: + .. code-block:: bash export API_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx @@ -3274,6 +3293,7 @@ The fully expanded example above (without environment variables) looks like this curl -H "X-Dataverse-key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -X PUT -d "Files updated to correct typos" "https://demo.dataverse.org/api/datasets/3/versions/:draft/versionNote" +And deleted via: .. code-block:: bash From b7bd6a7dd911b112b9b459435dae35b58f8d7d18 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Thu, 19 Dec 2024 13:01:15 -0500 Subject: [PATCH 48/65] fix overflows in version table/difference details --- src/main/webapp/resources/css/structure.css | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/webapp/resources/css/structure.css b/src/main/webapp/resources/css/structure.css index b68acaf7488..6da81b56e8b 100644 --- a/src/main/webapp/resources/css/structure.css +++ b/src/main/webapp/resources/css/structure.css @@ -908,7 +908,16 @@ div.dvnDifferanceTable > div.ui-datatable-tablewrapper > table > tbody > tr, div div.dvnDifferanceTable > div.ui-datatable-tablewrapper > table > tbody > tr, div.dvnDifferanceTable > div.ui-datatable-tablewrapper > table > tbody > tr > td:last-child {border-right-width:0;} div.dvnDifferanceTable div.ui-datatable-tablewrapper table td.versionValue {width:30%;} div.dvnDifferanceTable div.ui-datatable-tablewrapper table td.versionDetails {width:35%;} -div.dvnDifferanceTable .diffDetailBlock {display:block;} +div.dvnDifferanceTable .diffDetailBlock { + display:block; + word-break:break-all; +} + +div.dvnDifferanceTable .versionValue { + word-break:break-all; +} +div[id$="versionsTable"] tbody {word-break:break-word;} + /* DATATABLE + DROPDOWN BUTTON + OVERFLOW VISIBLE */ thead.ui-datatable-scrollable-theadclone {display:none} From 68b45d31106bbc1c3fb506c13dacb6fae0dc4dbb Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Tue, 4 Feb 2025 16:50:07 -0500 Subject: [PATCH 49/65] version note fix superuser case/simplify draft case --- .../harvard/iq/dataverse/api/Datasets.java | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 9167b658ca9..25d10c6d363 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -5330,24 +5330,36 @@ public Response getVersionCreationNote(@Context ContainerRequestContext crc, @Pa @AuthRequired @Path("{id}/versions/{versionId}/versionNote") public Response addVersionNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, String note, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { - if(!FeatureFlags.VERSION_NOTE.enabled()) { - return notFound(BundleUtil.getStringFromBundle("datasets.api.addVersionNote.notEnabled")); + if (!FeatureFlags.VERSION_NOTE.enabled()) { + return notFound(BundleUtil.getStringFromBundle("datasets.api.addVersionNote.notEnabled")); } if (!DS_VERSION_DRAFT.equals(versionId)) { - AuthenticatedUser user = getRequestAuthenticatedUserOrDie(crc); - if (!user.isSuperuser()) { - return forbidden(BundleUtil.getStringFromBundle("datasets.api.addVersionNote.forbidden")); + try { + AuthenticatedUser user = getRequestAuthenticatedUserOrDie(crc); + + if (!user.isSuperuser()) { + return forbidden(BundleUtil.getStringFromBundle("datasets.api.addVersionNote.forbidden")); + } + return response(req -> { + DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetOrDie(datasetId), uriInfo, headers); + datasetVersion.setVersionNote(note); + em.merge(datasetVersion); + + return ok("Note added to version " + datasetVersion.getFriendlyVersionNumber()); + }, getRequestUser(crc)); + } catch (WrappedResponse ex) { + return ex.getResponse(); } } return response(req -> { - DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetOrDie(datasetId), uriInfo, headers); + DatasetVersion datasetVersion = findDatasetOrDie(datasetId).getOrCreateEditVersion(); datasetVersion.setVersionNote(note); execCommand(new UpdateDatasetVersionCommand(datasetVersion.getDataset(), req)); return ok("Note added"); }, getRequestUser(crc)); } - + @DELETE @AuthRequired @Path("{id}/versions/{versionId}/versionNote") From 0108990bf5d555ac6371e4d2b3dca749007a70b8 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Tue, 4 Feb 2025 17:13:45 -0500 Subject: [PATCH 50/65] add stateless --- src/main/java/edu/harvard/iq/dataverse/api/Datasets.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 25d10c6d363..b4293f6e1c0 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -57,6 +57,7 @@ import edu.harvard.iq.dataverse.workflow.WorkflowServiceBean; import jakarta.ejb.EJB; import jakarta.ejb.EJBException; +import jakarta.ejb.Stateless; import jakarta.inject.Inject; import jakarta.json.*; import jakarta.json.stream.JsonParsingException; @@ -106,6 +107,7 @@ import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; +@Stateless @Path("datasets") public class Datasets extends AbstractApiBean { From 244f927ec4cd77f1df1b793a4849fe06d9dbfec8 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Tue, 4 Feb 2025 17:42:10 -0500 Subject: [PATCH 51/65] add renamed flyway --- src/main/resources/db/migration/V6.5.0.4.sql | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/resources/db/migration/V6.5.0.4.sql diff --git a/src/main/resources/db/migration/V6.5.0.4.sql b/src/main/resources/db/migration/V6.5.0.4.sql new file mode 100644 index 00000000000..c0968d843fe --- /dev/null +++ b/src/main/resources/db/migration/V6.5.0.4.sql @@ -0,0 +1,20 @@ +-- Add deaccessionnote column +-- + +ALTER TABLE datasetversion ADD COLUMN IF NOT EXISTS deaccessionnote VARCHAR(1000); + +-- Update deaccessionnote for existing datasetversions +-- + +UPDATE datasetversion set deaccessionnote = versionnote; +UPDATE datasetversion set versionnote = null; + +-- Move/merge archivenote contents and remove archivenote column (on existing DBs that have this column) +DO $$ +BEGIN +IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'datasetversion' AND COLUMN_NAME = 'archivenote') THEN +UPDATE datasetversion set deaccessionlink = CONCAT_WS(' ', deaccessionlink, archivenote); +ALTER TABLE datasetversion DROP COLUMN archivenote; +END IF; +END +$$ \ No newline at end of file From 976e9fc00e937b0eb88696e430db188688a8d501 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Thu, 6 Feb 2025 17:40:11 -0500 Subject: [PATCH 52/65] update flyway --- src/main/resources/db/migration/{V6.5.0.4.sql => V6.5.0.5.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V6.5.0.4.sql => V6.5.0.5.sql} (100%) diff --git a/src/main/resources/db/migration/V6.5.0.4.sql b/src/main/resources/db/migration/V6.5.0.5.sql similarity index 100% rename from src/main/resources/db/migration/V6.5.0.4.sql rename to src/main/resources/db/migration/V6.5.0.5.sql From e550223fa01c95c1ec2870d53e2023396c3df265 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 21 Feb 2025 10:00:48 -0500 Subject: [PATCH 53/65] update superuser case for versionNote to avoid adding @Stateless --- .../harvard/iq/dataverse/api/Datasets.java | 4 +- .../UpdatePublishedDatasetVersionCommand.java | 63 +++++++++++++++++++ 2 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdatePublishedDatasetVersionCommand.java diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index a1e6baefe20..ef717cf9dd6 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -107,7 +107,6 @@ import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST; import static jakarta.ws.rs.core.Response.Status.NOT_FOUND; -@Stateless @Path("datasets") public class Datasets extends AbstractApiBean { @@ -5398,8 +5397,7 @@ public Response addVersionNote(@Context ContainerRequestContext crc, @PathParam( return response(req -> { DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetOrDie(datasetId), uriInfo, headers); datasetVersion.setVersionNote(note); - em.merge(datasetVersion); - + execCommand(new UpdatePublishedDatasetVersionCommand(req, datasetVersion)); return ok("Note added to version " + datasetVersion.getFriendlyVersionNumber()); }, getRequestUser(crc)); } catch (WrappedResponse ex) { diff --git a/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdatePublishedDatasetVersionCommand.java b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdatePublishedDatasetVersionCommand.java new file mode 100644 index 00000000000..f8f5d05d972 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdatePublishedDatasetVersionCommand.java @@ -0,0 +1,63 @@ +package edu.harvard.iq.dataverse.engine.command.impl; + +import edu.harvard.iq.dataverse.DatasetVersion; +import edu.harvard.iq.dataverse.authorization.Permission; +import edu.harvard.iq.dataverse.engine.command.AbstractCommand; +import edu.harvard.iq.dataverse.engine.command.CommandContext; +import edu.harvard.iq.dataverse.engine.command.DataverseRequest; +import edu.harvard.iq.dataverse.engine.command.RequiredPermissions; +import edu.harvard.iq.dataverse.engine.command.exception.CommandException; +import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; + +/** + * Updates the specified dataset version, which must already be published/not + * draft. The command is only usable by superusers. The initial use is to allow + * adding version notes to existing versions but it is otherwise generic + * assuming there may be other cases where updating some aspect of an existing + * version is needed. Note this is similar to the + * CuratePublishedDatasetVersionCommand, but in that case changes in an existing + * draft version are pushed into the latest published version as a form of + * republishing (and the draft version ceases to exist). This command assumes + * changes have been made to the existing dataset version of interest, which may + * not be the latest published one, and it does not make any changes to a + * dataset's draft version if that exists. + */ +@RequiredPermissions(Permission.EditDataset) +public class UpdatePublishedDatasetVersionCommand extends AbstractCommand { + + private final DatasetVersion datasetVersion; + + public UpdatePublishedDatasetVersionCommand(DataverseRequest aRequest, DatasetVersion datasetVersion) { + super(aRequest, datasetVersion.getDataset()); + this.datasetVersion = datasetVersion; + } + + @Override + public DatasetVersion execute(CommandContext ctxt) throws CommandException { + // Check if the user is a superuser + if (!getUser().isSuperuser()) { + throw new IllegalCommandException("Only superusers can update published dataset versions", this); + } + + // Ensure the version is published + if (!datasetVersion.isReleased()) { + throw new IllegalCommandException("This command can only be used on published dataset versions", this); + } + + // Save the changes + DatasetVersion savedVersion = ctxt.em().merge(datasetVersion); + + return savedVersion; + } + + @Override + public boolean onSuccess(CommandContext ctxt, Object r) { + DatasetVersion version = (DatasetVersion) r; + // Only need to reindex if this version is the latest published version for the + // dataset + if (version.equals(version.getDataset().getLatestVersionForCopy())) { + ctxt.index().asyncIndexDataset(version.getDataset(), true); + } + return true; + } +} From d9909a0d7b927b467fc16180cc610c855415934f Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 21 Feb 2025 10:19:03 -0500 Subject: [PATCH 54/65] fix get for null --- .../java/edu/harvard/iq/dataverse/api/Datasets.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index ef717cf9dd6..c62f76fd355 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -5372,11 +5372,19 @@ public Response updateDatasetTypeLinksWithMetadataBlocks(@Context ContainerReque @GET @AuthRequired @Path("{id}/versions/{versionId}/versionNote") - public Response getVersionCreationNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, String note, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { + public Response getVersionCreationNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { return response(req -> { DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetOrDie(datasetId), uriInfo, headers); +<<<<<<< IQSS/8431_Version_Creation_Note return ok(datasetVersion.getVersionNote()); +======= + String note = datasetVersion.getCreationNote(); + if(note == null) { + return ok(Json.createObjectBuilder()); + } + return ok(datasetVersion.getCreationNote()); +>>>>>>> e96bc2f fix get for null }, getRequestUser(crc)); } From a543f9ddd110d48b700f3e2159c4506628ebc79d Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 21 Feb 2025 10:42:23 -0500 Subject: [PATCH 55/65] fix merge conflict --- src/main/java/edu/harvard/iq/dataverse/api/Datasets.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index c62f76fd355..8c94f23cebb 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -5376,15 +5376,11 @@ public Response getVersionCreationNote(@Context ContainerRequestContext crc, @Pa return response(req -> { DatasetVersion datasetVersion = getDatasetVersionOrDie(req, versionId, findDatasetOrDie(datasetId), uriInfo, headers); -<<<<<<< IQSS/8431_Version_Creation_Note - return ok(datasetVersion.getVersionNote()); -======= - String note = datasetVersion.getCreationNote(); + String note = datasetVersion.getVersionNote(); if(note == null) { return ok(Json.createObjectBuilder()); } - return ok(datasetVersion.getCreationNote()); ->>>>>>> e96bc2f fix get for null + return ok(note); }, getRequestUser(crc)); } From 8982049c5d7087ecddb1d8c2f858ef002c45ad69 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 28 Feb 2025 11:23:16 -0500 Subject: [PATCH 56/65] changes per review --- doc/sphinx-guides/source/api/changelog.rst | 4 ++-- doc/sphinx-guides/source/installation/config.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/sphinx-guides/source/api/changelog.rst b/doc/sphinx-guides/source/api/changelog.rst index 7f0ad85cd8e..48a8dbce32c 100644 --- a/doc/sphinx-guides/source/api/changelog.rst +++ b/doc/sphinx-guides/source/api/changelog.rst @@ -1,7 +1,7 @@ API Changelog (Breaking Changes) ================================ -This API changelog is experimental and we would love feedback on its usefulness. Its primary purpose is to inform API developers of any breaking changes. (We try not ship any backward incompatible changes, but it happens.) To see a list of new APIs and backward-compatible changes to existing API, please see each version's release notes at https://github.com/IQSS/dataverse/releases +This API changelog is experimental and we would love feedback on its usefulness. Its primary purpose is to inform API developers of any breaking changes. (We try not to ship any backward incompatible changes, but it happens.) To see a list of new APIs and backward-compatible changes to existing API, please see each version's release notes at https://github.com/IQSS/dataverse/releases .. contents:: |toctitle| :local: @@ -20,7 +20,7 @@ v6.5 - The JSON representation for a datasetVersion sent or received in API calls has changed such that - "versionNote" -> "deaccessionNote" - "archiveNote" --> "deaccessionLink" - that may be non-null for deaccessioned versions and an optional new "versionNote" field indicating the reason a version was created may be present on any datasetversion. + These may be non-null for deaccessioned versions and an optional new "versionNote" field indicating the reason a version was created may be present on any datasetversion. - **/api/datasets/{identifier}/links**: The response from :ref:`list-collections-linked-from-dataset` has been improved to provide a more structured (but backward-incompatible) JSON response. diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index 1bb3e458475..5b10769adb5 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -3489,7 +3489,7 @@ please find all known feature flags below. Any of these flags can be activated u - Activates a new experimental implementation of Globus polling of ongoing remote data transfers that does not rely on the instance staying up continuously for the duration of the transfers and saves the state information about Globus upload requests in the database. Added in v6.4. Affects :ref:`:GlobusPollingInterval`. Note that the JVM option :ref:`dataverse.files.globus-monitoring-server` described above must also be enabled on one (and only one, in a multi-node installation) Dataverse instance. - ``Off`` * - enable-version-note - - Turns on the ability to add/view per-dataset-version notes intended to provide :ref:`provenance` information about why the dataset/version was created. + - Turns on the ability to add/view/edit/delete per-dataset-version notes intended to provide :ref:`provenance` information about why the dataset/version was created. - ``Off`` From 875b7777fd149e979a9a30d05ff285ded497d0bd Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 28 Feb 2025 11:30:51 -0500 Subject: [PATCH 57/65] restore original null behavior, add note --- .../edu/harvard/iq/dataverse/util/json/JsonParser.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java index 36bf7c901f3..36f98f9e40f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/json/JsonParser.java @@ -411,7 +411,13 @@ public DatasetVersion parseDatasetVersion(JsonObject obj, DatasetVersion dsv) th try { dsv.setDeaccessionLink(obj.getString("deaccessionLink", null)); - dsv.setDeaccessionNote(obj.getString("deaccessionNote", null)); + String deaccessionNote = obj.getString("deaccessionNote", null); + // ToDo - the treatment of null inputs is inconsistent across different fields (either the original value is kept or set to null). + // This is moot for most uses of this method, which start from an empty datasetversion, but use through https://github.com/IQSS/dataverse/blob/3e5a516670c42e019338063516a9d93a61833027/src/main/java/edu/harvard/iq/dataverse/api/datadeposit/ContainerManagerImpl.java#L112 + // starts from an existing version where this inconsistency could be/is a problem. + if (deaccessionNote != null) { + dsv.setDeaccessionNote(deaccessionNote); + } dsv.setVersionNote(obj.getString("versionNote", null)); int versionNumberInt = obj.getInt("versionNumber", -1); Long versionNumber = null; From e373116f6965e1d09e1a6e55bbe70be5e1351b0b Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 28 Feb 2025 12:12:48 -0500 Subject: [PATCH 58/65] fix conflict --- .../harvard/iq/dataverse/api/Datasets.java | 67 ++++++++++++++++++- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java index 8c94f23cebb..3d30c7386ba 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Datasets.java @@ -57,7 +57,6 @@ import edu.harvard.iq.dataverse.workflow.WorkflowServiceBean; import jakarta.ejb.EJB; import jakarta.ejb.EJBException; -import jakarta.ejb.Stateless; import jakarta.inject.Inject; import jakarta.json.*; import jakarta.json.stream.JsonParsingException; @@ -5369,7 +5368,71 @@ public Response updateDatasetTypeLinksWithMetadataBlocks(@Context ContainerReque } } - @GET + @PUT + @AuthRequired + @Path("{id}/deleteFiles") + @Consumes(MediaType.APPLICATION_JSON) + public Response deleteDatasetFiles(@Context ContainerRequestContext crc, @PathParam("id") String id, + JsonArray fileIds) { + try { + getRequestAuthenticatedUserOrDie(crc); + } catch (WrappedResponse ex) { + return ex.getResponse(); + } + return response(req -> { + Dataset dataset = findDatasetOrDie(id); + // Convert JsonArray to List + List fileIdList = new ArrayList<>(); + for (JsonValue value : fileIds) { + fileIdList.add(((JsonNumber) value).longValue()); + } + // Find the files to be deleted + List filesToDelete = dataset.getOrCreateEditVersion().getFileMetadatas().stream() + .filter(fileMetadata -> fileIdList.contains(fileMetadata.getDataFile().getId())) + .collect(Collectors.toList()); + + if (filesToDelete.isEmpty()) { + return badRequest("No files found with the provided IDs."); + } + + if (filesToDelete.size() != fileIds.size()) { + return badRequest( + "Some files listed are not present in the latest dataset version and cannot be deleted."); + } + try { + + UpdateDatasetVersionCommand update_cmd = new UpdateDatasetVersionCommand(dataset, req, filesToDelete); + + commandEngine.submit(update_cmd); + for (FileMetadata fm : filesToDelete) { + DataFile dataFile = fm.getDataFile(); + boolean deletePhysicalFile = !dataFile.isReleased(); + if (deletePhysicalFile) { + try { + fileService.finalizeFileDelete(dataFile.getId(), + fileService.getPhysicalFileToDelete(dataFile)); + } catch (IOException ioex) { + logger.warning("Failed to delete the physical file associated with the deleted datafile id=" + + dataFile.getId() + ", storage location: " + + fileService.getPhysicalFileToDelete(dataFile)); + } + } + } + } catch (PermissionException ex) { + return error(FORBIDDEN, "You do not have permission to delete files ont this dataset."); + } catch (CommandException ex) { + return error(BAD_REQUEST, + "File deletes failed for dataset ID " + id + " (CommandException): " + ex.getMessage()); + } catch (EJBException ex) { + return error(jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR, + "File deletes failed for dataset ID " + id + "(EJBException): " + ex.getMessage()); + } + return ok(fileIds.size() + " files deleted successfully"); + + }, getRequestUser(crc)); + } + +@GET @AuthRequired @Path("{id}/versions/{versionId}/versionNote") public Response getVersionCreationNote(@Context ContainerRequestContext crc, @PathParam("id") String datasetId, @PathParam("versionId") String versionId, @Context UriInfo uriInfo, @Context HttpHeaders headers) throws WrappedResponse { From d9920282d189b9ee4d70b476bbf2dd3dd8c0b011 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Wed, 5 Mar 2025 11:15:11 -0500 Subject: [PATCH 59/65] update flyway name --- src/main/resources/db/migration/{V6.5.0.6.sql => V6.5.0.7.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V6.5.0.6.sql => V6.5.0.7.sql} (100%) diff --git a/src/main/resources/db/migration/V6.5.0.6.sql b/src/main/resources/db/migration/V6.5.0.7.sql similarity index 100% rename from src/main/resources/db/migration/V6.5.0.6.sql rename to src/main/resources/db/migration/V6.5.0.7.sql From f3005a36b07ad137c7bf7d44ad0e2d34343b80b1 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Wed, 5 Mar 2025 13:13:18 -0500 Subject: [PATCH 60/65] remove flyway merge issue --- src/main/resources/db/migration/V6.5.0.5.sql | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/main/resources/db/migration/V6.5.0.5.sql b/src/main/resources/db/migration/V6.5.0.5.sql index 9889a0393f0..d2b03040df8 100644 --- a/src/main/resources/db/migration/V6.5.0.5.sql +++ b/src/main/resources/db/migration/V6.5.0.5.sql @@ -68,23 +68,3 @@ UPDATE license SET scheme_uri = 'https://spdx.org/licenses/', language_code = 'en' WHERE uri = 'https://opensource.org/licenses/MIT'; --- Add deaccessionnote column --- - -ALTER TABLE datasetversion ADD COLUMN IF NOT EXISTS deaccessionnote VARCHAR(1000); - --- Update deaccessionnote for existing datasetversions --- - -UPDATE datasetversion set deaccessionnote = versionnote; -UPDATE datasetversion set versionnote = null; - --- Move/merge archivenote contents and remove archivenote column (on existing DBs that have this column) -DO $$ -BEGIN -IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'datasetversion' AND COLUMN_NAME = 'archivenote') THEN -UPDATE datasetversion set deaccessionlink = CONCAT_WS(' ', deaccessionlink, archivenote); -ALTER TABLE datasetversion DROP COLUMN archivenote; -END IF; -END -$$ \ No newline at end of file From 8ae2db0f613d7706da9d7e0c5fbcbf51e2320128 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Wed, 5 Mar 2025 14:09:26 -0500 Subject: [PATCH 61/65] fix for unrelated issue found in QA --- src/main/webapp/resources/css/structure.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/resources/css/structure.css b/src/main/webapp/resources/css/structure.css index 4fcc744c8e7..4dba29e0a6e 100644 --- a/src/main/webapp/resources/css/structure.css +++ b/src/main/webapp/resources/css/structure.css @@ -608,7 +608,7 @@ div[id$='roleDisplay'] span.label, div[id$='roleDetails'] span.label {display:in /* RESPONSIVE ORDER HACK BOOTSTRAP 3 https://stackoverflow.com/a/24834574 */ #dataset-colorder-block {height: 50px;} @media(min-width:992px){ - #dataset-summary-metadata, #deaccession-reason-block {margin-top: -50px;} + #dataset-colorder-block + div {margin-top: -50px;} } .bg-citation {background:#ECF6FB; border: 0;} From a217b79de8144ad737e96af5d1db1a09dea5ee9a Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Wed, 5 Mar 2025 15:01:22 -0500 Subject: [PATCH 62/65] flyway change --- src/main/resources/db/migration/{V6.5.0.7.sql => V6.5.0.8.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V6.5.0.7.sql => V6.5.0.8.sql} (100%) diff --git a/src/main/resources/db/migration/V6.5.0.7.sql b/src/main/resources/db/migration/V6.5.0.8.sql similarity index 100% rename from src/main/resources/db/migration/V6.5.0.7.sql rename to src/main/resources/db/migration/V6.5.0.8.sql From c22eee34c0e91e937c904fd36dcd1cf4626025de Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 5 Mar 2025 16:56:42 -0500 Subject: [PATCH 63/65] typo --- src/main/webapp/dataset.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index f001857605e..7a7f5ce90e8 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -633,7 +633,7 @@

#{DatasetPage.workingVersion.deaccessionNote}

#{bundle['dataset.beAccessedAt']} - #{DatasetPage.workingVersion.deaccessionLink} + #{DatasetPage.workingVersion.deaccessionLink}

From 27c54dad847eb85cae99788dd8c0f362ed85561b Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 5 Mar 2025 17:00:34 -0500 Subject: [PATCH 64/65] one more --- src/main/webapp/dataset.xhtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 7a7f5ce90e8..560315378e7 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -634,7 +634,7 @@

#{bundle['dataset.beAccessedAt']} #{DatasetPage.workingVersion.deaccessionLink} - +

From a3046d10ad683314076def58b1e8ab371d43f313 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Thu, 6 Mar 2025 13:53:43 -0500 Subject: [PATCH 65/65] flyway number change --- src/main/resources/db/migration/{V6.5.0.8.sql => V6.5.0.9.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V6.5.0.8.sql => V6.5.0.9.sql} (100%) diff --git a/src/main/resources/db/migration/V6.5.0.8.sql b/src/main/resources/db/migration/V6.5.0.9.sql similarity index 100% rename from src/main/resources/db/migration/V6.5.0.8.sql rename to src/main/resources/db/migration/V6.5.0.9.sql