Author: davsclaus Date: Wed Jul 7 06:24:18 2010 New Revision: 961248 URL: http://svn.apache.org/viewvc?rev=961248&view=rev Log: CAMEL-2917: Introduced ProcessorFactory SPI to allow custom hooks to manipulate model before processors is created. This makes it easier to adapt Camel routes to a very special needs you may have.
Added: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ProcessorFactory.java (with props) camel/trunk/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java - copied, changed from r961225, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringCustomProcessorFactoryTest.java - copied, changed from r961225, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringAOPAfterTest.java camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/CustomProcessorFactoryTest.xml - copied, changed from r961225, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aopafter.xml Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java?rev=961248&r1=961247&r2=961248&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/CamelContext.java Wed Jul 7 06:24:18 2010 @@ -19,7 +19,6 @@ package org.apache.camel; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import org.apache.camel.builder.ErrorHandlerBuilder; @@ -40,6 +39,7 @@ import org.apache.camel.spi.LifecycleStr import org.apache.camel.spi.ManagementStrategy; import org.apache.camel.spi.NodeIdFactory; import org.apache.camel.spi.PackageScanClassResolver; +import org.apache.camel.spi.ProcessorFactory; import org.apache.camel.spi.Registry; import org.apache.camel.spi.ServicePool; import org.apache.camel.spi.ShutdownStrategy; @@ -745,4 +745,18 @@ public interface CamelContext extends Se */ void setExecutorServiceStrategy(ExecutorServiceStrategy executorServiceStrategy); + /** + * Gets the current {...@link org.apache.camel.spi.ProcessorFactory} + * + * @return the factory, can be <tt>null</tt> if no custom factory has been set + */ + ProcessorFactory getProcessorFactory(); + + /** + * Sets a custom {...@link org.apache.camel.spi.ProcessorFactory} + * + * @param processorFactory the custom factory + */ + void setProcessorFactory(ProcessorFactory processorFactory); + } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java?rev=961248&r1=961247&r2=961248&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java Wed Jul 7 06:24:18 2010 @@ -89,6 +89,7 @@ import org.apache.camel.spi.LifecycleStr import org.apache.camel.spi.ManagementStrategy; import org.apache.camel.spi.NodeIdFactory; import org.apache.camel.spi.PackageScanClassResolver; +import org.apache.camel.spi.ProcessorFactory; import org.apache.camel.spi.Registry; import org.apache.camel.spi.RouteContext; import org.apache.camel.spi.RouteStartupOrder; @@ -162,6 +163,7 @@ public class DefaultCamelContext extends // so if we have 6 endpoints in the pool, we can have 6 x 100 producers in total private ServicePool<Endpoint, Producer> producerServicePool = new SharedProducerServicePool(100); private NodeIdFactory nodeIdFactory = new DefaultNodeIdFactory(); + private ProcessorFactory processorFactory; private InterceptStrategy defaultTracer; private InflightRepository inflightRepository = new DefaultInflightRepository(); private final List<RouteStartupOrder> routeStartupOrder = new ArrayList<RouteStartupOrder>(); @@ -1644,6 +1646,14 @@ public class DefaultCamelContext extends this.executorServiceStrategy = executorServiceStrategy; } + public ProcessorFactory getProcessorFactory() { + return processorFactory; + } + + public void setProcessorFactory(ProcessorFactory processorFactory) { + this.processorFactory = processorFactory; + } + protected String getEndpointKey(String uri, Endpoint endpoint) { if (endpoint.isSingleton()) { return uri; Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java?rev=961248&r1=961247&r2=961248&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoadBalanceDefinition.java Wed Jul 7 06:24:18 2010 @@ -35,7 +35,6 @@ import org.apache.camel.model.loadbalanc import org.apache.camel.model.loadbalancer.RoundRobinLoadBalancerDefinition; import org.apache.camel.model.loadbalancer.StickyLoadBalancerDefinition; import org.apache.camel.model.loadbalancer.TopicLoadBalancerDefinition; -import org.apache.camel.processor.SendProcessor; import org.apache.camel.processor.loadbalancer.FailOverLoadBalancer; import org.apache.camel.processor.loadbalancer.LoadBalancer; import org.apache.camel.processor.loadbalancer.RandomLoadBalancer; @@ -107,8 +106,7 @@ public class LoadBalanceDefinition exten Collection<ProcessorDefinition> outputs) throws Exception { LoadBalancer loadBalancer = LoadBalancerDefinition.getLoadBalancer(routeContext, loadBalancerType, ref); for (ProcessorDefinition<?> processorType : outputs) { - // The outputs should be the SendProcessor - SendProcessor processor = (SendProcessor) processorType.createProcessor(routeContext); + Processor processor = processorType.createProcessor(routeContext); loadBalancer.addProcessor(processor); } return loadBalancer; Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java?rev=961248&r1=961247&r2=961248&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java Wed Jul 7 06:24:18 2010 @@ -26,7 +26,6 @@ import java.util.LinkedList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; @@ -134,7 +133,16 @@ public abstract class ProcessorDefinitio * @throws Exception is thrown if error creating the child or if it was mandatory and there was no output defined on definition */ public Processor createChildProcessor(RouteContext routeContext, boolean mandatory) throws Exception { - Processor children = routeContext.createProcessor(this); + Processor children = null; + // at first use custom factory + if (routeContext.getCamelContext().getProcessorFactory() != null) { + children = routeContext.getCamelContext().getProcessorFactory().createChildProcessor(routeContext, this, mandatory); + } + // fallback to default implementation if factory did not create the child + if (children == null) { + children = routeContext.createProcessor(this); + } + if (children == null && mandatory) { throw new IllegalArgumentException("Definition has no children on " + this); } @@ -336,7 +344,16 @@ public abstract class ProcessorDefinitio protected Processor createOutputsProcessor(RouteContext routeContext, Collection<ProcessorDefinition> outputs) throws Exception { List<Processor> list = new ArrayList<Processor>(); for (ProcessorDefinition<?> output : outputs) { - Processor processor = output.createProcessor(routeContext); + Processor processor = null; + // at first use custom factory + if (routeContext.getCamelContext().getProcessorFactory() != null) { + processor = routeContext.getCamelContext().getProcessorFactory().createProcessor(routeContext, output); + } + // fallback to default implementation if factory did not create the processor + if (processor == null) { + processor = output.createProcessor(routeContext); + } + if (output instanceof Channel && processor == null) { continue; } @@ -362,7 +379,16 @@ public abstract class ProcessorDefinitio * Creates the processor and wraps it in any necessary interceptors and error handlers */ protected Processor makeProcessor(RouteContext routeContext) throws Exception { - Processor processor = createProcessor(routeContext); + Processor processor = null; + // at first use custom factory + if (routeContext.getCamelContext().getProcessorFactory() != null) { + processor = routeContext.getCamelContext().getProcessorFactory().createProcessor(routeContext, this); + } + // fallback to default implementation if factory did not create the processor + if (processor == null) { + processor = createProcessor(routeContext); + } + if (processor == null) { // no processor to make return null; Added: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ProcessorFactory.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ProcessorFactory.java?rev=961248&view=auto ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ProcessorFactory.java (added) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ProcessorFactory.java Wed Jul 7 06:24:18 2010 @@ -0,0 +1,61 @@ +/** + * 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.spi; + +import org.apache.camel.Processor; +import org.apache.camel.model.ProcessorDefinition; + +/** + * A factory to create {...@link Processor} based on the {...@link org.apache.camel.model.ProcessorDefinition definition}. + * <p/> + * This allows you to implement a custom factory in which you can control the creation of the processors. + * It also allows you to manipulate the {...@link org.apache.camel.model.ProcessorDefinition definition}s for example to + * configure or change options. Its also possible to add new steps in the route by adding outputs to + * {...@link org.apache.camel.model.ProcessorDefinition definition}s. + * <p/> + * <b>Important:</b> By returning <tt>null</tt> from the create methods you fallback to let the default implementation in Camel create + * the {...@link Processor}. You want to do this if you <i>only</i> want to manipulate the + * {...@link org.apache.camel.model.ProcessorDefinition definition}s. + * + * @version $Revision$ + */ +public interface ProcessorFactory { + + /** + * Creates the child processor. + * <p/> + * The child processor is an output from the given definition, for example the sub route in a splitter EIP. + * + * @param routeContext the route context + * @param definition the definition which represents the processor + * @param mandatory whether or not the child is mandatory + * @return the created processor, or <tt>null</tt> to let the default implementation in Camel create the processor. + * @throws Exception can be thrown if error creating the processor + */ + Processor createChildProcessor(RouteContext routeContext, ProcessorDefinition definition, boolean mandatory) throws Exception; + + /** + * Creates the processor. + * + * @param routeContext the route context + * @param definition the definition which represents the processor + * @return the created processor, or <tt>null</tt> to let the default implementation in Camel create the processor. + * @throws Exception can be thrown if error creating the processor + */ + Processor createProcessor(RouteContext routeContext, ProcessorDefinition definition) throws Exception; + +} Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ProcessorFactory.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/ProcessorFactory.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java (from r961225, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java&r1=961225&r2=961248&rev=961248&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/CustomProcessorFactoryTest.java Wed Jul 7 06:24:18 2010 @@ -16,89 +16,94 @@ */ package org.apache.camel.processor; +import org.apache.camel.CamelContext; import org.apache.camel.ContextTestSupport; -import org.apache.camel.Exchange; import org.apache.camel.Processor; -import org.apache.camel.builder.ExpressionClause; import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.impl.JndiRegistry; import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.model.SetBodyDefinition; -import org.apache.camel.model.language.ExpressionDefinition; -import org.apache.camel.spi.DefinitionAwarePolicy; +import org.apache.camel.model.SplitDefinition; +import org.apache.camel.model.ToDefinition; +import org.apache.camel.model.language.ConstantExpression; +import org.apache.camel.spi.ProcessorFactory; import org.apache.camel.spi.RouteContext; /** * @version $Revision: 937165 $ */ -public class DefinitionPolicyPerProcessorTest extends ContextTestSupport { +public class CustomProcessorFactoryTest extends ContextTestSupport { - public void testDefintionAugmentationPolicy() throws Exception { - getMockEndpoint("mock:foo").expectedMessageCount(1); - getMockEndpoint("mock:foo").expectedHeaderReceived("foo", "was wrapped"); - getMockEndpoint("mock:foo").expectedBodyReceived().constant("body was altered"); + @Override + // START SNIPPET: e1 + protected CamelContext createCamelContext() throws Exception { + CamelContext context = super.createCamelContext(); + // register our custom factory + context.setProcessorFactory(new MyFactory()); + return context; + } + // START SNIPPET: e2 + + public void testAlterDefinitionUsingProcessorFactory() throws Exception { + getMockEndpoint("mock:foo").expectedBodiesReceived("body was altered"); template.sendBody("direct:start", "Hello World"); assertMockEndpointsSatisfied(); - - MyPolicy foo = context.getRegistry().lookup("foo", MyPolicy.class); - assertEquals("Should only be invoked 1 time", 1, foo.getInvoked()); } - @Override - protected JndiRegistry createRegistry() throws Exception { - JndiRegistry jndi = super.createRegistry(); - jndi.bind("foo", new MyPolicy("foo")); - return jndi; + public void testAlterDefinitionUsingProcessorFactoryWithChild() throws Exception { + getMockEndpoint("mock:split").expectedBodiesReceived("body was altered", "body was altered"); + getMockEndpoint("mock:extra").expectedBodiesReceived("body was altered", "body was altered"); + getMockEndpoint("mock:result").expectedBodiesReceived("Hello,World"); + + template.sendBody("direct:foo", "Hello,World"); + + assertMockEndpointsSatisfied(); } @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override + // START SNIPPET: e2 public void configure() throws Exception { - // START SNIPPET: e1 from("direct:start") - // only wrap policy foo around the to(mock:foo) - notice the end() - .policy("foo").setBody().constant("body not altered").to("mock:foo").end(); + .setBody().constant("body not altered").to("mock:foo"); + + from("direct:foo") + .split(body()) + .setBody().constant("body not altered").to("mock:split") + .end() + .to("mock:result"); } + // END SNIPPET: e2 }; } - public static class MyPolicy implements DefinitionAwarePolicy { - - private final String name; - private int invoked; + // START SNIPPET: e3 + public static class MyFactory implements ProcessorFactory { - public MyPolicy(String name) { - this.name = name; + public Processor createChildProcessor(RouteContext routeContext, ProcessorDefinition definition, boolean mandatory) throws Exception { + return null; } - public Processor wrap(RouteContext routeContext, final Processor processor) { - throw new UnsupportedOperationException("This method should not be called"); - } + public Processor createProcessor(RouteContext routeContext, ProcessorDefinition definition) throws Exception { + if (definition instanceof SplitDefinition) { + // add additional output to the splitter + SplitDefinition split = (SplitDefinition) definition; + split.addOutput(new ToDefinition("mock:extra")); + } - public int getInvoked() { - return invoked; - } + if (definition instanceof SetBodyDefinition) { + SetBodyDefinition set = (SetBodyDefinition) definition; + set.setExpression(new ConstantExpression("body was altered")); + } - public Processor wrap(final RouteContext routeContext, - final Processor processor, - final ProcessorDefinition<?> processorDefinition) { - - // alter the child definition - SetBodyDefinition bodyDef = (SetBodyDefinition) processorDefinition.getOutputs().get(0); - ((ExpressionClause<?>)((ExpressionDefinition)bodyDef.getExpression()).getExpressionValue()).constant("body was altered"); - - // make sure the normal "wrap" still works. - return new Processor() { - public void process(Exchange exchange) throws Exception { - invoked++; - exchange.getIn().setHeader(name, "was wrapped"); - processor.process(exchange); - } - }; + // return null to let the default implementation create the processor, we just wanted to alter the definition + // before the processor was created + return null; } } -} + // END SNIPPET: e3 + +} \ No newline at end of file Modified: camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java?rev=961248&r1=961247&r2=961248&view=diff ============================================================================== --- camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java (original) +++ camel/trunk/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java Wed Jul 7 06:24:18 2010 @@ -21,7 +21,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; - import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlTransient; @@ -73,6 +72,7 @@ import org.apache.camel.spi.LifecycleStr import org.apache.camel.spi.ManagementStrategy; import org.apache.camel.spi.PackageScanClassResolver; import org.apache.camel.spi.PackageScanFilter; +import org.apache.camel.spi.ProcessorFactory; import org.apache.camel.spi.ShutdownStrategy; import org.apache.camel.spi.ThreadPoolProfile; import org.apache.camel.util.CamelContextHelper; @@ -149,6 +149,11 @@ public abstract class AbstractCamelConte LOG.info("Using custom ExecutorServiceStrategy: " + executorServiceStrategy); getContext().setExecutorServiceStrategy(executorServiceStrategy); } + ProcessorFactory processorFactory = getBeanForType(ProcessorFactory.class); + if (processorFactory != null) { + LOG.info("Using custom ProcessorFactory: " + processorFactory); + getContext().setProcessorFactory(processorFactory); + } // set the custom registry if defined initCustomRegistry(getContext()); Copied: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringCustomProcessorFactoryTest.java (from r961225, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringAOPAfterTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringCustomProcessorFactoryTest.java?p2=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringCustomProcessorFactoryTest.java&p1=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringAOPAfterTest.java&r1=961225&r2=961248&rev=961248&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringAOPAfterTest.java (original) +++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringCustomProcessorFactoryTest.java Wed Jul 7 06:24:18 2010 @@ -17,15 +17,16 @@ package org.apache.camel.spring.processor; import org.apache.camel.CamelContext; -import org.apache.camel.processor.AOPAfterTest; +import org.apache.camel.processor.CustomProcessorFactoryTest; + import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext; /** * @version $Revision$ */ -public class SpringAOPAfterTest extends AOPAfterTest { +public class SpringCustomProcessorFactoryTest extends CustomProcessorFactoryTest { protected CamelContext createCamelContext() throws Exception { - return createSpringCamelContext(this, "org/apache/camel/spring/processor/aopafter.xml"); + return createSpringCamelContext(this, "org/apache/camel/spring/processor/CustomProcessorFactoryTest.xml"); } } \ No newline at end of file Copied: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/CustomProcessorFactoryTest.xml (from r961225, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aopafter.xml) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/CustomProcessorFactoryTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/CustomProcessorFactoryTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aopafter.xml&r1=961225&r2=961248&rev=961248&view=diff ============================================================================== --- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/aopafter.xml (original) +++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/CustomProcessorFactoryTest.xml Wed Jul 7 06:24:18 2010 @@ -23,15 +23,36 @@ "> <!-- START SNIPPET: e1 --> + + <!-- use a custom processor factory as a hook which can manipulate the model before the processors + is created, which allows us to do stuff to the route before its created --> + <bean id="customFactory" class="org.apache.camel.processor.CustomProcessorFactoryTest$MyFactory"/> + <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> + <!-- a simple route --> <route> <from uri="direct:start"/> - <aop afterUri="mock:after"> - <transform><constant>Bye World</constant></transform> - <to uri="mock:result"/> - </aop> + <setBody> + <constant>body not altered</constant> + </setBody> + <to uri="mock:foo"/> </route> + + <!-- a route which has a sub route (the split) --> + <route> + <from uri="direct:foo"/> + <split> + <simple>${body}</simple> + <setBody> + <constant>body not altered</constant> + </setBody> + <to uri="mock:split"/> + </split> + <to uri="mock:result"/> + </route> + </camelContext> + <!-- END SNIPPET: e1 --> </beans>