org.fcrepo.camel.FcrepoProducerTest.java Source code

Java tutorial

Introduction

Here is the source code for org.fcrepo.camel.FcrepoProducerTest.java

Source

/*
 * Licensed to DuraSpace under one or more contributor license agreements.
 * See the NOTICE file distributed with this work for additional information
 * regarding copyright ownership.
 *
 * DuraSpace licenses this file to you 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;

import static java.net.URI.create;
import static java.util.Collections.emptyMap;
import static java.util.Collections.singletonList;
import static java.util.Collections.singletonMap;
import static org.apache.camel.Exchange.ACCEPT_CONTENT_TYPE;
import static org.apache.camel.Exchange.CONTENT_TYPE;
import static org.apache.camel.Exchange.DISABLE_HTTP_STREAM_CACHE;
import static org.apache.camel.Exchange.HTTP_METHOD;
import static org.apache.camel.Exchange.HTTP_RESPONSE_CODE;
import static org.fcrepo.camel.FcrepoHeaders.FCREPO_IDENTIFIER;
import static org.fcrepo.camel.FcrepoHeaders.FCREPO_PREFER;
import static org.fcrepo.camel.FcrepoProducer.PREFER_PROPERTIES;
import static org.fcrepo.camel.TestUtils.N_TRIPLES;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.camel.Exchange;
import org.apache.camel.component.http4.HttpMethods;
import org.apache.camel.converter.stream.InputStreamCache;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.DefaultExchange;
import org.apache.camel.impl.DefaultUnitOfWork;
import org.apache.commons.lang3.StringUtils;
import org.fcrepo.client.DeleteBuilder;
import org.fcrepo.client.FcrepoClient;
import org.fcrepo.client.FcrepoOperationFailedException;
import org.fcrepo.client.FcrepoResponse;
import org.fcrepo.client.GetBuilder;
import org.fcrepo.client.HeadBuilder;
import org.fcrepo.client.PatchBuilder;
import org.fcrepo.client.PostBuilder;
import org.fcrepo.client.PutBuilder;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

/**
 * @author acoburn
 */
@RunWith(MockitoJUnitRunner.class)
public class FcrepoProducerTest {

    private static final String REPOSITORY = "http://fedora.info/definitions/v4/repository#";

    private static final String LDP = "http://www.w3.org/ns/ldp#";

    private FcrepoEndpoint testEndpoint;

    private FcrepoProducer testProducer;

    private Exchange testExchange;

    @Mock
    private FcrepoClient mockClient, mockClient2;

    @Mock
    private GetBuilder mockGetBuilder, mockGetBuilder2, mockGetBuilder3;

    @Mock
    private HeadBuilder mockHeadBuilder;

    @Mock
    private DeleteBuilder mockDeleteBuilder;

    @Mock
    private PostBuilder mockPostBuilder, mockPostBuilder2, mockPostBuilder3;

    @Mock
    private PatchBuilder mockPatchBuilder;

    @Mock
    private PutBuilder mockPutBuilder;

