001/** 002 * Copyright 2015 DuraSpace, Inc. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.fcrepo.camel.integration; 017 018import java.util.HashMap; 019import java.util.Map; 020 021import javax.xml.transform.stream.StreamSource; 022 023import org.apache.camel.EndpointInject; 024import org.apache.camel.Exchange; 025import org.apache.camel.Produce; 026import org.apache.camel.ProducerTemplate; 027import org.apache.camel.builder.RouteBuilder; 028import org.apache.camel.builder.xml.Namespaces; 029import org.apache.camel.builder.xml.XPathBuilder; 030import org.apache.camel.component.mock.MockEndpoint; 031import org.apache.camel.test.junit4.CamelTestSupport; 032import org.fcrepo.camel.FcrepoHeaders; 033import org.fcrepo.camel.RdfNamespaces; 034import org.junit.Assert; 035import org.junit.Test; 036import org.junit.runner.RunWith; 037import org.springframework.test.context.ContextConfiguration; 038import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 039 040/** 041 * Test adding an RDF resource 042 * @author Aaron Coburn 043 * @since Dec 26, 2014 044 */ 045@RunWith(SpringJUnit4ClassRunner.class) 046@ContextConfiguration({"/spring-test/test-container.xml"}) 047public class FcrepoStreamIT extends CamelTestSupport { 048 049 final private int children = 200; 050 051 @EndpointInject(uri = "mock:created") 052 protected MockEndpoint createdEndpoint; 053 054 @EndpointInject(uri = "mock:child") 055 protected MockEndpoint childEndpoint; 056 057 @EndpointInject(uri = "mock:verifyGone") 058 protected MockEndpoint goneEndpoint; 059 060 @EndpointInject(uri = "mock:deleted") 061 protected MockEndpoint deletedEndpoint; 062 063 @EndpointInject(uri = "mock:verifyNotFound") 064 protected MockEndpoint notFoundEndpoint; 065 066 @Produce(uri = "direct:filter") 067 protected ProducerTemplate template; 068 069 @Test 070 public void testGetStreamedContainer() throws InterruptedException { 071 // Assertions 072 createdEndpoint.expectedMessageCount(children + 1); 073 createdEndpoint.expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 201); 074 075 childEndpoint.expectedMessageCount(children); 076 077 deletedEndpoint.expectedMessageCount(2); 078 deletedEndpoint.expectedBodiesReceived(null, null); 079 deletedEndpoint.expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 204); 080 081 goneEndpoint.expectedMessageCount(1); 082 goneEndpoint.expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 410); 083 084 notFoundEndpoint.expectedMessageCount(1); 085 notFoundEndpoint.expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 404); 086 087 final Map<String, Object> headers = new HashMap<>(); 088 headers.put(Exchange.HTTP_METHOD, "PUT"); 089 headers.put(FcrepoHeaders.FCREPO_IDENTIFIER, "/stream"); 090 template.sendBodyAndHeaders("direct:create", null, headers); 091 092 headers.clear(); 093 headers.put(Exchange.HTTP_METHOD, "POST"); 094 headers.put(Exchange.CONTENT_TYPE, "text/turtle"); 095 headers.put(FcrepoHeaders.FCREPO_IDENTIFIER, "/stream"); 096 097 for (int i = 0; i < children; ++i) { 098 template.sendBodyAndHeaders("direct:create", FcrepoTestUtils.getTurtleDocument(), headers); 099 } 100 101 template.sendBodyAndHeader("direct:get", null, FcrepoHeaders.FCREPO_IDENTIFIER, "/stream"); 102 103 template.sendBodyAndHeader("direct:delete", null, FcrepoHeaders.FCREPO_IDENTIFIER, "/stream"); 104 105 // Confirm that assertions passed 106 createdEndpoint.assertIsSatisfied(); 107 childEndpoint.assertIsSatisfied(); 108 goneEndpoint.assertIsSatisfied(); 109 deletedEndpoint.assertIsSatisfied(); 110 notFoundEndpoint.assertIsSatisfied(); 111 112 for (Exchange exchange : childEndpoint.getExchanges()) { 113 Assert.assertTrue(exchange.getIn().getBody(String.class).contains("/stream/")); 114 } 115 } 116 117 @Override 118 protected RouteBuilder createRouteBuilder() { 119 return new RouteBuilder() { 120 @Override 121 public void configure() { 122 123 final String fcrepo_uri = FcrepoTestUtils.getFcrepoEndpointUriWithScheme(); 124 125 final Namespaces ns = new Namespaces("rdf", RdfNamespaces.RDF); 126 ns.add("ldp", RdfNamespaces.LDP); 127 128 final XPathBuilder ldpChildren = new XPathBuilder("/rdf:RDF/rdf:Description/ldp:contains"); 129 ldpChildren.namespaces(ns); 130 131 getContext().getStreamCachingStrategy().setSpoolThreshold(1024); 132 getContext().getStreamCachingStrategy().setBufferSize(128); 133 getContext().setStreamCaching(true); 134 135 from("direct:create") 136 .to(fcrepo_uri) 137 .to("mock:created"); 138 139 from("direct:get") 140 .streamCaching() 141 .to(fcrepo_uri) 142 .convertBodyTo(StreamSource.class) 143 .split(ldpChildren).streaming() 144 .transform() 145 .xpath("/ldp:contains/@rdf:resource", String.class, ns) 146 .to("mock:child"); 147 148 from("direct:delete") 149 .setHeader(Exchange.HTTP_METHOD, constant("DELETE")) 150 .to(fcrepo_uri) 151 .to("mock:deleted") 152 .setHeader(Exchange.HTTP_METHOD, constant("GET")) 153 .to(fcrepo_uri + "?throwExceptionOnFailure=false") 154 .to("mock:verifyGone") 155 .setHeader(Exchange.HTTP_METHOD, constant("DELETE")) 156 .to(fcrepo_uri + "?tombstone=true") 157 .to("mock:deleted") 158 .setHeader(Exchange.HTTP_METHOD, constant("GET")) 159 .to(fcrepo_uri + "?throwExceptionOnFailure=false") 160 .to("mock:verifyNotFound"); 161 } 162 }; 163 } 164}