From 3ad67c8cb8a1eb2a5a92a2a1d218d75d9a4328f8 Mon Sep 17 00:00:00 2001 From: Aaron Coburn Date: Fri, 2 Jan 2015 14:08:51 -0500 Subject: [PATCH] Add support for prefer headers along with unit and integration tests Resolves: https://jira.duraspace.org/browse/FCREPO-1273 --- README.md | 29 +- pom.xml | 16 +- .../java/org/fcrepo/camel/FcrepoClient.java | 6 +- .../java/org/fcrepo/camel/FcrepoEndpoint.java | 38 +++ .../java/org/fcrepo/camel/FcrepoHeaders.java | 8 +- .../java/org/fcrepo/camel/FcrepoProducer.java | 72 ++++- .../java/org/fcrepo/camel/RdfNamespaces.java | 12 + .../fcrepo/camel/FcrepoClientAuthTest.java | 6 +- .../fcrepo/camel/FcrepoClientErrorTest.java | 4 +- .../org/fcrepo/camel/FcrepoClientTest.java | 10 +- .../org/fcrepo/camel/FcrepoConstantsTest.java | 7 +- .../org/fcrepo/camel/FcrepoEndpointTest.java | 33 +++ .../org/fcrepo/camel/FcrepoProducerTest.java | 151 ++++++++++- .../camel/integration/FcrepoConstantsIT.java | 3 + .../integration/FcrepoContainerPreferIT.java | 249 ++++++++++++++++++ .../camel/integration/FcrepoSparqlIT.java | 7 +- 16 files changed, 604 insertions(+), 47 deletions(-) create mode 100644 src/test/java/org/fcrepo/camel/integration/FcrepoContainerPreferIT.java diff --git a/README.md b/README.md index af02433..a5129c7 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Fcrepo Component The **fcrepo:** component provides access to an external [Fedora4](http://fcrepo.org) Object -[API](https://wiki.duraspace.org/display/FF/RESTful+HTTP+API+-+Containers) +[API](https://wiki.duraspace.org/display/FEDORA40/RESTful+HTTP+API+-+Containers) for use with [Apache Camel](https://camel.apache.org). [![Build Status](https://travis-ci.org/fcrepo4-labs/fcrepo-camel.png?branch=master)](https://travis-ci.org/fcrepo4-labs/fcrepo-camel) @@ -25,15 +25,16 @@ FcrepoEndpoint options | `accept` | `null` | Set the `Accept` header for content negotiation | | `metadata` | `true` | Whether GET requests should retrieve RDF descriptions of non-RDF content | | `transform` | `null` | If set, this defines the transform used for the given object. This should be used in the context of GET or POST. For GET requests, the value should be the name of the transform (e.g. `default`). For POST requests, the value can simply be `true`. Using this causes the `Accept` header to be set as `application/json`. | +| `preferOmit` | `null` | If set, this populates the `Prefer:` HTTP header with omitted values. For single values, the standard [LDP values](http://www.w3.org/TR/ldp/#prefer-parameters) and the corresponding [Fcrepo extensions](https://wiki.duraspace.org/display/FEDORA40/RESTful+HTTP+API+-+Containers#RESTfulHTTPAPI-Containers-GETRetrievethecontentoftheresource) can be provided in short form (without the namespace). | +| `preferInclude` | `null` | If set, this populates the `Prefer:` HTTP header with included values. For single values, the standard [LDP values](http://www.w3.org/TR/ldp/#prefer-parameters) and the corresponding [Fcrepo extensions](https://wiki.duraspace.org/display/FEDORA40/RESTful+HTTP+API+-+Containers#RESTfulHTTPAPI-Containers-GETRetrievethecontentoftheresource) can be provided in short form (without the namespace). | | `throwExceptionOnFailure` | `true` | Option to disable throwing the HttpOperationFailedException in case of failed responses from the remote server. This allows you to get all responses regardless of the HTTP status code. | - Examples -------- A simple example for sending messages to an external Solr service: - XPathBuilder xpath = new XPathBuilder("/rdf:RDF/rdf:Description/rdf:type[@rdf:resource='http://fedora.info/definitions/v4/repository#Indexable']"); + XPathBuilder xpath = new XPathBuilder("/rdf:RDF/rdf:Description/rdf:type[@rdf:resource='http://fedora.info/definitions/v4/indexing#indexable']"); xpath.namespace("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); from("activemq:topic:fedora") @@ -48,7 +49,7 @@ Or, using the Spring DSL: - /rdf:RDF/rdf:Description/rdf:type[@rdf:resource='http://fedora.info/definitions/v4/repository#Indexable'] + /rdf:RDF/rdf:Description/rdf:type[@rdf:resource='http://fedora.info/definitions/v4/indexing#indexable'] @@ -73,11 +74,23 @@ Message headers | `Exchange.HTTP_METHOD` | `String` | The HTTP method to use | | `Exchange.CONTENT_TYPE` | `String` | The ContentType of the resource. This sets the `Content-Type` header, but this value can be overridden directly on the endpoint. | | `Exchange.ACCEPT_CONTENT_TYPE` | `String` | This sets the `Accept` header, but this value can be overridden directly on the endpoint. | -| `FCREPO_IDENTIFIER` | `String` | The resource path, appended to the endpoint uri. | -| `FCREPO_BASE_URL` | `String` | The base url used for accessing Fedora. | -| `FCREPO_TRANSFORM` | `String` | The named `fcr:transform` method to use. This value overrides any value set explicitly on the endpoint. | +| `FcrepoHeaders.FCREPO_PREFER` | `String` | This sets the `Prefer` header on a repository request. The full header value should be declared here, and it will override any value set directly on an endpoint. | +| `FcrepoHeaders.FCREPO_IDENTIFIER` | `String` | The resource path, appended to the endpoint uri. | +| `FcrepoHeaders.FCREPO_BASE_URL` | `String` | The base url used for accessing Fedora. | +| `FcrepoHeaders.FCREPO_TRANSFORM` | `String` | The named `fcr:transform` method to use. This value overrides any value set explicitly on the endpoint. | + +The `fcrepo` component will also accept message headers produced directly by fedora, particularly the `org.fcrepo.jms.identifier` header. It will use that header only when `CamelFcrepoIdentifier` is not defined. + +If these headers are used with the Spring DSL or with the Simple language, the header values can be used directly with the following values: + +| Name | Value | +| ------- | ----- | +| `FcrepoHeaders.FCREPO_BASE_URL` | `CamelFcrepoBaseUrl` | +| `FcrepoHeaders.FCREPO_IDENTIFIER` | `CamelFcrepoIdentifier` | +| `FcrepoHeaders.FCREPO_TRANSFORM` | `CamelFcrepoTransform` | +| `FcrepoHeaders.FCREPO_PREFER` | `CamelFcrepoPrefer` | -The `fcrepo` component will also accept message headers produced directly by fedora, particularly the `org.fcrepo.jms.identifier` header. It will use that header only when `FEDORA_IDENTIFIER` is not defined. +These headers can be removed as a group like this in the Java DSL: `removeHeaders("CamelFcrepo*")` Message body ------------ diff --git a/pom.xml b/pom.xml index 56c9d74..64b71ae 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,7 @@ 0.11 0.12 0.14 + 18.0 2.12.1 @@ -141,6 +142,12 @@ ${commons.io.version} + + com.google.guava + guava + ${guava.version} + + javax.ws.rs javax.ws.rs-api @@ -615,8 +622,15 @@ ${project.artifactId} + org.fcrepo.camel;version=${project.version}, + org.fcrepo.camel.processor;version=${project.version} + + + com.google.common.*, + com.google.thirdparty.publicsuffix.*, com.hp.hpl.jena.*, com.ibm.icu.*, + javax.ws.rs.*, org.apache.clerezza.rdf.*, org.apache.clerezza.utils.*, org.apache.commons.codec.*, @@ -624,7 +638,7 @@ org.apache.jena.*, org.osgi.service.component, org.wymiwyg.commons.util.*, - + diff --git a/src/main/java/org/fcrepo/camel/FcrepoClient.java b/src/main/java/org/fcrepo/camel/FcrepoClient.java index 8fa80e7..025d0e8 100644 --- a/src/main/java/org/fcrepo/camel/FcrepoClient.java +++ b/src/main/java/org/fcrepo/camel/FcrepoClient.java @@ -235,7 +235,7 @@ public FcrepoResponse delete(final URI url) * @param url the URL of the resource to fetch * @param accept the requested MIMEType of the resource to be retrieved */ - public FcrepoResponse get(final URI url, final String accept) + public FcrepoResponse get(final URI url, final String accept, final String prefer) throws IOException, HttpOperationFailedException { final HttpGet request = new HttpGet(url); @@ -244,6 +244,10 @@ public FcrepoResponse get(final URI url, final String accept) request.setHeader("Accept", accept); } + if (prefer != null) { + request.setHeader("Prefer", prefer); + } + final HttpResponse response = httpclient.execute(request); final int status = response.getStatusLine().getStatusCode(); final String contentType = getContentTypeHeader(response); diff --git a/src/main/java/org/fcrepo/camel/FcrepoEndpoint.java b/src/main/java/org/fcrepo/camel/FcrepoEndpoint.java index 5484106..a64a58d 100644 --- a/src/main/java/org/fcrepo/camel/FcrepoEndpoint.java +++ b/src/main/java/org/fcrepo/camel/FcrepoEndpoint.java @@ -63,6 +63,12 @@ public class FcrepoEndpoint extends DefaultEndpoint { @UriParam private Boolean throwExceptionOnFailure = true; + @UriParam + private String preferInclude = null; + + @UriParam + private String preferOmit = null; + /** * Create a FcrepoEndpoint with a uri, path and component * @param uri the endpoint uri (without path values) @@ -265,4 +271,36 @@ public void setTombstone(final Boolean tombstone) { public Boolean getTombstone() { return tombstone; } + + /** + * preferInclude setter + */ + @ManagedAttribute(description = "Whether to include a Prefer: return=representation; include=\"URI\" header") + public void setPreferInclude(final String include) { + this.preferInclude = include; + } + + /** + * preferOmit getter + */ + @ManagedAttribute(description = "Whether to include a Prefer: return=representation; include=\"URI\" header") + public String getPreferInclude() { + return preferInclude; + } + + /** + * preferOmit setter + */ + @ManagedAttribute(description = "Whether to include a Prefer: return=representation; omit=\"URI\" header") + public void setPreferOmit(final String omit) { + this.preferOmit = omit; + } + + /** + * preferOmit getter + */ + @ManagedAttribute(description = "Whether to include a Prefer: return=representation; omit=\"URI\" header") + public String getPreferOmit() { + return preferOmit; + } } diff --git a/src/main/java/org/fcrepo/camel/FcrepoHeaders.java b/src/main/java/org/fcrepo/camel/FcrepoHeaders.java index f1e0223..909b576 100644 --- a/src/main/java/org/fcrepo/camel/FcrepoHeaders.java +++ b/src/main/java/org/fcrepo/camel/FcrepoHeaders.java @@ -20,11 +20,13 @@ */ public final class FcrepoHeaders { - public static final String FCREPO_BASE_URL = "FCREPO_BASE_URL"; + public static final String FCREPO_BASE_URL = "CamelFcrepoBaseUrl"; - public static final String FCREPO_IDENTIFIER = "FCREPO_IDENTIFIER"; + public static final String FCREPO_IDENTIFIER = "CamelFcrepoIdentifier"; - public static final String FCREPO_TRANSFORM = "FCREPO_TRANSFORM"; + public static final String FCREPO_TRANSFORM = "CamelFcrepoTransform"; + + public static final String FCREPO_PREFER = "CamelFcrepoPrefer"; private FcrepoHeaders() { // prevent instantiation diff --git a/src/main/java/org/fcrepo/camel/FcrepoProducer.java b/src/main/java/org/fcrepo/camel/FcrepoProducer.java index 250437b..004ea4f 100644 --- a/src/main/java/org/fcrepo/camel/FcrepoProducer.java +++ b/src/main/java/org/fcrepo/camel/FcrepoProducer.java @@ -77,6 +77,7 @@ public void process(final Exchange exchange) throws HttpOperationFailedException final String contentType = getContentType(exchange); final String accept = getAccept(exchange); final String url = getUrl(exchange); + final String prefer = getPrefer(exchange); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Fcrepo Request [{}] with method [{}]", url, method); @@ -107,7 +108,7 @@ public void process(final Exchange exchange) throws HttpOperationFailedException break; case GET: default: - response = client.get(endpoint.getMetadata() ? getMetadataUri(url) : URI.create(url), accept); + response = client.get(endpoint.getMetadata() ? getMetadataUri(url) : URI.create(url), accept, prefer); exchange.getIn().setBody(extractResponseBodyAsStream(response.getBody(), exchange)); } exchange.getIn().setHeader(Exchange.CONTENT_TYPE, response.getContentType()); @@ -115,9 +116,9 @@ public void process(final Exchange exchange) throws HttpOperationFailedException } /** - * + * Retrieve the resource location from a HEAD request. */ - protected URI getMetadataUri(final String url) + private URI getMetadataUri(final String url) throws HttpOperationFailedException, IOException { final FcrepoResponse headResponse = client.head(URI.create(url)); if (headResponse.getLocation() != null) { @@ -134,7 +135,7 @@ protected URI getMetadataUri(final String url) * * @param exchange the incoming message exchange */ - protected HttpMethods getMethod(final Exchange exchange) { + private HttpMethods getMethod(final Exchange exchange) { final HttpMethods method = exchange.getIn().getHeader(Exchange.HTTP_METHOD, HttpMethods.class); if (method == null) { return HttpMethods.GET; @@ -149,7 +150,7 @@ protected HttpMethods getMethod(final Exchange exchange) { * * @param exchange the incoming message exchange */ - protected String getContentType(final Exchange exchange) { + private String getContentType(final Exchange exchange) { final String contentTypeString = ExchangeHelper.getContentType(exchange); if (!isBlank(endpoint.getContentType())) { return endpoint.getContentType(); @@ -168,7 +169,7 @@ protected String getContentType(final Exchange exchange) { * * @param exchange the incoming message exchange */ - protected String getAccept(final Exchange exchange) { + private String getAccept(final Exchange exchange) { final Message in = exchange.getIn(); final String fcrepoTransform = in.getHeader(FcrepoHeaders.FCREPO_TRANSFORM, String.class); @@ -192,21 +193,23 @@ protected String getAccept(final Exchange exchange) { * * @param exchange the incoming message exchange */ - protected String getUrl(final Exchange exchange) { + private String getUrl(final Exchange exchange) { final Message in = exchange.getIn(); - final HttpMethods method = exchange.getIn().getHeader(Exchange.HTTP_METHOD, HttpMethods.class); + final HttpMethods method = getMethod(exchange); final URI baseUri = URI.create(endpoint.getBaseUrl()); final String fcrepoTransform = in.getHeader(FcrepoHeaders.FCREPO_TRANSFORM, String.class); final StringBuilder url = new StringBuilder("http://" + baseUri); + if (!isBlank(in.getHeader(FcrepoHeaders.FCREPO_IDENTIFIER, String.class))) { url.append(in.getHeader(FcrepoHeaders.FCREPO_IDENTIFIER, String.class)); } else if (!isBlank(in.getHeader(JmsHeaders.IDENTIFIER, String.class))) { url.append(in.getHeader(JmsHeaders.IDENTIFIER, String.class)); } + if (!isBlank(endpoint.getTransform()) || !isBlank(fcrepoTransform)) { if (method == HttpMethods.POST) { url.append("/fcr:transform"); - } else if (method == null || method == HttpMethods.GET) { + } else if (method == HttpMethods.GET) { if (!isBlank(fcrepoTransform)) { url.append("/fcr:transform/" + fcrepoTransform); } else { @@ -216,9 +219,60 @@ protected String getUrl(final Exchange exchange) { } else if (method == HttpMethods.DELETE && endpoint.getTombstone()) { url.append("/fcr:tombstone"); } + return url.toString(); } + /** + * Given an exchange, extract the Prefer headers, if any. + * + * @param exchange the incoming message exchange + */ + private String getPrefer(final Exchange exchange) { + final Message in = exchange.getIn(); + + if (getMethod(exchange) == HttpMethods.GET) { + if (!isBlank(in.getHeader(FcrepoHeaders.FCREPO_PREFER, String.class))) { + return in.getHeader(FcrepoHeaders.FCREPO_PREFER, String.class); + } else { + return buildPreferHeader(endpoint.getPreferInclude(), endpoint.getPreferOmit()); + } + } else { + return null; + } + } + + /** + * Build the prefer header from include and/or omit endpoint values + */ + private String buildPreferHeader(final String include, final String omit) { + if (isBlank(include) && isBlank(omit)) { + return null; + } else { + String prefer = "return=representation;"; + if (!isBlank(include)) { + prefer += " include=\"" + addPreferNamespace(include) + "\";"; + } + if (!isBlank(omit)) { + prefer += " omit=\"" + addPreferNamespace(omit) + "\";"; + } + return prefer; + } + } + + /** + * Add the appropriate namespace to the prefer header in case the + * short form was supplied. + */ + private String addPreferNamespace(final String property) { + final String prefer = RdfNamespaces.PREFER_PROPERTIES.get(property); + if (!isBlank(prefer)) { + return prefer; + } else { + return property; + } + } + private static InputStream extractResponseBodyAsStream(final InputStream is, final Exchange exchange) throws IOException { // As httpclient is using a AutoCloseInputStream, it will be closed when the connection is closed diff --git a/src/main/java/org/fcrepo/camel/RdfNamespaces.java b/src/main/java/org/fcrepo/camel/RdfNamespaces.java index e626ceb..84f307a 100644 --- a/src/main/java/org/fcrepo/camel/RdfNamespaces.java +++ b/src/main/java/org/fcrepo/camel/RdfNamespaces.java @@ -16,6 +16,10 @@ package org.fcrepo.camel; +import com.google.common.collect.ImmutableMap; + +import java.util.Map; + /** * @author acoburn */ @@ -29,6 +33,14 @@ public final class RdfNamespaces { public static final String LDP = "http://www.w3.org/ns/ldp#"; + public static final Map PREFER_PROPERTIES = ImmutableMap.builder() + .put("PreferContainment", LDP + "PreferContainment") + .put("PreferMembership", LDP + "PreferMembership") + .put("PreferMinimalContainer", LDP + "PreferMinimalContainer") + .put("ServerManaged", REPOSITORY + "ServerManaged") + .put("EmbedResources", REPOSITORY + "EmbedResources") + .put("InboundReferences", REPOSITORY + "InboundReferences").build(); + private RdfNamespaces() { // Prevent instantiation } diff --git a/src/test/java/org/fcrepo/camel/FcrepoClientAuthTest.java b/src/test/java/org/fcrepo/camel/FcrepoClientAuthTest.java index cf40fd8..d0af9a6 100644 --- a/src/test/java/org/fcrepo/camel/FcrepoClientAuthTest.java +++ b/src/test/java/org/fcrepo/camel/FcrepoClientAuthTest.java @@ -70,7 +70,7 @@ public void testAuthNoHost() throws IOException, HttpOperationFailedException { entity.setContentType(RDF_XML); doSetupMockRequest(RDF_XML, entity, status); - final FcrepoResponse response = testClient.get(uri, RDF_XML); + final FcrepoResponse response = testClient.get(uri, RDF_XML, null); assertEquals(response.getUrl(), uri); assertEquals(response.getStatusCode(), status); @@ -90,7 +90,7 @@ public void testAuthWithHost() throws IOException, HttpOperationFailedException entity.setContentType(RDF_XML); doSetupMockRequest(RDF_XML, entity, status); - final FcrepoResponse response = testClient.get(uri, RDF_XML); + final FcrepoResponse response = testClient.get(uri, RDF_XML, null); assertEquals(response.getUrl(), uri); assertEquals(response.getStatusCode(), status); @@ -110,7 +110,7 @@ public void testAuthNoPassword() throws IOException, HttpOperationFailedExceptio entity.setContentType(RDF_XML); doSetupMockRequest(RDF_XML, entity, status); - final FcrepoResponse response = testClient.get(uri, RDF_XML); + final FcrepoResponse response = testClient.get(uri, RDF_XML, null); assertEquals(response.getUrl(), uri); assertEquals(response.getStatusCode(), status); diff --git a/src/test/java/org/fcrepo/camel/FcrepoClientErrorTest.java b/src/test/java/org/fcrepo/camel/FcrepoClientErrorTest.java index ba9020a..9e87d5c 100644 --- a/src/test/java/org/fcrepo/camel/FcrepoClientErrorTest.java +++ b/src/test/java/org/fcrepo/camel/FcrepoClientErrorTest.java @@ -80,7 +80,7 @@ public void testGet() throws IOException, HttpOperationFailedException { entity.setContentType(RDF_XML); doSetupMockRequest(RDF_XML, entity, status); - final FcrepoResponse response = testClient.get(uri, RDF_XML); + final FcrepoResponse response = testClient.get(uri, RDF_XML, null); assertEquals(response.getUrl(), uri); assertEquals(response.getStatusCode(), status); @@ -98,7 +98,7 @@ public void testGetError() throws Exception { entity.setContentType(RDF_XML); doSetupMockRequest(RDF_XML, entity, status); - final FcrepoResponse response = testClient.get(uri, RDF_XML); + final FcrepoResponse response = testClient.get(uri, RDF_XML, "return=representation;"); assertEquals(response.getUrl(), uri); assertEquals(response.getStatusCode(), status); diff --git a/src/test/java/org/fcrepo/camel/FcrepoClientTest.java b/src/test/java/org/fcrepo/camel/FcrepoClientTest.java index 37c05a1..b728ae8 100644 --- a/src/test/java/org/fcrepo/camel/FcrepoClientTest.java +++ b/src/test/java/org/fcrepo/camel/FcrepoClientTest.java @@ -80,7 +80,7 @@ public void testGet() throws IOException, HttpOperationFailedException { doSetupMockRequest(RDF_XML, entity, status); - final FcrepoResponse response = testClient.get(uri, RDF_XML); + final FcrepoResponse response = testClient.get(uri, RDF_XML, "return=minimal"); assertEquals(response.getUrl(), uri); assertEquals(response.getStatusCode(), status); @@ -97,7 +97,7 @@ public void testGetError() throws Exception { entity.setContentType(RDF_XML); doSetupMockRequest(RDF_XML, entity, status); - testClient.get(uri, RDF_XML); + testClient.get(uri, RDF_XML, "return=representation"); } @Test (expected = HttpOperationFailedException.class) @@ -108,7 +108,7 @@ public void testGet100() throws Exception { entity.setContentType(RDF_XML); doSetupMockRequest(RDF_XML, entity, status); - testClient.get(uri, RDF_XML); + testClient.get(uri, RDF_XML, null); } @Test @@ -122,7 +122,7 @@ public void testGet300() throws Exception { when(mockResponse.getHeaders("Link")).thenReturn(headers); - final FcrepoResponse response = testClient.get(uri, RDF_XML); + final FcrepoResponse response = testClient.get(uri, RDF_XML, null); assertEquals(response.getUrl(), uri); assertEquals(response.getStatusCode(), status); @@ -138,7 +138,7 @@ public void testGetNoAccept() throws Exception { doSetupMockRequest(RDF_XML, null, status); - final FcrepoResponse response = testClient.get(uri, null); + final FcrepoResponse response = testClient.get(uri, null, null); assertEquals(response.getUrl(), uri); assertEquals(response.getStatusCode(), status); diff --git a/src/test/java/org/fcrepo/camel/FcrepoConstantsTest.java b/src/test/java/org/fcrepo/camel/FcrepoConstantsTest.java index fc62e5b..fae446c 100644 --- a/src/test/java/org/fcrepo/camel/FcrepoConstantsTest.java +++ b/src/test/java/org/fcrepo/camel/FcrepoConstantsTest.java @@ -44,9 +44,10 @@ public void testConstants() { @Test public void testFcrepoHeaders() { - assertEquals(FcrepoHeaders.FCREPO_BASE_URL, "FCREPO_BASE_URL"); - assertEquals(FcrepoHeaders.FCREPO_IDENTIFIER, "FCREPO_IDENTIFIER"); - assertEquals(FcrepoHeaders.FCREPO_TRANSFORM, "FCREPO_TRANSFORM"); + assertEquals(FcrepoHeaders.FCREPO_BASE_URL, "CamelFcrepoBaseUrl"); + assertEquals(FcrepoHeaders.FCREPO_IDENTIFIER, "CamelFcrepoIdentifier"); + assertEquals(FcrepoHeaders.FCREPO_TRANSFORM, "CamelFcrepoTransform"); + assertEquals(FcrepoHeaders.FCREPO_PREFER, "CamelFcrepoPrefer"); } @Test diff --git a/src/test/java/org/fcrepo/camel/FcrepoEndpointTest.java b/src/test/java/org/fcrepo/camel/FcrepoEndpointTest.java index 6616b55..bda1918 100644 --- a/src/test/java/org/fcrepo/camel/FcrepoEndpointTest.java +++ b/src/test/java/org/fcrepo/camel/FcrepoEndpointTest.java @@ -157,6 +157,39 @@ public void testContentType() { assertEquals(contentType4, testEndpoint.getContentType()); } + @Test + public void testPreferOmit() { + final FcrepoEndpoint testEndpoint = new FcrepoEndpoint(FCREPO_URI, FCREPO_PATH, mockContext); + final String omit1 = "PreferContainment"; + final String omit2 = "http://www.w3.org/ns/ldp#PreferMembership"; + final String omit3 = "http://www.w3.org/ns/ldp#PreferMinimalContainer " + + "http://www.w3.org/ns/ldp#PreferContainment"; + assertEquals(null, testEndpoint.getPreferOmit()); + testEndpoint.setPreferOmit(omit1); + assertEquals(omit1, testEndpoint.getPreferOmit()); + testEndpoint.setPreferOmit(omit2); + assertEquals(omit2, testEndpoint.getPreferOmit()); + testEndpoint.setPreferOmit(omit3); + assertEquals(omit3, testEndpoint.getPreferOmit()); + } + + @Test + public void testPreferInclude() { + final FcrepoEndpoint testEndpoint = new FcrepoEndpoint(FCREPO_URI, FCREPO_PATH, mockContext); + final String include1 = "PreferContainment"; + final String include2 = "http://www.w3.org/ns/ldp#PreferMembership"; + final String include3 = "http://www.w3.org/ns/ldp#PreferMinimalContainer " + + "http://www.w3.org/ns/ldp#PreferContainment"; + assertEquals(null, testEndpoint.getPreferInclude()); + testEndpoint.setPreferInclude(include1); + assertEquals(include1, testEndpoint.getPreferInclude()); + testEndpoint.setPreferInclude(include2); + assertEquals(include2, testEndpoint.getPreferInclude()); + testEndpoint.setPreferInclude(include3); + assertEquals(include3, testEndpoint.getPreferInclude()); + } + + @Test public void testSingleton() { final FcrepoEndpoint testEndpoint = new FcrepoEndpoint(FCREPO_URI, FCREPO_PATH, mockContext); diff --git a/src/test/java/org/fcrepo/camel/FcrepoProducerTest.java b/src/test/java/org/fcrepo/camel/FcrepoProducerTest.java index bc1885b..095eb56 100644 --- a/src/test/java/org/fcrepo/camel/FcrepoProducerTest.java +++ b/src/test/java/org/fcrepo/camel/FcrepoProducerTest.java @@ -80,7 +80,7 @@ public void testGetProducer() throws Exception { testExchange.getIn().setHeader(FcrepoHeaders.FCREPO_IDENTIFIER, "/foo"); when(mockClient.head(any(URI.class))).thenReturn(headResponse); - when(mockClient.get(any(URI.class), eq(TestUtils.RDF_XML))).thenReturn(getResponse); + when(mockClient.get(any(URI.class), eq(TestUtils.RDF_XML), any(String.class))).thenReturn(getResponse); testProducer.process(testExchange); @@ -102,7 +102,123 @@ public void testGetAcceptHeaderProducer() throws Exception { testExchange.getIn().setHeader("Accept", TestUtils.N_TRIPLES); when(mockClient.head(any(URI.class))).thenReturn(headResponse); - when(mockClient.get(any(URI.class), eq(TestUtils.N_TRIPLES))).thenReturn(getResponse); + when(mockClient.get(any(URI.class), eq(TestUtils.N_TRIPLES), any(String.class))).thenReturn(getResponse); + + testProducer.process(testExchange); + + assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfTriples); + assertEquals(testExchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class), TestUtils.N_TRIPLES); + } + + @Test + public void testGetPreferHeaderProducer() throws Exception { + final URI uri = create(TestUtils.baseUrl); + final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfTriples.getBytes()); + final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, null, null, null); + final FcrepoResponse getResponse = new FcrepoResponse(uri, 200, TestUtils.N_TRIPLES, null, body); + final String prefer = "return=representation; omit=\"http://www.w3.org/ns/ldp#PreferContainment\";"; + + init(); + + testExchange.getIn().setHeader(FcrepoHeaders.FCREPO_IDENTIFIER, "/foo"); + testExchange.getIn().setHeader(FcrepoHeaders.FCREPO_PREFER, prefer); + + when(mockClient.head(any(URI.class))).thenReturn(headResponse); + when(mockClient.get(any(URI.class), any(String.class), eq(prefer))).thenReturn(getResponse); + + testProducer.process(testExchange); + + assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfTriples); + assertEquals(testExchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class), TestUtils.N_TRIPLES); + } + + @Test + public void testGetPreferIncludeLongEndpointProducer() throws Exception { + final URI uri = create(TestUtils.baseUrl); + final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfTriples.getBytes()); + final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, null, null, null); + final FcrepoResponse getResponse = new FcrepoResponse(uri, 200, TestUtils.N_TRIPLES, null, body); + final String prefer = "return=representation; " + + "include=\"http://fedora.info/definitions/v4/repository#ServerManaged\";"; + + testEndpoint.setPreferInclude("http://fedora.info/definitions/v4/repository#ServerManaged"); + + init(); + + testExchange.getIn().setHeader(FcrepoHeaders.FCREPO_IDENTIFIER, "/foo"); + + when(mockClient.head(any(URI.class))).thenReturn(headResponse); + when(mockClient.get(any(URI.class), any(String.class), eq(prefer))).thenReturn(getResponse); + + testProducer.process(testExchange); + + assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfTriples); + assertEquals(testExchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class), TestUtils.N_TRIPLES); + } + + @Test + public void testGetPreferIncludeShortEndpointProducer() throws Exception { + final URI uri = create(TestUtils.baseUrl); + final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfTriples.getBytes()); + final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, null, null, null); + final FcrepoResponse getResponse = new FcrepoResponse(uri, 200, TestUtils.N_TRIPLES, null, body); + final String prefer = "return=representation; include=\"http://www.w3.org/ns/ldp#PreferMembership\";"; + + testEndpoint.setPreferInclude("PreferMembership"); + + init(); + + testExchange.getIn().setHeader(FcrepoHeaders.FCREPO_IDENTIFIER, "/foo"); + + when(mockClient.head(any(URI.class))).thenReturn(headResponse); + when(mockClient.get(any(URI.class), any(String.class), eq(prefer))).thenReturn(getResponse); + + testProducer.process(testExchange); + + assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfTriples); + assertEquals(testExchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class), TestUtils.N_TRIPLES); + } + + @Test + public void testGetPreferOmitLongEndpointProducer() throws Exception { + final URI uri = create(TestUtils.baseUrl); + final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfTriples.getBytes()); + final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, null, null, null); + final FcrepoResponse getResponse = new FcrepoResponse(uri, 200, TestUtils.N_TRIPLES, null, body); + final String prefer = "return=representation; " + + "omit=\"http://fedora.info/definitions/v4/repository#EmbedResources\";"; + + testEndpoint.setPreferOmit("http://fedora.info/definitions/v4/repository#EmbedResources"); + + init(); + + testExchange.getIn().setHeader(FcrepoHeaders.FCREPO_IDENTIFIER, "/foo"); + + when(mockClient.head(any(URI.class))).thenReturn(headResponse); + when(mockClient.get(any(URI.class), any(String.class), eq(prefer))).thenReturn(getResponse); + + testProducer.process(testExchange); + + assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfTriples); + assertEquals(testExchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class), TestUtils.N_TRIPLES); + } + + @Test + public void testGetPreferOmitShortEndpointProducer() throws Exception { + final URI uri = create(TestUtils.baseUrl); + final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfTriples.getBytes()); + final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, null, null, null); + final FcrepoResponse getResponse = new FcrepoResponse(uri, 200, TestUtils.N_TRIPLES, null, body); + final String prefer = "return=representation; omit=\"http://www.w3.org/ns/ldp#PreferContainment\";"; + + testEndpoint.setPreferOmit("PreferContainment"); + + init(); + + testExchange.getIn().setHeader(FcrepoHeaders.FCREPO_IDENTIFIER, "/foo"); + + when(mockClient.head(any(URI.class))).thenReturn(headResponse); + when(mockClient.get(any(URI.class), any(String.class), eq(prefer))).thenReturn(getResponse); testProducer.process(testExchange); @@ -124,7 +240,7 @@ public void testGetAcceptEndpointProducer() throws Exception { testExchange.getIn().setHeader(FcrepoHeaders.FCREPO_IDENTIFIER, "/foo"); when(mockClient.head(any(URI.class))).thenReturn(headResponse); - when(mockClient.get(any(URI.class), eq(TestUtils.N_TRIPLES))).thenReturn(getResponse); + when(mockClient.get(any(URI.class), eq(TestUtils.N_TRIPLES), any(String.class))).thenReturn(getResponse); testProducer.process(testExchange); @@ -142,7 +258,7 @@ public void testGetRootProducer() throws Exception { init(); when(mockClient.head(any(URI.class))).thenReturn(headResponse); - when(mockClient.get(any(URI.class), eq(TestUtils.RDF_XML))).thenReturn(getResponse); + when(mockClient.get(any(URI.class), eq(TestUtils.RDF_XML), any(String.class))).thenReturn(getResponse); testProducer.process(testExchange); @@ -165,7 +281,7 @@ public void testGetBinaryProducer() throws Exception { testExchange.getIn().setHeader(Exchange.ACCEPT_CONTENT_TYPE, TestUtils.TEXT_PLAIN); testExchange.getIn().setHeader(Exchange.HTTP_METHOD, HttpMethods.GET); - when(mockClient.get(any(URI.class), eq(TestUtils.TEXT_PLAIN))).thenReturn(getResponse); + when(mockClient.get(any(URI.class), eq(TestUtils.TEXT_PLAIN), any(String.class))).thenReturn(getResponse); testProducer.process(testExchange); @@ -252,7 +368,7 @@ public void testTransformGetProducer() throws Exception { testExchange.getIn().setHeader(Exchange.HTTP_METHOD, HttpMethods.GET); when(mockClient.head(any(URI.class))).thenReturn(headResponse); - when(mockClient.get(create(TestUtils.baseUrl + "/fcr:transform/default"), TestUtils.JSON)) + when(mockClient.get(create(TestUtils.baseUrl + "/fcr:transform/default"), TestUtils.JSON, null)) .thenReturn(getResponse); testProducer.process(testExchange); @@ -309,7 +425,7 @@ public void testTransformHeaderProducer() throws Exception { testExchange.getIn().setHeader(FcrepoHeaders.FCREPO_TRANSFORM, "default"); when(mockClient.head(any(URI.class))).thenReturn(headResponse); - when(mockClient.get(create(TestUtils.baseUrl + "/fcr:transform/default"), TestUtils.JSON)) + when(mockClient.get(create(TestUtils.baseUrl + "/fcr:transform/default"), TestUtils.JSON, null)) .thenReturn(getResponse); testProducer.process(testExchange); @@ -335,7 +451,7 @@ public void testTransformHeaderOnlyProducer() throws Exception { testExchange.getIn().setHeader(FcrepoHeaders.FCREPO_TRANSFORM, "default"); when(mockClient.head(any(URI.class))).thenReturn(headResponse); - when(mockClient.get(create(TestUtils.baseUrl + "/fcr:transform/default"), TestUtils.JSON)) + when(mockClient.get(create(TestUtils.baseUrl + "/fcr:transform/default"), TestUtils.JSON, null)) .thenReturn(getResponse); testProducer.process(testExchange); @@ -362,7 +478,7 @@ public void testTransformProducer() throws Exception { testExchange.getIn().setHeader(FcrepoHeaders.FCREPO_IDENTIFIER, "/foo"); when(mockClient.head(any(URI.class))).thenReturn(headResponse); - when(mockClient.get(create(TestUtils.baseUrl + "/fcr:transform/default"), TestUtils.JSON)) + when(mockClient.get(create(TestUtils.baseUrl + "/fcr:transform/default"), TestUtils.JSON, null)) .thenReturn(getResponse); testProducer.process(testExchange); @@ -488,4 +604,21 @@ public void testPutProducer() throws Exception { assertEquals(testExchange.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE), status); assertEquals(testExchange.getIn().getHeader(Exchange.CONTENT_TYPE), TestUtils.TEXT_PLAIN); } + + @Test + public void testPreferProperties() throws Exception { + testProducer = new FcrepoProducer(testEndpoint); + + assertEquals(6, RdfNamespaces.PREFER_PROPERTIES.size()); + final String[] fcrepoPrefer = new String[] { "ServerManaged", "EmbedResources", "InboundReferences" }; + for (final String s : fcrepoPrefer) { + assertEquals(RdfNamespaces.REPOSITORY + s, RdfNamespaces.PREFER_PROPERTIES.get(s)); + } + + final String[] ldpPrefer = new String[] { "PreferContainment", "PreferMembership", + "PreferMinimalContainer" }; + for (final String s : ldpPrefer) { + assertEquals(RdfNamespaces.LDP + s, RdfNamespaces.PREFER_PROPERTIES.get(s)); + } + } } diff --git a/src/test/java/org/fcrepo/camel/integration/FcrepoConstantsIT.java b/src/test/java/org/fcrepo/camel/integration/FcrepoConstantsIT.java index e7b3ddc..27e6ff3 100644 --- a/src/test/java/org/fcrepo/camel/integration/FcrepoConstantsIT.java +++ b/src/test/java/org/fcrepo/camel/integration/FcrepoConstantsIT.java @@ -47,5 +47,8 @@ public void testRdfLexicon() { assertEquals(RdfNamespaces.INDEXING, RdfLexicon.INDEXING_NAMESPACE); assertEquals(RdfNamespaces.RDF, RdfLexicon.RDF_NAMESPACE); assertEquals(RdfNamespaces.LDP, RdfLexicon.LDP_NAMESPACE); + assertEquals(RdfNamespaces.REPOSITORY + "ServerManaged", RdfLexicon.SERVER_MANAGED.toString()); + assertEquals(RdfNamespaces.REPOSITORY + "EmbedResources", RdfLexicon.EMBED_CONTAINS.toString()); + assertEquals(RdfNamespaces.REPOSITORY + "InboundReferences", RdfLexicon.INBOUND_REFERENCES.toString()); } } diff --git a/src/test/java/org/fcrepo/camel/integration/FcrepoContainerPreferIT.java b/src/test/java/org/fcrepo/camel/integration/FcrepoContainerPreferIT.java new file mode 100644 index 0000000..1fc6022 --- /dev/null +++ b/src/test/java/org/fcrepo/camel/integration/FcrepoContainerPreferIT.java @@ -0,0 +1,249 @@ +/** + * Copyright 2014 DuraSpace, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.fcrepo.camel.integration; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.camel.EndpointInject; +import org.apache.camel.Exchange; +import org.apache.camel.Produce; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.builder.xml.Namespaces; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.fcrepo.camel.FcrepoHeaders; +import org.fcrepo.camel.JmsHeaders; +import org.fcrepo.camel.RdfNamespaces; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * Test adding an RDF resource + * @author Aaron Coburn + * @since Dec 26, 2014 + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration({"/spring-test/test-container.xml"}) +public class FcrepoContainerPreferIT extends CamelTestSupport { + + @EndpointInject(uri = "mock:created") + protected MockEndpoint createdEndpoint; + + @EndpointInject(uri = "mock:filter") + protected MockEndpoint filteredEndpoint; + + @EndpointInject(uri = "mock:container") + protected MockEndpoint containerEndpoint; + + @EndpointInject(uri = "mock:verifyGone") + protected MockEndpoint goneEndpoint; + + @EndpointInject(uri = "mock:deleted") + protected MockEndpoint deletedEndpoint; + + @EndpointInject(uri = "mock:verifyNotFound") + protected MockEndpoint notFoundEndpoint; + + @Produce(uri = "direct:filter") + protected ProducerTemplate template; + + @Test + public void testGetContainer() throws InterruptedException { + // Assertions + createdEndpoint.expectedMessageCount(2); + createdEndpoint.expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 201); + + containerEndpoint.expectedMessageCount(1); + containerEndpoint.expectedHeaderReceived(Exchange.CONTENT_TYPE, "application/rdf+xml"); + containerEndpoint.expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 200); + + filteredEndpoint.expectedMessageCount(4); + filteredEndpoint.expectedHeaderReceived(Exchange.CONTENT_TYPE, "application/rdf+xml"); + filteredEndpoint.expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 200); + + deletedEndpoint.expectedMessageCount(4); + deletedEndpoint.expectedBodiesReceived(null, null, null, null); + deletedEndpoint.expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 204); + + goneEndpoint.expectedMessageCount(2); + goneEndpoint.expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 410); + + notFoundEndpoint.expectedMessageCount(2); + notFoundEndpoint.expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 404); + + final Map headers = new HashMap<>(); + headers.put(Exchange.HTTP_METHOD, "POST"); + headers.put(Exchange.CONTENT_TYPE, "text/turtle"); + + final String fullPath = template.requestBodyAndHeaders( + "direct:create", + FcrepoTestUtils.getTurtleDocument(), + headers, String.class); + + // Strip off the baseUrl to get the resource path + final String identifier = fullPath.replaceAll(FcrepoTestUtils.getFcrepoBaseUrl(), ""); + + final String child = "/child"; + + headers.clear(); + headers.put(Exchange.HTTP_METHOD, "PUT"); + headers.put(Exchange.CONTENT_TYPE, "text/turtle"); + headers.put(FcrepoHeaders.FCREPO_IDENTIFIER, identifier + child); + + template.sendBodyAndHeaders("direct:create", FcrepoTestUtils.getTurtleDocument(), headers); + + template.sendBodyAndHeader("direct:includeServerManaged", null, FcrepoHeaders.FCREPO_IDENTIFIER, + identifier); + template.sendBodyAndHeader("direct:includeContainment", null, FcrepoHeaders.FCREPO_IDENTIFIER, + identifier); + + template.sendBodyAndHeader("direct:omitServerManaged", null, JmsHeaders.IDENTIFIER, + identifier); + template.sendBodyAndHeader("direct:omitContainmentShort", null, FcrepoHeaders.FCREPO_IDENTIFIER, + identifier); + template.sendBodyAndHeader("direct:omitContainmentFull", null, FcrepoHeaders.FCREPO_IDENTIFIER, + identifier); + + template.sendBodyAndHeader("direct:includeContainmentOmitManaged", null, FcrepoHeaders.FCREPO_IDENTIFIER, + identifier); + + headers.clear(); + headers.put(FcrepoHeaders.FCREPO_IDENTIFIER, identifier); + headers.put(FcrepoHeaders.FCREPO_PREFER, "return=representation; " + + "omit=\"http://fedora.info/definitions/v4/repository#ServerManaged\"; " + + "include=\"http://www.w3.org/ns/ldp#PreferContainment\";"); + template.sendBodyAndHeaders("direct:preferHeadersCheckContainment", null, headers); + template.sendBodyAndHeaders("direct:preferHeadersCheckServerManaged", null, headers); + + headers.put(FcrepoHeaders.FCREPO_PREFER, "return=representation; " + + "omit=\"http://fedora.info/definitions/v4/repository#ServerManaged " + + "http://www.w3.org/ns/ldp#PreferContainment\""); + template.sendBodyAndHeaders("direct:preferHeadersCheckContainment", null, headers); + template.sendBodyAndHeaders("direct:preferHeadersCheckServerManaged", null, headers); + + template.sendBodyAndHeader("direct:delete", null, FcrepoHeaders.FCREPO_IDENTIFIER, identifier + child); + template.sendBodyAndHeader("direct:delete", null, FcrepoHeaders.FCREPO_IDENTIFIER, identifier); + + // Confirm that assertions passed + createdEndpoint.assertIsSatisfied(); + filteredEndpoint.assertIsSatisfied(); + containerEndpoint.assertIsSatisfied(); + goneEndpoint.assertIsSatisfied(); + notFoundEndpoint.assertIsSatisfied(); + deletedEndpoint.assertIsSatisfied(); + + // Check deleted container + for (Exchange exchange : goneEndpoint.getExchanges()) { + Assert.assertTrue(exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class).contains("text/html")); + Assert.assertTrue(exchange.getIn().getBody(String.class).contains("Gone")); + } + + for (Exchange exchange : notFoundEndpoint.getExchanges()) { + Assert.assertTrue(exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class).contains("text/html")); + Assert.assertTrue(exchange.getIn().getBody(String.class).contains("Not Found")); + } + } + + @Override + protected RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + @Override + public void configure() { + + final String fcrepo_uri = FcrepoTestUtils.getFcrepoEndpointUri(); + + final Namespaces ns = new Namespaces("rdf", RdfNamespaces.RDF); + ns.add("fedora", RdfNamespaces.REPOSITORY); + ns.add("ldp", RdfNamespaces.LDP); + + from("direct:create") + .to(fcrepo_uri) + .to("mock:created"); + + from("direct:preferHeadersCheckContainment") + .to(fcrepo_uri) + .filter().xpath( + "/rdf:RDF/rdf:Description/ldp:contains", ns) + .to("mock:filter"); + + from("direct:preferHeadersCheckServerManaged") + .to(fcrepo_uri) + .filter().xpath( + "/rdf:RDF/rdf:Description/fedora:uuid", ns) + .to("mock:filter"); + + from("direct:includeServerManaged") + .to(fcrepo_uri + "?preferInclude=ServerManaged") + .filter().xpath( + "/rdf:RDF/rdf:Description/fedora:uuid", ns) + .to("mock:filter") + .to(fcrepo_uri) + .to("mock:container"); + + from("direct:includeContainmentOmitManaged") + .to(fcrepo_uri + "?preferOmit=ServerManaged&preferInclude=PreferContainment") + .filter().xpath( + "/rdf:RDF/rdf:Description/ldp:contains", ns) + .to("mock:filter"); + + from("direct:omitServerManaged") + .to(fcrepo_uri + "?preferOmit=ServerManaged") + .filter().xpath( + "/rdf:RDF/rdf:Description/fedora:uuid", ns) + .to("mock:filter") + .to(fcrepo_uri) + .to("mock:container"); + + from("direct:includeContainment") + .to(fcrepo_uri + "?preferInclude=PreferContainment") + .filter().xpath( + "/rdf:RDF/rdf:Description/ldp:contains", ns) + .to("mock:filter"); + + from("direct:omitContainmentShort") + .to(fcrepo_uri + "?preferOmit=PreferContainment") + .filter().xpath( + "/rdf:RDF/rdf:Description/ldp:contains", ns) + .to("mock:filter"); + + from("direct:omitContainmentFull") + .to(fcrepo_uri + "?preferOmit=http://www.w3.org/ns/ldp#PreferContainment") + .filter().xpath( + "/rdf:RDF/rdf:Description/ldp:contains", ns) + .to("mock:filter"); + + from("direct:delete") + .setHeader(Exchange.HTTP_METHOD, constant("DELETE")) + .to(fcrepo_uri) + .to("mock:deleted") + .setHeader(Exchange.HTTP_METHOD, constant("GET")) + .to(fcrepo_uri + "?throwExceptionOnFailure=false") + .to("mock:verifyGone") + .setHeader(Exchange.HTTP_METHOD, constant("DELETE")) + .to(fcrepo_uri + "?tombstone=true") + .to("mock:deleted") + .setHeader(Exchange.HTTP_METHOD, constant("GET")) + .to(fcrepo_uri + "?throwExceptionOnFailure=false") + .to("mock:verifyNotFound"); + } + }; + } +} diff --git a/src/test/java/org/fcrepo/camel/integration/FcrepoSparqlIT.java b/src/test/java/org/fcrepo/camel/integration/FcrepoSparqlIT.java index 18066b3..4766c99 100644 --- a/src/test/java/org/fcrepo/camel/integration/FcrepoSparqlIT.java +++ b/src/test/java/org/fcrepo/camel/integration/FcrepoSparqlIT.java @@ -222,7 +222,7 @@ public void configure() throws IOException { .removeHeaders("CamelHttp*") .setHeader(Exchange.HTTP_QUERY, simple( "query=SELECT * WHERE { " + - "<${headers.FCREPO_BASE_URL}${headers.FCREPO_IDENTIFIER}> " + + "<${headers.CamelFcrepoBaseUrl}${headers.CamelFcrepoIdentifier}> " + "<" + RdfNamespaces.RDF + "type> ?o }")) .to("http4:" + fuseki_url + "/test/query") .filter(resourceXpath) @@ -232,7 +232,7 @@ public void configure() throws IOException { .removeHeaders("CamelHttp*") .setHeader(Exchange.HTTP_QUERY, simple( "query=SELECT * WHERE { " + - "<${headers.FCREPO_BASE_URL}${headers.FCREPO_IDENTIFIER}> " + + "<${headers.CamelFcrepoBaseUrl}${headers.CamelFcrepoIdentifier}> " + "<" + RdfNamespaces.RDF + "type> ?o }")) .to("http4:" + fuseki_url + "/test/query") .filter(containerXpath) @@ -242,9 +242,10 @@ public void configure() throws IOException { .removeHeaders("CamelHttp*") .setHeader(Exchange.HTTP_QUERY, simple( "query=SELECT * WHERE { " + - "<${headers.FCREPO_BASE_URL}${headers.FCREPO_IDENTIFIER}> " + + "<${headers.CamelFcrepoBaseUrl}${headers.CamelFcrepoIdentifier}> " + " ?o }")) .to("http4:" + fuseki_url + "/test/query") + .convertBodyTo(String.class) .filter(titleXpath) .to("mock:sparql.query");