diff --git a/preston-serve/src/main/java/bio/guoda/preston/server/BadgeServlet.java b/preston-serve/src/main/java/bio/guoda/preston/server/BadgeServlet.java index 2bed5f9a..85c02667 100644 --- a/preston-serve/src/main/java/bio/guoda/preston/server/BadgeServlet.java +++ b/preston-serve/src/main/java/bio/guoda/preston/server/BadgeServlet.java @@ -65,7 +65,7 @@ protected void handleRequest(HttpServletResponse response, response.setStatus(HttpServletResponse.SC_NOT_FOUND); log("found [" + requestedIdIRI.getIRIString() + "] but no associated content"); } else { - populateReponseHeaderWithProvenanceGraphVersion(response, provInfo); + populateReponseHeaderWithProvenanceAnchor(response, getProvenanceId().getIRIString()); renderTemplate( response, URI.create(getResolverEndpoint() + requestedIdIRI.getIRIString()), @@ -76,6 +76,7 @@ protected void handleRequest(HttpServletResponse response, log("did not find origin of [" + requestedIdIRI.getIRIString() + "]"); } } catch (Throwable th) { + populateReponseHeaderWithProvenanceAnchor(response, getProvenanceId().getIRIString()); response.setStatus(HttpServletResponse.SC_NOT_FOUND); log("not found [" + requestedIdIRI.getIRIString() + "]"); try { diff --git a/preston-serve/src/main/java/bio/guoda/preston/server/RedirectingServlet.java b/preston-serve/src/main/java/bio/guoda/preston/server/RedirectingServlet.java index f4585bef..36ae300b 100644 --- a/preston-serve/src/main/java/bio/guoda/preston/server/RedirectingServlet.java +++ b/preston-serve/src/main/java/bio/guoda/preston/server/RedirectingServlet.java @@ -36,6 +36,7 @@ public class RedirectingServlet extends HttpServlet { public static final String DOI = "doi"; public static final String CONTENT_ID = "contentId"; public static final String ACTIVITY = "activity"; + public static final String X_PROV_HAD_PRIMARY_SOURCE = "X-PROV-hadPrimarySource"; @Override public void destroy() { @@ -126,9 +127,11 @@ protected void handleRequest(HttpServletResponse response, populateResponseHeader(response, provInfo); response.setStatus(HttpServletResponse.SC_NOT_FOUND); } else { + populateReponseHeaderWithProvenanceAnchor(response, getProvenanceId().getIRIString()); response.setStatus(HttpServletResponse.SC_NOT_FOUND); } } catch (Throwable th) { + populateReponseHeaderWithProvenanceAnchor(response, getProvenanceId().getIRIString()); response.setStatus(HttpServletResponse.SC_NOT_FOUND); log("not found [" + requestedIdIRI.getIRIString() + "]"); try { @@ -169,11 +172,11 @@ protected void populateResponseHeader(HttpServletResponse response, Map provInfo) { - response.setHeader("X-PROV-hadPrimarySource", provInfo.get(PROVENANCE_ID)); + protected void populateReponseHeaderWithProvenanceAnchor(HttpServletResponse response, String provenanceAnchor) { + response.setHeader(X_PROV_HAD_PRIMARY_SOURCE, provenanceAnchor); } protected URI getResolverURI(String resolverEndpoint, String contentId) { diff --git a/preston-serve/src/test/java/bio/guoda/preston/server/RedirectingServletIT.java b/preston-serve/src/test/java/bio/guoda/preston/server/RedirectingServletIT.java index c69cab79..e3e76969 100644 --- a/preston-serve/src/test/java/bio/guoda/preston/server/RedirectingServletIT.java +++ b/preston-serve/src/test/java/bio/guoda/preston/server/RedirectingServletIT.java @@ -2,7 +2,14 @@ import bio.guoda.preston.MimeTypes; import bio.guoda.preston.RefNodeFactory; +import bio.guoda.preston.ResourcesHTTP; import org.apache.commons.rdf.api.IRI; +import org.apache.http.Header; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.utils.HttpClientUtils; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; import org.hamcrest.core.Is; import org.junit.Test; @@ -18,6 +25,7 @@ import static bio.guoda.preston.server.RedirectingServlet.PROVENANCE_ID; import static bio.guoda.preston.server.RedirectingServlet.SEEN_AT; import static bio.guoda.preston.server.RedirectingServlet.UUID; +import static bio.guoda.preston.server.RedirectingServlet.X_PROV_HAD_PRIMARY_SOURCE; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.CoreMatchers.startsWith; import static org.hamcrest.MatcherAssert.assertThat; @@ -77,6 +85,32 @@ public void dealiasUUID_iDigBio_EML() throws IOException, URISyntaxException { assertThat(contentId.get(CONTENT_TYPE), Is.is("application/eml")); } + @Test + public void dealiasNonExistentUUID_iDigBio_EML() throws IOException, URISyntaxException { + String anchor = "hash://sha256/5b7fa37bf8b64e7c935c4ff3389e36f8dd162f0705410dd719fd089e1ea253cd"; + + CloseableHttpClient build = HttpClientBuilder.create().build(); + String nonExistentUUID = "urn:uuid:c9316f11-d955-4472-a276-6a26a6514599"; + CloseableHttpResponse response = build.execute(new HttpGet("http://localhost:8080/" + nonExistentUUID)); + + Header firstHeader = response.getFirstHeader(X_PROV_HAD_PRIMARY_SOURCE); + assertThat(firstHeader.getName(), Is.is(X_PROV_HAD_PRIMARY_SOURCE)); + assertThat(firstHeader.getValue(), Is.is("urn:uuid:0659a54f-b713-4f86-a917-5be166a14110")); + } + + @Test + public void dealiasBadgeNonExistentUUID_iDigBio_EML() throws IOException, URISyntaxException { + String anchor = "hash://sha256/5b7fa37bf8b64e7c935c4ff3389e36f8dd162f0705410dd719fd089e1ea253cd"; + + CloseableHttpClient build = HttpClientBuilder.create().build(); + String nonExistentUUID = "urn:uuid:c9316f11-d955-4472-a276-6a26a6514599"; + CloseableHttpResponse response = build.execute(new HttpGet("http://localhost:8080/badge/" + nonExistentUUID)); + + Header firstHeader = response.getFirstHeader(X_PROV_HAD_PRIMARY_SOURCE); + assertThat(firstHeader.getName(), Is.is(X_PROV_HAD_PRIMARY_SOURCE)); + assertThat(firstHeader.getValue(), Is.is("urn:uuid:0659a54f-b713-4f86-a917-5be166a14110")); + } + @Test public void dealiasContentIdGBIF() throws IOException, URISyntaxException { Map contentId = ProvUtil.findMostRecentContentId(