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 2009/04/14 08:10:19 UTC

svn commit: r764683 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/builder/ camel-core/src/main/java/org/apache/camel/impl/ camel-core/src/main/java/org/apache/camel/management/ camel-core/src/main/java/org/apache/camel/model/ camel-core/...

Author: davsclaus
Date: Tue Apr 14 06:10:17 2009
New Revision: 764683

URL: http://svn.apache.org/viewvc?rev=764683&view=rev
Log:
CAMEL-1475: Easier transacted route configuration. Camel will auto lookup the PlatformTransactionManager and use it if found. Fixed CS. Fixed some TODO that dont apply anymore. 

Added:
    camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/TransactionMinimalConfigurationTest.java
      - copied, changed from r763533, camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.java
    camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionMinimalConfigurationTest.xml
      - copied, changed from r763533, camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.xml
    camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java
      - copied, changed from r763533, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTransactedTest.java
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSourceMinimalConfiguration.xml
      - copied, changed from r763533, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSourceUsingTransacted.xml
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultEndpoint.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationProcessor.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/MarshalDefinition.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/PolicyDefinition.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProcessorDefinition.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/TransactedDefinition.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/UnmarshalDefinition.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/DataFormatsDefinition.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Delayer.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DelegateProcessor.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/HandleFaultProcessor.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Interceptor.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/StreamCachingInterceptor.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/spi/InterceptStrategy.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/BodyAndHeaderConvertTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/builder/InterceptorBuilderTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/impl/ProducerTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/model/XmlTestSupport.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/resequencer/ResequencerRunner.java
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringRouteBuilder.java
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DefaultErrorHandlerBuilder.java Tue Apr 14 06:10:17 2009
@@ -18,8 +18,6 @@
 
 import org.apache.camel.Processor;
 import org.apache.camel.processor.DefaultErrorHandler;
