This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 64abe1998255c41f5a5c83d9c75850126f578348 Author: Guillaume Nodet <gno...@gmail.com> AuthorDate: Mon May 20 18:16:53 2019 +0200 [CAMEL-13371] small refactorings on RouteContext and reifiers --- .../hystrix/processor/HystrixReifier.java | 3 +-- .../apache/camel/spring/EndpointReferenceTest.java | 2 +- .../java/org/apache/camel/spi/RouteContext.java | 20 ++++++--------- .../org/apache/camel/impl/DefaultRouteContext.java | 29 ++++++++++++++++------ .../java/org/apache/camel/impl/RouteService.java | 5 ++-- .../apache/camel/model/OnCompletionDefinition.java | 19 -------------- .../apache/camel/model/OnExceptionDefinition.java | 18 -------------- .../errorhandler/ErrorHandlerSupport.java | 2 +- .../errorhandler/RedeliveryErrorHandler.java | 6 ++--- .../apache/camel/reifier/OnCompletionReifier.java | 4 +-- .../apache/camel/reifier/OnExceptionReifier.java | 5 ++-- .../org/apache/camel/reifier/ProcessorReifier.java | 11 +++++--- .../java/org/apache/camel/reifier/StepReifier.java | 3 +-- 13 files changed, 50 insertions(+), 77 deletions(-) diff --git a/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixReifier.java b/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixReifier.java index a0d2981..a3c24e3 100644 --- a/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixReifier.java +++ b/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixReifier.java @@ -27,7 +27,6 @@ import com.netflix.hystrix.HystrixCommandProperties; import com.netflix.hystrix.HystrixThreadPoolKey; import com.netflix.hystrix.HystrixThreadPoolProperties; import org.apache.camel.CamelContext; -import org.apache.camel.ExtendedCamelContext; import org.apache.camel.Processor; import org.apache.camel.model.HystrixConfigurationDefinition; import org.apache.camel.model.HystrixDefinition; @@ -56,7 +55,7 @@ public class HystrixReifier extends ProcessorReifier<HystrixDefinition> { } final HystrixConfigurationDefinition config = buildHystrixConfiguration(routeContext.getCamelContext()); - final String id = definition.idOrCreate(routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getNodeIdFactory()); + final String id = getId(definition, routeContext); // group and thread pool keys to use they can be configured on configRef and config, so look there first, and if none then use default String groupKey = config.getGroupKey(); diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/EndpointReferenceTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/EndpointReferenceTest.java index 8e68565..d172ef5 100644 --- a/components/camel-spring/src/test/java/org/apache/camel/spring/EndpointReferenceTest.java +++ b/components/camel-spring/src/test/java/org/apache/camel/spring/EndpointReferenceTest.java @@ -74,7 +74,7 @@ public class EndpointReferenceTest extends SpringTestSupport { @Test public void testReferenceEndpointFromOtherCamelContext() throws Exception { CamelContext context = applicationContext.getBean("camel2", CamelContext.class); - RouteContext routeContext = new DefaultRouteContext(context, new RouteDefinition("temporary"), null); + RouteContext routeContext = new DefaultRouteContext(context, new RouteDefinition("temporary")); try { routeContext.resolveEndpoint(null, "endpoint1"); fail("Should have thrown exception"); diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/RouteContext.java b/core/camel-api/src/main/java/org/apache/camel/spi/RouteContext.java index ba8d9c6..f931785 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/RouteContext.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/RouteContext.java @@ -199,18 +199,6 @@ public interface RouteContext extends RuntimeConfiguration, EndpointAware { Integer getStartupOrder(); - /** - * A private counter that increments, is used to as book keeping - * when building a route based on the model - * <p/> - * We need this special book keeping be able to assign the correct - * {@link org.apache.camel.model.ProcessorDefinition} to the {@link org.apache.camel.Channel} - * - * @param node the current node - * @return the current count - */ - int getAndIncrement(NamedNode node); - ErrorHandlerFactory getErrorHandlerFactory(); /** @@ -249,4 +237,12 @@ public interface RouteContext extends RuntimeConfiguration, EndpointAware { default void setRouteController(RouteController controller) { } + Processor getOnCompletion(String onCompletionId); + + void setOnCompletion(String onCompletionId, Processor processor); + + Processor getOnException(String onExceptionId); + + void setOnException(String onExceptionId, Processor processor); + } diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java index 6df3b2a..a64cd54 100644 --- a/core/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java +++ b/core/camel-core/src/main/java/org/apache/camel/impl/DefaultRouteContext.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; @@ -54,7 +53,6 @@ import org.apache.camel.support.CamelContextHelper; * The context used to activate new routing rules */ public class DefaultRouteContext implements RouteContext { - private final Map<NamedNode, AtomicInteger> nodeIndex = new HashMap<>(); private final RouteDefinition route; private final String routeId; private Route runtimeRoute; @@ -77,6 +75,8 @@ public class DefaultRouteContext implements RouteContext { private ShutdownRunningTask shutdownRunningTask; private RouteError routeError; private RouteController routeController; + private final Map<String, Processor> onCompletions = new HashMap<>(); + private final Map<String, Processor> onExceptions = new HashMap<>(); public DefaultRouteContext(CamelContext camelContext, RouteDefinition route) { this.camelContext = camelContext; @@ -464,11 +464,6 @@ public class DefaultRouteContext implements RouteContext { return getCamelContext().getShutdownRunningTask(); } } - - public int getAndIncrement(NamedNode node) { - AtomicInteger count = nodeIndex.computeIfAbsent(node, n -> new AtomicInteger()); - return count.getAndIncrement(); - } public void setRoutePolicyList(List<RoutePolicy> routePolicyList) { this.routePolicyList = routePolicyList; @@ -497,4 +492,24 @@ public class DefaultRouteContext implements RouteContext { public void setRouteController(RouteController routeController) { this.routeController = routeController; } + + @Override + public Processor getOnCompletion(String onCompletionId) { + return onCompletions.get(onCompletionId); + } + + @Override + public void setOnCompletion(String onCompletionId, Processor processor) { + onCompletions.put(onCompletionId, processor); + } + + @Override + public Processor getOnException(String onExceptionId) { + return onExceptions.get(onExceptionId); + } + + @Override + public void setOnException(String onExceptionId, Processor processor) { + onExceptions.put(onExceptionId, processor); + } } diff --git a/core/camel-core/src/main/java/org/apache/camel/impl/RouteService.java b/core/camel-core/src/main/java/org/apache/camel/impl/RouteService.java index 9cde665..1551af6 100644 --- a/core/camel-core/src/main/java/org/apache/camel/impl/RouteService.java +++ b/core/camel-core/src/main/java/org/apache/camel/impl/RouteService.java @@ -88,11 +88,12 @@ public class RouteService extends BaseRouteService { * Gather all other kind of route scoped services from the given route, except error handler */ protected void doGetRouteScopedServices(List<Service> services) { + for (ProcessorDefinition<?> output : routeDefinition.getOutputs()) { if (output instanceof OnExceptionDefinition) { OnExceptionDefinition onExceptionDefinition = (OnExceptionDefinition) output; if (onExceptionDefinition.isRouteScoped()) { - Processor errorHandler = onExceptionDefinition.getErrorHandler(getId()); + Processor errorHandler = getRouteContext().getOnException(onExceptionDefinition.getId()); if (errorHandler instanceof Service) { services.add((Service) errorHandler); } @@ -100,7 +101,7 @@ public class RouteService extends BaseRouteService { } else if (output instanceof OnCompletionDefinition) { OnCompletionDefinition onCompletionDefinition = (OnCompletionDefinition) output; if (onCompletionDefinition.isRouteScoped()) { - Processor onCompletionProcessor = onCompletionDefinition.getOnCompletion(getId()); + Processor onCompletionProcessor = getRouteContext().getOnCompletion(onCompletionDefinition.getId()); if (onCompletionProcessor instanceof Service) { services.add((Service) onCompletionProcessor); } diff --git a/core/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java index 0c6b959..b7b43f0 100644 --- a/core/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java +++ b/core/camel-core/src/main/java/org/apache/camel/model/OnCompletionDefinition.java @@ -17,11 +17,8 @@ package org.apache.camel.model; import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.concurrent.ExecutorService; import javax.xml.bind.annotation.XmlAccessType; @@ -33,7 +30,6 @@ import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import org.apache.camel.Predicate; -import org.apache.camel.Processor; import org.apache.camel.spi.AsPredicate; import org.apache.camel.spi.Metadata; @@ -64,9 +60,6 @@ public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefi private ExecutorService executorService; @XmlTransient private Boolean routeScoped; - // TODO: in Camel 3.0 the OnCompletionDefinition should not contain state and OnCompletion processors - @XmlTransient - private final Map<String, Processor> onCompletions = new HashMap<>(); public OnCompletionDefinition() { } @@ -80,18 +73,6 @@ public class OnCompletionDefinition extends ProcessorDefinition<OnCompletionDefi return routeScoped; } - public Processor getOnCompletion(String routeId) { - return onCompletions.get(routeId); - } - - public Collection<Processor> getOnCompletions() { - return onCompletions.values(); - } - - public void setOnCompletion(String routeId, Processor processor) { - onCompletions.put(routeId, processor); - } - @Override public String toString() { return "onCompletion[" + getOutputs() + "]"; diff --git a/core/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java b/core/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java index c8c32cf..87bb2eb 100644 --- a/core/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java +++ b/core/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java @@ -17,10 +17,7 @@ package org.apache.camel.model; import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; import javax.xml.bind.annotation.XmlAccessType; @@ -83,9 +80,6 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini private Processor onExceptionOccurred; @XmlTransient private Boolean routeScoped; - // TODO: in Camel 3.0 the OnExceptionDefinition should not contain state and ErrorHandler processors - @XmlTransient - private final Map<String, Processor> errorHandlers = new HashMap<>(); public OnExceptionDefinition() { } @@ -733,18 +727,6 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini this.exceptions = exceptions; } - public Processor getErrorHandler(String routeId) { - return errorHandlers.get(routeId); - } - - public Collection<Processor> getErrorHandlers() { - return errorHandlers.values(); - } - - public void setErrorHandler(String routeId, Processor errorHandler) { - errorHandlers.put(routeId, errorHandler); - } - public RedeliveryPolicyDefinition getRedeliveryPolicyType() { return redeliveryPolicyType; } diff --git a/core/camel-core/src/main/java/org/apache/camel/processor/errorhandler/ErrorHandlerSupport.java b/core/camel-core/src/main/java/org/apache/camel/processor/errorhandler/ErrorHandlerSupport.java index b164240..dfa1ebc 100644 --- a/core/camel-core/src/main/java/org/apache/camel/processor/errorhandler/ErrorHandlerSupport.java +++ b/core/camel-core/src/main/java/org/apache/camel/processor/errorhandler/ErrorHandlerSupport.java @@ -46,7 +46,7 @@ public abstract class ErrorHandlerSupport extends ChildServiceSupport implements public void addExceptionPolicy(RouteContext routeContext, OnExceptionDefinition exceptionType) { if (routeContext != null) { // add error handler as child service so they get lifecycle handled - Processor errorHandler = exceptionType.getErrorHandler(routeContext.getRouteId()); + Processor errorHandler = routeContext.getOnException(exceptionType.getId()); if (errorHandler != null) { addChildService(errorHandler); } diff --git a/core/camel-core/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java b/core/camel-core/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java index f65cb63..754c990 100644 --- a/core/camel-core/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java +++ b/core/camel-core/src/main/java/org/apache/camel/processor/errorhandler/RedeliveryErrorHandler.java @@ -676,13 +676,11 @@ public abstract class RedeliveryErrorHandler extends ErrorHandlerSupport impleme Processor processor = null; UnitOfWork uow = exchange.getUnitOfWork(); if (uow != null && uow.getRouteContext() != null) { - String routeId = uow.getRouteContext().getRouteId(); - processor = exceptionPolicy.getErrorHandler(routeId); - } else if (!exceptionPolicy.getErrorHandlers().isEmpty()) { + processor = uow.getRouteContext().getOnException(exceptionPolicy.getId()); + } else { // note this should really not happen, but we have this code as a fail safe // to be backwards compatible with the old behavior log.warn("Cannot determine current route from Exchange with id: {}, will fallback and use first error handler.", exchange.getExchangeId()); - processor = exceptionPolicy.getErrorHandlers().iterator().next(); } if (processor != null) { failureProcessor = processor; diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/OnCompletionReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/OnCompletionReifier.java index 6662037..5db1ece 100644 --- a/core/camel-core/src/main/java/org/apache/camel/reifier/OnCompletionReifier.java +++ b/core/camel-core/src/main/java/org/apache/camel/reifier/OnCompletionReifier.java @@ -60,15 +60,13 @@ class OnCompletionReifier extends ProcessorReifier<OnCompletionDefinition> { routeContext.setAllowUseOriginalMessage(true); } - String routeId = routeContext.getRouteId(); - Processor childProcessor = this.createChildProcessor(routeContext, true); // wrap the on completion route in a unit of work processor CamelInternalProcessor internal = new CamelInternalProcessor(childProcessor); internal.addAdvice(new CamelInternalProcessor.UnitOfWorkProcessorAdvice(routeContext)); - definition.setOnCompletion(routeId, internal); + routeContext.setOnCompletion(getId(definition, routeContext), internal); Predicate when = null; if (definition.getOnWhen() != null) { diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java index e958fb4..98d19f8 100644 --- a/core/camel-core/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java +++ b/core/camel-core/src/main/java/org/apache/camel/reifier/OnExceptionReifier.java @@ -24,7 +24,6 @@ import org.apache.camel.Processor; import org.apache.camel.builder.ErrorHandlerBuilder; import org.apache.camel.model.OnExceptionDefinition; import org.apache.camel.model.ProcessorDefinition; -import org.apache.camel.model.RouteDefinition; import org.apache.camel.processor.CatchProcessor; import org.apache.camel.processor.FatalFallbackErrorHandler; import org.apache.camel.spi.ClassResolver; @@ -68,8 +67,8 @@ class OnExceptionReifier extends ProcessorReifier<OnExceptionDefinition> { if (child != null) { // wrap in our special safe fallback error handler if OnException have child output Processor errorHandler = new FatalFallbackErrorHandler(child); - String id = routeContext.getRouteId(); - definition.setErrorHandler(id, errorHandler); + String id = getId(definition, routeContext); + routeContext.setOnException(id, errorHandler); } // lookup the error handler builder ErrorHandlerBuilder builder = (ErrorHandlerBuilder) routeContext.getErrorHandlerFactory(); diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/ProcessorReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/ProcessorReifier.java index 9d1b615..891ca43 100644 --- a/core/camel-core/src/main/java/org/apache/camel/reifier/ProcessorReifier.java +++ b/core/camel-core/src/main/java/org/apache/camel/reifier/ProcessorReifier.java @@ -55,6 +55,7 @@ import org.apache.camel.model.MulticastDefinition; import org.apache.camel.model.OnCompletionDefinition; import org.apache.camel.model.OnExceptionDefinition; import org.apache.camel.model.OnFallbackDefinition; +import org.apache.camel.model.OptionalIdentifiedDefinition; import org.apache.camel.model.OtherwiseDefinition; import org.apache.camel.model.PipelineDefinition; import org.apache.camel.model.PolicyDefinition; @@ -105,6 +106,7 @@ import org.apache.camel.processor.interceptor.HandleFault; import org.apache.camel.spi.IdAware; import org.apache.camel.spi.InterceptStrategy; import org.apache.camel.spi.LifecycleStrategy; +import org.apache.camel.spi.NodeIdFactory; import org.apache.camel.spi.RouteContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -450,7 +452,7 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> { // inject id if (processor instanceof IdAware) { - String id = output.idOrCreate(routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getNodeIdFactory()); + String id = getId(output, routeContext); ((IdAware) processor).setId(id); } @@ -541,7 +543,7 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> { // inject id if (processor instanceof IdAware) { - String id = definition.idOrCreate(routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getNodeIdFactory()); + String id = getId(definition, routeContext); ((IdAware) processor).setId(id); } @@ -568,5 +570,8 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> { // noop } - + protected String getId(OptionalIdentifiedDefinition<?> def, RouteContext routeContext) { + return def.idOrCreate(routeContext.getCamelContext() + .adapt(ExtendedCamelContext.class).getNodeIdFactory()); + } } diff --git a/core/camel-core/src/main/java/org/apache/camel/reifier/StepReifier.java b/core/camel-core/src/main/java/org/apache/camel/reifier/StepReifier.java index 71d8880..1cd333c 100644 --- a/core/camel-core/src/main/java/org/apache/camel/reifier/StepReifier.java +++ b/core/camel-core/src/main/java/org/apache/camel/reifier/StepReifier.java @@ -18,7 +18,6 @@ package org.apache.camel.reifier; import java.util.List; -import org.apache.camel.ExtendedCamelContext; import org.apache.camel.Processor; import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.model.StepDefinition; @@ -38,7 +37,7 @@ class StepReifier extends ProcessorReifier<StepDefinition> { @Override protected Processor createCompositeProcessor(RouteContext routeContext, List<Processor> list) throws Exception { - String stepId = definition.idOrCreate(routeContext.getCamelContext().adapt(ExtendedCamelContext.class).getNodeIdFactory()); + String stepId = getId(definition, routeContext); return StepProcessor.newInstance(routeContext.getCamelContext(), list, stepId); } }