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 2011/01/15 14:46:38 UTC

svn commit: r1059327 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/impl/ main/java/org/apache/camel/model/ test/java/org/apache/camel/model/ test/resources/org/apache/camel/model/

Author: davsclaus
Date: Sat Jan 15 13:46:38 2011
New Revision: 1059327

URL: http://svn.apache.org/viewvc?rev=1059327&view=rev
Log:
CAMEL-3543: Fixed loading routes from XML should prepare route model sooner.

Added:
    camel/trunk/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithPolicyTest.java
      - copied, changed from r1059270, camel/trunk/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithOnExceptionTest.java
    camel/trunk/camel-core/src/test/resources/org/apache/camel/model/barPolicyRoute.xml
      - copied, changed from r1059270, camel/trunk/camel-core/src/test/resources/org/apache/camel/model/barOnExceptionRoute.xml
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java

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=1059327&r1=1059326&r2=1059327&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 Sat Jan 15 13:46:38 2011
@@ -694,11 +694,12 @@ public class DefaultCamelContext extends
     }
 
     public void startRoute(RouteDefinition route) throws Exception {
+        // must ensure route is prepared, before we can start it
+        route.prepare();
+
         List<Route> routes = new ArrayList<Route>();
         List<RouteContext> routeContexts = route.addRoutes(this, routes);
         RouteService routeService = new RouteService(this, route, routeContexts, routes);
-        // must ensure route is prepared, before we can start it 
-        route.prepare();
         startRouteService(routeService, true);
     }
 

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java?rev=1059327&r1=1059326&r2=1059327&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteDefinitionHelper.java Sat Jan 15 13:46:38 2011
@@ -19,6 +19,7 @@ package org.apache.camel.model;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.camel.impl.InterceptSendToEndpoint;
 import org.apache.camel.util.EndpointHelper;
 
 /**
@@ -113,7 +114,7 @@ public final class RouteDefinitionHelper
         RouteDefinitionHelper.prepareRouteForInit(route, abstracts, lower);
 
         // interceptors should be first for the cross cutting concerns
-        initInterceptors(route, upper, intercepts, interceptFromDefinitions, interceptSendToEndpointDefinitions);
+        initInterceptors(route, abstracts, upper, intercepts, interceptFromDefinitions, interceptSendToEndpointDefinitions);
         // then on completion
         initOnCompletions(abstracts, upper, onCompletions);
         // then transactions
@@ -148,10 +149,39 @@ public final class RouteDefinitionHelper
         }
     }
 
-    private static void initInterceptors(RouteDefinition route, List<ProcessorDefinition> upper,
+    private static void initInterceptors(RouteDefinition route, List<ProcessorDefinition> abstracts, List<ProcessorDefinition> upper,
                                          List<InterceptDefinition> intercepts,
                                          List<InterceptFromDefinition> interceptFromDefinitions,
                                          List<InterceptSendToEndpointDefinition> interceptSendToEndpointDefinitions) {
+
+        // move the abstracts interceptors into the dedicated list
+        for (ProcessorDefinition processor : abstracts) {
+            if (processor instanceof InterceptSendToEndpointDefinition) {
+                if (interceptSendToEndpointDefinitions == null) {
+                    interceptSendToEndpointDefinitions = new ArrayList<InterceptSendToEndpointDefinition>();
+                }
+                interceptSendToEndpointDefinitions.add((InterceptSendToEndpointDefinition) processor);
+            } else if (processor instanceof InterceptFromDefinition) {
+                if (interceptFromDefinitions == null) {
+                    interceptFromDefinitions = new ArrayList<InterceptFromDefinition>();
+                }
+                interceptFromDefinitions.add((InterceptFromDefinition) processor);
+            } else if (processor instanceof InterceptDefinition) {
+                if (intercepts == null) {
+                    intercepts = new ArrayList<InterceptDefinition>();
+                }
+                intercepts.add((InterceptDefinition) processor);
+            }
+        }
+
+        doInitInterceptors(route, upper, intercepts, interceptFromDefinitions, interceptSendToEndpointDefinitions);
+    }
+
+    private static void doInitInterceptors(RouteDefinition route, List<ProcessorDefinition> upper,
+                                         List<InterceptDefinition> intercepts,
+                                         List<InterceptFromDefinition> interceptFromDefinitions,
+                                         List<InterceptSendToEndpointDefinition> interceptSendToEndpointDefinitions) {
+
         // configure intercept
         if (intercepts != null && !intercepts.isEmpty()) {
             for (InterceptDefinition intercept : intercepts) {

Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithPolicyTest.java (from r1059270, camel/trunk/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithOnExceptionTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithPolicyTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithPolicyTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithOnExceptionTest.java&r1=1059270&r2=1059327&rev=1059327&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithOnExceptionTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/model/LoadRouteFromXmlWithPolicyTest.java Sat Jan 15 13:46:38 2011
@@ -22,16 +22,18 @@ import org.apache.camel.ContextTestSuppo
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.spi.Policy;
+import org.apache.camel.spi.RouteContext;
 
 /**
  * @version $Revision$
  */
