From 168aa90940837fbfcedcb431156878eb019a52f1 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 13 Aug 2025 13:37:03 -0400 Subject: [PATCH 1/3] Fix Handle case insensitivity broken in 6.5 --- .../dataverse/pidproviders/AbstractPidProvider.java | 5 ++++- .../iq/dataverse/pidproviders/PidUtilTest.java | 12 +++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java index 469b3505165..2f3a3f108fe 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java @@ -343,8 +343,11 @@ public GlobalId parsePersistentId(String protocol, String authority, String iden if (!PidProvider.isValidGlobalId(protocol, authority, identifier)) { return null; } + String comparableShoulder = getShoulder(); + if(isCaseInsensitive) { identifier = identifier.toUpperCase(); + comparableShoulder = comparableShoulder.toUpperCase(); } // Check authority/identifier if this is a provider that manages specific // identifiers @@ -362,7 +365,7 @@ public GlobalId parsePersistentId(String protocol, String authority, String iden logger.fine("managed in " + getId() + ": " + getManagedSet().contains(cleanIdentifier)); logger.fine("excluded from " + getId() + ": " + getExcludedSet().contains(cleanIdentifier)); - if (!(((authority.equals(getAuthority()) && identifier.startsWith(getShoulder().toUpperCase())) + if (!(((authority.equals(getAuthority()) && identifier.startsWith(comparableShoulder)) || getManagedSet().contains(cleanIdentifier)) && !getExcludedSet().contains(cleanIdentifier))) { return null; } diff --git a/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java b/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java index 2058de1d6c2..3f8c198b0fe 100644 --- a/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/pidproviders/PidUtilTest.java @@ -107,7 +107,7 @@ @JvmSetting(key = JvmSettings.PID_PROVIDER_LABEL, value = "HDL 1", varArgs = "hdl1") @JvmSetting(key = JvmSettings.PID_PROVIDER_TYPE, value = HandlePidProvider.TYPE, varArgs = "hdl1") @JvmSetting(key = JvmSettings.PID_PROVIDER_AUTHORITY, value = "20.500.1234", varArgs = "hdl1") -@JvmSetting(key = JvmSettings.PID_PROVIDER_SHOULDER, value = "", varArgs = "hdl1") +@JvmSetting(key = JvmSettings.PID_PROVIDER_SHOULDER, value = "test", varArgs = "hdl1") @JvmSetting(key = JvmSettings.PID_PROVIDER_MANAGED_LIST, value = "hdl:20.20.20/FK2ABCDEF", varArgs ="hdl1") @JvmSetting(key = JvmSettings.HANDLENET_AUTH_HANDLE, value = "20.500.1234/ADMIN", varArgs ="hdl1") @JvmSetting(key = JvmSettings.HANDLENET_INDEPENDENT_SERVICE, value = "true", varArgs ="hdl1") @@ -294,16 +294,22 @@ public void testDOIParsing() throws IOException { @Test public void testHandleParsing() throws IOException { - String pid1String = "hdl:20.500.1234/10052"; + String pid1String = "hdl:20.500.1234/test10052"; GlobalId pid2 = PidUtil.parseAsGlobalID(pid1String); assertEquals(pid1String, pid2.asString()); assertEquals("hdl1", pid2.getProviderId()); - assertEquals("https://hdl.handle.net/" + pid2.getAuthority() + PidUtil.getPidProvider(pid2.getProviderId()).getSeparator() + pid2.getIdentifier(),pid2.asURL()); + assertEquals("https://hdl.handle.net/" + pid2.getAuthority() + PidUtil.getPidProvider(pid2.getProviderId()).getSeparator() + pid2.getIdentifier(), pid2.asURL()); assertEquals("20.500.1234", pid2.getAuthority()); assertEquals(HandlePidProvider.HDL_PROTOCOL, pid2.getProtocol()); GlobalId pid3 = PidUtil.parseAsGlobalID(pid2.asURL()); assertEquals(pid1String, pid3.asString()); assertEquals("hdl1", pid3.getProviderId()); + + // Test case sensitivity - a handle with uppercase "TEST" should not match the hdl1 provider + String pid4String = "hdl:20.500.1234/TEST10052"; + GlobalId pid4 = PidUtil.parseAsGlobalID(pid4String); + assertEquals(pid4String, pid4.asString()); + assertEquals(UnmanagedHandlePidProvider.ID, pid4.getProviderId()); } @Test From eee66d5193b7cab6341af57b9df0e721a872bfe4 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 13 Aug 2025 13:53:48 -0400 Subject: [PATCH 2/3] release note --- doc/release-notes/11592-HandleParsing_fix.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/release-notes/11592-HandleParsing_fix.md diff --git a/doc/release-notes/11592-HandleParsing_fix.md b/doc/release-notes/11592-HandleParsing_fix.md new file mode 100644 index 00000000000..087655d77c4 --- /dev/null +++ b/doc/release-notes/11592-HandleParsing_fix.md @@ -0,0 +1 @@ +A bug introduced in v6.5 broken Handle parsing when using a lower-case shoulder. This is now fixed. \ No newline at end of file From b1ef66b32c815b5107089622d5f65192b7ebc676 Mon Sep 17 00:00:00 2001 From: qqmyers Date: Wed, 27 Aug 2025 17:02:26 -0400 Subject: [PATCH 3/3] handle null shoulder --- .../iq/dataverse/pidproviders/AbstractPidProvider.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java b/src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java index 2f3a3f108fe..d7da92f5dd7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java +++ b/src/main/java/edu/harvard/iq/dataverse/pidproviders/AbstractPidProvider.java @@ -347,7 +347,9 @@ public GlobalId parsePersistentId(String protocol, String authority, String iden if(isCaseInsensitive) { identifier = identifier.toUpperCase(); - comparableShoulder = comparableShoulder.toUpperCase(); + if(comparableShoulder != null) { + comparableShoulder = comparableShoulder.toUpperCase(); + } } // Check authority/identifier if this is a provider that manages specific // identifiers