This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch patch in repository https://gitbox.apache.org/repos/asf/camel.git
commit 2567e9aacb56bd57134c50ed009daabb82e5b6ef Author: Claus Ibsen <[email protected]> AuthorDate: Tue Apr 30 16:54:45 2019 +0200 [CAMEL-13468]Exception tag is missing when Camel Java DSL is converted into XML using dumpRouteAsXml() operation --- .../apache/camel/model/OnExceptionDefinition.java | 29 ++++---------- .../camel/processor/ErrorHandlerSupport.java | 42 ++++++++++++++------ .../management/ManagedRouteDumpRouteAsXmlTest.java | 3 ++ .../camel/processor/ErrorHandlerSupportTest.java | 45 ++++++++++++++-------- .../onexception/OnExceptionMisconfiguredTest.java | 8 ++-- 5 files changed, 73 insertions(+), 54 deletions(-) diff --git a/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java b/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java index db80e60..8f9bd92 100644 --- a/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java +++ b/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java @@ -21,6 +21,7 @@ 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; import javax.xml.bind.annotation.XmlAccessorType; @@ -81,8 +82,6 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini @XmlElementRef private List<ProcessorDefinition<?>> outputs = new ArrayList<>(); @XmlTransient - private List<Class<? extends Throwable>> exceptionClasses; - @XmlTransient private Predicate handledPolicy; @XmlTransient private Predicate continuedPolicy; @@ -104,12 +103,11 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini } public OnExceptionDefinition(List<Class<? extends Throwable>> exceptionClasses) { - this.exceptionClasses = exceptionClasses; + this.exceptions.addAll(exceptionClasses.stream().map(Class::getName).collect(Collectors.toList())); } public OnExceptionDefinition(Class<? extends Throwable> exceptionType) { - exceptionClasses = new ArrayList<>(); - exceptionClasses.add(exceptionType); + this.exceptions.add(exceptionType.getName()); } public void setRouteScoped(boolean routeScoped) { @@ -127,7 +125,7 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini } protected String description() { - return getExceptionClasses() + (onWhen != null ? " " + onWhen : ""); + return getExceptions() + (onWhen != null ? " " + onWhen : ""); } @Override @@ -193,11 +191,6 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini setOnRedeliveryFromRedeliveryRef(routeContext); setOnExceptionOccurredFromOnExceptionOccurredRef(routeContext); - // load exception classes - if (exceptions != null && !exceptions.isEmpty()) { - exceptionClasses = createExceptionClasses(routeContext.getCamelContext().getClassResolver()); - } - // must validate configuration before creating processor validateConfiguration(); @@ -223,6 +216,7 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini @Override public CatchProcessor createProcessor(RouteContext routeContext) throws Exception { // load exception classes + List<Class<? extends Throwable>> exceptionClasses = null; if (exceptions != null && !exceptions.isEmpty()) { exceptionClasses = createExceptionClasses(routeContext.getCamelContext().getClassResolver()); } @@ -247,7 +241,7 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini handle = handled.createPredicate(routeContext); } - return new CatchProcessor(getExceptionClasses(), childProcessor, when, handle); + return new CatchProcessor(exceptionClasses, childProcessor, when, handle); } protected void validateConfiguration() { @@ -255,7 +249,6 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini throw new IllegalArgumentException(this + " cannot have the inheritErrorHandler option set to true"); } - List<Class<? extends Throwable>> exceptions = getExceptionClasses(); if (exceptions == null || exceptions.isEmpty()) { throw new IllegalArgumentException("At least one exception must be configured on " + this); } @@ -287,7 +280,7 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini @Override public OnExceptionDefinition onException(Class<? extends Throwable> exceptionType) { - getExceptionClasses().add(exceptionType); + getExceptions().add(exceptionType.getName()); return this; } @@ -868,14 +861,6 @@ public class OnExceptionDefinition extends ProcessorDefinition<OnExceptionDefini return true; } - public List<Class<? extends Throwable>> getExceptionClasses() { - return exceptionClasses; - } - - public void setExceptionClasses(List<Class<? extends Throwable>> exceptionClasses) { - this.exceptionClasses = exceptionClasses; - } - public List<String> getExceptions() { return exceptions; } diff --git a/camel-core/src/main/java/org/apache/camel/processor/ErrorHandlerSupport.java b/camel-core/src/main/java/org/apache/camel/processor/ErrorHandlerSupport.java index 90ba3c1..27bfe3f 100644 --- a/camel-core/src/main/java/org/apache/camel/processor/ErrorHandlerSupport.java +++ b/camel-core/src/main/java/org/apache/camel/processor/ErrorHandlerSupport.java @@ -16,18 +16,21 @@ */ package org.apache.camel.processor; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.camel.Exchange; import org.apache.camel.Processor; +import org.apache.camel.RuntimeCamelException; import org.apache.camel.model.OnExceptionDefinition; import org.apache.camel.model.ProcessorDefinitionHelper; import org.apache.camel.model.RouteDefinition; import org.apache.camel.processor.exceptionpolicy.DefaultExceptionPolicyStrategy; import org.apache.camel.processor.exceptionpolicy.ExceptionPolicyKey; import org.apache.camel.processor.exceptionpolicy.ExceptionPolicyStrategy; +import org.apache.camel.spi.ClassResolver; import org.apache.camel.spi.RouteContext; import org.apache.camel.support.ChildServiceSupport; import org.slf4j.Logger; @@ -52,23 +55,40 @@ public abstract class ErrorHandlerSupport extends ChildServiceSupport implements if (errorHandler != null) { addChildService(errorHandler); } - } - List<Class<? extends Throwable>> list = exceptionType.getExceptionClasses(); - for (Class<? extends Throwable> clazz : list) { - String routeId = null; - // only get the route id, if the exception type is route scoped - if (exceptionType.isRouteScoped()) { - RouteDefinition route = ProcessorDefinitionHelper.getRoute(exceptionType); - if (route != null) { - routeId = route.getId(); + List<Class<? extends Throwable>> list = null; + if (exceptionType.getExceptions() != null && !exceptionType.getExceptions().isEmpty()) { + list = createExceptionClasses(exceptionType, routeContext.getCamelContext().getClassResolver()); + for (Class<? extends Throwable> clazz : list) { + String routeId = null; + // only get the route id, if the exception type is route scoped + if (exceptionType.isRouteScoped()) { + RouteDefinition route = ProcessorDefinitionHelper.getRoute(exceptionType); + if (route != null) { + routeId = route.getId(); + } + } + ExceptionPolicyKey key = new ExceptionPolicyKey(routeId, clazz, exceptionType.getOnWhen()); + exceptionPolicies.put(key, exceptionType); } } - ExceptionPolicyKey key = new ExceptionPolicyKey(routeId, clazz, exceptionType.getOnWhen()); - exceptionPolicies.put(key, exceptionType); } } + protected List<Class<? extends Throwable>> createExceptionClasses(OnExceptionDefinition exceptionType, ClassResolver resolver) { + List<String> list = exceptionType.getExceptions(); + List<Class<? extends Throwable>> answer = new ArrayList<>(list.size()); + for (String name : list) { + try { + Class<? extends Throwable> type = resolver.resolveMandatoryClass(name, Throwable.class); + answer.add(type); + } catch (ClassNotFoundException e) { + throw new RuntimeCamelException(e); + } + } + return answer; + } + /** * Attempts to find the best suited {@link OnExceptionDefinition} to be used for handling the given thrown exception. * diff --git a/camel-core/src/test/java/org/apache/camel/management/ManagedRouteDumpRouteAsXmlTest.java b/camel-core/src/test/java/org/apache/camel/management/ManagedRouteDumpRouteAsXmlTest.java index 1d83150..79fdb0c 100644 --- a/camel-core/src/test/java/org/apache/camel/management/ManagedRouteDumpRouteAsXmlTest.java +++ b/camel-core/src/test/java/org/apache/camel/management/ManagedRouteDumpRouteAsXmlTest.java @@ -58,6 +58,7 @@ public class ManagedRouteDumpRouteAsXmlTest extends ManagementTestSupport { assertTrue(xml.contains("route")); assertTrue(xml.contains("myRoute")); assertTrue(xml.contains("mock:result")); + assertTrue(xml.contains("java.lang.Exception")); } @Test @@ -91,6 +92,8 @@ public class ManagedRouteDumpRouteAsXmlTest extends ManagementTestSupport { return new RouteBuilder() { @Override public void configure() throws Exception { + onException(Exception.class).log("${exception.stacktrace}").logStackTrace(true).handled(true); + from("direct:start").routeId("myRoute") .log("Got ${body}") .to("mock:result"); diff --git a/camel-core/src/test/java/org/apache/camel/processor/ErrorHandlerSupportTest.java b/camel-core/src/test/java/org/apache/camel/processor/ErrorHandlerSupportTest.java index 5f79c84..3bf708f 100644 --- a/camel-core/src/test/java/org/apache/camel/processor/ErrorHandlerSupportTest.java +++ b/camel-core/src/test/java/org/apache/camel/processor/ErrorHandlerSupportTest.java @@ -19,13 +19,15 @@ package org.apache.camel.processor; import java.util.ArrayList; import java.util.List; +import org.apache.camel.ContextTestSupport; import org.apache.camel.Exchange; import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; import org.apache.camel.model.OnExceptionDefinition; import org.junit.Assert; import org.junit.Test; -public class ErrorHandlerSupportTest extends Assert { +public class ErrorHandlerSupportTest extends ContextTestSupport { @Test public void testOnePolicyChildFirst() { @@ -34,10 +36,10 @@ public class ErrorHandlerSupportTest extends Assert { exceptions.add(ParentException.class); ErrorHandlerSupport support = new ShuntErrorHandlerSupport(); - support.addExceptionPolicy(null, new OnExceptionDefinition(exceptions)); + support.addExceptionPolicy(context.getRoute("foo").getRouteContext(), new OnExceptionDefinition(exceptions)); - assertEquals(ChildException.class, getExceptionPolicyFor(support, new ChildException(), 0)); - assertEquals(ParentException.class, getExceptionPolicyFor(support, new ParentException(), 1)); + assertEquals(ChildException.class.getName(), getExceptionPolicyFor(support, new ChildException(), 0)); + assertEquals(ParentException.class.getName(), getExceptionPolicyFor(support, new ParentException(), 1)); } @Test @@ -47,35 +49,35 @@ public class ErrorHandlerSupportTest extends Assert { exceptions.add(ChildException.class); ErrorHandlerSupport support = new ShuntErrorHandlerSupport(); - support.addExceptionPolicy(null, new OnExceptionDefinition(exceptions)); + support.addExceptionPolicy(context.getRoute("foo").getRouteContext(), new OnExceptionDefinition(exceptions)); - assertEquals(ChildException.class, getExceptionPolicyFor(support, new ChildException(), 1)); - assertEquals(ParentException.class, getExceptionPolicyFor(support, new ParentException(), 0)); + assertEquals(ChildException.class.getName(), getExceptionPolicyFor(support, new ChildException(), 1)); + assertEquals(ParentException.class.getName(), getExceptionPolicyFor(support, new ParentException(), 0)); } @Test public void testTwoPolicyChildFirst() { ErrorHandlerSupport support = new ShuntErrorHandlerSupport(); - support.addExceptionPolicy(null, new OnExceptionDefinition(ChildException.class)); - support.addExceptionPolicy(null, new OnExceptionDefinition(ParentException.class)); + support.addExceptionPolicy(context.getRoute("foo").getRouteContext(), new OnExceptionDefinition(ChildException.class)); + support.addExceptionPolicy(context.getRoute("foo").getRouteContext(), new OnExceptionDefinition(ParentException.class)); - assertEquals(ChildException.class, getExceptionPolicyFor(support, new ChildException(), 0)); - assertEquals(ParentException.class, getExceptionPolicyFor(support, new ParentException(), 0)); + assertEquals(ChildException.class.getName(), getExceptionPolicyFor(support, new ChildException(), 0)); + assertEquals(ParentException.class.getName(), getExceptionPolicyFor(support, new ParentException(), 0)); } @Test public void testTwoPolicyChildLast() { ErrorHandlerSupport support = new ShuntErrorHandlerSupport(); - support.addExceptionPolicy(null, new OnExceptionDefinition(ParentException.class)); - support.addExceptionPolicy(null, new OnExceptionDefinition(ChildException.class)); + support.addExceptionPolicy(context.getRoute("foo").getRouteContext(), new OnExceptionDefinition(ParentException.class)); + support.addExceptionPolicy(context.getRoute("foo").getRouteContext(), new OnExceptionDefinition(ChildException.class)); - assertEquals(ChildException.class, getExceptionPolicyFor(support, new ChildException(), 0)); - assertEquals(ParentException.class, getExceptionPolicyFor(support, new ParentException(), 0)); + assertEquals(ChildException.class.getName(), getExceptionPolicyFor(support, new ChildException(), 0)); + assertEquals(ParentException.class.getName(), getExceptionPolicyFor(support, new ParentException(), 0)); } - private static Class<? extends Throwable> getExceptionPolicyFor(ErrorHandlerSupport support, Throwable childException, + private static String getExceptionPolicyFor(ErrorHandlerSupport support, Throwable childException, int index) { - return support.getExceptionPolicy(null, childException).getExceptionClasses().get(index); + return support.getExceptionPolicy(null, childException).getExceptions().get(index); } private static class ParentException extends Exception { @@ -106,4 +108,13 @@ public class ErrorHandlerSupportTest extends Assert { } } + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:foo").to("mock:foo").routeId("foo"); + } + }; + } } diff --git a/camel-core/src/test/java/org/apache/camel/processor/onexception/OnExceptionMisconfiguredTest.java b/camel-core/src/test/java/org/apache/camel/processor/onexception/OnExceptionMisconfiguredTest.java index 1db9f40..44f21a2 100644 --- a/camel-core/src/test/java/org/apache/camel/processor/onexception/OnExceptionMisconfiguredTest.java +++ b/camel-core/src/test/java/org/apache/camel/processor/onexception/OnExceptionMisconfiguredTest.java @@ -50,7 +50,7 @@ public class OnExceptionMisconfiguredTest extends ContextTestSupport { fail("Should have thrown exception"); } catch (FailedToCreateRouteException e) { IllegalArgumentException iae = assertIsInstanceOf(IllegalArgumentException.class, e.getCause()); - assertEquals("OnException[[class java.lang.Exception] -> []] is not configured.", iae.getMessage()); + assertEquals("OnException[[java.lang.Exception] -> []] is not configured.", iae.getMessage()); } } @@ -69,7 +69,7 @@ public class OnExceptionMisconfiguredTest extends ContextTestSupport { fail("Should have thrown exception"); } catch (FailedToCreateRouteException e) { IllegalArgumentException iae = assertIsInstanceOf(IllegalArgumentException.class, e.getCause()); - assertEquals("OnException[[class java.lang.Exception] -> []] is not configured.", iae.getMessage()); + assertEquals("OnException[[java.lang.Exception] -> []] is not configured.", iae.getMessage()); } } @@ -89,7 +89,7 @@ public class OnExceptionMisconfiguredTest extends ContextTestSupport { fail("Should have thrown exception"); } catch (FailedToCreateRouteException e) { IllegalArgumentException iae = assertIsInstanceOf(IllegalArgumentException.class, e.getCause()); - assertEquals("OnException[[class java.lang.Exception] -> []] is not configured.", iae.getMessage()); + assertEquals("OnException[[java.lang.Exception] -> []] is not configured.", iae.getMessage()); } } @@ -109,7 +109,7 @@ public class OnExceptionMisconfiguredTest extends ContextTestSupport { fail("Should have thrown exception"); } catch (FailedToCreateRouteException e) { IllegalArgumentException iae = assertIsInstanceOf(IllegalArgumentException.class, e.getCause()); - assertEquals("OnException[[class java.lang.Exception] -> []] is not configured.", iae.getMessage()); + assertEquals("OnException[[java.lang.Exception] -> []] is not configured.", iae.getMessage()); } }