    @Before
    @SuppressWarnings("unchecked")
    public void setUp() throws Exception {
        final FcrepoComponent mockComponent = mock(FcrepoComponent.class);

        final FcrepoConfiguration testConfig = new FcrepoConfiguration();
        testEndpoint = new FcrepoEndpoint("fcrepo:localhost:8080", "/rest", mockComponent, testConfig);
        testEndpoint.setBaseUrl("localhost:8080/rest");
        testExchange = new DefaultExchange(new DefaultCamelContext());
        testExchange.getIn().setBody(null);
        when(mockClient.get(any(URI.class))).thenReturn(mockGetBuilder);
        when(mockClient2.get(any(URI.class))).thenReturn(mockGetBuilder);
        when(mockClient2.head(any(URI.class))).thenReturn(mockHeadBuilder);
        when(mockGetBuilder.accept(any(String.class))).thenReturn(mockGetBuilder);
        when(mockGetBuilder.preferMinimal()).thenReturn(mockGetBuilder);
        when(mockGetBuilder.preferRepresentation(any(List.class), any(List.class))).thenReturn(mockGetBuilder);
        when(mockGetBuilder2.accept(any(String.class))).thenReturn(mockGetBuilder2);
        when(mockGetBuilder3.accept(any(String.class))).thenReturn(mockGetBuilder3);
        when(mockClient.head(any(URI.class))).thenReturn(mockHeadBuilder);
        when(mockClient.delete(any(URI.class))).thenReturn(mockDeleteBuilder);
        when(mockClient.patch(any(URI.class))).thenReturn(mockPatchBuilder);
        when(mockClient.post(any(URI.class))).thenReturn(mockPostBuilder);
        when(mockClient.put(any(URI.class))).thenReturn(mockPutBuilder);
        when(mockPatchBuilder.body(any(InputStream.class))).thenReturn(mockPatchBuilder);
        when(mockPostBuilder.body(any(InputStream.class), any(String.class))).thenReturn(mockPostBuilder);
        when(mockPostBuilder2.body(any(InputStream.class), any(String.class))).thenReturn(mockPostBuilder2);
        when(mockPostBuilder3.body(any(InputStream.class), any(String.class))).thenReturn(mockPostBuilder3);
        when(mockPutBuilder.body(any(InputStream.class), any(String.class))).thenReturn(mockPutBuilder);
    }

    public void init() throws IOException {
        testProducer = new FcrepoProducer(testEndpoint);
        TestUtils.setField(testProducer, "fcrepoClient", mockClient);
    }

