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 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..d7da92f5dd7 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,13 @@ 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(); + if(comparableShoulder != null) { + comparableShoulder = comparableShoulder.toUpperCase(); + } } // Check authority/identifier if this is a provider that manages specific // identifiers @@ -362,7 +367,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