Author: davsclaus Date: Tue Apr 27 09:33:26 2010 New Revision: 938376 URL: http://svn.apache.org/viewvc?rev=938376&view=rev Log: CAMEL-2677: RouteDefinition should be stateless, eg not tied to a CamelContext. This allows us to have reusable route defs used by multiple CamelContexts.
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java 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/model/RoutesDefinition.java camel/trunk/camel-core/src/main/java/org/apache/camel/model/ThrottleDefinition.java camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/StreamCaching.java camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithRouteIdTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithTest.java camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/rules/TemporalRule.java camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/resources/RouteResource.java camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/resources/RouteStatusResource.java camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/util/ProcessorDefinitionRenderer.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java?rev=938376&r1=938375&r2=938376&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java Tue Apr 27 09:33:26 2010 @@ -579,7 +579,6 @@ public class DefaultCamelContext extends public void addRouteDefinitions(Collection<RouteDefinition> routeDefinitions) throws Exception { for (RouteDefinition routeDefinition : routeDefinitions) { - routeDefinition.setCamelContext(this); removeRouteDefinition(routeDefinition); } this.routeDefinitions.addAll(routeDefinitions); 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=938376&r1=938375&r2=938376&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java Tue Apr 27 09:33:26 2010 @@ -99,9 +99,6 @@ public class DefaultRouteContext impleme } public CamelContext getCamelContext() { - if (camelContext == null) { - camelContext = getRoute().getCamelContext(); - } return camelContext; } @@ -110,7 +107,7 @@ public class DefaultRouteContext impleme } public Endpoint resolveEndpoint(String uri) { - return route.resolveEndpoint(uri); + return route.resolveEndpoint(getCamelContext(), uri); } public Endpoint resolveEndpoint(String uri, String ref) { 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=938376&r1=938375&r2=938376&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 Tue Apr 27 09:33:26 2010 @@ -28,7 +28,6 @@ import javax.xml.bind.annotation.XmlTran import javax.xml.bind.annotation.XmlType; import org.apache.camel.CamelContext; -import org.apache.camel.CamelContextAware; import org.apache.camel.Endpoint; import org.apache.camel.FailedToCreateRouteException; import org.apache.camel.NoSuchEndpointException; @@ -47,6 +46,7 @@ import org.apache.camel.spi.LifecycleStr import org.apache.camel.spi.RouteContext; import org.apache.camel.spi.RoutePolicy; import org.apache.camel.util.CamelContextHelper; +import org.apache.camel.util.ObjectHelper; /** * Represents an XML <route/> element @@ -56,10 +56,9 @@ import org.apache.camel.util.CamelContex @XmlRootElement(name = "route") @XmlType(propOrder = {"inputs", "outputs" }) @XmlAccessorType(XmlAccessType.PROPERTY) -public class RouteDefinition extends ProcessorDefinition<ProcessorDefinition> implements CamelContextAware { +public class RouteDefinition extends ProcessorDefinition<ProcessorDefinition> { private List<FromDefinition> inputs = new ArrayList<FromDefinition>(); private List<ProcessorDefinition> outputs = new ArrayList<ProcessorDefinition>(); - private CamelContext camelContext; private String group; private Boolean streamCache; private Boolean trace; @@ -96,7 +95,7 @@ public class RouteDefinition extends Pro /** * Returns the status of the route if it has been registered with a {...@link CamelContext} */ - public ServiceStatus getStatus() { + public ServiceStatus getStatus(CamelContext camelContext) { if (camelContext != null) { ServiceStatus answer = camelContext.getRouteStatus(this.getId()); if (answer == null) { @@ -107,8 +106,8 @@ public class RouteDefinition extends Pro return null; } - public boolean isStartable() { - ServiceStatus status = getStatus(); + public boolean isStartable(CamelContext camelContext) { + ServiceStatus status = getStatus(camelContext); if (status == null) { return true; } else { @@ -116,8 +115,8 @@ public class RouteDefinition extends Pro } } - public boolean isStoppable() { - ServiceStatus status = getStatus(); + public boolean isStoppable(CamelContext camelContext) { + ServiceStatus status = getStatus(camelContext); if (status == null) { return false; } else { @@ -125,11 +124,10 @@ public class RouteDefinition extends Pro } } - public List<RouteContext> addRoutes(CamelContext context, Collection<Route> routes) throws Exception { + public List<RouteContext> addRoutes(CamelContext camelContext, Collection<Route> routes) throws Exception { List<RouteContext> answer = new ArrayList<RouteContext>(); - setCamelContext(context); - ErrorHandlerBuilder handler = context.getErrorHandlerBuilder(); + ErrorHandlerBuilder handler = camelContext.getErrorHandlerBuilder(); if (handler != null) { setErrorHandlerBuilderIfNull(handler); } @@ -137,7 +135,7 @@ public class RouteDefinition extends Pro for (FromDefinition fromType : inputs) { RouteContext routeContext; try { - routeContext = addRoutes(routes, fromType); + routeContext = addRoutes(camelContext, routes, fromType); } catch (FailedToCreateRouteException e) { throw e; } catch (Exception e) { @@ -150,12 +148,9 @@ public class RouteDefinition extends Pro } - public Endpoint resolveEndpoint(String uri) throws NoSuchEndpointException { - CamelContext context = getCamelContext(); - if (context == null) { - throw new IllegalArgumentException("CamelContext has not been injected!"); - } - return CamelContextHelper.getMandatoryEndpoint(context, uri); + public Endpoint resolveEndpoint(CamelContext camelContext, String uri) throws NoSuchEndpointException { + ObjectHelper.notNull(camelContext, "CamelContext"); + return CamelContextHelper.getMandatoryEndpoint(camelContext, uri); } /** @@ -168,18 +163,17 @@ 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 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 */ - public RouteDefinition adviceWith(RouteBuilder builder) throws Exception { - CamelContext context = getCamelContext(); - if (context == null) { - throw new IllegalArgumentException("CamelContext has not been injected!"); - } + public RouteDefinition adviceWith(CamelContext camelContext, RouteBuilder builder) throws Exception { + ObjectHelper.notNull(camelContext, "CamelContext"); + ObjectHelper.notNull(builder, "RouteBuilder"); // configure and prepare the routes from the builder - RoutesDefinition routes = builder.configureRoutes(context); + RoutesDefinition routes = builder.configureRoutes(camelContext); // we can only advice with a route builder without any routes if (!routes.getRoutes().isEmpty()) { @@ -188,18 +182,18 @@ public class RouteDefinition extends Pro } // stop and remove this existing route - List<RouteDefinition> list = new ArrayList<RouteDefinition>(); + List<RouteDefinition> list = new ArrayList<RouteDefinition>(1); list.add(this); - context.removeRouteDefinitions(list); + camelContext.removeRouteDefinitions(list); // now merge which also ensures that interceptors and the likes get mixed in correctly as well RouteDefinition merged = routes.route(this); // add the new merged route - context.getRouteDefinitions().add(0, merged); + camelContext.getRouteDefinitions().add(0, merged); // and start it - context.startRoute(merged); + camelContext.startRoute(merged); return merged; } @@ -294,7 +288,7 @@ public class RouteDefinition extends Pro */ public RouteDefinition streamCaching() { setStreamCache(Boolean.TRUE); - StreamCaching cache = StreamCaching.getStreamCaching(getCamelContext()); + StreamCaching cache = StreamCaching.getStreamCaching(getInterceptStrategies()); if (cache == null) { cache = new StreamCaching(); } @@ -470,15 +464,6 @@ public class RouteDefinition extends Pro } } - public CamelContext getCamelContext() { - return camelContext; - } - - @XmlTransient - public void setCamelContext(CamelContext camelContext) { - this.camelContext = camelContext; - } - /** * The group that this route belongs to; could be the name of the RouteBuilder class * or be explicitly configured in the XML. @@ -611,8 +596,8 @@ public class RouteDefinition extends Pro // Implementation methods // ------------------------------------------------------------------------- @SuppressWarnings("unchecked") - protected RouteContext addRoutes(Collection<Route> routes, FromDefinition fromType) throws Exception { - RouteContext routeContext = new DefaultRouteContext(getCamelContext(), this, fromType, routes); + protected RouteContext addRoutes(CamelContext camelContext, Collection<Route> routes, FromDefinition fromType) throws Exception { + RouteContext routeContext = new DefaultRouteContext(camelContext, this, fromType, routes); // configure tracing if (trace != null) { @@ -633,7 +618,7 @@ public class RouteDefinition extends Pro log.debug("StreamCaching is enabled on route: " + this); } // only add a new stream cache if not already a global configured on camel context - if (StreamCaching.getStreamCaching(getCamelContext()) == null) { + if (StreamCaching.getStreamCaching(camelContext) == null) { addInterceptStrategy(new StreamCaching()); } } @@ -647,7 +632,7 @@ public class RouteDefinition extends Pro log.debug("HandleFault is enabled on route: " + this); } // only add a new handle fault if not already a global configured on camel context - if (HandleFault.getHandleFault(getCamelContext()) == null) { + if (HandleFault.getHandleFault(camelContext) == null) { addInterceptStrategy(new HandleFault()); } } @@ -678,7 +663,7 @@ public class RouteDefinition extends Pro } routeContext.setRoutePolicy(getRoutePolicy()); } else if (routePolicyRef != null) { - RoutePolicy policy = CamelContextHelper.mandatoryLookup(getCamelContext(), routePolicyRef, RoutePolicy.class); + RoutePolicy policy = CamelContextHelper.mandatoryLookup(camelContext, routePolicyRef, RoutePolicy.class); if (log.isDebugEnabled()) { log.debug("RoutePolicy is enabled: " + policy + " on route: " + this); } 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=938376&r1=938375&r2=938376&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 Tue Apr 27 09:33:26 2010 @@ -198,8 +198,6 @@ public class RoutesDefinition extends Op * @return the builder */ public RouteDefinition route(RouteDefinition route) { - // lets configure the route - route.setCamelContext(getCamelContext()); // configure intercept for (InterceptDefinition intercept : getIntercepts()) { Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/ThrottleDefinition.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ThrottleDefinition.java?rev=938376&r1=938375&r2=938376&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/ThrottleDefinition.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/ThrottleDefinition.java Tue Apr 27 09:33:26 2010 @@ -16,13 +16,11 @@ */ 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.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; import org.apache.camel.Processor; @@ -36,13 +34,11 @@ import org.apache.camel.spi.RouteContext */ @XmlRootElement(name = "throttle") @XmlAccessorType(XmlAccessType.FIELD) -public class ThrottleDefinition extends ProcessorDefinition<ProcessorDefinition> { +public class ThrottleDefinition extends OutputDefinition<ProcessorDefinition> { @XmlAttribute private Long maximumRequestsPerPeriod; @XmlAttribute private long timePeriodMillis = 1000; - @XmlElementRef - private List<ProcessorDefinition> outputs = new ArrayList<ProcessorDefinition>(); public ThrottleDefinition() { } @@ -117,11 +113,4 @@ public class ThrottleDefinition extends this.timePeriodMillis = timePeriodMillis; } - public List<ProcessorDefinition> getOutputs() { - return outputs; - } - - public void setOutputs(List<ProcessorDefinition> outputs) { - this.outputs = outputs; - } } Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/StreamCaching.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/StreamCaching.java?rev=938376&r1=938375&r2=938376&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/StreamCaching.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/StreamCaching.java Tue Apr 27 09:33:26 2010 @@ -28,9 +28,8 @@ import org.apache.camel.spi.InterceptStr */ public final class StreamCaching implements InterceptStrategy { - public Processor wrapProcessorInInterceptors(CamelContext context, - ProcessorDefinition<?> definition, Processor target, Processor nextTarget) throws Exception { - + public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, + Processor target, Processor nextTarget) throws Exception { return new StreamCachingInterceptor(target); } @@ -42,8 +41,18 @@ public final class StreamCaching impleme * @return the stream cache or null if none can be found */ public static StreamCaching getStreamCaching(CamelContext context) { - List<InterceptStrategy> list = context.getInterceptStrategies(); - for (InterceptStrategy interceptStrategy : list) { + return getStreamCaching(context.getInterceptStrategies()); + } + + /** + * A helper method to return the StreamCaching instance + * for a given list of interceptors + * + * @param interceptors the list of interceptors + * @return the stream cache or null if none can be found + */ + public static StreamCaching getStreamCaching(List<InterceptStrategy> interceptors) { + for (InterceptStrategy interceptStrategy : interceptors) { if (interceptStrategy instanceof StreamCaching) { return (StreamCaching)interceptStrategy; } Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithRouteIdTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithRouteIdTest.java?rev=938376&r1=938375&r2=938376&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithRouteIdTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithRouteIdTest.java Tue Apr 27 09:33:26 2010 @@ -24,7 +24,7 @@ import org.apache.camel.builder.RouteBui public class AdviceWithRouteIdTest extends AdviceWithTest { public void testAdvised() throws Exception { - context.getRouteDefinition("myRoute").adviceWith(new RouteBuilder() { + context.getRouteDefinition("myRoute").adviceWith(context, new RouteBuilder() { @Override public void configure() throws Exception { interceptSendToEndpoint("mock:foo") Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithTest.java?rev=938376&r1=938375&r2=938376&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/interceptor/AdviceWithTest.java Tue Apr 27 09:33:26 2010 @@ -37,7 +37,7 @@ public class AdviceWithTest extends Cont // START SNIPPET: e1 public void testAdvised() throws Exception { // advice the first route using the inlined route builder - context.getRouteDefinitions().get(0).adviceWith(new RouteBuilder() { + context.getRouteDefinitions().get(0).adviceWith(context, new RouteBuilder() { @Override public void configure() throws Exception { // intercept sending to mock:foo and do something else @@ -60,7 +60,7 @@ public class AdviceWithTest extends Cont public void testAdvisedNoNewRoutesAllowed() throws Exception { try { - context.getRouteDefinitions().get(0).adviceWith(new RouteBuilder() { + context.getRouteDefinitions().get(0).adviceWith(context, new RouteBuilder() { @Override public void configure() throws Exception { from("direct:bar").to("mock:bar"); @@ -78,7 +78,7 @@ public class AdviceWithTest extends Cont } public void testAdvisedThrowException() throws Exception { - context.getRouteDefinitions().get(0).adviceWith(new RouteBuilder() { + context.getRouteDefinitions().get(0).adviceWith(context, new RouteBuilder() { @Override public void configure() throws Exception { interceptSendToEndpoint("mock:foo") Modified: camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/rules/TemporalRule.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/rules/TemporalRule.java?rev=938376&r1=938375&r2=938376&view=diff ============================================================================== --- camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/rules/TemporalRule.java (original) +++ camel/trunk/components/camel-bam/src/main/java/org/apache/camel/bam/rules/TemporalRule.java Tue Apr 27 09:33:26 2010 @@ -87,9 +87,8 @@ public class TemporalRule extends Servic public Processor getOverdueAction() throws Exception { if (overdueAction == null && overdueProcessors != null) { RouteDefinition route = new RouteDefinition(); - route.setCamelContext(first.getBuilder().getProcessBuilder().getContext()); - RouteContext routeContext = new DefaultRouteContext( - first.getBuilder().getProcessBuilder().getContext(), route, null, new ArrayList<Route>()); + RouteContext routeContext = new DefaultRouteContext(first.getBuilder().getProcessBuilder().getContext(), + route, null, new ArrayList<Route>()); overdueAction = overdueProcessors.createOutputsProcessor(routeContext); } @@ -158,8 +157,6 @@ public class TemporalRule extends Servic /** * Returns the date in the future adding the given number of millis * - * @param date - * @param millis * @return the date in the future */ protected Date add(Date date, long millis) { Modified: camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/resources/RouteResource.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/resources/RouteResource.java?rev=938376&r1=938375&r2=938376&view=diff ============================================================================== --- camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/resources/RouteResource.java (original) +++ camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/resources/RouteResource.java Tue Apr 27 09:33:26 2010 @@ -79,7 +79,7 @@ public class RouteResource extends Camel public RouteResource(RoutesResource routesResource, RouteDefinition route) { super(routesResource.getContextResource()); this.route = route; - this.id = route.idOrCreate(route.getCamelContext().getNodeIdFactory()); + this.id = route.idOrCreate(getCamelContext().getNodeIdFactory()); } /** Modified: camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/resources/RouteStatusResource.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/resources/RouteStatusResource.java?rev=938376&r1=938375&r2=938376&view=diff ============================================================================== --- camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/resources/RouteStatusResource.java (original) +++ camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/resources/RouteStatusResource.java Tue Apr 27 09:33:26 2010 @@ -61,7 +61,7 @@ public class RouteStatusResource { } public ServiceStatus getStatus() { - return getRoute().getStatus(); + return getRoute().getStatus(getCamelContext()); } @POST Modified: camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/util/ProcessorDefinitionRenderer.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/util/ProcessorDefinitionRenderer.java?rev=938376&r1=938375&r2=938376&view=diff ============================================================================== --- camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/util/ProcessorDefinitionRenderer.java (original) +++ camel/trunk/components/camel-web/src/main/java/org/apache/camel/web/util/ProcessorDefinitionRenderer.java Tue Apr 27 09:33:26 2010 @@ -64,8 +64,6 @@ public final class ProcessorDefinitionRe } else if (processor instanceof OnExceptionDefinition) { OnExceptionDefinitionRenderer.render(buffer, processor); return; - } else if (processor instanceof OutputDefinition) { - OutputDefinitionRenderer.render(buffer, processor); } else if (processor instanceof ResequenceDefinition) { ResequenceDefinitionRenderer.render(buffer, processor); } else if (processor instanceof RollbackDefinition) { @@ -80,6 +78,9 @@ public final class ProcessorDefinitionRe ThrottleDefinitionRenderer.render(buffer, processor); } else if (processor instanceof ThrowExceptionDefinition) { ThrowExceptionDefinitionRenderer.render(buffer, processor); + } else if (processor instanceof OutputDefinition) { + // output must be last as its very generic + OutputDefinitionRenderer.render(buffer, processor); } else { buffer.append(".").append(processor.getShortName()).append("()"); }