    @Test
    public void testGetProducer() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final int status = 200;
        final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfXml.getBytes());
        final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, status,
                singletonMap(CONTENT_TYPE, singletonList(TestUtils.RDF_XML)), body);

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfXml);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), TestUtils.RDF_XML);
        assertEquals(testExchange.getIn().getHeader(HTTP_RESPONSE_CODE), status);
    }

    @Test
    public void testGetAcceptHeaderProducer() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfTriples.getBytes());
        final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, 200,
                singletonMap(CONTENT_TYPE, singletonList(N_TRIPLES)), body);

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");
        testExchange.getIn().setHeader("Accept", N_TRIPLES);

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfTriples);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), 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, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, 200,
                singletonMap(CONTENT_TYPE, singletonList(N_TRIPLES)), body);
        final String prefer = "return=representation; omit=\"http://www.w3.org/ns/ldp#PreferContainment\";";

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");
        testExchange.getIn().setHeader(FCREPO_PREFER, prefer);

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfTriples);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), N_TRIPLES);
    }

    @Test
    public void testGetFixity() throws Exception {
        final String baseUrl = "http://localhost:8080/rest";
        final String path = "/binary";
        final URI uri = create(baseUrl + path);
        final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.fixityTriples.getBytes());
        final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, 200,
                singletonMap(CONTENT_TYPE, singletonList(N_TRIPLES)), body);

        testEndpoint.setFixity(true);

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, path);

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.fixityTriples);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), 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, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, 200,
                singletonMap(CONTENT_TYPE, singletonList(N_TRIPLES)), 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(FCREPO_IDENTIFIER, "/foo");

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfTriples);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), 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, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, 200,
                singletonMap(CONTENT_TYPE, singletonList(N_TRIPLES)), body);
        final String prefer = "return=representation; include=\"http://www.w3.org/ns/ldp#PreferMembership\";";

        testEndpoint.setPreferInclude("PreferMembership");

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfTriples);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), 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, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, 200,
                singletonMap(CONTENT_TYPE, singletonList(N_TRIPLES)), body);
        final String embed = "http://fedora.info/definitions/v4/repository#EmbedResources";

        testEndpoint.setPreferOmit(embed);

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfTriples);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), 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, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, 200,
                singletonMap(CONTENT_TYPE, singletonList(N_TRIPLES)), body);
        final String prefer = "return=representation; omit=\"http://www.w3.org/ns/ldp#PreferContainment\";";

        testEndpoint.setPreferOmit("PreferContainment");

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfTriples);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), N_TRIPLES);
    }

    @Test
    public void testGetAcceptEndpointProducer() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfTriples.getBytes());
        final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, 200,
                singletonMap(CONTENT_TYPE, singletonList(N_TRIPLES)), body);

        testEndpoint.setAccept(N_TRIPLES);

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfTriples);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), N_TRIPLES);
    }

    @Test
    public void testGetRootProducer() throws Exception {
        final URI uri = create("http://localhost:8080/rest");
        final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfXml.getBytes());
        final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, 200,
                singletonMap(CONTENT_TYPE, singletonList(TestUtils.RDF_XML)), body);

        init();

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfXml);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), TestUtils.RDF_XML);
    }

    @Test
    public void testGetBinaryProducer() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final String content = "Foo";
        final ByteArrayInputStream body = new ByteArrayInputStream(content.getBytes());
        final FcrepoResponse getResponse = new FcrepoResponse(uri, 200,
                singletonMap(CONTENT_TYPE, singletonList(TestUtils.TEXT_PLAIN)), body);

        testEndpoint.setMetadata(false);

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");
        testExchange.getIn().setHeader(ACCEPT_CONTENT_TYPE, TestUtils.TEXT_PLAIN);
        testExchange.getIn().setHeader(HTTP_METHOD, HttpMethods.GET);

        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), content);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), TestUtils.TEXT_PLAIN);
    }

    @Test
    public void testHeadProducer() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final Map<String, List<String>> headers = new HashMap<>();
        headers.put(CONTENT_TYPE, singletonList(N_TRIPLES));
        headers.put("Link", singletonList("<" + TestUtils.baseUrl + "/bar>; rel=\"describedby\""));
        final int status = 200;
        final FcrepoResponse headResponse = new FcrepoResponse(uri, status, headers, null);

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");
        testExchange.getIn().setHeader(HTTP_METHOD, HttpMethods.HEAD);

        when(mockHeadBuilder.perform()).thenReturn(headResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(), null);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), N_TRIPLES);
        assertEquals(testExchange.getIn().getHeader(HTTP_RESPONSE_CODE), status);
    }

    @Test
    public void testDeleteProducer() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final int status = 204;
        final FcrepoResponse deleteResponse = new FcrepoResponse(uri, status, emptyMap(), null);

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");
        testExchange.getIn().setHeader(HTTP_METHOD, HttpMethods.DELETE);

        when(mockDeleteBuilder.perform()).thenReturn(deleteResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(), null);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE), null);
        assertEquals(testExchange.getIn().getHeader(HTTP_RESPONSE_CODE), status);
    }

    @Test
    public void testPostProducer() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final String responseText = TestUtils.baseUrl + "/e8/0b/ab/e80bab60";
        final int status = 201;
        final FcrepoResponse postResponse = new FcrepoResponse(uri, status,
                singletonMap(CONTENT_TYPE, singletonList(TestUtils.TEXT_PLAIN)),
                new ByteArrayInputStream(responseText.getBytes()));

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");
        testExchange.getIn().setHeader(HTTP_METHOD, HttpMethods.POST);

        when(mockPostBuilder.perform()).thenReturn(postResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), responseText);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE), TestUtils.TEXT_PLAIN);
        assertEquals(testExchange.getIn().getHeader(HTTP_RESPONSE_CODE), status);
    }

    @Test
    public void testPostContentTypeEndpointProducer() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final int status = 204;
        final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, emptyMap(), null);
        final FcrepoResponse postResponse = new FcrepoResponse(uri, status, emptyMap(), null);

        testEndpoint.setContentType(TestUtils.SPARQL_UPDATE);

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");
        testExchange.getIn().setHeader(HTTP_METHOD, HttpMethods.POST);
        testExchange.getIn().setBody(new ByteArrayInputStream(TestUtils.sparqlUpdate.getBytes()));

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockPostBuilder.perform()).thenReturn(postResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(), null);
        assertEquals(testExchange.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE), status);
    }

    @Test
    public void testPatchProducer() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final String metadata = "<" + TestUtils.baseUrl + "/bar>; rel=\"describedby\"";
        final int status = 204;
        final FcrepoResponse headResponse = new FcrepoResponse(uri, 200,
                singletonMap("Link", singletonList(metadata)), null);
        final FcrepoResponse patchResponse = new FcrepoResponse(uri, status, emptyMap(), null);

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");
        testExchange.getIn().setHeader(HTTP_METHOD, HttpMethods.PATCH);
        testExchange.getIn().setBody(new ByteArrayInputStream(TestUtils.sparqlUpdate.getBytes()));

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockPatchBuilder.perform()).thenReturn(patchResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(), null);
        assertEquals(testExchange.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE), status);
    }

    @Test
    public void testPutProducer() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final int status = 201;
        final FcrepoResponse putResponse = new FcrepoResponse(uri, status,
                singletonMap(CONTENT_TYPE, singletonList(TestUtils.TEXT_PLAIN)),
                new ByteArrayInputStream(TestUtils.baseUrl.getBytes()));

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");
        testExchange.getIn().setHeader(HTTP_METHOD, HttpMethods.PUT);
        testExchange.getIn().setBody(null);

        when(mockPutBuilder.perform()).thenReturn(putResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.baseUrl);
        assertEquals(testExchange.getIn().getHeader(HTTP_RESPONSE_CODE), status);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE), TestUtils.TEXT_PLAIN);
    }

    @Test
    public void testPreferProperties() throws Exception {
        testProducer = new FcrepoProducer(testEndpoint);

        assertEquals(6, PREFER_PROPERTIES.size());
        final String[] fcrepoPrefer = new String[] { "ServerManaged", "EmbedResources", "InboundReferences" };
        for (final String s : fcrepoPrefer) {
            assertEquals(REPOSITORY + s, PREFER_PROPERTIES.get(s));
        }

        final String[] ldpPrefer = new String[] { "PreferContainment", "PreferMembership",
                "PreferMinimalContainer" };
        for (final String s : ldpPrefer) {
            assertEquals(LDP + s, PREFER_PROPERTIES.get(s));
        }
    }

    @Test
    public void testGetProducerWithScheme() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final int status = 200;
        final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfXml.getBytes());
        final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, status,
                singletonMap(CONTENT_TYPE, singletonList(TestUtils.RDF_XML)), body);

        // set the baseUrl with an explicit http:// scheme
        testEndpoint.setBaseUrl("http://localhost:8080/rest");
        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfXml);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), TestUtils.RDF_XML);
        assertEquals(testExchange.getIn().getHeader(HTTP_RESPONSE_CODE), status);
    }

    @Test
    public void testGetSecureProducer() throws Exception {
        final URI uri = create(TestUtils.baseUrlSecure);
        final int status = 200;
        final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfXml.getBytes());
        final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, status,
                singletonMap(CONTENT_TYPE, singletonList(TestUtils.RDF_XML)), body);

        // set the baseUrl with no scheme but with a secure port
        testEndpoint.setBaseUrl("localhost:443/rest");
        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/secure");

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfXml);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), TestUtils.RDF_XML);
        assertEquals(testExchange.getIn().getHeader(HTTP_RESPONSE_CODE), status);
    }

    @Test
    public void testGetSecureProducerWithScheme() throws Exception {
        final URI uri = create(TestUtils.baseUrlSecureWithoutPort);
        final int status = 200;
        final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfXml.getBytes());
        final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, status,
                singletonMap(CONTENT_TYPE, singletonList(TestUtils.RDF_XML)), body);

        // set the baseUrl with explicit scheme but no port
        testEndpoint.setBaseUrl("https://localhost/rest");
        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/secure");

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfXml);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), TestUtils.RDF_XML);
        assertEquals(testExchange.getIn().getHeader(HTTP_RESPONSE_CODE), status);
    }

    @Test
    public void testTransactedGetProducer() throws Exception {
        final String baseUrl = "http://localhost:8080/rest";
        final String path = "/transact";
        final String path2 = "/transact2";
        final String tx = "tx:12345";
        final URI uri = create(baseUrl + "/" + tx + path);
        final URI uri2 = create(baseUrl + "/" + tx + path2);
        final URI commitUri = URI.create(baseUrl + "/" + tx + FcrepoConstants.COMMIT);
        final URI beginUri = URI.create(baseUrl + FcrepoConstants.TRANSACTION);
        final int status = 200;
        final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfXml.getBytes());
        final ByteArrayInputStream body2 = new ByteArrayInputStream(TestUtils.rdfTriples.getBytes());
        final DefaultUnitOfWork uow = new DefaultUnitOfWork(testExchange);
        final FcrepoTransactionManager txMgr = new FcrepoTransactionManager();
        txMgr.setBaseUrl(baseUrl);

        testEndpoint.setTransactionManager(txMgr);

        when(mockClient2.post(eq(beginUri))).thenReturn(mockPostBuilder2);
        when(mockClient2.post(eq(commitUri))).thenReturn(mockPostBuilder2);

        init();
        TestUtils.setField(txMgr, "fcrepoClient", mockClient2);

        uow.beginTransactedBy((Object) tx);

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, path);
        testExchange.setUnitOfWork(uow);

        when(mockPostBuilder2.perform()).thenReturn(new FcrepoResponse(beginUri, 201,
                singletonMap("Location", singletonList(baseUrl + "/" + tx)), null));
        when(mockPostBuilder3.perform()).thenReturn(new FcrepoResponse(commitUri, 201, emptyMap(), null));

        when(mockHeadBuilder.perform()).thenReturn(new FcrepoResponse(uri, 200, emptyMap(), null));
        when(mockClient.get(eq(uri))).thenReturn(mockGetBuilder2);
        when(mockClient.get(eq(uri2))).thenReturn(mockGetBuilder3);

        when(mockGetBuilder2.perform()).thenReturn(new FcrepoResponse(uri, status,
                singletonMap(CONTENT_TYPE, singletonList(TestUtils.RDF_XML)), body));
        when(mockGetBuilder3.perform()).thenReturn(
                new FcrepoResponse(uri2, status, singletonMap(CONTENT_TYPE, singletonList(N_TRIPLES)), body2));

        testProducer.process(testExchange);

        assertEquals(status, testExchange.getIn().getHeader(HTTP_RESPONSE_CODE));
        assertEquals(TestUtils.RDF_XML, testExchange.getIn().getHeader(CONTENT_TYPE, String.class));
        assertEquals(TestUtils.rdfXml, testExchange.getIn().getBody(String.class));

        testExchange.getIn().setHeader(HTTP_METHOD, "GET");
        testExchange.getIn().setHeader(ACCEPT_CONTENT_TYPE, N_TRIPLES);
        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, path2);
        testExchange.setUnitOfWork(uow);
        testProducer.process(testExchange);
        assertEquals(status, testExchange.getIn().getHeader(HTTP_RESPONSE_CODE));
        assertEquals(N_TRIPLES, testExchange.getIn().getHeader(CONTENT_TYPE, String.class));
        assertEquals(TestUtils.rdfTriples, testExchange.getIn().getBody(String.class));
    }

    @Test(expected = RuntimeException.class)
    public void testTransactedProducerWithError() throws Exception {
        final String baseUrl = "http://localhost:8080/rest";
        final String path = "/transact";
        final String path2 = "/transact2";
        final String tx = "tx:12345";
        final URI uri = create(baseUrl + "/" + tx + path);
        final URI uri2 = create(baseUrl + "/" + tx + path2);
        final URI commitUri = URI.create(baseUrl + "/" + tx + FcrepoConstants.COMMIT);
        final URI beginUri = URI.create(baseUrl + FcrepoConstants.TRANSACTION);
        final int status = 200;
        final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfXml.getBytes());
        final ByteArrayInputStream body2 = new ByteArrayInputStream(TestUtils.rdfTriples.getBytes());
        final DefaultUnitOfWork uow = new DefaultUnitOfWork(testExchange);
        final FcrepoTransactionManager txMgr = new FcrepoTransactionManager();
        txMgr.setBaseUrl(baseUrl);

        testEndpoint.setTransactionManager(txMgr);

        init();
        TestUtils.setField(txMgr, "fcrepoClient", mockClient2);

        uow.beginTransactedBy((Object) tx);

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, path);
        testExchange.setUnitOfWork(uow);

        when(mockClient2.post(eq(beginUri))).thenReturn(mockPostBuilder2);
        when(mockClient2.post(eq(commitUri))).thenReturn(mockPostBuilder3);
        when(mockPostBuilder2.perform()).thenReturn(new FcrepoResponse(beginUri, 201,
                singletonMap("Location", singletonList(baseUrl + "/" + tx)), null));
        when(mockPostBuilder3.perform()).thenReturn(new FcrepoResponse(commitUri, 201, emptyMap(), null));

        when(mockHeadBuilder.perform()).thenReturn(new FcrepoResponse(uri, 200, emptyMap(), null));
        when(mockClient.get(eq(uri))).thenReturn(mockGetBuilder2);
        when(mockClient.get(eq(uri2))).thenReturn(mockGetBuilder3);
        when(mockGetBuilder2.perform()).thenReturn(new FcrepoResponse(uri, status,
                singletonMap(CONTENT_TYPE, singletonList(TestUtils.RDF_XML)), body));
        when(mockGetBuilder3.perform()).thenThrow(new FcrepoOperationFailedException(uri2, 400, "Bad Request"));

        testProducer.process(testExchange);

        assertEquals(status, testExchange.getIn().getHeader(HTTP_RESPONSE_CODE));
        assertEquals(TestUtils.RDF_XML, testExchange.getIn().getHeader(CONTENT_TYPE, String.class));
        assertEquals(TestUtils.rdfXml, testExchange.getIn().getBody(String.class));

        testExchange.getIn().setHeader(HTTP_METHOD, "GET");
        testExchange.getIn().setHeader(ACCEPT_CONTENT_TYPE, N_TRIPLES);
        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, path2);
        testExchange.setUnitOfWork(uow);
        testProducer.process(testExchange);
    }

    @Test
    public void testNoStreamCaching() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final int status = 200;
        final ByteArrayInputStream body = new ByteArrayInputStream(TestUtils.rdfXml.getBytes());
        final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, status,
                singletonMap(CONTENT_TYPE, singletonList(TestUtils.RDF_XML)), body);

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");
        testExchange.setProperty(DISABLE_HTTP_STREAM_CACHE, true);

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(testExchange.getIn().getBody(String.class), TestUtils.rdfXml);
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), TestUtils.RDF_XML);
        assertEquals(testExchange.getIn().getHeader(HTTP_RESPONSE_CODE), status);
    }

    @Test
    public void testStreamCaching() throws Exception {
        final URI uri = create(TestUtils.baseUrl);
        final int status = 200;
        final String rdfConcat = StringUtils.repeat(TestUtils.rdfXml, 10000);
        final ByteArrayInputStream body = new ByteArrayInputStream(rdfConcat.getBytes());
        final FcrepoResponse headResponse = new FcrepoResponse(uri, 200, emptyMap(), null);
        final FcrepoResponse getResponse = new FcrepoResponse(uri, status,
                singletonMap(CONTENT_TYPE, singletonList(TestUtils.RDF_XML)), body);

        init();

        testExchange.getIn().setHeader(FCREPO_IDENTIFIER, "/foo");
        testExchange.setProperty(DISABLE_HTTP_STREAM_CACHE, false);

        testExchange.getContext().getStreamCachingStrategy().setSpoolThreshold(1024);
        testExchange.getContext().getStreamCachingStrategy().setBufferSize(256);
        testExchange.getContext().setStreamCaching(true);

        when(mockHeadBuilder.perform()).thenReturn(headResponse);
        when(mockGetBuilder.perform()).thenReturn(getResponse);

        testProducer.process(testExchange);

        assertEquals(true, testExchange.getContext().isStreamCaching());
        assertNotNull(testExchange.getIn().getBody(InputStreamCache.class));
        assertEquals(rdfConcat.length(), testExchange.getIn().getBody(InputStreamCache.class).length());
        assertEquals(rdfConcat.length(), testExchange.getIn().getBody(InputStreamCache.class).length());
        assertEquals(testExchange.getIn().getHeader(CONTENT_TYPE, String.class), TestUtils.RDF_XML);
        assertEquals(testExchange.getIn().getHeader(HTTP_RESPONSE_CODE), status);
    }
}