Skip to content

Commit f214ee4

Browse files
authored
Merge pull request IQSS#11943 from IQSS/315-fix-handle-to-citation-processing
Add check for findByAltGlobalId when parsing handles
2 parents daa5634 + 24c324c commit f214ee4

File tree

3 files changed

+123
-1
lines changed

3 files changed

+123
-1
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
### Bug Fix
2+
3+
Handles from hdl.handle.net with urls of `/citation` instead of `/dataset.xhtml` were not properly redirecting. This fix adds a lookup for alternate PID so `/citation` endpoint will redirect to `/dataset.xhtml`
4+
5+

src/main/java/edu/harvard/iq/dataverse/CitationServlet.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@ protected void processRequest(HttpServletRequest request, HttpServletResponse re
3838

3939
String persistentId = request.getParameter("persistentId");
4040
if (persistentId != null) {
41-
DvObject dob = dvObjectService.findByGlobalId(PidUtil.parseAsGlobalID(persistentId));
41+
GlobalId globalId = PidUtil.parseAsGlobalID(persistentId);
42+
DvObject dob = dvObjectService.findByGlobalId(globalId);
43+
if (dob == null) {
44+
// try to find with alternative PID
45+
dob = dvObjectService.findByAltGlobalId(globalId, DvObject.DType.Dataset);
46+
}
4247
if (dob != null) {
4348
if (dob instanceof Dataset) {
4449
response.sendRedirect("dataset.xhtml?persistentId=" + persistentId);
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package edu.harvard.iq.dataverse;
2+
3+
import edu.harvard.iq.dataverse.pidproviders.PidProviderFactory;
4+
import edu.harvard.iq.dataverse.pidproviders.PidUtil;
5+
import edu.harvard.iq.dataverse.pidproviders.doi.UnmanagedDOIProvider;
6+
import edu.harvard.iq.dataverse.pidproviders.doi.crossref.CrossRefDOIProvider;
7+
import edu.harvard.iq.dataverse.pidproviders.doi.datacite.DataCiteDOIProvider;
8+
import edu.harvard.iq.dataverse.pidproviders.doi.ezid.EZIdDOIProvider;
9+
import edu.harvard.iq.dataverse.pidproviders.doi.fake.FakeDOIProvider;
10+
import edu.harvard.iq.dataverse.pidproviders.doi.fake.FakeProviderFactory;
11+
import edu.harvard.iq.dataverse.pidproviders.handle.HandlePidProvider;
12+
import edu.harvard.iq.dataverse.pidproviders.handle.HandleProviderFactory;
13+
import edu.harvard.iq.dataverse.pidproviders.handle.UnmanagedHandlePidProvider;
14+
import edu.harvard.iq.dataverse.pidproviders.perma.PermaLinkPidProvider;
15+
import edu.harvard.iq.dataverse.pidproviders.perma.UnmanagedPermaLinkPidProvider;
16+
import edu.harvard.iq.dataverse.settings.JvmSettings;
17+
import edu.harvard.iq.dataverse.util.testing.JvmSetting;
18+
import edu.harvard.iq.dataverse.util.testing.LocalJvmSettings;
19+
import jakarta.servlet.ServletException;
20+
import jakarta.servlet.http.HttpServletRequest;
21+
import jakarta.servlet.http.HttpServletResponse;
22+
import org.junit.jupiter.api.AfterAll;
23+
import org.junit.jupiter.api.BeforeAll;
24+
import org.junit.jupiter.api.BeforeEach;
25+
import org.junit.jupiter.api.Test;
26+
import org.junit.jupiter.api.extension.ExtendWith;
27+
import org.mockito.ArgumentCaptor;
28+
import org.mockito.Mock;
29+
import org.mockito.Mockito;
30+
import org.mockito.MockitoAnnotations;
31+
import org.mockito.junit.jupiter.MockitoExtension;
32+
33+
import java.io.IOException;
34+
import java.util.*;
35+
36+
import static org.junit.jupiter.api.Assertions.assertEquals;
37+
import static org.mockito.ArgumentMatchers.any;
38+
import static org.mockito.Mockito.*;
39+
40+
@ExtendWith(MockitoExtension.class)
41+
@LocalJvmSettings
42+
43+
//HANDLE 1
44+
@JvmSetting(key = JvmSettings.PID_PROVIDER_LABEL, value = "HDL 1", varArgs = "hdl1")
45+
@JvmSetting(key = JvmSettings.PID_PROVIDER_TYPE, value = HandlePidProvider.TYPE, varArgs = "hdl1")
46+
@JvmSetting(key = JvmSettings.PID_PROVIDER_AUTHORITY, value = "20.500.1234", varArgs = "hdl1")
47+
@JvmSetting(key = JvmSettings.PID_PROVIDER_SHOULDER, value = "test", varArgs = "hdl1")
48+
@JvmSetting(key = JvmSettings.PID_PROVIDER_MANAGED_LIST, value = "hdl:20.20.20/FK2ABCDEF", varArgs ="hdl1")
49+
@JvmSetting(key = JvmSettings.HANDLENET_AUTH_HANDLE, value = "20.500.1234/ADMIN", varArgs ="hdl1")
50+
@JvmSetting(key = JvmSettings.HANDLENET_INDEPENDENT_SERVICE, value = "true", varArgs ="hdl1")
51+
@JvmSetting(key = JvmSettings.HANDLENET_INDEX, value = "1", varArgs ="hdl1")
52+
@JvmSetting(key = JvmSettings.HANDLENET_KEY_PASSPHRASE, value = "passphrase", varArgs ="hdl1")
53+
@JvmSetting(key = JvmSettings.HANDLENET_KEY_PATH, value = "/tmp/cred", varArgs ="hdl1")
54+
//List to instantiate
55+
@JvmSetting(key = JvmSettings.PID_PROVIDERS, value = "hdl1")
56+
57+
public class CitationServletTest {
58+
59+
@Mock
60+
DvObjectServiceBean dvObjectService;
61+
@Mock
62+
HttpServletRequest request;
63+
@Mock
64+
HttpServletResponse response;
65+
66+
67+
static CitationServlet citationServlet = new CitationServlet();
68+
69+
@BeforeAll
70+
public static void setUp() {
71+
Map<String, PidProviderFactory> pidProviderFactoryMap = new HashMap<>();
72+
pidProviderFactoryMap.put(HandlePidProvider.TYPE, new HandleProviderFactory());
73+
74+
PidUtil.clearPidProviders();
75+
76+
//Read list of providers to add
77+
List<String> providers = Arrays.asList(JvmSettings.PID_PROVIDERS.lookup().split(",\\s"));
78+
//Iterate through the list of providers and add them using the PidProviderFactory of the appropriate type
79+
for (String providerId : providers) {
80+
System.out.println("Loading provider: " + providerId);
81+
String type = JvmSettings.PID_PROVIDER_TYPE.lookup(providerId);
82+
PidProviderFactory factory = pidProviderFactoryMap.get(type);
83+
PidUtil.addToProviderList(factory.createPidProvider(providerId));
84+
}
85+
PidUtil.addAllToUnmanagedProviderList(Arrays.asList(new UnmanagedDOIProvider(),
86+
new UnmanagedHandlePidProvider(), new UnmanagedPermaLinkPidProvider()));
87+
}
88+
@BeforeEach
89+
public void initMocks() {
90+
MockitoAnnotations.initMocks(this);
91+
}
92+
93+
@AfterAll
94+
public static void tearDownClass() throws Exception {
95+
PidUtil.clearPidProviders();
96+
}
97+
98+
@Test
99+
public void testHandleRedirect() throws ServletException, IOException {
100+
String pidString = "hdl:1902.1/test10052";
101+
DvObject dvObj = new Dataset();
102+
citationServlet.dvObjectService = dvObjectService = Mockito.mock(DvObjectServiceBean.class);
103+
when(dvObjectService.findByGlobalId(any(GlobalId.class))).thenReturn(null);
104+
when(dvObjectService.findByAltGlobalId(any(GlobalId.class), any())).thenReturn(dvObj);
105+
when(request.getParameter("persistentId")).thenReturn(pidString);
106+
ArgumentCaptor<String> valueCapture = ArgumentCaptor.forClass(String.class);
107+
doNothing().when(response).sendRedirect(valueCapture.capture());
108+
109+
citationServlet.doGet(request, response);
110+
assertEquals("dataset.xhtml?persistentId=hdl:1902.1/test10052", valueCapture.getValue());
111+
}
112+
}

0 commit comments

Comments
 (0)