-public class LoadRouteFromXmlWithOnExceptionTest extends ContextTestSupport {
+public class LoadRouteFromXmlWithPolicyTest extends ContextTestSupport {
 
     @Override
     protected JndiRegistry createRegistry() throws Exception {
         JndiRegistry jndi = super.createRegistry();
-        jndi.bind("myProcessor", new MyProcessor());
+        jndi.bind("foo", new MyPolicy("foo"));
         return jndi;
     }
 
@@ -40,32 +42,64 @@ public class LoadRouteFromXmlWithOnExcep
         return false;
     }
 
-    public void testLoadRouteFromXmlWitOnException() throws Exception {
-        InputStream is = getClass().getResourceAsStream("barOnExceptionRoute.xml");
+    public void testLoadRouteFromXmlWitPolicy() throws Exception {
+        InputStream is = getClass().getResourceAsStream("barPolicyRoute.xml");
         RoutesDefinition routes = context.loadRoutesDefinition(is);
         context.addRouteDefinitions(routes.getRoutes());
         context.start();
 
+        assertNotNull("Loaded foo route should be there", context.getRoute("foo"));
         assertNotNull("Loaded bar route should be there", context.getRoute("bar"));
-        assertEquals(1, context.getRoutes().size());
+        assertEquals(2, context.getRoutes().size());
 
         // test that loaded route works
-        getMockEndpoint("mock:bar").expectedBodiesReceived("Bye World");
-        getMockEndpoint("mock:error").expectedBodiesReceived("Kabom");
-
-        template.sendBody("direct:bar", "Bye World");
-        template.sendBody("direct:bar", "Kabom");
+        getMockEndpoint("mock:foo").expectedMessageCount(1);
+        getMockEndpoint("mock:foo").expectedHeaderReceived("foo", "was wrapped");
+        getMockEndpoint("mock:bar").expectedMessageCount(1);
+        getMockEndpoint("mock:bar").expectedHeaderReceived("foo", "was wrapped");
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+        getMockEndpoint("mock:result").expectedHeaderReceived("foo", "was wrapped");
+
+        getMockEndpoint("mock:response").expectedMessageCount(1);
+        getMockEndpoint("mock:response").expectedHeaderReceived("foo", "policy finished execution");
+        template.sendBody("direct:send", "Hello World");
 
         assertMockEndpointsSatisfied();
+
+        MyPolicy foo = context.getRegistry().lookup("foo", MyPolicy.class);
+
+        assertEquals("Should only be invoked 1 time", 1, foo.getInvoked());
     }
 
-    private final class MyProcessor implements Processor {
+    public static class MyPolicy implements Policy {
+
+        private final String name;
+        private int invoked;
+
+        public MyPolicy(String name) {
+            this.name = name;
+        }
 
-        public void process(Exchange exchange) throws Exception {
-            String body = exchange.getIn().getBody(String.class);
-            if ("Kabom".equals(body)) {
-                throw new IllegalArgumentException("Damn");
-            }
+        public void beforeWrap(RouteContext routeContext,
+                               ProcessorDefinition<?> definition) {
+            // no need to modify the route
+        }
+
+        public Processor wrap(RouteContext routeContext, final Processor processor) {
+            return new Processor() {
+                public void process(Exchange exchange) throws Exception {
+                    invoked++;
+                    // let the original processor continue routing
+                    exchange.getIn().setHeader(name, "was wrapped");
+                    processor.process(exchange);
+                    exchange.getIn().setHeader(name, "policy finished execution");
+                }
+            };
+        }
+
+        public int getInvoked() {
+            return invoked;
         }
     }
+
 }

Copied: camel/trunk/camel-core/src/test/resources/org/apache/camel/model/barPolicyRoute.xml (from r1059270, camel/trunk/camel-core/src/test/resources/org/apache/camel/model/barOnExceptionRoute.xml)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/resources/org/apache/camel/model/barPolicyRoute.xml?p2=camel/trunk/camel-core/src/test/resources/org/apache/camel/model/barPolicyRoute.xml&p1=camel/trunk/camel-core/src/test/resources/org/apache/camel/model/barOnExceptionRoute.xml&r1=1059270&r2=1059327&rev=1059327&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/resources/org/apache/camel/model/barOnExceptionRoute.xml (original)
+++ camel/trunk/camel-core/src/test/resources/org/apache/camel/model/barPolicyRoute.xml Sat Jan 15 13:46:38 2011
@@ -17,19 +17,19 @@
 -->
 <routes xmlns="http://camel.apache.org/schema/spring">
 
+    <route id="foo">
+        <from uri="direct:start"/>
+        <policy ref="foo">
+            <to uri="mock:foo"/>
+            <to uri="mock:bar"/>
+            <to uri="mock:result"/>
+        </policy>
+    </route>
+
     <route id="bar">
-        <from uri="direct:bar"/>
-        <onException>
-            <exception>java.lang.Exception</exception>
-            <handled>
-                <constant>true</constant>
-            </handled>
-            <to uri="log:error"/>
-            <to uri="mock:error"/>
-        </onException>
-        <process ref="myProcessor"/>
-        <to uri="log:bar"/>
-        <to uri="mock:bar"/>
+        <from uri="direct:send"/>
+        <to uri="direct:start"/>
+        <to uri="mock:response"/>
     </route>
 
 </routes>