Strike 2.
Hadrian

On Jan 29, 2011, at 7:54 AM, davscl...@apache.org wrote:

> 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