-import org.apache.camel.processor.ErrorHandlerSupport;
-import org.apache.camel.processor.exceptionpolicy.ExceptionPolicyStrategy;
 import org.apache.camel.spi.RouteContext;
 
 /**

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultEndpoint.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultEndpoint.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultEndpoint.java Tue Apr 14 06:10:17 2009
@@ -127,7 +127,6 @@
      * Converts the given exchange to the specified exchange type
      */
     public Exchange convertTo(Class<Exchange> type, Exchange exchange) {
-        // TODO we could infer type parameter
         if (type.isInstance(exchange)) {
             return type.cast(exchange);
         }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java Tue Apr 14 06:10:17 2009
@@ -141,6 +141,8 @@
 
             // lets create the async processor
             final AsyncProcessor asyncProcessor = AsyncProcessorTypeConverter.convert(processor);
+            // and wrap it in a unit of work so the UoW is on the top, so the entire route
+            // will be in the same UoW
             Processor unitOfWorkProcessor = new UnitOfWorkProcessor(asyncProcessor);
 
             // TODO: hz: move all this into the lifecycle strategy! (used by jmx naming strategy)

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationLifecycleStrategy.java Tue Apr 14 06:10:17 2009
@@ -268,7 +268,7 @@
             // add exception handlers as top children
             routeType.getOutputs().addAll(exceptionHandlers);
 
-            // add an interceptor
+            // add an interceptor to instrument the route
             InstrumentationProcessor processor = new InstrumentationProcessor();
             routeType.intercept(processor);
 

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationProcessor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationProcessor.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationProcessor.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/InstrumentationProcessor.java Tue Apr 14 06:10:17 2009
@@ -44,7 +44,7 @@
     
     @Override
     public String toString() {
-        return "Instrumentation(" + processor + ")";
+        return "Instrumentation[" + processor + "]";
     }
 
     public void setCounter(PerformanceCounter counter) {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/MarshalDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/MarshalDefinition.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/MarshalDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/MarshalDefinition.java Tue Apr 14 06:10:17 2009
@@ -51,8 +51,7 @@
 public class MarshalDefinition extends OutputDefinition<ProcessorDefinition> {
     @XmlAttribute(required = false)
     private String ref;
-    // TODO cannot use @XmlElementRef as it doesn't allow optional properties
-    // @XmlElementRef
+    // cannot use @XmlElementRef as it doesn't allow optional properties
     @XmlElements({
     @XmlElement(required = false, name = "artixDS", type = ArtixDSDataFormat.class),
     @XmlElement(required = false, name = "csv", type = CsvDataFormat.class),

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/PolicyDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/PolicyDefinition.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/PolicyDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/PolicyDefinition.java Tue Apr 14 06:10:17 2009
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.model;
 
-import java.util.Map;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
@@ -26,7 +25,6 @@
 import org.apache.camel.Processor;
 import org.apache.camel.spi.Policy;
 import org.apache.camel.spi.RouteContext;
-import org.apache.camel.spi.TransactedPolicy;
 import org.apache.camel.util.ObjectHelper;
 
 /**
@@ -41,8 +39,6 @@
     // TODO: Align this code with TransactedDefinition
 
     @XmlTransient
-    public static final String PROPAGATION_REQUIRED = "PROPAGATION_REQUIRED";
-    @XmlTransient
     protected Class<? extends Policy> type;
     @XmlAttribute(required = true)
     protected String ref;
@@ -121,36 +117,6 @@
         return policy.wrap(routeContext, childProcessor);
     }
 
-    protected Policy resolvePolicy(RouteContext routeContext) {
-        if (policy == null) {
-            // try ref first
-            String ref = getRef();
-            if (ObjectHelper.isNotEmpty(ref)) {
-                policy = routeContext.lookup(ref, Policy.class);
-            }
-
-            // try to lookup by scoped type
-            if (policy == null && type != null) {
-                // try find by type, note that this method is not supported by all registry
-                Map types = routeContext.lookupByType(type);
-                if (types.size() == 1) {
-                    // only one policy defined so use it
-                    Object found = types.values().iterator().next();
-                    if (type.isInstance(found)) {
-                        return type.cast(found);
-                    }
-                }
-            }
-
-            // for transacted routing try the default REQUIRED name
-            if (policy == null && type == TransactedPolicy.class) {
-                // still not found try with the default name PROPAGATION_REQUIRED
-                policy = routeContext.lookup(PROPAGATION_REQUIRED, TransactedPolicy.class);
-            }
-        }
-        return policy;
-    }
-
     protected String description() {
         if (policy != null) {
             return policy.toString();
@@ -158,4 +124,13 @@
             return "ref: " + ref;
         }
     }
+
+    protected Policy resolvePolicy(RouteContext routeContext) {
+        if (policy != null) {
+            return policy;
+        }
+        // reuse code on transacted definition to do the resolution
+        return TransactedDefinition.doResolvePolicy(routeContext, getRef(), type);
+    }
+
 }

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=764683&r1=764682&r2=764683&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 Tue Apr 14 06:10:17 2009
@@ -2040,6 +2040,7 @@
         CamelContext camelContext = routeContext.getCamelContext();
         strategies.addAll(camelContext.getInterceptStrategies());
         strategies.addAll(routeContext.getInterceptStrategies());
+        // TODO: Order the strategies, eg using Comparable so we can have Tracer near the real processor
         for (InterceptStrategy strategy : strategies) {
             if (strategy != null) {
                 target = strategy.wrapProcessorInInterceptors(this, target);

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/TransactedDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/TransactedDefinition.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/TransactedDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/TransactedDefinition.java Tue Apr 14 06:10:17 2009
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.model;
 
+import java.lang.reflect.Method;
 import java.util.Map;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
@@ -24,10 +25,13 @@
 import javax.xml.bind.annotation.XmlTransient;
 
 import org.apache.camel.Processor;
+import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.Policy;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.spi.TransactedPolicy;
 import org.apache.camel.util.ObjectHelper;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 /**
  * Represents an XML &lt;transacted/&gt; element
@@ -44,6 +48,9 @@
     // if we extend PolicyDefinition so we must make a copy of the class
     @XmlTransient
     public static final String PROPAGATION_REQUIRED = "PROPAGATION_REQUIRED";
+
+    private static final transient Log LOG = LogFactory.getLog(TransactedDefinition.class);
+
     @XmlTransient
     protected Class<? extends Policy> type = TransactedPolicy.class;
     @XmlAttribute
@@ -123,41 +130,99 @@
         return policy.wrap(routeContext, childProcessor);
     }
 
+
+    protected String description() {
+        if (policy != null) {
+            return policy.toString();
+        } else {
+            return "ref: " + ref;
+        }
+    }
+
     protected Policy resolvePolicy(RouteContext routeContext) {
-        if (policy == null) {
-            // try ref first
-            String ref = getRef();
-            if (ObjectHelper.isNotEmpty(ref)) {
-                policy = routeContext.lookup(ref, Policy.class);
-            }
+        if (policy != null) {
+            return policy;
+        }
+        return doResolvePolicy(routeContext, getRef(), type);
+    }
 
-            // try to lookup by scoped type
-            if (policy == null && type != null) {
-                // try find by type, note that this method is not supported by all registry
-                Map types = routeContext.lookupByType(type);
-                if (types.size() == 1) {
-                    // only one policy defined so use it
-                    Object found = types.values().iterator().next();
-                    if (type.isInstance(found)) {
-                        return type.cast(found);
-                    }
+    @SuppressWarnings("unchecked")
+    protected static Policy doResolvePolicy(RouteContext routeContext, String ref, Class<? extends Policy> type) {
+        Policy answer = null;
+
+        // try ref first
+        if (ObjectHelper.isNotEmpty(ref)) {
+            answer = routeContext.lookup(ref, Policy.class);
+        }
+
+        // try to lookup by scoped type
+        if (answer == null && type != null) {
+            // try find by type, note that this method is not supported by all registry
+            Map types = routeContext.lookupByType(type);
+            if (types.size() == 1) {
+                // only one policy defined so use it
+                Object found = types.values().iterator().next();
+                if (type.isInstance(found)) {
+                    return type.cast(found);
                 }
             }
+        }
 
-            // for transacted routing try the default REQUIRED name
-            if (policy == null && type == TransactedPolicy.class) {
-                // still not found try with the default name PROPAGATION_REQUIRED
-                policy = routeContext.lookup(PROPAGATION_REQUIRED, TransactedPolicy.class);
-            }
+        // for transacted routing try the default REQUIRED name
+        if (answer == null && type == TransactedPolicy.class) {
+            // still not found try with the default name PROPAGATION_REQUIRED
+            answer = routeContext.lookup(PROPAGATION_REQUIRED, TransactedPolicy.class);
         }
-        return policy;
-    }
 
-    protected String description() {
-        if (policy != null) {
-            return policy.toString();
-        } else {
-            return "ref: " + ref;
+        // no policy then try lookup the platform transaction manager and use it as policy
+        if (answer == null && type == TransactedPolicy.class) {
+            Class tmClazz = routeContext.getCamelContext().getClassResolver().resolveClass("org.springframework.transaction.PlatformTransactionManager");
+            if (tmClazz != null) {
+                // see if we can find the platform transaction manager in the registry
+                Map<String, Object> maps = routeContext.lookupByType(tmClazz);
+                if (maps.size() == 1) {
+                    // only one platform manager then use it as default and create a transacted
+                    // policy with it and default to required
+
+                    // as we do not want dependency on spring jars in the camel-core we use
+                    // reflection to lookup classes and create new objects and call methods
+                    // as this is only done during route building it does not matter that we
+                    // use reflection as performance is no a concern during route building
+                    Object transactionManager = maps.values().iterator().next();
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("One instance of PlatformTransactionManager found in registry: " + transactionManager);
+                    }
+                    Class txClazz = routeContext.getCamelContext().getClassResolver().resolveClass("org.apache.camel.spring.spi.SpringTransactionPolicy");
+                    if (txClazz != null) {
+                        if (LOG.isDebugEnabled()) {
+                            LOG.debug("Creating a new temporary SpringTransactionPolicy using the PlatformTransactionManager: " + transactionManager);
+                        }
+                        TransactedPolicy txPolicy = ObjectHelper.newInstance(txClazz, TransactedPolicy.class);
+                        Method method;
+                        try {
+                            method = txClazz.getMethod("setTransactionManager", tmClazz);
+                        } catch (NoSuchMethodException e) {
+                            throw new RuntimeCamelException("Cannot get method setTransactionManager(PlatformTransactionManager) on class: " + txClazz);
+                        }
+                        ObjectHelper.invokeMethod(method, txPolicy, transactionManager);
+                        return txPolicy;
+                    } else {
+                        LOG.warn("Cannot create a transacted policy as camel-spring.jar is not on the classpath!");
+                    }
+                } else {
+                    if (LOG.isDebugEnabled()) {
+                        if (maps.isEmpty()) {
+                            LOG.debug("No PlatformTransactionManager found in registry.");
+                        } else {
+                            LOG.debug("Found " + maps.size() + " PlatformTransactionManager in registry. "
+                                    + "Cannot determine which one to use. Please configure a TransactionTemplate on the policy");
+                        }
+                    }
+                }
+            }
         }
+
+        return answer;
     }
+
 }

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/UnmarshalDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/UnmarshalDefinition.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/UnmarshalDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/UnmarshalDefinition.java Tue Apr 14 06:10:17 2009
@@ -52,8 +52,7 @@
 public class UnmarshalDefinition extends OutputDefinition<ProcessorDefinition> {
     @XmlAttribute(required = false)
     private String ref;
-    // TODO cannot use @XmlElementRef as it doesn't allow optional properties
-    // @XmlElementRef
+    // cannot use @XmlElementRef as it doesn't allow optional properties
     @XmlElements({
     @XmlElement(required = false, name = "artixDS", type = ArtixDSDataFormat.class),
     @XmlElement(required = false, name = "csv", type = CsvDataFormat.class),

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/DataFormatsDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/DataFormatsDefinition.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/DataFormatsDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/dataformat/DataFormatsDefinition.java Tue Apr 14 06:10:17 2009
@@ -33,8 +33,7 @@
 @XmlAccessorType(XmlAccessType.FIELD)
 public class DataFormatsDefinition {
 
-    // TODO cannot use @XmlElementRef as it doesn't allow optional properties
-    // @XmlElementRef
+    // cannot use @XmlElementRef as it doesn't allow optional properties
     @XmlElements({
         @XmlElement(required = false, name = "artixDS", type = ArtixDSDataFormat.class),
         @XmlElement(required = false, name = "csv", type = CsvDataFormat.class),   

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Delayer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Delayer.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Delayer.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Delayer.java Tue Apr 14 06:10:17 2009
@@ -42,7 +42,7 @@
 
     @Override
     public String toString() {
-        return "Delayer[on: " + timeExpression + " delay: " + delay + " to: " + getProcessor() + "]";
+        return "Delayer[" + (timeExpression != null ? "on: " + timeExpression : "") + " delay: " + delay + " to: " + getProcessor() + "]";
     }
 
     // Properties

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DelegateProcessor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DelegateProcessor.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DelegateProcessor.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DelegateProcessor.java Tue Apr 14 06:10:17 2009
@@ -52,7 +52,7 @@
 
     @Override
     public String toString() {
-        return "Delegate(" + processor + ")";
+        return "Delegate[" + processor + "]";
     }
 
     public Processor getProcessor() {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/HandleFaultProcessor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/HandleFaultProcessor.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/HandleFaultProcessor.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/HandleFaultProcessor.java Tue Apr 14 06:10:17 2009
@@ -27,7 +27,7 @@
     
     @Override
     public String toString() {
-        return "HandleFaultProcessor(" + processor + ")";
+        return "HandleFault[" + processor + "]";
     }
 
     @Override

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Interceptor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Interceptor.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Interceptor.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Interceptor.java Tue Apr 14 06:10:17 2009
@@ -50,6 +50,11 @@
     }
 
     @Override
+    public String toString() {
+        return "Interceptor[" + interceptorLogic + "]";
+    }
+
+    @Override
     protected void doStart() throws Exception {
         ServiceHelper.startService(interceptorLogic);
         super.doStart();

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/StreamCachingInterceptor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/StreamCachingInterceptor.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/StreamCachingInterceptor.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/StreamCachingInterceptor.java Tue Apr 14 06:10:17 2009
@@ -45,7 +45,7 @@
 
     @Override
     public String toString() {
-        return "StreamCachingInterceptor(" + processor + ")";
+        return "StreamCachingInterceptor[" + processor + "]";
     }
 
     /**

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/InterceptStrategy.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/InterceptStrategy.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/InterceptStrategy.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/InterceptStrategy.java Tue Apr 14 06:10:17 2009
@@ -40,5 +40,5 @@
      * @throws Exception can be thrown
      */
     Processor wrapProcessorInInterceptors(ProcessorDefinition processorType,
-            Processor target) throws Exception;
+                                          Processor target) throws Exception;
 }

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/BodyAndHeaderConvertTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/BodyAndHeaderConvertTest.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/BodyAndHeaderConvertTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/BodyAndHeaderConvertTest.java Tue Apr 14 06:10:17 2009
@@ -47,15 +47,11 @@
     public void testConversionOfExchangeProperties() throws Exception {
         String text = exchange.getProperty("foo", String.class);
         assertEquals("foo property", "1234", text);
-
-        // TODO better conversion example when the property editor support is added
     }
 
     public void testConversionOfMessageHeaders() throws Exception {
         String text = exchange.getIn().getHeader("bar", String.class);
         assertEquals("bar header", "567", text);
-
-        // TODO better conversion example when the property editor support is added
     }
 
     public void testConversionOfMessageAttachments() throws Exception {

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/builder/InterceptorBuilderTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/InterceptorBuilderTest.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/builder/InterceptorBuilderTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/builder/InterceptorBuilderTest.java Tue Apr 14 06:10:17 2009
@@ -73,12 +73,7 @@
 
         RouteBuilder builder = new RouteBuilder() {
             public void configure() {
-                //from("direct:a").intercept(interceptor1).intercept(interceptor2).to("direct:d");
                 from("direct:a").intercept(interceptor1).process(orderProcessor).intercept(interceptor2).process(toProcessor);
-                /*
-                 * TODO keep old DSL? .intercept() .add(interceptor1)
-                 * .add(interceptor2) .target().to("direct:d");
-                 */
             }
         };
         container.addRoutes(builder);

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/impl/ProducerTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/impl/ProducerTest.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/impl/ProducerTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/impl/ProducerTest.java Tue Apr 14 06:10:17 2009
@@ -69,18 +69,11 @@
         Exchange exchange = new DefaultExchange(context);
         producer.process(exchange);
 
-        // TODO: fix me
-        // Class<?> type = endpoint.getExchangeType();
-        // assertEquals("exchange type", MyExchange.class, type);
-
         MyExchange actual = (MyExchange) endpoint.createExchange(exchange);
         assertNotNull(actual);
         assertTrue("Not same exchange", actual != exchange);
 
         MyExchange expected = new MyExchange(context, pattern);
         actual = (MyExchange) endpoint.createExchange(expected);
-
-        // TODO: fix me
-        // assertSame("Should not copy an exchange when of the correct type", expected, actual);
     }
 }

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/model/XmlTestSupport.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/model/XmlTestSupport.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/model/XmlTestSupport.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/model/XmlTestSupport.java Tue Apr 14 06:10:17 2009
@@ -55,7 +55,6 @@
     }
 
     public static JAXBContext createJaxbContext() throws JAXBException {
-        return JAXBContext
-            .newInstance(Constants.JAXB_CONTEXT_PACKAGES);
+        return JAXBContext.newInstance(Constants.JAXB_CONTEXT_PACKAGES);
     }
 }

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/resequencer/ResequencerRunner.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/resequencer/ResequencerRunner.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/resequencer/ResequencerRunner.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/resequencer/ResequencerRunner.java Tue Apr 14 06:10:17 2009
@@ -44,7 +44,6 @@
                 e.printStackTrace();
             }
         }
-        // TODO Auto-generated method stub
         super.run();
     }
 

Copied: camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/TransactionMinimalConfigurationTest.java (from r763533, camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/TransactionMinimalConfigurationTest.java?p2=camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/TransactionMinimalConfigurationTest.java&p1=camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.java&r1=763533&r2=764683&rev=764683&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.java (original)
+++ camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/tx/TransactionMinimalConfigurationTest.java Tue Apr 14 06:10:17 2009
@@ -23,13 +23,13 @@
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
 /**
- * To demonstrate the TransactionErrorHandlerBuilder configured in Spring XML.
+ * To demonstrate transacted with minimal configuration.
  */
-public class TransactionErrorHandlerBuilderAsSpringBeanTest extends SpringTestSupport {
+public class TransactionMinimalConfigurationTest extends SpringTestSupport {
 
     protected ClassPathXmlApplicationContext createApplicationContext() {
         return new ClassPathXmlApplicationContext(
-            "/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.xml");
+            "/org/apache/camel/component/jms/tx/TransactionMinimalConfigurationTest.xml");
     }
 
     protected int getExpectedRouteCount() {

Copied: camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionMinimalConfigurationTest.xml (from r763533, camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.xml)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionMinimalConfigurationTest.xml?p2=camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionMinimalConfigurationTest.xml&p1=camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.xml&r1=763533&r2=764683&rev=764683&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionErrorHandlerBuilderAsSpringBeanTest.xml (original)
+++ camel/trunk/components/camel-jms/src/test/resources/org/apache/camel/component/jms/tx/TransactionMinimalConfigurationTest.xml Tue Apr 14 06:10:17 2009
@@ -22,73 +22,36 @@
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
          http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
 
-    <!-- START SNIPPET: e1 -->
-    <!-- here we define our camel context -->
-    <camel:camelContext id="myroutes">
-
-        <!-- first route with transaction error handler -->
-        <!-- here we refer to our transaction error handler we define in this Spring XML file -->
-        <!-- in this route the transactionErrorHandler is used -->
-        <camel:route errorHandlerRef="transactionErrorHandler">
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+        <route>
             <!-- 1: from the jms queue -->
-            <camel:from uri="activemq:queue:okay"/>
-            <!-- 2: setup the transactional boundaries to require a transaction -->
-            <camel:policy ref="required"/>
+            <from uri="activemq:queue:okay"/>
+            <!-- 2: mark this route as transacted -->
+            <transacted/>
             <!-- 3: call our business logic that is myProcessor -->
-            <camel:process ref="myProcessor"/>
+            <process ref="myProcessor"/>
             <!-- 4: if success then send it to the mock -->
-            <camel:to uri="mock:result"/>
-        </camel:route>
-
-        <!-- 2nd route with no error handling -->
-        <!-- this route doens't use error handler, in fact the spring bean with id noErrorHandler -->
-        <camel:route errorHandlerRef="noErrorHandler">
-            <camel:from uri="activemq:queue:bad"/>
-            <camel:to uri="log:bad"/>
-        </camel:route>
-
-    </camel:camelContext>
-    <!-- END SNIPPET: e1 -->
+            <to uri="mock:result"/>
+        </route>
+    </camelContext>
 
     <bean id="myProcessor" class="org.apache.camel.component.jms.tx.JMSTransactionalClientTest$MyProcessor"/>
 
-    <!-- START SNIPPET: e2 -->
-    <!-- camel policy we refer to in our route -->
-    <bean id="required" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
-        <property name="transactionTemplate" ref="PROPAGATION_REQUIRED"/>
-    </bean>
-
-    <!-- the standard spring transaction template for required -->
-    <bean id="PROPAGATION_REQUIRED" class="org.springframework.transaction.support.TransactionTemplate">
-        <property name="transactionManager" ref="jmsTransactionManager"/>
-    </bean>
-
-    <!-- the transaction error handle we refer to from the route -->
-    <bean id="transactionErrorHandler" class="org.apache.camel.spring.spi.TransactionErrorHandlerBuilder">
-        <property name="transactionTemplate" ref="PROPAGATION_REQUIRED"/>
-    </bean>
-
-    <!-- the no error handler -->
-    <bean id="noErrorHandler" class="org.apache.camel.builder.NoErrorHandlerBuilder"/>
-    <!-- END SNIPPET: e2 -->
-
+    <!-- setup JMS connection factory -->
     <bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
         <property name="brokerURL" value="vm://localhost?broker.persistent=false&amp;broker.useJmx=false"/>
     </bean>
 
+    <!-- setup spring jms TX manager -->
     <bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
         <property name="connectionFactory" ref="jmsConnectionFactory"/>
     </bean>
 
-    <bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
+    <!-- define our activemq component -->
+    <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
         <property name="connectionFactory" ref="jmsConnectionFactory"/>
-        <property name="transactionManager" ref="jmsTransactionManager"/>
+        <!-- define the jms consumer/producer as transacted -->
         <property name="transacted" value="true"/>
-        <property name="concurrentConsumers" value="1"/>
-    </bean>
-
-    <bean id="activemq" class="org.apache.camel.component.jms.JmsComponent">
-        <property name="configuration" ref="jmsConfig"/>
     </bean>
 
 </beans>

Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringRouteBuilder.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringRouteBuilder.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringRouteBuilder.java (original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/SpringRouteBuilder.java Tue Apr 14 06:10:17 2009
@@ -23,6 +23,7 @@
 import org.apache.camel.spring.spi.TransactionErrorHandlerBuilder;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
+import org.springframework.transaction.PlatformTransactionManager;
 import org.springframework.transaction.support.TransactionTemplate;
 
 /**
@@ -124,4 +125,15 @@
         return answer;
     }
 
+    /**
+     * Creates a transaction error handler.
+     *
+     * @param transactionManager the spring transaction manager
+     * @return the created error handler
+     */
+    public TransactionErrorHandlerBuilder transactionErrorHandler(PlatformTransactionManager transactionManager) {
+        TransactionTemplate template = new TransactionTemplate(transactionManager);
+        return transactionErrorHandler(template);
+    }
+
 }

Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java?rev=764683&r1=764682&r2=764683&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java (original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/SpringTransactionPolicy.java Tue Apr 14 06:10:17 2009
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.spring.spi;
 
+import java.util.Map;
+
 import org.apache.camel.Processor;
 import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;

Copied: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java (from r763533, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTransactedTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java?p2=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java&p1=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTransactedTest.java&r1=763533&r2=764683&rev=764683&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTransactedTest.java (original)
+++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java Tue Apr 14 06:10:17 2009
@@ -16,35 +16,61 @@
  */
 package org.apache.camel.spring.interceptor;
 
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.spring.SpringRouteBuilder;
+import javax.sql.DataSource;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spring.SpringTestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.jdbc.core.JdbcTemplate;
 
 /**
- * Easier transaction configuration as we do not have to setup a transaction error handler
+ * Easier transaction configuration as we only setup Spring TX stuff.
  */
-public class TransactionalClientDataSourceTransactedTest extends TransactionalClientDataSourceTest {
+public class TransactionalClientDataSourceMinimalConfigurationTest extends SpringTestSupport {
+
+    protected JdbcTemplate jdbc;
+
+    protected AbstractXmlApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext(
+            "/org/apache/camel/spring/interceptor/springTransactionalClientDataSourceMinimalConfiguration.xml");
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // create database and insert dummy data
+        final DataSource ds = getMandatoryBean(DataSource.class, "dataSource");
+        jdbc = new JdbcTemplate(ds);
+        jdbc.execute("create table books (title varchar(50))");
+        jdbc.update("insert into books (title) values (?)", new Object[] {"Camel in Action"});
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        jdbc.execute("drop table books");
+    }
+
+    public void testTransactionSuccess() throws Exception {
+        template.sendBody("direct:okay", "Hello World");
+
+        int count = jdbc.queryForInt("select count(*) from books");
+        assertEquals("Number of books", 3, count);
+    }
+
+    public void testTransactionRollback() throws Exception {
+        try {
+            template.sendBody("direct:fail", "Hello World");
+        } catch (RuntimeCamelException e) {
+            // expeced as we fail
+            assertTrue(e.getCause() instanceof IllegalArgumentException);
+            assertEquals("We don't have Donkeys, only Camels", e.getCause().getMessage());
+        }
 
-    protected RouteBuilder createRouteBuilder() throws Exception {
-        return new SpringRouteBuilder() {
-            public void configure() throws Exception {
-                // START SNIPPET: e1
-                from("direct:okay")
-                    // marks this route as transacted, and we dont pass in any parameters so we
-                    // will auto lookup and use the Policy defined in the spring XML file
-                    .transacted()
-                    .setBody(constant("Tiger in Action")).beanRef("bookService")
-                    .setBody(constant("Elephant in Action")).beanRef("bookService");
-
-                // marks this route as transacted that will use the single policy defined in the registry
-                from("direct:fail")
-                    // marks this route as transacted, and we dont pass in any parameters so we
-                    // will auto lookup and use the Policy defined in the spring XML file
-                    .transacted()
-                    .setBody(constant("Tiger in Action")).beanRef("bookService")
-                    .setBody(constant("Donkey in Action")).beanRef("bookService");
-                // END SNIPPET: e1
-            }
-        };
+        int count = jdbc.queryForInt("select count(*) from books");
+        assertEquals("Number of books", 1, count);
     }
 
-}
+}
\ No newline at end of file

Copied: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSourceMinimalConfiguration.xml (from r763533, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSourceUsingTransacted.xml)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSourceMinimalConfiguration.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSourceMinimalConfiguration.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSourceUsingTransacted.xml&r1=763533&r2=764683&rev=764683&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSourceUsingTransacted.xml (original)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/springTransactionalClientDataSourceMinimalConfiguration.xml Tue Apr 14 06:10:17 2009
@@ -21,12 +21,36 @@
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
          http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
 
-    <import resource="transactionalClientDataSource.xml"/>
-
     <!-- START SNIPPET: e1 -->
+    <!-- this example uses JDBC so we define a data source -->
+    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
+        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
+        <property name="url" value="jdbc:hsqldb:mem:camel"/>
+        <property name="username" value="sa"/>
+        <property name="password" value=""/>
+    </bean>
+
+    <!-- spring transaction manager -->
+    <!-- this is the transaction manager Camel will use for transacted routes -->
+    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
+        <property name="dataSource" ref="dataSource"/>
+    </bean>
+
+    <!-- bean for book business logic -->
+    <bean id="bookService" class="org.apache.camel.spring.interceptor.BookService">
+        <property name="dataSource" ref="dataSource"/>
+    </bean>
+    <!-- END SNIPPET: e1 -->
+
+    <!-- START SNIPPET: e2 -->
     <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
         <route>
             <from uri="direct:okay"/>
+            <!-- we mark this route as transacted. Camel will lookup the spring transaction manager
+                 and use it by default. We can optimally pass in arguments to specify a policy to use
+                 that is configured with a spring transaction manager of choice. However Camel supports
+                 convention over configuration as we can just use the defaults out of the box and Camel
+                 that suites in most situations -->
             <transacted/>
             <setBody>
                 <constant>Tiger in Action</constant>
@@ -40,6 +64,7 @@
 
         <route>
             <from uri="direct:fail"/>
+            <!-- we mark this route as transacted. See comments above. -->
             <transacted/>
             <setBody>
                 <constant>Tiger in Action</constant>
@@ -51,6 +76,6 @@
             <bean ref="bookService"/>
         </route>
     </camelContext>
-    <!-- END SNIPPET: e1 -->
+    <!-- END SNIPPET: e2 -->
 
 </beans>