Author: davsclaus Date: Tue Jun 14 08:40:33 2011 New Revision: 1135407 URL: http://svn.apache.org/viewvc?rev=1135407&view=rev Log: CAMEL-4103: doCatch has failure endpoint information as well, just like onException / errorHandler would have. To make it consistent.
Added: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TryCatchCaughtExceptionTest.java camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TryFinallyCaughtExceptionTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/TryProcessor.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/processor/TryProcessor.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/TryProcessor.java?rev=1135407&r1=1135406&r2=1135407&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/processor/TryProcessor.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/processor/TryProcessor.java Tue Jun 14 08:40:33 2011 @@ -280,6 +280,8 @@ public class TryProcessor extends Servic // clear exception so finally block can be executed final Exception e = exchange.getException(); exchange.setException(null); + // store the last to endpoint as the failure endpoint + exchange.setProperty(Exchange.FAILURE_ENDPOINT, exchange.getProperty(Exchange.TO_ENDPOINT)); boolean sync = super.processNext(exchange, new AsyncCallback() { public void done(boolean doneSync) { @@ -341,6 +343,8 @@ public class TryProcessor extends Servic return true; } + // store the last to endpoint as the failure endpoint + exchange.setProperty(Exchange.FAILURE_ENDPOINT, exchange.getProperty(Exchange.TO_ENDPOINT)); // give the rest of the pipeline another chance exchange.setProperty(Exchange.EXCEPTION_CAUGHT, caught); exchange.setException(null); Added: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TryCatchCaughtExceptionTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TryCatchCaughtExceptionTest.java?rev=1135407&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TryCatchCaughtExceptionTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TryCatchCaughtExceptionTest.java Tue Jun 14 08:40:33 2011 @@ -0,0 +1,76 @@ +/** + * 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.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.impl.JndiRegistry; + +/** + * + */ +public class TryCatchCaughtExceptionTest extends ContextTestSupport { + + public void testTryCatchCaughtException() throws Exception { + getMockEndpoint("mock:a").expectedMessageCount(1); + getMockEndpoint("mock:result").expectedMessageCount(1); + + MockEndpoint error = getMockEndpoint("mock:b"); + error.expectedMessageCount(1); + + template.sendBody("direct:start", "Hello World"); + + assertMockEndpointsSatisfied(); + + Exception e = error.getReceivedExchanges().get(0).getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class); + assertNotNull(e); + assertEquals("Forced", e.getMessage()); + + String to = error.getReceivedExchanges().get(0).getProperty(Exchange.FAILURE_ENDPOINT, String.class); + assertEquals("bean://myBean?method=doSomething", to); + } + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("myBean", this); + return jndi; + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .doTry() + .to("mock:a") + .to("bean:myBean?method=doSomething") + .doCatch(Exception.class) + .to("mock:b") + .end() + .to("mock:result"); + } + }; + } + + public void doSomething(String body) throws Exception { + throw new IllegalArgumentException("Forced"); + } +} Added: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TryFinallyCaughtExceptionTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TryFinallyCaughtExceptionTest.java?rev=1135407&view=auto ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TryFinallyCaughtExceptionTest.java (added) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TryFinallyCaughtExceptionTest.java Tue Jun 14 08:40:33 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.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.impl.JndiRegistry; + +/** + * + */ +public class TryFinallyCaughtExceptionTest extends ContextTestSupport { + + public void testTryFinallyCaughtException() throws Exception { + getMockEndpoint("mock:a").expectedMessageCount(1); + getMockEndpoint("mock:result").expectedMessageCount(0); + + MockEndpoint error = getMockEndpoint("mock:b"); + error.expectedMessageCount(1); + + try { + template.sendBody("direct:start", "Hello World"); + fail("Should have thrown an exception"); + } catch (Exception e) { + // expected + } + + assertMockEndpointsSatisfied(); + + Exception e = error.getReceivedExchanges().get(0).getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class); + assertNotNull(e); + assertEquals("Forced", e.getMessage()); + + String to = error.getReceivedExchanges().get(0).getProperty(Exchange.FAILURE_ENDPOINT, String.class); + assertEquals("bean://myBean?method=doSomething", to); + } + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("myBean", this); + return jndi; + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:start") + .doTry() + .to("mock:a") + .to("bean:myBean?method=doSomething") + .doFinally() + .to("mock:b") + .end() + .to("mock:result"); + } + }; + } + + public void doSomething(String body) throws Exception { + throw new IllegalArgumentException("Forced"); + } +}