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/01/06 09:56:38 UTC

svn commit: r896355 - in /camel/trunk: camel-core/src/test/java/org/apache/camel/processor/ camel-core/src/test/resources/ components/camel-spring/src/main/java/org/apache/camel/spring/ components/camel-spring/src/test/resources/ components/camel-sprin...

Author: davsclaus
Date: Wed Jan  6 08:56:25 2010
New Revision: 896355

URL: http://svn.apache.org/viewvc?rev=896355&view=rev
Log:
CAMEL-2336: Fixed issue with transacted and intercept when using Spring XML.

Modified:
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionAndInterceptAndOnExceptionGlobalTest.java
    camel/trunk/camel-core/src/test/resources/log4j.properties
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
    camel/trunk/components/camel-spring/src/test/resources/log4j.properties
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionAndInterceptAndOnExceptionGlobalTest.xml

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionAndInterceptAndOnExceptionGlobalTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionAndInterceptAndOnExceptionGlobalTest.java?rev=896355&r1=896354&r2=896355&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionAndInterceptAndOnExceptionGlobalTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/OnCompletionAndInterceptAndOnExceptionGlobalTest.java Wed Jan  6 08:56:25 2010
@@ -66,13 +66,15 @@
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
+                //context.setTracing(true);
+
                 intercept().to("mock:intercept");
 
-                // define a global on completion that is invoked when the exchage is complete
+                // define a global on completion that is invoked when the exchange is complete
                 onCompletion().to("log:global").to("mock:sync");
 
-                // define an on excpetion
-                onException(Exception.class).to("mock:exception");
+                // define an on exception
+                onException(Exception.class).to("mock:foo", "mock:bar", "mock:exception");
 
                 from("direct:start")
                     .process(new MyProcessor())

Modified: camel/trunk/camel-core/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/resources/log4j.properties?rev=896355&r1=896354&r2=896355&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/resources/log4j.properties (original)
+++ camel/trunk/camel-core/src/test/resources/log4j.properties Wed Jan  6 08:56:25 2010
@@ -23,6 +23,7 @@
 log4j.logger.org.apache.activemq.spring=WARN
 #log4j.logger.org.apache.camel=DEBUG
 #log4j.logger.org.apache.camel.component=TRACE
