Author: davsclaus
Date: Sat Jan 29 12:54:32 2011
New Revision: 1065012

URL: http://svn.apache.org/viewvc?rev=1065012&view=rev
Log:
CAMEL-3254: Added test for using multiple route policies. Reworked a bit to 
only use one RoutePolicyProcessor.

Added:
    
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RoutePoliciesRefTest.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RoutePoliciesTest.java
    
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRoutePoliciesTest.java
    
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRoutePoliciesTest.xml
      - copied, changed from r1064979, 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/choice.xml
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RoutePolicyProcessor.java
    camel/trunk/components/camel-quartz/pom.xml

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java?rev=1065012&r1=1065011&r2=1065012&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java
 Sat Jan 29 12:54:32 2011
@@ -146,35 +146,28 @@ public class DefaultRouteContext impleme
     public void commit() {
         // now lets turn all of the event driven consumer processors into a 
single route
         if (!eventDrivenProcessors.isEmpty()) {
-            Processor processor = Pipeline.newInstance(getCamelContext(), 
eventDrivenProcessors);
+            Processor target = Pipeline.newInstance(getCamelContext(), 
eventDrivenProcessors);
 
             // and wrap it in a unit of work so the UoW is on the top, so the 
entire route will be in the same UoW
-            UnitOfWorkProcessor unitOfWorkProcessor = new 
UnitOfWorkProcessor(this, processor);
-            Processor target = unitOfWorkProcessor;
+            UnitOfWorkProcessor unitOfWorkProcessor = new 
UnitOfWorkProcessor(this, target);
 
             // and then optionally add route policy processor if a custom 
policy is set
             RoutePolicyProcessor routePolicyProcessor = null;
-            List<RoutePolicy> policyList = getRoutePolicyList();
-            if (!policyList.isEmpty()) {
-                boolean firstPolicy = true;
-                for (RoutePolicy policy : policyList) {
-                    if (firstPolicy) {
-                        routePolicyProcessor = new 
RoutePolicyProcessor(unitOfWorkProcessor, policy);
-                        firstPolicy = false;
-                    } else {
-                        routePolicyProcessor = new 
RoutePolicyProcessor(routePolicyProcessor, policy);
-                    }
-                    
-                    // add it as service if we have not already done that (eg 
possible if two routes have the same service)
-                    if (!camelContext.hasService(policy)) {
-                        try {
-                            camelContext.addService(policy);
-                        } catch (Exception e) {
-                            throw ObjectHelper.wrapRuntimeCamelException(e);
-                        }
+            List<RoutePolicy> routePolicyList = getRoutePolicyList();
+            if (routePolicyList != null && !routePolicyList.isEmpty()) {
+                routePolicyProcessor = new 
RoutePolicyProcessor(unitOfWorkProcessor, routePolicyList);
+
+                // add it as service if we have not already done that (eg 
possible if two routes have the same service)
+                if (!camelContext.hasService(routePolicyProcessor)) {
+                    try {
+                        camelContext.addService(routePolicyProcessor);
+                    } catch (Exception e) {
+                        throw ObjectHelper.wrapRuntimeCamelException(e);
                     }
                 }
                 target = routePolicyProcessor;
+            } else {
+                target = unitOfWorkProcessor;
             }
 
             // and wrap it by a instrumentation processor that is to be used 
for performance stats
@@ -199,8 +192,8 @@ public class DefaultRouteContext impleme
             }
 
             // invoke init on route policy
-            if (!policyList.isEmpty()) {
-                for (RoutePolicy policy : policyList) { 
+            if (routePolicyList != null && !routePolicyList.isEmpty()) {
+                for (RoutePolicy policy : routePolicyList) {
                     policy.onInit(edcr);
                 }
             }

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java?rev=1065012&r1=1065011&r2=1065012&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RouteDefinition.java
 Sat Jan 29 12:54:32 2011
@@ -56,7 +56,7 @@ import org.apache.camel.util.ObjectHelpe
  * @version $Revision$
  */
 @XmlRootElement(name = "route")
-@XmlType(propOrder = {"inputs", "outputs" })
+@XmlType(propOrder = {"inputs", "outputs"})
 @XmlAccessorType(XmlAccessType.PROPERTY)
 public class RouteDefinition extends ProcessorDefinition<RouteDefinition> {
     private final AtomicBoolean prepared = new AtomicBoolean(false);
@@ -69,7 +69,7 @@ public class RouteDefinition extends Pro
     private String delayer;
     private String autoStartup;
     private Integer startupOrder;
-    private RoutePolicy routePolicy;
+    private List<RoutePolicy> routePolicies;
     private String routePolicyRef;
     private ShutdownRoute shutdownRoute;
     private ShutdownRunningTask shutdownRunningTask;
@@ -146,7 +146,7 @@ public class RouteDefinition extends Pro
             return status.isStoppable();
         }
     }
-    
+
     public List<RouteContext> addRoutes(CamelContext camelContext, 
Collection<Route> routes) throws Exception {
         List<RouteContext> answer = new ArrayList<RouteContext>();
 
@@ -186,8 +186,8 @@ public class RouteDefinition extends Pro
      * <p/>
      * Will stop and remove the old route from camel context and add and start 
this new advised route.
      *
-     * @param camelContext  the camel context
-     * @param builder       the route builder
+     * @param camelContext the camel context
+     * @param builder      the route builder
      * @return a new route which is this route merged with the route builder
      * @throws Exception can be thrown from the route builder
      */
@@ -224,7 +224,7 @@ public class RouteDefinition extends Pro
     /**
      * Creates an input to the route
      *
-     * @param uri  the from uri
+     * @param uri the from uri
      * @return the builder
      */
     public RouteDefinition from(String uri) {
@@ -235,7 +235,7 @@ public class RouteDefinition extends Pro
     /**
      * Creates an input to the route
      *
-     * @param endpoint  the from endpoint
+     * @param endpoint the from endpoint
      * @return the builder
      */
     public RouteDefinition from(Endpoint endpoint) {
@@ -246,7 +246,7 @@ public class RouteDefinition extends Pro
     /**
      * Creates inputs to the route
      *
-     * @param uris  the from uris
+     * @param uris the from uris
      * @return the builder
      */
     public RouteDefinition from(String... uris) {
@@ -259,7 +259,7 @@ public class RouteDefinition extends Pro
     /**
      * Creates inputs to the route
      *
-     * @param endpoints  the from endpoints
+     * @param endpoints the from endpoints
      * @return the builder
      */
     public RouteDefinition from(Endpoint... endpoints) {
@@ -272,7 +272,7 @@ public class RouteDefinition extends Pro
     /**
      * Set the group name for this route
      *
-     * @param name  the group name
+     * @param name the group name
      * @return the builder
      */
     public RouteDefinition group(String name) {
@@ -283,7 +283,7 @@ public class RouteDefinition extends Pro
     /**
      * Set the route id for this route
      *
-     * @param id  the route id
+     * @param id the route id
      * @return the builder
      */
     public RouteDefinition routeId(String id) {
@@ -293,7 +293,7 @@ public class RouteDefinition extends Pro
 
     /**
      * Disable stream caching for this route.
-     * 
+     *
      * @return the builder
      */
     public RouteDefinition noStreamCaching() {
@@ -304,7 +304,7 @@ public class RouteDefinition extends Pro
 
     /**
      * Enable stream caching for this route.
-     * 
+     *
      * @return the builder
      */
     public RouteDefinition streamCaching() {
@@ -320,7 +320,7 @@ public class RouteDefinition extends Pro
 
     /**
      * Disable tracing for this route.
-     * 
+     *
      * @return the builder
      */
     public RouteDefinition noTracing() {
@@ -330,7 +330,7 @@ public class RouteDefinition extends Pro
 
     /**
      * Enable tracing for this route.
-     * 
+     *
      * @return the builder
      */
     public RouteDefinition tracing() {
@@ -340,7 +340,7 @@ public class RouteDefinition extends Pro
 
     /**
      * Disable handle fault for this route.
-     * 
+     *
      * @return the builder
      */
     public RouteDefinition noHandleFault() {
@@ -350,7 +350,7 @@ public class RouteDefinition extends Pro
 
     /**
      * Enable handle fault for this route.
-     * 
+     *
      * @return the builder
      */
     public RouteDefinition handleFault() {
@@ -360,7 +360,7 @@ public class RouteDefinition extends Pro
 
     /**
      * Disable delayer for this route.
-     * 
+     *
      * @return the builder
      */
     public RouteDefinition noDelayer() {
@@ -392,7 +392,7 @@ public class RouteDefinition extends Pro
 
     /**
      * Disables this route from being auto started when Camel starts.
-     * 
+     *
      * @return the builder
      */
     public RouteDefinition noAutoStartup() {
@@ -415,13 +415,18 @@ public class RouteDefinition extends Pro
     }
 
     /**
-     * Configures a route policy for this route
+     * Configures route policies for this route
      *
-     * @param routePolicy the route policy
+     * @param policies the route policies
      * @return the builder
-     */ 
-    public RouteDefinition routePolicy(RoutePolicy routePolicy) {
-        setRoutePolicy(routePolicy);
+     */
+    public RouteDefinition routePolicy(RoutePolicy... policies) {
+        if (routePolicies == null) {
+            routePolicies = new ArrayList<RoutePolicy>();
+        }
+        for (RoutePolicy policy : policies) {
+            routePolicies.add(policy);
+        }
         return this;
     }
 
@@ -429,6 +434,7 @@ public class RouteDefinition extends Pro
      * Configures a route policy for this route
      *
      * @param routePolicyRef reference to a {@link RoutePolicy} to lookup and 
use.
+     *                       You can specify multiple references by separating 
using comma.
      * @return the builder
      */
     public RouteDefinition routePolicyRef(String routePolicyRef) {
@@ -488,7 +494,7 @@ public class RouteDefinition extends Pro
     /**
      * The group that this route belongs to; could be the name of the 
RouteBuilder class
      * or be explicitly configured in the XML.
-     *
+     * <p/>
      * May be null.
      */
     public String getGroup() {
@@ -596,13 +602,13 @@ public class RouteDefinition extends Pro
         return routePolicyRef;
     }
 
-    @XmlTransient
-    public void setRoutePolicy(RoutePolicy routePolicy) {
-        this.routePolicy = routePolicy;
+    public List<RoutePolicy> getRoutePolicies() {
+        return routePolicies;
     }
 
-    public RoutePolicy getRoutePolicy() {
-        return routePolicy;
+    @XmlTransient
+    public void setRoutePolicies(List<RoutePolicy> routePolicies) {
+        this.routePolicies = routePolicies;
     }
 
     public ShutdownRoute getShutdownRoute() {
@@ -636,7 +642,7 @@ public class RouteDefinition extends Pro
                 routeContext.setTracing(isTrace);
                 if (isTrace) {
                     if (log.isDebugEnabled()) {
-                        log.debug("Tracing is enabled on route: " + this);
+                        log.debug("Tracing is enabled on route: " + getId());
                     }
                     // tracing is added in the DefaultChannel so we can enable 
it on the fly
                 }
@@ -650,7 +656,7 @@ public class RouteDefinition extends Pro
                 routeContext.setStreamCaching(isStreamCache);
                 if (isStreamCache) {
                     if (log.isDebugEnabled()) {
-                        log.debug("StreamCaching is enabled on route: " + 
this);
+                        log.debug("StreamCaching is enabled on route: " + 
getId());
                     }
                     // only add a new stream cache if not already a global 
configured on camel context
                     if (StreamCaching.getStreamCaching(camelContext) == null) {
@@ -667,7 +673,7 @@ public class RouteDefinition extends Pro
                 routeContext.setHandleFault(isHandleFault);
                 if (isHandleFault) {
                     if (log.isDebugEnabled()) {
-                        log.debug("HandleFault is enabled on route: " + this);
+                        log.debug("HandleFault is enabled on route: " + 
getId());
                     }
                     // only add a new handle fault if not already a global 
configured on camel context
                     if (HandleFault.getHandleFault(camelContext) == null) {
@@ -684,29 +690,33 @@ public class RouteDefinition extends Pro
                 routeContext.setDelayer(delayer);
                 if (delayer > 0) {
                     if (log.isDebugEnabled()) {
-                        log.debug("Delayer is enabled with: " + delayer + " 
ms. on route: " + this);
+                        log.debug("Delayer is enabled with: " + delayer + " 
ms. on route: " + getId());
                     }
                     addInterceptStrategy(new Delayer(delayer));
                 } else {
                     if (log.isDebugEnabled()) {
-                        log.debug("Delayer is disabled on route: " + this);
+                        log.debug("Delayer is disabled on route: " + getId());
                     }
                 }
             }
         }
 
         // configure route policy
-        if (routePolicy != null) {
-            if (log.isDebugEnabled()) {
-                log.debug("RoutePolicy is enabled: " + routePolicy + " on 
route: " + this);
+        if (routePolicies != null && !routePolicies.isEmpty()) {
+            for (RoutePolicy policy : routePolicies) {
+                if (log.isDebugEnabled()) {
+                    log.debug("RoutePolicy is enabled: " + policy + " on 
route: " + getId());
+                }
+                routeContext.getRoutePolicyList().add(policy);
             }
-            routeContext.getRoutePolicyList().add(getRoutePolicy());
-        } else if (routePolicyRef != null) {
+        }
+        if (routePolicyRef != null) {
             StringTokenizer policyTokens = new StringTokenizer(routePolicyRef, 
",");
             while (policyTokens.hasMoreTokens()) {
-                RoutePolicy policy = 
CamelContextHelper.mandatoryLookup(camelContext, 
policyTokens.nextToken().trim(), RoutePolicy.class);
+                String ref = policyTokens.nextToken().trim();
+                RoutePolicy policy = 
CamelContextHelper.mandatoryLookup(camelContext, ref, RoutePolicy.class);
                 if (log.isDebugEnabled()) {
-                    log.debug("RoutePolicy is enabled: " + policy + " on 
route: " + this);
+                    log.debug("RoutePolicy is enabled: " + policy + " on 
route: " + getId());
                 }
                 routeContext.getRoutePolicyList().add(policy);
             }
@@ -716,7 +726,7 @@ public class RouteDefinition extends Pro
         Boolean isAutoStartup = CamelContextHelper.parseBoolean(camelContext, 
getAutoStartup());
         if (isAutoStartup != null) {
             if (log.isDebugEnabled()) {
-                log.debug("Using AutoStartup " + isAutoStartup + " on route: " 
+ this);
+                log.debug("Using AutoStartup " + isAutoStartup + " on route: " 
+ getId());
             }
             routeContext.setAutoStartup(isAutoStartup);
         }
@@ -724,13 +734,13 @@ public class RouteDefinition extends Pro
         // configure shutdown
         if (shutdownRoute != null) {
             if (log.isDebugEnabled()) {
-                log.debug("Using ShutdownRoute " + getShutdownRoute() + " on 
route: " + this);
+                log.debug("Using ShutdownRoute " + getShutdownRoute() + " on 
route: " + getId());
             }
             routeContext.setShutdownRoute(getShutdownRoute());
         }
         if (shutdownRunningTask != null) {
             if (log.isDebugEnabled()) {
-                log.debug("Using ShutdownRunningTask " + 
getShutdownRunningTask() + " on route: " + this);
+                log.debug("Using ShutdownRunningTask " + 
getShutdownRunningTask() + " on route: " + getId());
             }
             routeContext.setShutdownRunningTask(getShutdownRunningTask());
         }

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RoutePolicyProcessor.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RoutePolicyProcessor.java?rev=1065012&r1=1065011&r2=1065012&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RoutePolicyProcessor.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RoutePolicyProcessor.java
 Sat Jan 29 12:54:32 2011
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.processor;
 
+import java.util.List;
+
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
@@ -24,61 +26,101 @@ import org.apache.camel.Route;
 import org.apache.camel.impl.ServiceSupport;
 import org.apache.camel.impl.SynchronizationAdapter;
 import org.apache.camel.spi.RoutePolicy;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 /**
+ * {@link Processor} which instruments the {@link RoutePolicy}.
+ *
  * @version $Revision$
  */
 public class RoutePolicyProcessor extends DelegateAsyncProcessor {
 
-    private final RoutePolicy routePolicy;
+    private final Log LOG = LogFactory.getLog(RoutePolicyProcessor.class);
+    private final List<RoutePolicy> routePolicies;
     private Route route;
 
-    public RoutePolicyProcessor(Processor processor, RoutePolicy routePolicy) {
+    public RoutePolicyProcessor(Processor processor, List<RoutePolicy> 
routePolicies) {
         super(processor);
-        this.routePolicy = routePolicy;
+        this.routePolicies = routePolicies;
     }
 
     @Override
     public String toString() {
-        return "RoutePolicy[" + routePolicy + "]";
+        return "RoutePolicy[" + routePolicies + "]";
     }
 
     @Override
     public boolean process(Exchange exchange, AsyncCallback callback) {
-        // check whether the policy is enabled
-        if (isRoutePolicyRunAllowed()) {
 
-            // invoke begin
-            routePolicy.onExchangeBegin(route, exchange);
+        // invoke begin
+        for (RoutePolicy policy : routePolicies) {
+            try {
+                if (isRoutePolicyRunAllowed(policy)) {
+                    policy.onExchangeBegin(route, exchange);
+                }
+            } catch (Exception e) {
+                LOG.warn("Error occurred during onExchangeBegin on 
RoutePolicy: " + policy
+                        + ". This exception will be ignored", e);
+            }
+        }
 
-            // add on completion that invokes the policy callback on complete
-            // as the Exchange can be routed async and thus we need the 
callback to
-            // invoke when the route is completed
-            exchange.addOnCompletion(new SynchronizationAdapter() {
-                @Override
-                public void onDone(Exchange exchange) {
-                    // do not invoke it if Camel is stopping as we don't want
-                    // the policy to start a consumer during Camel is stopping
-                    if (isCamelStopping(exchange.getContext())) {
-                        return;
-                    }
-                    routePolicy.onExchangeDone(route, exchange);
+        // add on completion that invokes the policy callback on complete
+        // as the Exchange can be routed async and thus we need the callback to
+        // invoke when the route is completed
+        exchange.addOnCompletion(new SynchronizationAdapter() {
+            @Override
+            public void onDone(Exchange exchange) {
+                // do not invoke it if Camel is stopping as we don't want
+                // the policy to start a consumer during Camel is stopping
+                if (isCamelStopping(exchange.getContext())) {
+                    return;
                 }
 
-                @Override
-                public String toString() {
-                    return "RoutePolicy";
+                for (RoutePolicy policy : routePolicies) {
+                    try {
+                        if (isRoutePolicyRunAllowed(policy)) {
+                            policy.onExchangeDone(route, exchange);
+                        }
+                    } catch (Exception e) {
+                        LOG.warn("Error occurred during onExchangeDone on 
RoutePolicy: " + policy
+                                + ". This exception will be ignored", e);
+                    }
                 }
-            });
-        }
+            }
+
+            @Override
+            public String toString() {
+                return "RoutePolicyOnCompletion";
+            }
+        });
 
         return super.process(exchange, callback);
     }
 
+    /**
+     * Sets the route this policy applies.
+     *
+     * @param route the route
+     */
     public void setRoute(Route route) {
         this.route = route;
     }
 
+    /**
+     * Strategy to determine if this policy is allowed to run
+     *
+     * @param policy the policy
+     * @return <tt>true</tt> to run
+     */
+    protected boolean isRoutePolicyRunAllowed(RoutePolicy policy) {
+        if (policy instanceof ServiceSupport) {
+            ServiceSupport ss = (ServiceSupport) policy;
+            return ss.isRunAllowed();
+        }
+        return true;
+    }
+
     private static boolean isCamelStopping(CamelContext context) {
         if (context instanceof ServiceSupport) {
             ServiceSupport ss = (ServiceSupport) context;
@@ -87,12 +129,4 @@ public class RoutePolicyProcessor extend
         return false;
     }
 
-    private boolean isRoutePolicyRunAllowed() {
-        if (routePolicy instanceof ServiceSupport) {
-            ServiceSupport ss = (ServiceSupport) routePolicy;
-            return ss.isRunAllowed();
-        }
-        return true;
-    }
-
 }

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RoutePoliciesRefTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RoutePoliciesRefTest.java?rev=1065012&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RoutePoliciesRefTest.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RoutePoliciesRefTest.java
 Sat Jan 29 12:54:32 2011
@@ -0,0 +1,81 @@
+/**
+ * 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.Route;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.impl.RoutePolicySupport;
+
+/**
+ * @version $Revision: 1043882 $
+ */
+public class RoutePoliciesRefTest extends ContextTestSupport {
+
+    private final MyCustomRoutePolicy policyA = new MyCustomRoutePolicy("A");
+    private final MyCustomRoutePolicy policyB = new MyCustomRoutePolicy("B");
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+        jndi.bind("policy-a", policyA);
+        jndi.bind("policy-b", policyB);
+        return jndi;
+    }
+
+    private class MyCustomRoutePolicy extends RoutePolicySupport {
+
+        private final String name;
+
+        private MyCustomRoutePolicy(String name) {
+            this.name = name;
+        }
+
+        @Override
+        public void onExchangeBegin(Route route, Exchange exchange) {
+            exchange.getIn().setHeader(name, name);
+        }
+
+    }
+
+    public void testCustomPolicies() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Hello World");
+        mock.expectedHeaderReceived("A", "A");
+        mock.expectedHeaderReceived("B", "B");
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .routePolicyRef("policy-a, policy-b")
+                    .to("mock:result");
+            }
+        };
+    }
+}
+

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RoutePoliciesTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RoutePoliciesTest.java?rev=1065012&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RoutePoliciesTest.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RoutePoliciesTest.java
 Sat Jan 29 12:54:32 2011
@@ -0,0 +1,72 @@
+/**
+ * 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.Route;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.RoutePolicySupport;
+
+/**
+ * @version $Revision: 1043882 $
+ */
+public class RoutePoliciesTest extends ContextTestSupport {
+
+    private final MyCustomRoutePolicy policyA = new MyCustomRoutePolicy("A");
+    private final MyCustomRoutePolicy policyB = new MyCustomRoutePolicy("B");
+
+    private class MyCustomRoutePolicy extends RoutePolicySupport {
+
+        private final String name;
+
+        private MyCustomRoutePolicy(String name) {
+            this.name = name;
+        }
+
+        @Override
+        public void onExchangeBegin(Route route, Exchange exchange) {
+            exchange.getIn().setHeader(name, name);
+        }
+
+    }
+
+    public void testCustomPolicies() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Hello World");
+        mock.expectedHeaderReceived("A", "A");
+        mock.expectedHeaderReceived("B", "B");
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .routePolicy(policyA, policyB)
+                    .to("mock:result");
+            }
+        };
+    }
+}
+

Modified: camel/trunk/components/camel-quartz/pom.xml
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-quartz/pom.xml?rev=1065012&r1=1065011&r2=1065012&view=diff
==============================================================================
--- camel/trunk/components/camel-quartz/pom.xml (original)
+++ camel/trunk/components/camel-quartz/pom.xml Sat Jan 29 12:54:32 2011
@@ -73,11 +73,6 @@
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-core-xml</artifactId>            
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel</groupId>
             <artifactId>camel-test</artifactId>            
             <scope>test</scope>
         </dependency>

Added: 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRoutePoliciesTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRoutePoliciesTest.java?rev=1065012&view=auto
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRoutePoliciesTest.java
 (added)
+++ 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringRoutePoliciesTest.java
 Sat Jan 29 12:54:32 2011
@@ -0,0 +1,64 @@
+/**
+ * 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.Exchange;
+import org.apache.camel.Route;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.RoutePolicySupport;
+import org.apache.camel.spring.SpringTestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+/**
+ * @version $Revision$
+ */
+public class SpringRoutePoliciesTest extends SpringTestSupport {
+
+    @Override
+    protected AbstractXmlApplicationContext createApplicationContext() {
+        return new 
ClassPathXmlApplicationContext("org/apache/camel/spring/processor/SpringRoutePoliciesTest.xml");
+    }
+
+    public void testCustomPolicies() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Hello World");
+        mock.expectedHeaderReceived("A", "A");
+        mock.expectedHeaderReceived("B", "B");
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public static class MyCustomRoutePolicy extends RoutePolicySupport {
+
+        private final String name;
+
+        private MyCustomRoutePolicy(String name) {
+            this.name = name;
+        }
+
+        @Override
+        public void onExchangeBegin(Route route, Exchange exchange) {
+            exchange.getIn().setHeader(name, name);
+        }
+
+    }
+
+
+}

Copied: 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRoutePoliciesTest.xml
 (from r1064979, 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/choice.xml)
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRoutePoliciesTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRoutePoliciesTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/choice.xml&r1=1064979&r2=1065012&rev=1065012&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/choice.xml
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringRoutePoliciesTest.xml
 Sat Jan 29 12:54:32 2011
@@ -22,26 +22,19 @@
        http://camel.apache.org/schema/spring 
http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-  <!-- START SNIPPET: example -->
-  <camelContext xmlns="http://camel.apache.org/schema/spring";>
-    <route>
-      <from uri="direct:start"/>
-      <choice>
-        <when>
-          <xpath>$foo = 'bar'</xpath>
-          <to uri="mock:x"/>
-        </when>
-        <when>
-          <xpath>$foo = 'cheese'</xpath>
-          <to uri="mock:y"/>
-        </when>
-        <otherwise>
-          <to uri="mock:z"/>
-        </otherwise>
-      </choice>
-      <to uri="mock:end"/>
-    </route>
-  </camelContext>
-  <!-- END SNIPPET: example -->
+    <bean id="policy-a" 
class="org.apache.camel.spring.processor.SpringRoutePoliciesTest$MyCustomRoutePolicy">
+        <constructor-arg index="0" value="A"/>
+    </bean>
+
+    <bean id="policy-b" 
class="org.apache.camel.spring.processor.SpringRoutePoliciesTest$MyCustomRoutePolicy">
+        <constructor-arg index="0" value="B"/>
+    </bean>
+
+    <camelContext xmlns="http://camel.apache.org/schema/spring";>
+        <route routePolicyRef="policy-a, policy-b">
+            <from uri="direct:start"/>
+            <to uri="mock:result"/>
+        </route>
+    </camelContext>
 
 </beans>


Reply via email to