You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2010/07/07 08:24:18 UTC

svn commit: r961248 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/ camel-core/src/main/java/org/apache/camel/impl/ camel-core/src/main/java/org/apache/camel/model/ camel-core/src/main/java/org/apache/camel/spi/ camel-core/src/test/java/o...

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>