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/05/04 09:51:50 UTC

svn commit: r771227 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/ camel-core/src/main/java/org/apache/camel/model/ camel-core/src/main/java/org/apache/camel/processor/ camel-core/src/main/resources/org/apache/camel/model/ camel-core/src...

Author: davsclaus
Date: Mon May  4 07:51:49 2009
New Revision: 771227

URL: http://svn.apache.org/viewvc?rev=771227&view=rev
Log:
CAMEL-1569: Added stop() support for interceptors and in routing as general.

Added:
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/StopProcessor.java   (with props)
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteStopTest.java   (with props)
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteWhenStopTest.java
      - copied, changed from r771170, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteStopTest.java
    camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteStopTest.java
      - copied, changed from r771170, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteTest.java
    camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.java   (with props)
    camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRouteStopTest.java   (with props)
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteStopTest.xml
      - copied, changed from r771170, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteTest.xml
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.xml   (with props)
    camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRouteStopTest.xml   (with props)
Removed:
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/ProceedDefinition.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/Exchange.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/InterceptDefinition.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/InterceptFromDefinition.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/RoutesDefinition.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/model/StopDefinition.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DefaultChannel.java
    camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Pipeline.java
    camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index
    camel/trunk/camel-core/src/test/java/org/apache/camel/issues/InterceptFromLogTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/issues/InterceptFromPredicateProceedAndStopTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromRouteTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromWithPredicateAndProceedRouteTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromWithStopRouteTest.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteStopTest.java
    camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SInterceptFromDefinition.scala
    camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java

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=771227&r1=771226&r2=771227&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 Mon May  4 07:51:49 2009
@@ -56,6 +56,11 @@
     String LOOP_INDEX = "CamelLoopIndex";
     String LOOP_SIZE = "CamelLoopSize";
 
+    String ROUTE_STOP = "CamelRouteStop";
+
+    /**
+     * @deprecated a new Async API is planned for Camel 2.0
+     */
     String PROCESSED_SYNC = "CamelProcessedSync";
 
     String REDELIVERED = "CamelRedelivered";

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/InterceptDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/InterceptDefinition.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/InterceptDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/InterceptDefinition.java Mon May  4 07:51:49 2009
@@ -131,5 +131,4 @@
         }
     }
 
-
 }
\ No newline at end of file

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/InterceptFromDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/InterceptFromDefinition.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/InterceptFromDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/InterceptFromDefinition.java Mon May  4 07:51:49 2009
@@ -16,17 +16,12 @@
  */
 package org.apache.camel.model;
 
-import java.util.ArrayList;
-import java.util.List;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
 
