Author: davsclaus
Date: Thu Dec  3 14:06:52 2009
New Revision: 886781

URL: http://svn.apache.org/viewvc?rev=886781&view=rev
Log:
CAMEL-2052, CAMEL-2054: Minor overhaul of TransactionErrorHandler simplyfing 
internal logic. Added better support for using multiple transactions with 
different propagation behavior. Added markRollbackOnlyLast() to rollback only 
last TX and not the outer TXs.

Added:
    
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java
   (contents, props changed)
      - copied, changed from r886727, 
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactedRuntimeCamelException.java
    
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.java
      - copied, changed from r886727, 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java
    
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.xml
      - copied, changed from r886727, 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml
Removed:
    
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactedRuntimeCamelException.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.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/RollbackDefinition.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RollbackProcessor.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/spi/UnitOfWork.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
    
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandler.java
    
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedPropagationTransactedTest.java
    
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/SpringTransactionalClientDataSourceTransactedTest.java
    
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java
    
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceOnExceptionRedeliveryTest.java
    
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceRedeliveryTest.java
    
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java
    
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionRollbackTest.java
    
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionTest.java
    
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientWithRollbackTest.java
    camel/trunk/components/camel-spring/src/test/resources/log4j.properties
    
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java 
(original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java Thu Dec 
 3 14:06:52 2009
@@ -95,6 +95,7 @@
     String REDELIVERED        = "CamelRedelivered";
     String REDELIVERY_COUNTER = "CamelRedeliveryCounter";
     String ROLLBACK_ONLY      = "CamelRollbackOnly";
+    String ROLLBACK_ONLY_LAST = "CamelRollbackOnlyLast";
 
     String SPLIT_INDEX = "CamelSplitIndex";
     String SPLIT_SIZE  = "CamelSplitSize";

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java 
(original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java 
Thu Dec  3 14:06:52 2009
@@ -268,7 +268,7 @@
     }
 
     public boolean isRollbackOnly() {
-        return Boolean.TRUE.equals(getProperty(Exchange.ROLLBACK_ONLY));
+        return Boolean.TRUE.equals(getProperty(Exchange.ROLLBACK_ONLY)) || 
Boolean.TRUE.equals(getProperty(Exchange.ROLLBACK_ONLY_LAST));
     }
 
     public UnitOfWork getUnitOfWork() {

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultUnitOfWork.java
 Thu Dec  3 14:06:52 2009
@@ -17,7 +17,9 @@
 package org.apache.camel.impl;
 
 import java.util.ArrayList;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
@@ -42,12 +44,14 @@
     private List<Synchronization> synchronizations;
     private Message originalInMessage;
     private final TracedRouteNodes tracedRouteNodes;
+    private Set<Object> transactedBy;
 
     public DefaultUnitOfWork(Exchange exchange) {
         tracedRouteNodes = new DefaultTracedRouteNodes();
 
         // TODO: optimize to only copy original message if enabled to do so in 
the route
         // special for JmsMessage as it can cause it to loose headers later.
+        // This will be resolved when we get the message facade with copy on 
write implemented
         if (exchange.getIn().getClass().getSimpleName().equals("JmsMessage")) {
             this.originalInMessage = new DefaultMessage();
             this.originalInMessage.setBody(exchange.getIn().getBody());
@@ -77,6 +81,9 @@
         if (tracedRouteNodes != null) {
             tracedRouteNodes.clear();
         }
+        if (transactedBy != null) {
+            transactedBy.clear();
+        }
         originalInMessage = null;
     }
 
@@ -158,4 +165,22 @@
         return tracedRouteNodes;
     }
 
+    public boolean isTransactedBy(Object transactionDefinition) {
+        return getTransactedBy().contains(transactionDefinition);
+    }
+
+    public void beginTransactedBy(Object transactionDefinition) {
+        getTransactedBy().add(transactionDefinition);
+    }
+
+    public void endTransactedBy(Object transactionDefinition) {
+        getTransactedBy().remove(transactionDefinition);
+    }
+
+    private Set<Object> getTransactedBy() {
+        if (transactedBy == null) {
+            transactedBy = new LinkedHashSet<Object>();
+        }
+        return transactedBy;
+    }
 }

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=886781&r1=886780&r2=886781&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
 Thu Dec  3 14:06:52 2009
@@ -1458,6 +1458,7 @@
      * @return the builder
      * @see #rollback()
      * @see #rollback(String)
+     * @see #markRollbackOnlyLast()
      */
     @SuppressWarnings("unchecked")
     public Type markRollbackOnly() {
@@ -1468,6 +1469,27 @@
     }
 
     /**
+     * Marks the exchange for rollback only, but only for the last (current) 
transaction.
+     * <p/>
+     * A last rollback is used when you have nested transactions and only want 
the last local transaction to rollback,
+     * where as the outer transaction can still be completed
+     * <p/>
+     * Does <b>not</b> set any exception as opposed to {...@link #rollback()} 
methods.
+     *
+     * @return the builder
+     * @see #rollback()
+     * @see #rollback(String)
+     * @see #markRollbackOnly()
+     */
+    @SuppressWarnings("unchecked")
+    public Type markRollbackOnlyLast() {
+        RollbackDefinition answer = new RollbackDefinition();
+        answer.setMarkRollbackOnlyLast(true);
+        addOutput(answer);
+        return (Type) this;
+    }
+
+    /**
      * Marks the exchange for rollback only and sets an exception with a 
default message.
      * <p/>
      * This is done by setting a {...@link 
org.apache.camel.RollbackExchangeException} on the Exchange

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RollbackDefinition.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RollbackDefinition.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RollbackDefinition.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RollbackDefinition.java
 Thu Dec  3 14:06:52 2009
@@ -37,6 +37,8 @@
     @XmlAttribute
     private Boolean markRollbackOnly;
     @XmlAttribute
+    private Boolean markRollbackOnlyLast;
+    @XmlAttribute
     private String message;
 
     public RollbackDefinition() {
@@ -66,8 +68,15 @@
 
     @Override
     public Processor createProcessor(RouteContext routeContext) {
+        // validate that only either mark rollbacks is chosen and not both
+        if (markRollbackOnly != null && markRollbackOnly.booleanValue()
+            && markRollbackOnlyLast != null && 
markRollbackOnlyLast.booleanValue()) {
+            throw new IllegalArgumentException("Only either one of 
markRollbackOnly and markRollbackOnlyLast is possible to select as true");
+        }
+
         RollbackProcessor answer = new RollbackProcessor(message);
         answer.setMarkRollbackOnly(markRollbackOnly != null ? markRollbackOnly 
: false);
+        answer.setMarkRollbackOnlyLast(markRollbackOnlyLast != null ? 
markRollbackOnlyLast : false);
         return answer;
     }
 
@@ -84,4 +93,12 @@
     public void setMarkRollbackOnly(Boolean markRollbackOnly) {
         this.markRollbackOnly = markRollbackOnly;
     }
+
+    public Boolean isMarkRollbackOnlyLast() {
+        return markRollbackOnlyLast;
+    }
+
+    public void setMarkRollbackOnlyLast(Boolean markRollbackOnlyLast) {
+        this.markRollbackOnlyLast = markRollbackOnlyLast;
+    }
 }
\ No newline at end of file

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RollbackProcessor.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RollbackProcessor.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RollbackProcessor.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RollbackProcessor.java
 Thu Dec  3 14:06:52 2009
@@ -28,6 +28,7 @@
 public class RollbackProcessor implements Processor, Traceable {
 
     private boolean markRollbackOnly;
+    private boolean markRollbackOnlyLast;
     private String message;
 
     public RollbackProcessor() {
@@ -38,10 +39,16 @@
     }
 
     public void process(Exchange exchange) throws Exception {
-        // mark the exchange for rollback
-        exchange.setProperty(Exchange.ROLLBACK_ONLY, Boolean.TRUE);
+        if (isMarkRollbackOnlyLast()) {
+            // only mark the last route (current) as rollback
+            // this is needed when you have multiple transactions in play
+            exchange.setProperty(Exchange.ROLLBACK_ONLY_LAST, Boolean.TRUE);
+        } else {
+            // default to mark the entire route as rollback
+            exchange.setProperty(Exchange.ROLLBACK_ONLY, Boolean.TRUE);
+        }
 
-        if (markRollbackOnly) {
+        if (markRollbackOnly || markRollbackOnlyLast) {
             // do not do anything more as we should only mark the rollback
             return;
         }
@@ -74,4 +81,11 @@
         this.markRollbackOnly = markRollbackOnly;
     }
 
+    public boolean isMarkRollbackOnlyLast() {
+        return markRollbackOnlyLast;
+    }
+
+    public void setMarkRollbackOnlyLast(boolean markRollbackOnlyLast) {
+        this.markRollbackOnlyLast = markRollbackOnlyLast;
+    }
 }

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/spi/UnitOfWork.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/UnitOfWork.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/UnitOfWork.java 
(original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/UnitOfWork.java 
Thu Dec  3 14:06:52 2009
@@ -80,4 +80,34 @@
      * @return trace information
      */
     TracedRouteNodes getTracedRouteNodes();
+
+    /**
+     * Are we already transacted by the given transaction definition
+     * <p/>
+     * The definition will most likely be a Spring TransactionTemplate when 
using Spring Transaction
+     *
+     * @param transactionDefinition the transaction definition
+     * @return <tt>true</tt> if already, <tt>false</tt> otherwise
+     */
+    boolean isTransactedBy(Object transactionDefinition);
+
+    /**
+     * Mark this UnitOfWork as being transacted by the given transaction 
definition.
+     * <p/>
+     * The definition will most likely be a Spring TransactionTemplate when 
using Spring Transaction
+     * <p/>
+     * When the transaction is completed then invoke the {...@link 
#endTransactedBy(Object)} method.
+     *
+     * @param transactionDefinition the transaction definition
+     */
+    void beginTransactedBy(Object transactionDefinition);
+
+    /**
+     * Mark this UnitOfWork as not transacted anymore by the given transaction 
definition.
+     * <p/>
+     * The definition will most likely be a Spring TransactionTemplate when 
using Spring Transaction
+     *
+     * @param transactionDefinition the transaction definition
+     */
+    void endTransactedBy(Object transactionDefinition);
 }

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java 
(original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ObjectHelper.java 
Thu Dec  3 14:06:52 2009
@@ -1059,7 +1059,7 @@
     /**
      * Cleans the string to pure java identifier so we can use it for loading 
class names.
      * <p/>
-     * Especially from Sping DSL people can have \n \t or other characters 
that otherwise
+     * Especially from Spring DSL people can have \n \t or other characters 
that otherwise
      * would result in ClassNotFoundException
      *
      * @param name the class name

Modified: 
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandler.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandler.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandler.java
 (original)
+++ 
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionErrorHandler.java
 Thu Dec  3 14:06:52 2009
@@ -19,17 +19,15 @@
 import org.apache.camel.Exchange;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
+import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.processor.Logger;
 import org.apache.camel.processor.RedeliveryErrorHandler;
 import org.apache.camel.processor.RedeliveryPolicy;
 import org.apache.camel.processor.exceptionpolicy.ExceptionPolicyStrategy;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.camel.util.ObjectHelper;
 import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.TransactionStatus;
-import org.springframework.transaction.support.DefaultTransactionStatus;
 import 
org.springframework.transaction.support.TransactionCallbackWithoutResult;
-import 
org.springframework.transaction.support.TransactionSynchronizationManager;
 import org.springframework.transaction.support.TransactionTemplate;
 
 /**
@@ -40,7 +38,6 @@
  */
 public class TransactionErrorHandler extends RedeliveryErrorHandler {
 
-    private static final transient Log LOG = 
LogFactory.getLog(TransactionErrorHandler.class);
     private final TransactionTemplate transactionTemplate;
 
     /**
@@ -78,38 +75,67 @@
     }
 
     public void process(final Exchange exchange) throws Exception {
-        if (log.isTraceEnabled()) {
-            log.trace("Transaction error handler is processing: " + exchange);
+        if (exchange.getUnitOfWork().isTransactedBy(transactionTemplate)) {
+            // already transacted by this transaction template
+            // so lets just let the regular default error handler process it
+            processByRegularErrorHandler(exchange);
+        } else {
+            // not yet wrapped in transaction so lets do that
+            processInTransaction(exchange);
         }
+    }
+
+    protected void processByRegularErrorHandler(Exchange exchange) {
+        try {
+            super.process(exchange);
+        } catch (Exception e) {
+            exchange.setException(e);
+        }
+    }
+
+    protected void processInTransaction(final Exchange exchange) throws 
Exception {
+        String id = ObjectHelper.getIdentityHashCode(transactionTemplate);
+        try {
+            // mark the beginning of this transaction boundary
+            exchange.getUnitOfWork().beginTransactedBy(transactionTemplate);
+
+            if (log.isDebugEnabled()) {
+                log.debug("Transaction begin (" + id + ") for ExchangeId: " + 
exchange.getExchangeId());
+            }
+
+            doInTransactionTemplate(exchange);
+
+            if (log.isDebugEnabled()) {
+                log.debug("Transaction commit (" + id + ") for ExchangeId: " + 
exchange.getExchangeId());
+            }
+        } catch (TransactionRollbackException e) {
+            // ignore as its just a dummy exception to force spring TX to 
rollback
+            if (log.isDebugEnabled()) {
+                log.debug("Transaction rollback (" + id + ") for ExchangeId: " 
+ exchange.getExchangeId());
+            }
+        } catch (Exception e) {
+            log.warn("Transaction rollback (" + id + ") for ExchangeId: " + 
exchange.getExchangeId() + " due exception: " + e.getMessage());
+            exchange.setException(e);
+        } finally {
+            // mark the end of this transaction boundary
+            exchange.getUnitOfWork().endTransactedBy(transactionTemplate);
+        }
+    }
+
+    protected void doInTransactionTemplate(final Exchange exchange) {
+
+        // spring transaction template is working best with rollback if you 
throw it a runtime exception
+        // otherwise it may not rollback messages send to JMS queues etc.
 
-        // just to let the stacktrace reveal that this is a transaction error 
handler
         transactionTemplate.execute(new TransactionCallbackWithoutResult() {
             protected void doInTransactionWithoutResult(TransactionStatus 
status) {
                 // wrapper exception to throw if the exchange failed
                 // IMPORTANT: Must be a runtime exception to let Spring regard 
it as to do "rollback"
-                TransactedRuntimeCamelException rce = null;
+                RuntimeCamelException rce = null;
 
-                // find out if there is an actual transaction alive, and thus 
we are in transacted mode
-                boolean activeTx = 
TransactionSynchronizationManager.isActualTransactionActive();
-                if (!activeTx) {
-                    activeTx = status.isNewTransaction() && 
!status.isCompleted();
-                    if (!activeTx) {
-                        if 
(DefaultTransactionStatus.class.isAssignableFrom(status.getClass())) {
-                            DefaultTransactionStatus defStatus = 
DefaultTransactionStatus.class.cast(status);
-                            activeTx = defStatus.hasTransaction() && 
!status.isCompleted();
-                        }
-                    }
-                }
-                if (LOG.isTraceEnabled()) {
-                    LOG.trace("Is actual transaction active: " + activeTx);
-                }
-
-                // okay mark the exchange as transacted, then the 
DeadLetterChannel or others know
-                // its a transacted exchange
-                if (activeTx) {
-                    exchange.setProperty(Exchange.TRANSACTED, Boolean.TRUE);
-                }
+                exchange.setProperty(Exchange.TRANSACTED, Boolean.TRUE);
 
+                // and now let process the exchange
                 try {
                     TransactionErrorHandler.super.process(exchange);
                 } catch (Exception e) {
@@ -118,60 +144,30 @@
 
                 // after handling and still an exception or marked as rollback 
only then rollback
                 if (exchange.getException() != null || 
exchange.isRollbackOnly()) {
+
+                    // if it was a local rollback only then remove its marker 
so outer transaction
+                    // wont rollback as well (Note: isRollbackOnly() also 
returns true for ROLLBACK_ONLY_LAST)
+                    exchange.removeProperty(Exchange.ROLLBACK_ONLY_LAST);
+
                     // wrap exception in transacted exception
                     if (exchange.getException() != null) {
-                        rce = 
wrapTransactedRuntimeException(exchange.getException());
+                        rce = 
ObjectHelper.wrapRuntimeCamelException(exchange.getException());
                     }
 
-                    if (activeTx && !status.isRollbackOnly()) {
+                    if (!status.isRollbackOnly()) {
                         status.setRollbackOnly();
-                        if (LOG.isDebugEnabled()) {
-                            if (rce != null) {
-                                LOG.debug("Setting transaction to rollbackOnly 
due to exception being thrown: " + rce.getMessage());
-                            } else {
-                                LOG.debug("Setting transaction to rollbackOnly 
as Exchange was marked as rollback only");
-                            }
-                        }
                     }
 
                     // rethrow if an exception occurred
                     if (rce != null) {
                         throw rce;
+                    } else {
+                        // create dummy exception to force spring transaction 
manager to rollback
+                        throw new TransactionRollbackException();
                     }
                 }
             }
         });
-
-        log.trace("Transaction error handler done");
-    }
-
-    @Override
-    protected boolean shouldHandleException(Exchange exchange) {
-        boolean answer = false;
-        if (exchange.getException() != null) {
-            answer = true;
-            // handle onException
-            // but test beforehand if we have already handled it, if so we 
should not do it again
-            if (exchange.getException() instanceof 
TransactedRuntimeCamelException) {
-                TransactedRuntimeCamelException trce = 
exchange.getException(TransactedRuntimeCamelException.class);
-                answer = !trce.isHandled();
-            }
-        }
-        return answer;
-    }
-
-    protected TransactedRuntimeCamelException 
wrapTransactedRuntimeException(Exception exception) {
-        if (exception instanceof TransactedRuntimeCamelException) {
-            return (TransactedRuntimeCamelException) exception;
-        } else {
-            // Mark as handled so we don't want to handle the same exception 
twice or more in other
-            // wrapped transaction error handlers in this route.
-            // We need to mark this information in the exception as we need to 
propagate
-            // the exception back by rehtrowing it. We cannot mark it on the 
exchange as Camel
-            // uses copies of exchanges in its pipeline and the data isn't 
copied back in case
-            // when an exception occurred
-            return new TransactedRuntimeCamelException(exception, true);
-        }
     }
 
     protected String propagationBehaviorToString(int propagationBehavior) {

Copied: 
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java
 (from r886727, 
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactedRuntimeCamelException.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java?p2=camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java&p1=camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactedRuntimeCamelException.java&r1=886727&r2=886781&rev=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactedRuntimeCamelException.java
 (original)
+++ 
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java
 Thu Dec  3 14:06:52 2009
@@ -16,22 +16,18 @@
  */
 package org.apache.camel.spring.spi;
 
-import org.apache.camel.RuntimeCamelException;
-
 /**
+ * We use a runtime exception to force Spring transaction manager to rollback 
the transaction.
+ *
  * @version $Revision$
  */
-public class TransactedRuntimeCamelException extends RuntimeCamelException {
-
-    private final boolean handled;
+public class TransactionRollbackException extends RuntimeException {
 
-    public TransactedRuntimeCamelException(Throwable cause, boolean handled) {
-        super(cause);
-        this.handled = handled;
+    public TransactionRollbackException() {
     }
 
-    public boolean isHandled() {
-        return handled;
+    @Override
+    public String getMessage() {
+        return "Rollback";
     }
-
 }

Propchange: 
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/spi/TransactionRollbackException.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedPropagationTransactedTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedPropagationTransactedTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedPropagationTransactedTest.java
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedPropagationTransactedTest.java
 Thu Dec  3 14:06:52 2009
@@ -22,13 +22,12 @@
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spring.SpringRouteBuilder;
 import org.apache.camel.spring.SpringTestSupport;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
 import org.springframework.context.support.AbstractXmlApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
 
 /**
- * For testing with mixed transacted propagations (required, requires new)
+ * For testing with mixed transacted propagation (required, requires new)
  */
 public class MixedPropagationTransactedTest extends SpringTestSupport {
 
@@ -98,8 +97,8 @@
         try {
             template.sendBody("direct:required", "Donkey in Action");
         } catch (RuntimeCamelException e) {
-            // expeced as we fail
-            assertIsInstanceOf(TransactedRuntimeCamelException.class, 
e.getCause());
+            // expected as we fail
+            assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
             assertTrue(e.getCause().getCause() instanceof 
IllegalArgumentException);
             assertEquals("We don't have Donkeys, only Camels", 
e.getCause().getCause().getMessage());
         }
@@ -113,8 +112,8 @@
         try {
             template.sendBody("direct:new", "Donkey in Action");
         } catch (RuntimeCamelException e) {
-            // expeced as we fail
-            assertIsInstanceOf(TransactedRuntimeCamelException.class, 
e.getCause());
+            // expected as we fail
+            assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
             assertTrue(e.getCause().getCause() instanceof 
IllegalArgumentException);
             assertEquals("We don't have Donkeys, only Camels", 
e.getCause().getCause().getMessage());
         }
@@ -129,7 +128,7 @@
             template.sendBody("direct:new", "Tiger in Action");
         } catch (RuntimeCamelException e) {
             // expeced as we fail
-            assertIsInstanceOf(TransactedRuntimeCamelException.class, 
e.getCause());
+            assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
             assertTrue(e.getCause().getCause() instanceof 
IllegalArgumentException);
             assertEquals("We don't have Donkeys, only Camels", 
e.getCause().getCause().getMessage());
         }

Copied: 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.java
 (from r886727, 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.java?p2=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.java&p1=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java&r1=886727&r2=886781&rev=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.java
 Thu Dec  3 14:06:52 2009
@@ -22,8 +22,6 @@
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spring.SpringRouteBuilder;
 import org.apache.camel.spring.SpringTestSupport;
-import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
 import org.springframework.context.support.AbstractXmlApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -31,14 +29,13 @@
 /**
  * Unit test to demonstrate the transactional client pattern.
  */
-public class TransactionalClientDataSourceTest extends SpringTestSupport {
+public class MixedTransactionPropagationTest extends SpringTestSupport {
 
     protected JdbcTemplate jdbc;
-    protected boolean useTransactionErrorHandler = true;
 
     protected AbstractXmlApplicationContext createApplicationContext() {
         return new ClassPathXmlApplicationContext(
-            
"/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml");
+            
"/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.xml");
     }
 
     protected int getExpectedRouteCount() {
@@ -50,13 +47,10 @@
         this.disableJMX();
         super.setUp();
 
-        // START SNIPPET: e5
-        // 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"});
-        // END SNIPPET: e5
     }
 
     @Override
@@ -66,22 +60,19 @@
         this.enableJMX();
     }
 
-    // START SNIPPET: e3
-    public void testTransactionSuccess() throws Exception {
+    public void testOkay() throws Exception {
         template.sendBody("direct:okay", "Hello World");
 
         int count = jdbc.queryForInt("select count(*) from books");
         assertEquals("Number of books", 3, count);
     }
-    // END SNIPPET: e3
 
-    // START SNIPPET: e4
-    public void testTransactionRollback() throws Exception {
+    public void testFail() throws Exception {
         try {
             template.sendBody("direct:fail", "Hello World");
         } catch (RuntimeCamelException e) {
-            // expeced as we fail
-            assertIsInstanceOf(TransactedRuntimeCamelException.class, 
e.getCause());
+            // expected as we fail
+            assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
             assertTrue(e.getCause().getCause() instanceof 
IllegalArgumentException);
             assertEquals("We don't have Donkeys, only Camels", 
e.getCause().getCause().getMessage());
         }
@@ -89,42 +80,51 @@
         int count = jdbc.queryForInt("select count(*) from books");
         assertEquals("Number of books", 1, count);
     }
-    // END SNIPPET: e4
+
+    public void testMixed() throws Exception {
+        template.sendBody("direct:mixed", "Hello World");
+
+        int count = jdbc.queryForInt("select count(*) from books");
+        assertEquals("Number of books", 4, count);
+    }
 
     protected RouteBuilder createRouteBuilder() throws Exception {
-        // START SNIPPET: e1
-        // Notice that we use the SpringRouteBuilder that has a few more 
features than
-        // the standard RouteBuilder
         return new SpringRouteBuilder() {
             public void configure() throws Exception {
-                // START SNIPPET: e1
-                // lookup the transaction policy
-                SpringTransactionPolicy required = 
lookup("PROPAGATION_REQUIRED", SpringTransactionPolicy.class);
+                from("direct:okay")
+                    .transacted("PROPAGATION_REQUIRED")
+                    .setBody(constant("Tiger in 
Action")).beanRef("bookService")
+                    .setBody(constant("Elephant in 
Action")).beanRef("bookService");
+
+                from("direct:fail")
+                    .transacted("PROPAGATION_REQUIRED")
+                    .setBody(constant("Tiger in 
Action")).beanRef("bookService")
+                    .setBody(constant("Donkey in 
Action")).beanRef("bookService");
 
-                // use this error handler instead of DeadLetterChannel that is 
the default
-                // Notice: transactionErrorHandler is in SpringRouteBuilder
-                if (useTransactionErrorHandler) {
-                    // useTransactionErrorHandler is only used for unit 
testing to reuse code
-                    // for doing a 2nd test without this transaction error 
handler, so ignore
-                    // this. For spring based transaction, end users are 
encouraged to use the
-                    // transaction error handler instead of the default 
DeadLetterChannel.
-                    errorHandler(transactionErrorHandler(required));
-                }
+                // START SNIPPET: e1
+                from("direct:mixed")
+                    // using required
+                    .transacted("PROPAGATION_REQUIRED")
+                    // all these steps will be okay
+                    .setBody(constant("Tiger in 
Action")).beanRef("bookService")
+                    .setBody(constant("Elephant in 
Action")).beanRef("bookService")
+                    .setBody(constant("Lion in Action")).beanRef("bookService")
+                    // continue on route 2
+                    .to("direct:mixed2");
+
+                from("direct:mixed2")
+                    // using a different propagation which is requires new
+                    .transacted("PROPAGATION_REQUIRES_NEW")
+                    // tell Camel that if this route fails then only rollback 
this last route
+                    // by using (rollback only *last*)
+                    .onException(Exception.class).markRollbackOnlyLast().end()
+                    // this step will be okay
+                    .setBody(constant("Giraffe in 
Action")).beanRef("bookService")
+                    // this step will fail with donkey
+                    .setBody(constant("Donkey in 
Action")).beanRef("bookService");
                 // END SNIPPET: e1
-
-                // START SNIPPET: e2
-                // set the required policy for this route
-                from("direct:okay").policy(required).
-                    setBody(constant("Tiger in 
Action")).beanRef("bookService").
-                    setBody(constant("Elephant in 
Action")).beanRef("bookService");
-
-                // set the required policy for this route
-                from("direct:fail").policy(required).
-                    setBody(constant("Tiger in 
Action")).beanRef("bookService").
-                    setBody(constant("Donkey in 
Action")).beanRef("bookService");
-                // END SNIPPET: e2
             }
         };
     }
 
-}
+}
\ No newline at end of file

Modified: 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/SpringTransactionalClientDataSourceTransactedTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/SpringTransactionalClientDataSourceTransactedTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/SpringTransactionalClientDataSourceTransactedTest.java
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/SpringTransactionalClientDataSourceTransactedTest.java
 Thu Dec  3 14:06:52 2009
@@ -20,7 +20,6 @@
 
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spring.SpringTestSupport;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
 import org.springframework.context.support.AbstractXmlApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -65,8 +64,8 @@
         try {
             template.sendBody("direct:fail", "Hello World");
         } catch (RuntimeCamelException e) {
-            // expeced as we fail
-            assertIsInstanceOf(TransactedRuntimeCamelException.class, 
e.getCause());
+            // expected as we fail
+            assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
             assertTrue(e.getCause().getCause() instanceof 
IllegalArgumentException);
             assertEquals("We don't have Donkeys, only Camels", 
e.getCause().getCause().getMessage());
         }

Modified: 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceMinimalConfigurationTest.java
 Thu Dec  3 14:06:52 2009
@@ -20,7 +20,6 @@
 
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spring.SpringTestSupport;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
 import org.springframework.context.support.AbstractXmlApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -65,8 +64,8 @@
         try {
             template.sendBody("direct:fail", "Hello World");
         } catch (RuntimeCamelException e) {
-            // expeced as we fail
-            assertIsInstanceOf(TransactedRuntimeCamelException.class, 
e.getCause());
+            // expected as we fail
+            assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
             assertTrue(e.getCause().getCause() instanceof 
IllegalArgumentException);
             assertEquals("We don't have Donkeys, only Camels", 
e.getCause().getCause().getMessage());
         }

Modified: 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceOnExceptionRedeliveryTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceOnExceptionRedeliveryTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceOnExceptionRedeliveryTest.java
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceOnExceptionRedeliveryTest.java
 Thu Dec  3 14:06:52 2009
@@ -18,9 +18,9 @@
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
+import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spring.SpringRouteBuilder;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
 
 /**
  * @version $Revision$
@@ -40,7 +40,7 @@
         assertNotNull(out);
 
         Exception e = out.getException();
-        assertIsInstanceOf(TransactedRuntimeCamelException.class, e);
+        assertIsInstanceOf(RuntimeCamelException.class, e);
         assertTrue(e.getCause()instanceof IllegalArgumentException);
         assertEquals("We don't have Donkeys, only Camels", 
e.getCause().getMessage());
 

Modified: 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceRedeliveryTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceRedeliveryTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceRedeliveryTest.java
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceRedeliveryTest.java
 Thu Dec  3 14:06:52 2009
@@ -18,9 +18,9 @@
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
+import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.spring.SpringRouteBuilder;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
 
 /**
  * @version $Revision$
@@ -40,7 +40,7 @@
         assertNotNull(out);
 
         Exception e = out.getException();
-        assertIsInstanceOf(TransactedRuntimeCamelException.class, e);
+        assertIsInstanceOf(RuntimeCamelException.class, e);
         assertTrue(e.getCause()instanceof IllegalArgumentException);
         assertEquals("We don't have Donkeys, only Camels", 
e.getCause().getMessage());
 

Modified: 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceTest.java
 Thu Dec  3 14:06:52 2009
@@ -23,7 +23,6 @@
 import org.apache.camel.spring.SpringRouteBuilder;
 import org.apache.camel.spring.SpringTestSupport;
 import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
 import org.springframework.context.support.AbstractXmlApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -80,8 +79,8 @@
         try {
             template.sendBody("direct:fail", "Hello World");
         } catch (RuntimeCamelException e) {
-            // expeced as we fail
-            assertIsInstanceOf(TransactedRuntimeCamelException.class, 
e.getCause());
+            // expected as we fail
+            assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
             assertTrue(e.getCause().getCause() instanceof 
IllegalArgumentException);
             assertEquals("We don't have Donkeys, only Camels", 
e.getCause().getCause().getMessage());
         }

Modified: 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionRollbackTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionRollbackTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionRollbackTest.java
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionRollbackTest.java
 Thu Dec  3 14:06:52 2009
@@ -22,7 +22,6 @@
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.spring.SpringRouteBuilder;
 import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
 
 /**
  * Unit test to demonstrate the transactional client pattern.
@@ -41,7 +40,7 @@
             template.sendBody("direct:fail", "Hello World");
         } catch (RuntimeCamelException e) {
             // expected as we fail
-            assertIsInstanceOf(TransactedRuntimeCamelException.class, 
e.getCause());
+            assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
             RollbackExchangeException rollback = 
assertIsInstanceOf(RollbackExchangeException.class, e.getCause().getCause());
             assertEquals("Donkey in Action", 
rollback.getExchange().getIn().getBody());
         }

Modified: 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionTest.java
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientDataSourceWithOnExceptionTest.java
 Thu Dec  3 14:06:52 2009
@@ -21,7 +21,6 @@
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.spring.SpringRouteBuilder;
 import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
 
 /**
  * Unit test to demonstrate the transactional client pattern.
@@ -39,8 +38,8 @@
         try {
             template.sendBody("direct:fail", "Hello World");
         } catch (RuntimeCamelException e) {
-            // expeced as we fail
-            assertIsInstanceOf(TransactedRuntimeCamelException.class, 
e.getCause());
+            // expected as we fail
+            assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
             assertTrue(e.getCause().getCause() instanceof 
IllegalArgumentException);
             assertEquals("We don't have Donkeys, only Camels", 
e.getCause().getCause().getMessage());
         }

Modified: 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientWithRollbackTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientWithRollbackTest.java?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientWithRollbackTest.java
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/interceptor/TransactionalClientWithRollbackTest.java
 Thu Dec  3 14:06:52 2009
@@ -24,7 +24,6 @@
 import org.apache.camel.spring.SpringRouteBuilder;
 import org.apache.camel.spring.SpringTestSupport;
 import org.apache.camel.spring.spi.SpringTransactionPolicy;
-import org.apache.camel.spring.spi.TransactedRuntimeCamelException;
 import org.springframework.context.support.AbstractXmlApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -75,7 +74,7 @@
             template.sendBody("direct:fail", "Hello World");
             fail("Should have thrown a RollbackExchangeException");
         } catch (RuntimeCamelException e) {
-            assertIsInstanceOf(TransactedRuntimeCamelException.class, 
e.getCause());
+            assertIsInstanceOf(RuntimeCamelException.class, e.getCause());
             assertTrue(e.getCause().getCause() instanceof 
RollbackExchangeException);
         }
 

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=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/log4j.properties 
(original)
+++ camel/trunk/components/camel-spring/src/test/resources/log4j.properties Thu 
Dec  3 14:06:52 2009
@@ -26,6 +26,7 @@
 log4j.logger.org.apache.camel.impl.DefaultPackageScanClassResolver=WARN
 
 #log4j.logger.org.apache.camel=DEBUG
+#log4j.logger.org.apache.camel.spring.spi=DEBUG
 
 # CONSOLE appender not used by default
 log4j.appender.out=org.apache.log4j.ConsoleAppender

Copied: 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.xml
 (from r886727, 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml)
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml&r1=886727&r2=886781&rev=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/MixedTransactionPropagationTest.xml
 Thu Dec  3 14:06:52 2009
@@ -21,8 +21,6 @@
          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 -->
-    <!-- datasource to the database -->
     <bean id="dataSource" 
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
         <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
         <property name="url" value="jdbc:hsqldb:mem:camel"/>
@@ -30,20 +28,24 @@
         <property name="password" value=""/>
     </bean>
 
-    <!-- spring transaction manager -->
     <bean id="txManager" 
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <property name="dataSource" ref="dataSource"/>
     </bean>
 
-    <!-- policy for required transaction used in our Camel routes -->
+    <!-- START SNIPPET: e1 -->
     <bean id="PROPAGATION_REQUIRED" 
class="org.apache.camel.spring.spi.SpringTransactionPolicy">
         <property name="transactionManager" ref="txManager"/>
+        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
     </bean>
 
-    <!-- bean for book business logic -->
+    <bean id="PROPAGATION_REQUIRES_NEW" 
class="org.apache.camel.spring.spi.SpringTransactionPolicy">
+        <property name="transactionManager" ref="txManager"/>
+        <property name="propagationBehaviorName" 
value="PROPAGATION_REQUIRES_NEW"/>
+    </bean>
+    <!-- END SNIPPET: e1 -->
+
     <bean id="bookService" 
class="org.apache.camel.spring.interceptor.BookService">
         <property name="dataSource" ref="dataSource"/>
     </bean>
-    <!-- END SNIPPET: e1 -->
 
 </beans>

Modified: 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml?rev=886781&r1=886780&r2=886781&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/interceptor/transactionalClientDataSource.xml
 Thu Dec  3 14:06:52 2009
@@ -38,6 +38,7 @@
     <!-- policy for required transaction used in our Camel routes -->
     <bean id="PROPAGATION_REQUIRED" 
class="org.apache.camel.spring.spi.SpringTransactionPolicy">
         <property name="transactionManager" ref="txManager"/>
+        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
     </bean>
 
     <!-- bean for book business logic -->


Reply via email to