+#log4j.logger.org.apache.camel.component.mock=DEBUG
 #log4j.logger.org.apache.camel.component.file=TRACE
 log4j.logger.org.apache.camel.impl.converter=WARN
 log4j.logger.org.apache.camel.management=WARN

Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java?rev=896355&r1=896354&r2=896355&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java (original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java Wed Jan  6 08:56:25 2010
@@ -306,21 +306,33 @@
         // using route builders. So we have here a little custom code to fix the JAXB gaps
         for (RouteDefinition route : routes) {
 
-            // move all abstracts into their own list so we can deal with them separately
+            // abstracts is the cross cutting concerns
             List<ProcessorDefinition> abstracts = new ArrayList<ProcessorDefinition>();
-            initAbstracts(route, abstracts);
+
+            // upper is the cross cutting concerns such as interceptors, error handlers etc
+            List<ProcessorDefinition> upper = new ArrayList<ProcessorDefinition>();
+
+            // lower is the regular route
+            List<ProcessorDefinition> lower = new ArrayList<ProcessorDefinition>();
+
+            prepareRouteForInit(route, abstracts, lower);
 
             // toAsync should fix up itself at first
-            initToAsync(route);
+            initToAsync(lower);
 
             // interceptors should be first for the cross cutting concerns
-            initInterceptors(route);
+            initInterceptors(route, upper);
             // then on completion
-            initOnCompletions(route, abstracts);
+            initOnCompletions(abstracts, upper);
             // then polices
-            initPolicies(route, abstracts);
+            initPolicies(abstracts, lower);
             // then on exception
-            initOnExceptions(route, abstracts);
+            initOnExceptions(abstracts, upper);
+
+            // rebuild route as upper + lower
+            route.clearOutput();
+            route.getOutputs().addAll(upper);
+            route.getOutputs().addAll(lower);
 
             // configure parents
             initParent(route);
@@ -340,6 +352,18 @@
         installRoutes();
     }
 
+    private void prepareRouteForInit(RouteDefinition route, List<ProcessorDefinition> abstracts,
+                                     List<ProcessorDefinition> lower) {
+        // filter the route into abstracts and lower
+        for (ProcessorDefinition output : route.getOutputs()) {
+            if (output.isAbstract()) {
+                abstracts.add(output);
+            } else {
+                lower.add(output);
+            }
+        }
+    }
+
     private void initParent(RouteDefinition route) {
         for (ProcessorDefinition output : route.getOutputs()) {
             output.setParent(route);
@@ -362,11 +386,11 @@
         }
     }
 
-    private void initToAsync(RouteDefinition route) {
+    private void initToAsync(List<ProcessorDefinition> lower) {
         List<ProcessorDefinition> outputs = new ArrayList<ProcessorDefinition>();
         ToDefinition toAsync = null;
 
-        for (ProcessorDefinition output : route.getOutputs()) {
+        for (ProcessorDefinition output : lower) {
             if (toAsync != null) {
                 // add this output on toAsync
                 toAsync.getOutputs().add(output);
@@ -385,11 +409,11 @@
         }
 
         // rebuild outputs
-        route.clearOutput();
-        route.getOutputs().addAll(outputs);
+        lower.clear();
+        lower.addAll(outputs);
     }
 
-    private void initOnExceptions(RouteDefinition route, List<ProcessorDefinition> abstracts) {
+    private void initOnExceptions(List<ProcessorDefinition> abstracts, List<ProcessorDefinition> upper) {
 
         // add global on exceptions if any
         if (onExceptions != null && !onExceptions.isEmpty()) {
@@ -401,36 +425,19 @@
             if (output instanceof OnExceptionDefinition) {
                 // on exceptions must be added at top, so the route flow is correct as
                 // on exceptions should be the first outputs
-                route.getOutputs().add(0, output);
-            }
-        }
-    }
-
-    private void initAbstracts(RouteDefinition route, List<ProcessorDefinition> abstracts) {
-        List<ProcessorDefinition> retains = new ArrayList<ProcessorDefinition>();
-
-        for (ProcessorDefinition output : route.getOutputs()) {
-            if (output.isAbstract()) {
-                abstracts.add(output);
-            } else {
-                retains.add(output);
+                upper.add(0, output);
             }
         }
-
-        route.clearOutput();
-        for (ProcessorDefinition retain : retains) {
-            route.addOutput(retain);
-        }
     }
 
-    private void initInterceptors(RouteDefinition route) {
+    private void initInterceptors(RouteDefinition route, List<ProcessorDefinition> upper) {
 
         // configure intercept
         for (InterceptDefinition intercept : getIntercepts()) {
             intercept.afterPropertiesSet();
             // add as first output so intercept is handled before the actual route and that gives
             // us the needed head start to init and be able to intercept all the remaining processing steps
-            route.getOutputs().add(0, intercept);
+            upper.add(0, intercept);
         }
 
         // configure intercept from
@@ -452,7 +459,7 @@
                 intercept.afterPropertiesSet();
                 // add as first output so intercept is handled before the actual route and that gives
                 // us the needed head start to init and be able to intercept all the remaining processing steps
-                route.getOutputs().add(0, intercept);
+                upper.add(0, intercept);
             }
         }
 
@@ -461,12 +468,13 @@
             intercept.afterPropertiesSet();
             // add as first output so intercept is handled before the actual route and that gives
             // us the needed head start to init and be able to intercept all the remaining processing steps
-            route.getOutputs().add(0, intercept);
+            upper.add(0, intercept);
         }
 
     }
 
-    private void initOnCompletions(RouteDefinition route, List<ProcessorDefinition> abstracts) {
+    private void initOnCompletions(List<ProcessorDefinition> abstracts, List<ProcessorDefinition> upper) {
+
         List<OnCompletionDefinition> completions = new ArrayList<OnCompletionDefinition>();
 
         // find the route scoped onCompletions
@@ -486,7 +494,9 @@
             return;
         }
 
-        // add onCompletion *after* intercept, as its important intercept is first
+        upper.addAll(completions);
+
+/*        // add onCompletion *after* intercept, as its important intercept is first
         int index = 0;
         for (int i = 0; i < route.getOutputs().size(); i++) {
             index = i;
@@ -498,10 +508,11 @@
                 break;
             }
         }
-        route.getOutputs().addAll(index, completions);
+        route.getOutputs().addAll(index, completions);*/
     }
 
-    private void initPolicies(RouteDefinition route, List<ProcessorDefinition> abstracts) {
+    private void initPolicies(List<ProcessorDefinition> abstracts, List<ProcessorDefinition> lower) {
+
         // we need two types as transacted cannot extend policy due JAXB limitations
         PolicyDefinition policy = null;
         TransactedDefinition transacted = null;
@@ -517,16 +528,16 @@
 
         if (policy != null) {
             // the outputs should be moved to the policy
-            policy.getOutputs().addAll(route.getOutputs());
+            policy.getOutputs().addAll(lower);
             // and add it as the single output
-            route.clearOutput();
-            route.addOutput(policy);
+            lower.clear();
+            lower.add(policy);
         } else if (transacted != null) {
             // the outputs should be moved to the transacted policy
-            transacted.getOutputs().addAll(route.getOutputs());
+            transacted.getOutputs().addAll(lower);
             // and add it as the single output
-            route.clearOutput();
-            route.addOutput(transacted);
+            lower.clear();
+            lower.add(transacted);
         }
     }
 

Modified: camel/trunk/components/camel-spring/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/log4j.properties?rev=896355&r1=896354&r2=896355&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/log4j.properties (original)
+++ camel/trunk/components/camel-spring/src/test/resources/log4j.properties Wed Jan  6 08:56:25 2010
@@ -26,6 +26,7 @@
 log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN
 
 #log4j.logger.org.apache.camel=DEBUG
+#log4j.logger.org.apache.camel.component.mock=DEBUG
 #log4j.logger.org.apache.camel.spring.spi=DEBUG
 
 # CONSOLE appender not used by default

Modified: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionAndInterceptAndOnExceptionGlobalTest.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionAndInterceptAndOnExceptionGlobalTest.xml?rev=896355&r1=896354&r2=896355&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionAndInterceptAndOnExceptionGlobalTest.xml (original)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringOnCompletionAndInterceptAndOnExceptionGlobalTest.xml Wed Jan  6 08:56:25 2010
@@ -28,6 +28,8 @@
 
         <onException>
             <exception>java.lang.Exception</exception>
+            <to uri="mock:foo"/>
+            <to uri="mock:bar"/>
             <to uri="mock:exception"/>
         </onException>