-import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
-import org.apache.camel.builder.PredicateBuilder;
 import org.apache.camel.spi.RouteContext;
 
 /**
@@ -36,22 +31,13 @@
  */
 @XmlRootElement(name = "interceptFrom")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class InterceptFromDefinition extends OutputDefinition<ProcessorDefinition> {
-
-    // TODO: we need a new interceptDefinition to uses the InterceptStrategy so its applied for each route step
-    // and a more intelligent Channel so we can stop or proceed on-the-fly
+public class InterceptFromDefinition extends InterceptDefinition {
 
     // TODO: Support lookup endpoint by ref (requires a bit more work)
     // TODO: Support wildcards for endpoints so you can match by scheme, eg jms:*
 
     @XmlAttribute(required = false)
     protected String uri;
-    @XmlTransient
-    protected ProceedDefinition proceed = new ProceedDefinition();
-    @XmlTransient
-    protected Boolean stopIntercept = Boolean.FALSE;
-    @XmlTransient
-    protected Boolean usePredicate = Boolean.FALSE;
 
     public InterceptFromDefinition() {
     }
@@ -80,147 +66,6 @@
         return createOutputsProcessor(routeContext);
     }
 
-    /**
-     * Applies this interceptor only if the given predicate is true
-     *
-     * @param predicate  the predicate
-     * @return the builder
-     */
-    public ChoiceDefinition when(Predicate predicate) {
-        usePredicate = Boolean.TRUE;
-        ChoiceDefinition choice = choice().when(PredicateBuilder.not(predicate));
-        choice.addOutput(proceed);
-        return choice.otherwise();
-    }
-
-    public ProceedDefinition getProceed() {
-        return proceed;
-    }
-
-    public void stopIntercept() {
-        setStopIntercept(Boolean.TRUE);
-    }
-
-    /**
-     * This method is <b>only</b> for handling some post configuration
-     * that is needed from the Spring DSL side as JAXB does not invoke the fluent
-     * builders, so we need to manually handle this afterwards, and since this is
-     * an interceptor it has to do a bit of magic logic to fixup to handle predicates
-     * with or without proceed/stop set as well.
-     */
-    public void afterPropertiesSet() {
-        List<ProcessorDefinition> list = new ArrayList<ProcessorDefinition>();
-        for (ProcessorDefinition out : outputs) {
-            if (out instanceof WhenDefinition) {
-                // JAXB does not invoke the when() fluent builder so we need to wrap the when in
-                // a choice with the proceed as the when for the Java DSL does
-                WhenDefinition when = (WhenDefinition) out;
-                usePredicate = Boolean.TRUE;
-                ChoiceDefinition choice = new ChoiceDefinition();
-                choice.when(PredicateBuilder.not(when.getExpression()));
-                choice.addOutput(proceed);
-                list.add(choice);
-
-                ChoiceDefinition otherwise = choice.otherwise();
-                // add the children to the otherwise
-                for (ProcessorDefinition child : when.getOutputs()) {
-                    if (child instanceof StopDefinition) {
-                        // notify we should stop
-                        stopIntercept();
-                    } else {
-                        otherwise.addOutput(child);
-                    }
-                }
-            } else if (out instanceof StopDefinition) {
-                // notify we shuld stop
-                stopIntercept();
-            } else {
-                list.add(out);
-            }
-        }
-
-        // replace old output with this redone output list
-        outputs.clear();
-        for (ProcessorDefinition out : list) {
-            addOutput(out);
-        }
-    }
-
-    // TODO: reduce complexity of this code
-
-    public InterceptFromDefinition createProxy() {
-        InterceptFromDefinition answer = new InterceptFromDefinition();
-        answer.getOutputs().addAll(this.getOutputs());
-        
-        answer.setStopIntercept(getStopIntercept());
-
-        // hack: now we need to replace the proceed of the proxy with its own
-        // a bit ugly, operating based on the assumption that the proceed is
-        // in its outputs (if proceed() was called) and/or in the
-        // outputs of the otherwise or last when clause for the predicated version.
-        if (answer.getOutputs().size() > 0) {
-            // this is for the predicate version or if a choice() is present
-            ChoiceDefinition choice = null;
-            for (ProcessorDefinition processor : answer.getOutputs()) {
-                if (processor instanceof ChoiceDefinition) {
-                    // special cases for predicates (choices)
-                    choice = (ChoiceDefinition) processor;
-
-                    // for the predicated version we add the proceed() to otherwise()
-                    // before knowing if stop() will follow, so let's make a small adjustment
-                    if (usePredicate && getStopIntercept()) {
-                        WhenDefinition when = choice.getWhenClauses().get(0);
-                        when.getOutputs().remove(this.getProceed());
-                    }
-
-                    // add proceed to the when clause
-                    addProceedProxy(this.getProceed(), answer.getProceed(),
-                        choice.getWhenClauses().get(choice.getWhenClauses().size() - 1), usePredicate && !getStopIntercept());
-
-                    // force adding a proceed at the end (otherwise) if its not a stop type
-                    addProceedProxy(this.getProceed(), answer.getProceed(), choice.getOtherwise(), !getStopIntercept());
-
-                    if (getStopIntercept()) {
-                        // must add proceed to when clause if stop is explictiy declared, otherwise when the
-                        // predicate test fails then there is no proceed
-                        // See example: InterceptFromSimpleRouteTest (City Paris is never proceeded)
-                        addProceedProxy(this.getProceed(), answer.getProceed(),
-                            choice.getWhenClauses().get(choice.getWhenClauses().size() - 1), usePredicate);
-                    }
-
-                    break;
-                }
-            }
-            if (choice == null) {
-                // force adding a proceed at the end if its not a stop type
-                addProceedProxy(this.getProceed(), answer.getProceed(), answer, !getStopIntercept());
-            }
-        }
-
-        return answer;
-    }
-
-    private void addProceedProxy(ProceedDefinition orig, ProceedDefinition proxy, ProcessorDefinition<?> processor, boolean force) {
-        int index = processor.getOutputs().indexOf(orig);
-        if (index >= 0) {
-            processor.addOutput(proxy);
-            // replace original proceed with proxy
-            List<ProcessorDefinition> outs = processor.getOutputs();
-            outs.remove(proxy);
-            outs.set(index, proxy);
-        } else if (force) {
-            processor.addOutput(proxy);
-        }
-    }
-
-    public void setStopIntercept(Boolean stop) {
-        this.stopIntercept = stop;
-    }
-
-    public Boolean getStopIntercept() {
-        return stopIntercept;
-    }
-
     public String getUri() {
         return uri;
     }

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=771227&r1=771226&r2=771227&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 Mon May  4 07:51:49 2009
@@ -197,8 +197,7 @@
         List<Processor> list = new ArrayList<Processor>();
         for (ProcessorDefinition output : outputs) {
             Processor processor = output.createProcessor(routeContext);
-            // if the ProceedType/StopType create processor is null we keep on going
-            if ((output instanceof ProceedDefinition || output instanceof StopDefinition || output instanceof Channel) && processor == null) {
+            if (output instanceof Channel && processor == null) {
                 continue;
             }
 
@@ -1308,7 +1307,7 @@
      * Pushes the given block on the stack as current block
      * @param block  the block
      */
-    public void pushBlock(Block block) {
+    void pushBlock(Block block) {
         blocks.add(block);
     }
 
@@ -1316,75 +1315,19 @@
      * Pops the block off the stack as current block
      * @return the block
      */
-    public Block popBlock() {
+    Block popBlock() {
         return blocks.isEmpty() ? null : blocks.removeLast();
     }
 
     /**
-     * Procceeds the given intercepted route.
-     * <p/>
-     * Proceed is used in conjunction with intercept where calling proceed will route the message through the
-     * original route path from the point of interception. This can be used to implement the
-     * <a href="http://www.enterpriseintegrationpatterns.com/Detour.html">detour</a> pattern.
-     *
-     * @return the builder
-     * @see ProcessorDefinition#proceed()
-     */
-    @SuppressWarnings("unchecked")
-    public Type proceed() {
-        ProceedDefinition proceed = null;
-        ProcessorDefinition currentProcessor = this;
-
-        if (currentProcessor instanceof InterceptFromDefinition) {
-            proceed = ((InterceptFromDefinition) currentProcessor).getProceed();
-            LOG.info("proceed() is the implied and hence not needed for an intercept()");
-        }
-        if (proceed == null) {
-            for (ProcessorDefinition node = parent; node != null; node = node.getParent()) {
-                if (node instanceof InterceptFromDefinition) {
-                    InterceptFromDefinition intercept = (InterceptFromDefinition)node;
-                    proceed = intercept.getProceed();
-                    break;
-                }
-            }
-
-            if (proceed == null) {
-                throw new IllegalArgumentException("Cannot use proceed() without being within an intercept() block");
-            }
-        }
-
-        addOutput(proceed);
-        return (Type) this;
-    }
-
-    /**
-     * Stops the given intercepted route.
-     * <p/>
-     * As opposed to {@link #proceed()} calling stop will stop the message route and <b>not</b> continue
-     * from the interepted origin.
+     * Stops continue routing the current {@link org.apache.camel.Exchange} and marks it as completed.
      *
      * @return the builder
-     * @see #proceed()
      */
     @SuppressWarnings("unchecked")
     public Type stop() {
-        ProcessorDefinition currentProcessor = this;
-
-        if (currentProcessor instanceof InterceptFromDefinition) {
-            ((InterceptFromDefinition) currentProcessor).stopIntercept();
-        } else {
-            ProcessorDefinition node;
-            for (node = parent; node != null; node = node.getParent()) {
-                if (node instanceof InterceptFromDefinition) {
-                    ((InterceptFromDefinition) node).stopIntercept();
-                    break;
-                }
-            }
-            if (node == null) {
-                throw new IllegalArgumentException("Cannot use stop() without being within an intercept() block");
-            }
-        }
-
+        StopDefinition stop = new StopDefinition();
+        addOutput(stop);
         return (Type) this;
     }
 
@@ -1396,6 +1339,7 @@
      */
     @SuppressWarnings("unchecked")
     public Type skip() {
+        // TODO: move this to InterceptSendToEndpoint so its a special builder method on it only
         ProcessorDefinition currentProcessor = this;
 
         if (currentProcessor instanceof InterceptSendToEndpointDefinition) {

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesDefinition.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesDefinition.java Mon May  4 07:51:49 2009
@@ -212,11 +212,7 @@
             }
 
             if (match) {
-                // need to create a proxy for this one and use the
-                // proceed of the proxy which will be local to this route
-                InterceptFromDefinition proxy = intercept.createProxy();
-                route.addOutput(proxy);
-                route.pushBlock(proxy.getProceed());
+                route.addOutput(intercept);
             }
         }
 

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/StopDefinition.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/StopDefinition.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/model/StopDefinition.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/StopDefinition.java Mon May  4 07:51:49 2009
@@ -16,11 +16,14 @@
  */
 package org.apache.camel.model;
 
+import java.util.Collections;
+import java.util.List;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.camel.Processor;
+import org.apache.camel.processor.StopProcessor;
 import org.apache.camel.spi.RouteContext;
 
 /**
@@ -39,17 +42,23 @@
 
     @Override
     public Processor createProcessor(RouteContext routeContext) throws Exception {
-        // stop does not have any processor
-        return null;
+        return new StopProcessor();
     }
 
     @Override
     public String getLabel() {
-        return getShortName();
+        return "stop";
     }
 
     @Override
     public String toString() {
-        return getShortName();
+        return "Stop";
     }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public List<ProcessorDefinition> getOutputs() {
+        return Collections.EMPTY_LIST;
+    }
+
 }
\ No newline at end of file

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DefaultChannel.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DefaultChannel.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DefaultChannel.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DefaultChannel.java Mon May  4 07:51:49 2009
@@ -22,11 +22,14 @@
 import org.apache.camel.Channel;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
+import org.apache.camel.NoTypeConversionAvailableException;
 import org.apache.camel.impl.ServiceSupport;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.spi.InterceptStrategy;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.util.ServiceHelper;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 /**
  * DefaultChannel is the default {@link Channel}.
@@ -42,6 +45,8 @@
  */
 public class DefaultChannel extends ServiceSupport implements Processor, Channel {
 
+    private static final transient Log LOG = LogFactory.getLog(DefaultChannel.class);
+
     private final List<InterceptStrategy> interceptors = new ArrayList<InterceptStrategy>();
     private Processor errorHandler;
     // the next processor (non wrapped)
@@ -139,11 +144,28 @@
 
     public void process(Exchange exchange) throws Exception {
         Processor processor = getOutput();
-        if (processor != null) {
+        if (processor != null && continueProcessing(exchange)) {
             processor.process(exchange);
         }
     }
 
+    /**
+     * Strategy to determine if we should continue processing the {@link Exchange}.
+     */
+    protected boolean continueProcessing(Exchange exchange) {
+        Object stop = exchange.getProperty(Exchange.ROUTE_STOP);
+        if (stop != null) {
+            boolean doStop = exchange.getContext().getTypeConverter().convertTo(Boolean.class, stop);
+            if (doStop) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Exchange is marked to stop routing: " + exchange);
+                }
+                return false;
+            }
+        }
+        return true;
+    }
+
     @Override
     public String toString() {
         // just output the next processor as all the interceptors and error handler is just too verbose

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Pipeline.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Pipeline.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Pipeline.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Pipeline.java Mon May  4 07:51:49 2009
@@ -25,9 +25,11 @@
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.Processor;
+import org.apache.camel.NoTypeConversionAvailableException;
 import org.apache.camel.impl.converter.AsyncProcessorTypeConverter;
 import org.apache.camel.util.AsyncProcessorHelper;
 import org.apache.camel.util.ExchangeHelper;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -76,7 +78,9 @@
                 }
                 break;
             }
-            if (!processors.hasNext()) {
+
+            // should we continue routing or not
+            if (!continueRouting(processors, nextExchange)) {
                 break;
             }
 
@@ -123,7 +127,8 @@
 
                 // Continue processing the pipeline...
                 Exchange nextExchange = exchange;
-                while (processors.hasNext()) {
+
+                while (continueRouting(processors, nextExchange)) {
                     AsyncProcessor processor = AsyncProcessorTypeConverter.convert(processors.next());
 
                     boolean exceptionHandled = hasExceptionBeenHandled(nextExchange);
@@ -188,6 +193,23 @@
         return answer;
     }
 
+    protected boolean continueRouting(Iterator<Processor> it, Exchange exchange) {
+        Object stop = exchange.getProperty(Exchange.ROUTE_STOP);
+        if (stop != null) {
+            boolean doStop = exchange.getContext().getTypeConverter().convertTo(Boolean.class, stop);
+            if (doStop) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Exchange is marked to stop routing: " + exchange);
+                }
+                return false;
+            } else {
+                return true;
+            }
+        } else {
+            return it.hasNext();
+        }
+    }
+
     @Override
     public String toString() {
         return "Pipeline" + getProcessors();

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/StopProcessor.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/StopProcessor.java?rev=771227&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/StopProcessor.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/StopProcessor.java Mon May  4 07:51:49 2009
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.processor;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+/**
+ * Stops continue processing the route and marks it as complete.
+ *
+ * @version $Revision$
+ */
+public class StopProcessor implements Processor {
+
+    public void process(Exchange exchange) throws Exception {
+        // mark the exchange to stop continue routing
+        exchange.setProperty(Exchange.ROUTE_STOP, Boolean.TRUE);
+    }
+
+    @Override
+    public String toString() {
+        return "StopProcessor";
+    }
+}

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/StopProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/StopProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index (original)
+++ camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index Mon May  4 07:51:49 2009
@@ -41,7 +41,6 @@
 OtherwiseDefinition
 PipelineDefinition
 PolicyDefinition
-ProceedDefinition
 ProcessDefinition
 RecipientListDefinition
 RedeliveryPolicyDefinition

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/issues/InterceptFromLogTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/issues/InterceptFromLogTest.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/issues/InterceptFromLogTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/issues/InterceptFromLogTest.java Mon May  4 07:51:49 2009
@@ -41,8 +41,8 @@
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             public void configure() throws Exception {
-                interceptFrom().to("log:foo").to("mock:foo").proceed();
-                interceptFrom().to("log:bar").to("mock:bar"); // proceed is default
+                interceptFrom().to("log:foo").to("mock:foo");
+                interceptFrom().to("log:bar").to("mock:bar");
 
                 from("seda:foo").to("seda:bar");
                 from("seda:bar").to("mock:result");

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/issues/InterceptFromPredicateProceedAndStopTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/issues/InterceptFromPredicateProceedAndStopTest.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/issues/InterceptFromPredicateProceedAndStopTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/issues/InterceptFromPredicateProceedAndStopTest.java Mon May  4 07:51:49 2009
@@ -48,7 +48,7 @@
     public void testInterceptorNoPredicateAndProceed() throws Exception {
         context.addRoutes(new RouteBuilder() {
             public void configure() throws Exception {
-                interceptFrom().to("mock:test").proceed();
+                interceptFrom().to("mock:test");
                 from("seda:order").to("mock:ok");
             }
         });
@@ -108,7 +108,7 @@
     public void testInterceptorWithPredicateAndProceed() throws Exception {
         context.addRoutes(new RouteBuilder() {
             public void configure() throws Exception {
-                interceptFrom().when(header("user").isEqualTo("test")).to("mock:test").proceed();
+                interceptFrom().when(header("user").isEqualTo("test")).to("mock:test");
                 from("seda:order").to("mock:ok");
             }
         });

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteStopTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteStopTest.java?rev=771227&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteStopTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteStopTest.java Mon May  4 07:51:49 2009
@@ -0,0 +1,94 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ * Unit test for stop() DSL
+ *
+ * @version $Revision$
+ */
+public class RouteStopTest extends ContextTestSupport {
+
+    public void testOtherwise() throws Exception {
+        getMockEndpoint("mock:hello").expectedMessageCount(0);
+        getMockEndpoint("mock:bye").expectedMessageCount(0);
+        getMockEndpoint("mock:other").expectedMessageCount(1);
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Other");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testHello() throws Exception {
+        getMockEndpoint("mock:hello").expectedMessageCount(1);
+        getMockEndpoint("mock:bye").expectedMessageCount(0);
+        getMockEndpoint("mock:other").expectedMessageCount(0);
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testByeWithStop() throws Exception {
+        getMockEndpoint("mock:hello").expectedMessageCount(0);
+        getMockEndpoint("mock:bye").expectedMessageCount(1);
+        getMockEndpoint("mock:other").expectedMessageCount(0);
+        // we should stop so no message arrives at result
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+
+        template.sendBody("direct:start", "Bye World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testSetPropertyToStop() throws Exception {
+        getMockEndpoint("mock:foo").expectedMessageCount(1);
+        getMockEndpoint("mock:result").expectedMessageCount(0);
+
+        template.sendBody("direct:foo", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .choice()
+                        .when(body().contains("Hello")).to("mock:hello")
+                        .when(body().contains("Bye")).to("mock:bye").stop()
+                        .otherwise().to("mock:other")
+                    .end()
+                    .to("mock:result");
+
+
+                from("direct:foo")
+                    .to("mock:foo")
+                    .setProperty(Exchange.ROUTE_STOP, constant("true"))
+                    .to("mock:result");
+            }
+        };
+    }
+}

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteStopTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RouteStopTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromRouteTest.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromRouteTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromRouteTest.java Mon May  4 07:51:49 2009
@@ -27,8 +27,7 @@
         return new RouteBuilder() {
             public void configure() {
                 interceptFrom().choice().
-                        when(header("foo").isEqualTo("bar")).to("mock:b").
-                        otherwise().proceed();
+                        when(header("foo").isEqualTo("bar")).to("mock:b").stop().end();
 
                 from("direct:start").to("mock:a");
             }

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromWithPredicateAndProceedRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromWithPredicateAndProceedRouteTest.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromWithPredicateAndProceedRouteTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromWithPredicateAndProceedRouteTest.java Mon May  4 07:51:49 2009
@@ -26,7 +26,7 @@
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                interceptFrom().when(header("foo").isEqualTo("bar")).to("mock:b").proceed();
+                interceptFrom().when(header("foo").isEqualTo("bar")).to("mock:b");
 
                 from("direct:start").to("mock:a");
             }

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromWithStopRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromWithStopRouteTest.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromWithStopRouteTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptFromWithStopRouteTest.java Mon May  4 07:51:49 2009
@@ -27,7 +27,13 @@
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                interceptFrom().filter(header("foo").isEqualTo("bar")).to("mock:b").stop();
+                interceptFrom()
+                    .filter(header("foo").isEqualTo("bar"))
+                        .to("mock:b")
+                    // need end to end filter
+                    .end()
+                    // stop continue routing no matter what
+                    .stop();
 
                 from("direct:start").to("mock:a");
             }

Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteStopTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteStopTest.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteStopTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteStopTest.java Mon May  4 07:51:49 2009
@@ -25,16 +25,15 @@
 public class InterceptSimpleRouteStopTest extends ContextTestSupport {
 
     public void testInterceptWithStop() throws Exception {
-        // TODO: stop is not yet supported
-        //getMockEndpoint("mock:foo").expectedMessageCount(0);
-        //getMockEndpoint("mock:bar").expectedMessageCount(0);
-        //getMockEndpoint("mock:result").expectedMessageCount(0);
+        getMockEndpoint("mock:foo").expectedMessageCount(0);
+        getMockEndpoint("mock:bar").expectedMessageCount(0);
+        getMockEndpoint("mock:result").expectedMessageCount(0);
 
-        //getMockEndpoint("mock:intercepted").expectedMessageCount(1);
+        getMockEndpoint("mock:intercepted").expectedMessageCount(1);
 
-        //template.sendBody("direct:start", "Hello World");
+        template.sendBody("direct:start", "Hello World");
 
-        //assertMockEndpointsSatisfied();
+        assertMockEndpointsSatisfied();
     }
 
     @Override
@@ -42,11 +41,12 @@
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-//                intercept().to("mock:intercepted").stop();
-                intercept().to("mock:intercepted");
+                // START SNIPPET: e1
+                intercept().to("mock:intercepted").stop();
 
                 from("direct:start")
                     .to("mock:foo", "mock:bar", "mock:result");
+                // END SNIPPET: e1
             }
         };
     }

Copied: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteWhenStopTest.java (from r771170, camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteStopTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteWhenStopTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteWhenStopTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteStopTest.java&r1=771170&r2=771227&rev=771227&view=diff
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteStopTest.java (original)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/intercept/InterceptSimpleRouteWhenStopTest.java Mon May  4 07:51:49 2009
@@ -22,19 +22,30 @@
 /**
  * @version $Revision$
  */
-public class InterceptSimpleRouteStopTest extends ContextTestSupport {
+public class InterceptSimpleRouteWhenStopTest extends ContextTestSupport {
 
-    public void testInterceptWithStop() throws Exception {
-        // TODO: stop is not yet supported
-        //getMockEndpoint("mock:foo").expectedMessageCount(0);
-        //getMockEndpoint("mock:bar").expectedMessageCount(0);
-        //getMockEndpoint("mock:result").expectedMessageCount(0);
+    public void testInterceptStop() throws Exception {
+        getMockEndpoint("mock:foo").expectedMessageCount(0);
+        getMockEndpoint("mock:bar").expectedMessageCount(0);
+        getMockEndpoint("mock:result").expectedMessageCount(0);
 
-        //getMockEndpoint("mock:intercepted").expectedMessageCount(1);
+        getMockEndpoint("mock:intercepted").expectedMessageCount(1);
 
-        //template.sendBody("direct:start", "Hello World");
+        template.sendBody("direct:start", "Hello World");
 
-        //assertMockEndpointsSatisfied();
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testInterceptNoStop() throws Exception {
+        getMockEndpoint("mock:foo").expectedMessageCount(1);
+        getMockEndpoint("mock:bar").expectedMessageCount(1);
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        getMockEndpoint("mock:intercepted").expectedMessageCount(0);
+
+        template.sendBody("direct:start", "Hi");
+
+        assertMockEndpointsSatisfied();
     }
 
     @Override
@@ -42,11 +53,12 @@
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-//                intercept().to("mock:intercepted").stop();
-                intercept().to("mock:intercepted");
+                // START SNIPPET: e1
+                intercept().when(body().contains("Hello")).to("mock:intercepted").stop();
 
                 from("direct:start")
                     .to("mock:foo", "mock:bar", "mock:result");
+                // END SNIPPET: e1
             }
         };
     }

Modified: camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SInterceptFromDefinition.scala
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SInterceptFromDefinition.scala?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SInterceptFromDefinition.scala (original)
+++ camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SInterceptFromDefinition.scala Mon May  4 07:51:49 2009
@@ -31,7 +31,4 @@
     this
   }
   
-  def stop =  {
-    target.setStopIntercept(true)
-  }   
 }

Modified: camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java?rev=771227&r1=771226&r2=771227&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java (original)
+++ camel/trunk/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java Mon May  4 07:51:49 2009
@@ -40,7 +40,6 @@
 import org.apache.camel.model.InterceptSendToEndpointDefinition;
 import org.apache.camel.model.OnExceptionDefinition;
 import org.apache.camel.model.PolicyDefinition;
-import org.apache.camel.model.ProceedDefinition;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RouteBuilderDefinition;
 import org.apache.camel.model.RouteContainer;
@@ -59,7 +58,6 @@
 import org.apache.camel.spi.PackageScanClassResolver;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.util.ObjectHelper;
-import org.apache.camel.util.ProcessorDefinitionHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.factory.DisposableBean;
@@ -166,7 +164,6 @@
     }
 
     public void afterPropertiesSet() throws Exception {
-        // TODO there should be a neater way to do this!
         if (properties != null) {
             getContext().setProperties(properties.asMap());
         }
@@ -313,38 +310,9 @@
             }
 
             if (match) {
-
-                // TODO: reduce the complex of this code when we overhaul the intercept from
-
-                List<ProcessorDefinition<?>> outputs = new ArrayList<ProcessorDefinition<?>>();
-                List<ProcessorDefinition<?>> exceptionHandlers = new ArrayList<ProcessorDefinition<?>>();
-
-                for (ProcessorDefinition output : route.getOutputs()) {
-                    if (output instanceof OnExceptionDefinition) {
-                        exceptionHandlers.add(output);
-                    } else {
-                        outputs.add(output);
-                    }
-                }
-
-                // clearing the outputs
-                route.clearOutput();
-
-                // add exception handlers as top children
-                route.getOutputs().addAll(exceptionHandlers);
-
-                // add the interceptor but we must do some pre configuration beforehand
-                intercept.afterPropertiesSet();
-                InterceptFromDefinition proxy = intercept.createProxy();
-                route.addOutput(proxy);
-                route.pushBlock(proxy.getProceed());
-
-                // if there is a proceed in the interceptor proxy then we should add
-                // the current outputs to out route so we will proceed and continue to route to them
-                ProceedDefinition proceed = ProcessorDefinitionHelper.findFirstTypeInOutputs(proxy.getOutputs(), ProceedDefinition.class);
-                if (proceed != null) {
-                    proceed.getOutputs().addAll(outputs);
-                }
+                // add as first output so intercept is handled before the acutal route and that gives
+                // us the needed head start to init and be able to intercept all the remaining processing steps
+                route.getOutputs().add(0, intercept);
             }
         }
 

Copied: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteStopTest.java (from r771170, camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteTest.java)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteStopTest.java?p2=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteStopTest.java&p1=camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteTest.java&r1=771170&r2=771227&rev=771227&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteTest.java (original)
+++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteStopTest.java Mon May  4 07:51:49 2009
@@ -18,11 +18,10 @@
 
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.processor.intercept.InterceptFromUriSimpleLogTest;
-import org.apache.camel.processor.intercept.InterceptSimpleRouteTest;
+import org.apache.camel.processor.intercept.InterceptSimpleRouteStopTest;
 import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
 
-public class SpringInterceptSimpleRouteTest extends InterceptSimpleRouteTest {
+public class SpringInterceptSimpleRouteStopTest extends InterceptSimpleRouteStopTest {
 
     @Override
     public boolean isUseRouteBuilder() {
@@ -30,7 +29,7 @@
     }
 
     protected CamelContext createCamelContext() throws Exception {
-        return createSpringCamelContext(this, "org/apache/camel/spring/processor/SpringInterceptSimpleRouteTest.xml");
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/SpringInterceptSimpleRouteStopTest.xml");
     }
 
 }
\ No newline at end of file

Added: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.java?rev=771227&view=auto
==============================================================================
--- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.java (added)
+++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.java Mon May  4 07:51:49 2009
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.spring.processor;
+
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.processor.intercept.InterceptSimpleRouteWhenStopTest;
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+public class SpringInterceptSimpleRouteWhenStopTest extends InterceptSimpleRouteWhenStopTest {
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.xml");
+    }
+
+}
\ No newline at end of file

Propchange: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRouteStopTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRouteStopTest.java?rev=771227&view=auto
==============================================================================
--- camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRouteStopTest.java (added)
+++ camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRouteStopTest.java Mon May  4 07:51:49 2009
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.spring.processor;
+
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.processor.RouteStopTest;
+import static org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+public class SpringRouteStopTest extends RouteStopTest {
+
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, "org/apache/camel/spring/processor/SpringRouteStopTest.xml");
+    }
+
+}
\ No newline at end of file

Propchange: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRouteStopTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRouteStopTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Copied: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteStopTest.xml (from r771170, camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteTest.xml)
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteStopTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteStopTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteTest.xml&r1=771170&r2=771227&rev=771227&view=diff
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteTest.xml (original)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteStopTest.xml Mon May  4 07:51:49 2009
@@ -22,14 +22,12 @@
        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-    <!-- START SNIPPET: example -->
+    <!-- START SNIPPET: e1 -->
     <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
-        <!-- here we intercept each processing step in the routing and do a detour
-             routing where we route the exhange to the mock:intercepted endpoint.
-             Think the intercept as a AOP around that is weaven around each and
-             every route tag in the route path below -->
         <intercept>
             <to uri="mock:intercepted"/>
+            <!-- stop continue routing -->
+            <stop/>
         </intercept>
 
         <!-- here we have a very simple route -->
@@ -40,5 +38,5 @@
             <to uri="mock:result"/>
         </route>
     </camelContext>
-    <!-- END SNIPPET: example -->
+    <!-- END SNIPPET: e1 -->
 </beans>

Added: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.xml?rev=771227&view=auto
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.xml (added)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.xml Mon May  4 07:51:49 2009
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       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 -->
+    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+        <intercept>
+            <!-- only trigger this interceptor if the message body contains the word Hello -->
+            <when>
+                <simple>${in.body} contains 'Hello'</simple>
+            </when>
+            <to uri="mock:intercepted"/>
+            <!-- stop continue routing -->
+            <stop/>
+        </intercept>
+
+        <!-- here we have a very simple route -->
+        <route>
+            <from uri="direct:start"/>
+            <to uri="mock:foo"/>
+            <to uri="mock:bar"/>
+            <to uri="mock:result"/>
+        </route>
+    </camelContext>
+    <!-- END SNIPPET: e1 -->
+</beans>

Propchange: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringInterceptSimpleRouteWhenStopTest.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRouteStopTest.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRouteStopTest.xml?rev=771227&view=auto
==============================================================================
--- camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRouteStopTest.xml (added)
+++ camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRouteStopTest.xml Mon May  4 07:51:49 2009
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+       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: example -->
+    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start"/>
+            <choice>
+                <when><simple>${in.body} contains 'Hello'</simple>
+                    <to uri="mock:hello"/>
+                </when>
+                <when><simple>${in.body} contains 'Bye'</simple>
+                    <to uri="mock:bye"/>
+                    <!-- here we stop continue routing so this was the last processing step -->
+                    <stop/>
+                </when>
+                <otherwise>
+                    <to uri="mock:other"/>
+                </otherwise>
+            </choice>
+            <to uri="mock:result"/>
+        </route>
+    </camelContext>
+    <!-- END SNIPPET: example -->
+</beans>

Propchange: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRouteStopTest.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRouteStopTest.xml
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Propchange: camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRouteStopTest.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml