/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF 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.apache.camel.component.jcr; import java.util.List; import javax.jcr.Node; import javax.jcr.Session; import javax.jcr.observation.Event; import javax.jcr.observation.EventIterator; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.builder.RouteBuilder; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * JcrConsumerTest * * @version $Id$ */ public class JcrConsumerTest extends JcrRouteTestSupport { private static final Logger LOG = LoggerFactory.getLogger(JcrConsumerTest.class); private String absPath = "/home/test"; @Test public void testJcrConsumer() throws Exception { // start consumer thread first JcrConsumerThread consumerThread = new JcrConsumerThread(); consumerThread.start(); // wait until the consumer thread has tried to receive event at least once while (consumerThread.getReceiveTrialTimes() < 1) { Thread.sleep(10L); } // now create a node under the specified event node path Session session = openSession(); try { Node folderNode = session.getRootNode(); for (String folderNodeName : absPath.split("\\/")) { if (!"".equals(folderNodeName)) { if (folderNode.hasNode(folderNodeName)) { folderNode.getNode(folderNodeName).remove(); } folderNode = folderNode.addNode(folderNodeName, "nt:unstructured"); } } folderNode.addNode("node", "nt:unstructured"); session.save(); } finally { if (session != null && session.isLive()) { session.logout(); } } // wait until the consumer thread captures an event consumerThread.join(); Exchange exchange = consumerThread.getExchange(); assertNotNull(exchange); Message message = exchange.getIn(); assertNotNull(message); assertTrue(message instanceof JcrMessage); EventIterator eventIterator = ((JcrMessage)message).getEventIterator(); assertNotNull(eventIterator); assertEquals(1, eventIterator.getSize()); List<?> eventList = message.getBody(List.class); assertEquals(1, eventList.size()); Event event = (Event) eventList.get(0); assertEquals(Event.NODE_ADDED, event.getType()); assertNotNull(event.getPath()); assertTrue(event.getPath().startsWith(absPath)); } @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { from("jcr://user:pass@repository/home/test?eventTypes=1&deep=true&noLocal=false") .to("direct:a"); } }; } private class JcrConsumerThread extends Thread { private Exchange exchange; private int receiveTrialTimes; public void run() { while (exchange == null) { exchange = consumer.receive("direct:a", 10L); ++receiveTrialTimes; try { Thread.sleep(10); } catch (InterruptedException e) { break; } } LOG.debug("JcrConsumerThread receive exchange, {} after {} trials", exchange, receiveTrialTimes); } public Exchange getExchange() { return exchange; } public int getReceiveTrialTimes() { return receiveTrialTimes; } } }