From 4605ce414be955143e7233114f9ed2c959f73144 Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Wed, 1 Apr 2026 19:06:46 -0400 Subject: [PATCH 1/4] A quick fix for the issue with file-level handles bombing on create. #12174 --- .../pidproviders/handle/HandlePidProvider.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/handle/HandlePidProvider.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/handle/HandlePidProvider.java index 972ffe5d864..c56beca1e49 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/handle/HandlePidProvider.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/handle/HandlePidProvider.java @@ -259,7 +259,7 @@ private String getRegistrationUrl(DvObject dvObject) { logger.log(Level.FINE,"getRegistrationUrl"); String siteUrl = SystemConfig.getDataverseSiteUrlStatic(); String targetUrl = siteUrl + dvObject.getTargetUrl() + "hdl:" + dvObject.getAuthority() - + "/" + dvObject.getIdentifier(); + + "/" + dvObject.getIdentifier(); return targetUrl; } @@ -324,12 +324,6 @@ private String getAuthenticationHandle(String handlePrefix) { return "0.NA/" + handlePrefix; } } - - @Override - public boolean alreadyRegistered(DvObject dvObject) { - String handle = getDvObjectHandle(dvObject); - return isHandleRegistered(handle); - } @Override public boolean alreadyRegistered(GlobalId pid, boolean noProviderDefault) throws Exception { @@ -400,6 +394,10 @@ public List getProviderInformation(){ @Override public String createIdentifier(DvObject dvObject) throws Throwable { + if (dvObject.getIdentifier() == null || dvObject.getIdentifier().isEmpty()) { + dvObject = generatePid(dvObject); + logger.fine("generated identifier: " + getIdentifier(dvObject)); + } Throwable result = registerNewHandle(dvObject); if (result != null) throw result; From e4b7399e050509c839afdb958a0d7f4c1da27934 Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Tue, 28 Apr 2026 13:37:04 -0400 Subject: [PATCH 2/4] Another quick fix, for #8881 (combined with #12174) --- src/main/java/edu/harvard/iq/dataverse/DataFile.java | 2 +- .../iq/dataverse/pidproviders/handle/HandlePidProvider.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java index 8a08cd15029..60f0b67e139 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java @@ -80,7 +80,7 @@ public class DataFile extends DvObject implements Comparable { private static final Logger logger = Logger.getLogger(DatasetPage.class.getCanonicalName()); private static final long serialVersionUID = 1L; - public static final String TARGET_URL = "/file.xhtml?persistentId="; + public static final String TARGET_URL = "/citation?persistentId="; public static final char INGEST_STATUS_NONE = 65; public static final char INGEST_STATUS_SCHEDULED = 66; public static final char INGEST_STATUS_INPROGRESS = 67; diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/handle/HandlePidProvider.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/handle/HandlePidProvider.java index c56beca1e49..b0fd4969f26 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/handle/HandlePidProvider.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/handle/HandlePidProvider.java @@ -185,7 +185,7 @@ public Throwable registerNewHandle(DvObject dvObject) { timestamp, null, true, true, true, false), new HandleValue(1, "URL".getBytes(StandardCharsets.UTF_8), datasetUrl.getBytes(), HandleValue.TTL_TYPE_RELATIVE, 86400, - timestamp, null, true, true, true, false)}; + timestamp, null, true, true, false, false)}; CreateHandleRequest req = new CreateHandleRequest(handle.getBytes(StandardCharsets.UTF_8), val, auth); From 45fdf68678bb9ec133f666e5420019c7a568f46d Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Tue, 28 Apr 2026 16:43:19 -0400 Subject: [PATCH 3/4] A release note #12174 --- doc/release-notes/12174-handle-improvements.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 doc/release-notes/12174-handle-improvements.md diff --git a/doc/release-notes/12174-handle-improvements.md b/doc/release-notes/12174-handle-improvements.md new file mode 100644 index 00000000000..09315f352f6 --- /dev/null +++ b/doc/release-notes/12174-handle-improvements.md @@ -0,0 +1,5 @@ +This release offers improved support for Handles as persistent ids. + +The following issues are fixed: +- When pid registration of persistent ids for files is enabled, Dataverse will create the handle as soon as the file is created (similary to other persistent id providers) (issue #12174); +- When a new handle is created, for a dataset or file that is still a draft, it will be reserved and registered, but not visible publicly. The handle will become visible and the redirects will start working once it is published. This is also in line with how DOI providers work (issue #8881). \ No newline at end of file From f733f1c7501c9e2e50c91a5bbb52e2f2eb281d21 Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Wed, 1 Apr 2026 19:06:46 -0400 Subject: [PATCH 4/4] A quick fix for the issue with file-level handles bombing on create. #12174 Another quick fix, for #8881 (combined with #12174) A release note #12174 --- doc/release-notes/12174-handle-improvements.md | 5 +++++ .../java/edu/harvard/iq/dataverse/DataFile.java | 2 +- .../pidproviders/handle/HandlePidProvider.java | 14 ++++++-------- 3 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 doc/release-notes/12174-handle-improvements.md diff --git a/doc/release-notes/12174-handle-improvements.md b/doc/release-notes/12174-handle-improvements.md new file mode 100644 index 00000000000..09315f352f6 --- /dev/null +++ b/doc/release-notes/12174-handle-improvements.md @@ -0,0 +1,5 @@ +This release offers improved support for Handles as persistent ids. + +The following issues are fixed: +- When pid registration of persistent ids for files is enabled, Dataverse will create the handle as soon as the file is created (similary to other persistent id providers) (issue #12174); +- When a new handle is created, for a dataset or file that is still a draft, it will be reserved and registered, but not visible publicly. The handle will become visible and the redirects will start working once it is published. This is also in line with how DOI providers work (issue #8881). \ No newline at end of file diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java index 8a08cd15029..60f0b67e139 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java @@ -80,7 +80,7 @@ public class DataFile extends DvObject implements Comparable { private static final Logger logger = Logger.getLogger(DatasetPage.class.getCanonicalName()); private static final long serialVersionUID = 1L; - public static final String TARGET_URL = "/file.xhtml?persistentId="; + public static final String TARGET_URL = "/citation?persistentId="; public static final char INGEST_STATUS_NONE = 65; public static final char INGEST_STATUS_SCHEDULED = 66; public static final char INGEST_STATUS_INPROGRESS = 67; diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/handle/HandlePidProvider.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/handle/HandlePidProvider.java index 972ffe5d864..b0fd4969f26 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/handle/HandlePidProvider.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/handle/HandlePidProvider.java @@ -185,7 +185,7 @@ public Throwable registerNewHandle(DvObject dvObject) { timestamp, null, true, true, true, false), new HandleValue(1, "URL".getBytes(StandardCharsets.UTF_8), datasetUrl.getBytes(), HandleValue.TTL_TYPE_RELATIVE, 86400, - timestamp, null, true, true, true, false)}; + timestamp, null, true, true, false, false)}; CreateHandleRequest req = new CreateHandleRequest(handle.getBytes(StandardCharsets.UTF_8), val, auth); @@ -259,7 +259,7 @@ private String getRegistrationUrl(DvObject dvObject) { logger.log(Level.FINE,"getRegistrationUrl"); String siteUrl = SystemConfig.getDataverseSiteUrlStatic(); String targetUrl = siteUrl + dvObject.getTargetUrl() + "hdl:" + dvObject.getAuthority() - + "/" + dvObject.getIdentifier(); + + "/" + dvObject.getIdentifier(); return targetUrl; } @@ -324,12 +324,6 @@ private String getAuthenticationHandle(String handlePrefix) { return "0.NA/" + handlePrefix; } } - - @Override - public boolean alreadyRegistered(DvObject dvObject) { - String handle = getDvObjectHandle(dvObject); - return isHandleRegistered(handle); - } @Override public boolean alreadyRegistered(GlobalId pid, boolean noProviderDefault) throws Exception { @@ -400,6 +394,10 @@ public List getProviderInformation(){ @Override public String createIdentifier(DvObject dvObject) throws Throwable { + if (dvObject.getIdentifier() == null || dvObject.getIdentifier().isEmpty()) { + dvObject = generatePid(dvObject); + logger.fine("generated identifier: " + getIdentifier(dvObject)); + } Throwable result = registerNewHandle(dvObject); if (result != null) throw result;