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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 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