Return-Path: Delivered-To: apmail-activemq-camel-commits-archive@locus.apache.org Received: (qmail 16800 invoked from network); 11 Oct 2008 16:35:42 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 11 Oct 2008 16:35:42 -0000 Received: (qmail 61721 invoked by uid 500); 11 Oct 2008 16:35:42 -0000 Delivered-To: apmail-activemq-camel-commits-archive@activemq.apache.org Received: (qmail 61700 invoked by uid 500); 11 Oct 2008 16:35:41 -0000 Mailing-List: contact camel-commits-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: camel-dev@activemq.apache.org Delivered-To: mailing list camel-commits@activemq.apache.org Received: (qmail 61691 invoked by uid 99); 11 Oct 2008 16:35:41 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 11 Oct 2008 09:35:41 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 11 Oct 2008 16:34:44 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 1D3B623888EB; Sat, 11 Oct 2008 09:34:51 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r703680 - in /activemq/camel/trunk/camel-core/src: main/java/org/apache/camel/builder/ main/java/org/apache/camel/model/ main/java/org/apache/camel/processor/ test/java/org/apache/camel/processor/ test/resources/ Date: Sat, 11 Oct 2008 16:34:50 -0000 To: camel-commits@activemq.apache.org From: davsclaus@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20081011163451.1D3B623888EB@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: davsclaus Date: Sat Oct 11 09:34:49 2008 New Revision: 703680 URL: http://svn.apache.org/viewvc?rev=703680&view=rev Log: CAMEL-976: Added example for new handled policy for ExceptionType. Polished code. Added handled(Expression) DSL. Added OFF logging level. Added: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelHandledExampleTest.java Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExceptionType.java activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DeadLetterChannel.java activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Logger.java activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/LoggingLevel.java activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRedeliveryTest.java activemq/camel/trunk/camel-core/src/test/resources/log4j.properties Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java?rev=703680&r1=703679&r2=703680&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java Sat Oct 11 09:34:49 2008 @@ -147,7 +147,7 @@ /** * Sets the exception policy to use */ - public ErrorHandlerBuilderSupport exceptionPolicyStrategy(ExceptionPolicyStrategy exceptionPolicyStrategy) { + public DeadLetterChannelBuilder exceptionPolicyStrategy(ExceptionPolicyStrategy exceptionPolicyStrategy) { setExceptionPolicyStrategy(exceptionPolicyStrategy); return this; } Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExceptionType.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExceptionType.java?rev=703680&r1=703679&r2=703680&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExceptionType.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/ExceptionType.java Sat Oct 11 09:34:49 2008 @@ -27,10 +27,12 @@ import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; +import org.apache.camel.Expression; import org.apache.camel.Predicate; import org.apache.camel.Processor; import org.apache.camel.Route; import org.apache.camel.builder.ErrorHandlerBuilder; +import static org.apache.camel.builder.PredicateBuilder.toPredicate; import org.apache.camel.language.constant.ConstantLanguage; import org.apache.camel.processor.CatchProcessor; import org.apache.camel.processor.RedeliveryPolicy; @@ -119,16 +121,21 @@ // Fluent API //------------------------------------------------------------------------- - public ExceptionType handled(boolean cond) { + public ExceptionType handled(boolean handled) { ConstantLanguage constant = new ConstantLanguage(); - return handled(constant.createPredicate(Boolean.toString(cond))); + return handled(constant.createPredicate(Boolean.toString(handled))); } - public ExceptionType handled(Predicate cond) { - setHandledPolicy(cond); + public ExceptionType handled(Predicate handled) { + setHandledPolicy(handled); return this; } + public ExceptionType handled(Expression handled) { + setHandledPolicy(toPredicate(handled)); + return this; + } + public ExceptionType backOffMultiplier(double backOffMultiplier) { getOrCreateRedeliveryPolicy().backOffMultiplier(backOffMultiplier); return this; Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DeadLetterChannel.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DeadLetterChannel.java?rev=703680&r1=703679&r2=703680&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DeadLetterChannel.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/DeadLetterChannel.java Sat Oct 11 09:34:49 2008 @@ -45,7 +45,6 @@ public static final String REDELIVERED = "org.apache.camel.Redelivered"; public static final String EXCEPTION_CAUSE_PROPERTY = "CamelCauseException"; - private static final transient Log LOG = LogFactory.getLog(DeadLetterChannel.class); private static final String FAILURE_HANDLED_PROPERTY = DeadLetterChannel.class.getName() + ".FAILURE_HANDLED"; private Processor output; @@ -208,9 +207,15 @@ protected static void restoreExceptionOnExchange(Exchange exchange, Predicate handledPredicate) { if (handledPredicate == null || !handledPredicate.matches(exchange)) { + if (LOG.isDebugEnabled()) { + LOG.debug("This exchange is not handled so its marked as failed: " + exchange); + } // exception not handled, put exception back in the exchange exchange.setException(exchange.getProperty(FAILURE_HANDLED_PROPERTY, Throwable.class)); } else { + if (LOG.isDebugEnabled()) { + LOG.debug("This exchange is handled so its marked as not failed: " + exchange); + } exchange.setProperty(Exchange.EXCEPTION_HANDLED_PROPERTY, Boolean.TRUE); } } Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Logger.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Logger.java?rev=703680&r1=703679&r2=703680&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Logger.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/Logger.java Sat Oct 11 09:34:49 2008 @@ -208,6 +208,7 @@ log.warn(message, exception); } break; + case OFF: break; default: log.error("Unknown level: " + level + " when trying to log exchange: " + message, exception); } Modified: activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/LoggingLevel.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/LoggingLevel.java?rev=703680&r1=703679&r2=703680&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/LoggingLevel.java (original) +++ activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/LoggingLevel.java Sat Oct 11 09:34:49 2008 @@ -22,5 +22,5 @@ * @version $Revision$ */ public enum LoggingLevel { - DEBUG, ERROR, FATAL, INFO, TRACE, WARN + DEBUG, ERROR, FATAL, INFO, TRACE, WARN, OFF } Added: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelHandledExampleTest.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelHandledExampleTest.java?rev=703680&view=auto ============================================================================== --- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelHandledExampleTest.java (added) +++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelHandledExampleTest.java Sat Oct 11 09:34:49 2008 @@ -0,0 +1,145 @@ +/** + * 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 java.util.Map; + +import org.apache.camel.Body; +import org.apache.camel.ContextTestSupport; +import org.apache.camel.Headers; +import org.apache.camel.OutHeaders; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; + +/** + * Unit test to verify that handled policy is working as expected for wiki documentation. + */ +public class DeadLetterChannelHandledExampleTest extends ContextTestSupport { + + public void testOrderOK() throws Exception { + MockEndpoint result = getMockEndpoint("mock:result"); + result.expectedBodiesReceived("Order OK"); + result.expectedHeaderReceived("orderid", "123"); + + MockEndpoint error = getMockEndpoint("mock:error"); + error.expectedMessageCount(0); + + Object out = template.requestBodyAndHeader("direct:start", "Order: MacBook Pro", "customerid", "444"); + assertEquals("Order OK", out); + + assertMockEndpointsSatisfied(); + } + + public void testOrderERROR() throws Exception { + MockEndpoint error = getMockEndpoint("mock:error"); + error.expectedBodiesReceived("Order ERROR"); + error.expectedHeaderReceived("orderid", "failed"); + + MockEndpoint result = getMockEndpoint("mock:result"); + result.expectedMessageCount(0); + + Object out = template.requestBodyAndHeader("direct:start", "Order: kaboom", "customerid", "555"); + assertEquals("Order ERROR", out); + + assertMockEndpointsSatisfied(); + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + // START SNIPPET: e1 + // we do special error handling for when OrderFailedException is thrown + onException(OrderFailedException.class) + // we mark the exchange as handled so the caller doesn't receive the + // OrderFailedException but whatever we want to return instead + .handled(true) + // this bean handles the error handling where we can customize the error + // response using java code + .bean(OrderService.class, "orderFailed") + // and since this is an unit test we use mocks for testing + .to("mock:error"); + + // this is just the generic error handler where we set the destination + // and the number of redeliveries we want to try + errorHandler(deadLetterChannel("mock:error").maximumRedeliveries(1)); + + // this is our route where we handle orders + from("direct:start") + // this bean is our order service + .bean(OrderService.class, "handleOrder") + // this is the destination if the order is OK + .to("mock:result"); + // END SNIPPET: e1 + } + }; + } + + // START SNIPPET: e2 + /** + * Order service as a plain POJO class + */ + public static class OrderService { + + /** + * This method handle our order input and return the order + * + * @param in the in headers + * @param payload the in payload + * @param out the out headers + * @return the out payload + * @throws OrderFailedException is thrown if the order can not be processed + */ + public Object handleOrder(@Headers Map in, @Body String payload, @OutHeaders Map out) + throws OrderFailedException { + out.put("customerid", in.get("customerid")); + if ("Order: kaboom".equals(payload)) { + throw new OrderFailedException("Can not order: kaboom"); + } else { + out.put("orderid", "123"); + return "Order OK"; + } + } + + /** + * This method creates the response to the caller if the order could not be processed + * @param in the in headers + * @param payload the in payload + * @param out the out headers + * @return the out payload + */ + public Object orderFailed(@Headers Map in, @Body String payload, @OutHeaders Map out) { + out.put("customerid", in.get("customerid")); + out.put("orderid", "failed"); + return "Order ERROR"; + } + } + // END SNIPPET: e2 + + // START SNIPPET: e3 + /** + * Exception thrown if the order can not be processed + */ + public static class OrderFailedException extends Exception { + + public OrderFailedException(String message) { + super(message); + } + + } + // END SNIPPET: e3 + +} \ No newline at end of file Modified: activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRedeliveryTest.java URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRedeliveryTest.java?rev=703680&r1=703679&r2=703680&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRedeliveryTest.java (original) +++ activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelRedeliveryTest.java Sat Oct 11 09:34:49 2008 @@ -24,7 +24,7 @@ import org.apache.camel.component.mock.MockEndpoint; /** - * Unit test to verift that redelivery counters is working as expected. + * Unit test to verify that redelivery counters is working as expected. */ public class DeadLetterChannelRedeliveryTest extends ContextTestSupport { Modified: activemq/camel/trunk/camel-core/src/test/resources/log4j.properties URL: http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/resources/log4j.properties?rev=703680&r1=703679&r2=703680&view=diff ============================================================================== --- activemq/camel/trunk/camel-core/src/test/resources/log4j.properties (original) +++ activemq/camel/trunk/camel-core/src/test/resources/log4j.properties Sat Oct 11 09:34:49 2008 @@ -22,6 +22,7 @@ log4j.logger.org.apache.activemq.spring=WARN log4j.logger.org.apache.camel=DEBUG +log4j.logger.org.apache.camel.impl.converter=WARN # CONSOLE appender not used by default log4j.appender.stdout=org.apache.log4j.ConsoleAppender