Author: janstey
Date: Thu Oct 30 07:15:53 2008
New Revision: 709164

URL: http://svn.apache.org/viewvc?rev=709164&view=rev
Log:
CAMEL-1036 - Adding retriesExhaustedLogLevel and retryAttemptedLogLevel methods 
on onException.


Added:
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoggingLevel.java
   (with props)
    
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ExceptionBuilderWithRetryLoggingLevelSetTest.java
   (with props)
Removed:
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/LoggingLevel.java
Modified:
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
    
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/builder/LoggingErrorHandlerBuilder.java
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/LoggingExceptionHandler.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/model/RedeliveryPolicyType.java
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesType.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/LoggingErrorHandler.java
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/ThroughputLogger.java
    
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java
    
activemq/camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index
    
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelTest.java
    
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FaultRetryRouteTest.java
    
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FaultRouteTest.java
    
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TracerConfigurationTest.java

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/BuilderSupport.java
 Thu Oct 30 07:15:53 2008
@@ -23,7 +23,7 @@
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.NoSuchEndpointException;
-import org.apache.camel.processor.LoggingLevel;
+import org.apache.camel.model.LoggingLevel;
 import org.apache.camel.processor.SendProcessor;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.commons.logging.Log;

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=709164&r1=709163&r2=709164&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
 Thu Oct 30 07:15:53 2008
@@ -18,10 +18,10 @@
 
 import org.apache.camel.Expression;
 import org.apache.camel.Processor;
+import org.apache.camel.model.LoggingLevel;
 import org.apache.camel.processor.DeadLetterChannel;
 import org.apache.camel.processor.ErrorHandlerSupport;
 import org.apache.camel.processor.Logger;
-import org.apache.camel.processor.LoggingLevel;
 import org.apache.camel.processor.RecipientList;
 import org.apache.camel.processor.RedeliveryPolicy;
 import org.apache.camel.processor.exceptionpolicy.ExceptionPolicyStrategy;

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/LoggingErrorHandlerBuilder.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/LoggingErrorHandlerBuilder.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/LoggingErrorHandlerBuilder.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/LoggingErrorHandlerBuilder.java
 Thu Oct 30 07:15:53 2008
@@ -17,9 +17,9 @@
 package org.apache.camel.builder;
 
 import org.apache.camel.Processor;
+import org.apache.camel.model.LoggingLevel;
 import org.apache.camel.processor.Logger;
 import org.apache.camel.processor.LoggingErrorHandler;
-import org.apache.camel.processor.LoggingLevel;
 import org.apache.camel.spi.RouteContext;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
 Thu Oct 30 07:15:53 2008
@@ -134,7 +134,7 @@
      * Adds an exception handler route for the given exception type
      */
     public ExceptionType onException(Class exceptionType) {
-        return routeCollection.exception(exceptionType);
+        return routeCollection.onException(exceptionType);
     }
 
     /**

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/log/LogComponent.java
 Thu Oct 30 07:15:53 2008
@@ -23,8 +23,8 @@
 import org.apache.camel.converter.ObjectConverter;
 import org.apache.camel.impl.DefaultComponent;
 import org.apache.camel.impl.ProcessorEndpoint;
+import org.apache.camel.model.LoggingLevel;
 import org.apache.camel.processor.Logger;
-import org.apache.camel.processor.LoggingLevel;
 import org.apache.camel.processor.ThroughputLogger;
 import org.apache.camel.util.IntrospectionSupport;
 

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/LoggingExceptionHandler.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/LoggingExceptionHandler.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/LoggingExceptionHandler.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/impl/LoggingExceptionHandler.java
 Thu Oct 30 07:15:53 2008
@@ -16,8 +16,8 @@
  */
 package org.apache.camel.impl;
 
+import org.apache.camel.model.LoggingLevel;
 import org.apache.camel.processor.Logger;
-import org.apache.camel.processor.LoggingLevel;
 import org.apache.camel.spi.ExceptionHandler;
 import org.apache.commons.logging.LogFactory;
 

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=709164&r1=709163&r2=709164&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
 Thu Oct 30 07:15:53 2008
@@ -159,7 +159,17 @@
         
getOrCreateRedeliveryPolicy().initialRedeliveryDelay(initialRedeliveryDelay);
         return this;
     }
+    
+    public ExceptionType retriesExhaustedLogLevel(LoggingLevel 
retriesExhaustedLogLevel) {
+        
getOrCreateRedeliveryPolicy().retriesExhaustedLogLevel(retriesExhaustedLogLevel);
+        return this;
+    }
 
+    public ExceptionType retryAttemptedLogLevel(LoggingLevel 
retryAttemptedLogLevel) {
+        
getOrCreateRedeliveryPolicy().retryAttemptedLogLevel(retryAttemptedLogLevel);
+        return this;
+    }
+    
     public ExceptionType maximumRedeliveries(int maximumRedeliveries) {
         getOrCreateRedeliveryPolicy().maximumRedeliveries(maximumRedeliveries);
         return this;

Added: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoggingLevel.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoggingLevel.java?rev=709164&view=auto
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoggingLevel.java
 (added)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoggingLevel.java
 Thu Oct 30 07:15:53 2008
@@ -0,0 +1,29 @@
+/**
+ * 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.model;
+
+import javax.xml.bind.annotation.XmlEnum;
+
+/**
+ * Used to configure the logging levels
+ *
+ * @version $Revision: 703680 $
+ */
[EMAIL PROTECTED]
+public enum LoggingLevel {
+    DEBUG, ERROR, FATAL, INFO, TRACE, WARN, OFF
+}

Propchange: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/LoggingLevel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyType.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyType.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyType.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyType.java
 Thu Oct 30 07:15:53 2008
@@ -45,6 +45,10 @@
     private Boolean useCollisionAvoidance;
     @XmlAttribute
     private Long maximumRedeliveryDelay;
+    @XmlAttribute
+    private LoggingLevel retriesExhaustedLogLevel;
+    @XmlAttribute
+    private LoggingLevel retryAttemptedLogLevel;
 
     public RedeliveryPolicy createRedeliveryPolicy(RedeliveryPolicy 
parentPolicy) {
         RedeliveryPolicy answer =  parentPolicy.copy();
@@ -56,6 +60,12 @@
         if (initialRedeliveryDelay != null) {
             answer.setDelay(initialRedeliveryDelay);
         }
+        if (retriesExhaustedLogLevel != null) {
+            answer.setRetriesExhaustedLogLevel(retriesExhaustedLogLevel);
+        }
+        if (retryAttemptedLogLevel != null) {
+            answer.setRetryAttemptedLogLevel(retryAttemptedLogLevel);
+        }
         if (backOffMultiplier != null) {
             answer.setBackOffMultiplier(backOffMultiplier);
         }
@@ -100,6 +110,16 @@
         return this;
     }
 
+    public RedeliveryPolicyType retriesExhaustedLogLevel(LoggingLevel 
retriesExhaustedLogLevel) {
+        setRetriesExhaustedLogLevel(retriesExhaustedLogLevel);
+        return this;
+    }    
+    
+    public RedeliveryPolicyType retryAttemptedLogLevel(LoggingLevel 
retryAttemptedLogLevel) {
+        setRetryAttemptedLogLevel(retryAttemptedLogLevel);
+        return this;
+    }
+        
     public RedeliveryPolicyType maximumRedeliveries(int maximumRedeliveries) {
         setMaximumRedeliveries(maximumRedeliveries);
         return this;
@@ -178,4 +198,21 @@
     public void setMaximumRedeliveryDelay(Long maximumRedeliveryDelay) {
         this.maximumRedeliveryDelay = maximumRedeliveryDelay;
     }
+
+    private void setRetriesExhaustedLogLevel(LoggingLevel 
retriesExhaustedLogLevel) {
+        this.retriesExhaustedLogLevel = retriesExhaustedLogLevel;
+    }
+
+    private LoggingLevel getRetriesExhaustedLogLevel() {
+        return retriesExhaustedLogLevel;
+    } 
+
+    private void setRetryAttemptedLogLevel(LoggingLevel 
retryAttemptedLogLevel) {
+        this.retryAttemptedLogLevel = retryAttemptedLogLevel;
+    }
+
+    private LoggingLevel getRetryAttemptedLogLevel() {
+        return retryAttemptedLogLevel;
+    }     
+   
 }

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesType.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesType.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesType.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RoutesType.java
 Thu Oct 30 07:15:53 2008
@@ -192,7 +192,7 @@
         return answer.when(predicate);
     }
 
-    public ExceptionType exception(Class exceptionType) {
+    public ExceptionType onException(Class exceptionType) {
         ExceptionType answer = new ExceptionType(exceptionType);
         getExceptions().add(answer);
         return answer;

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=709164&r1=709163&r2=709164&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
 Thu Oct 30 07:15:53 2008
@@ -26,6 +26,7 @@
 import org.apache.camel.Processor;
 import org.apache.camel.impl.converter.AsyncProcessorTypeConverter;
 import org.apache.camel.model.ExceptionType;
+import org.apache.camel.model.LoggingLevel;
 import org.apache.camel.processor.exceptionpolicy.ExceptionPolicyStrategy;
 import org.apache.camel.util.AsyncProcessorHelper;
 import org.apache.camel.util.ServiceHelper;
@@ -120,9 +121,6 @@
                 // set the original caused exception
                 exchange.setProperty(EXCEPTION_CAUSE_PROPERTY, e);
 
-                logger.log("Failed delivery for exchangeId: " + 
exchange.getExchangeId() + ". On delivery attempt: " + data.redeliveryCounter + 
" caught: " + e, e);
-                data.redeliveryCounter = incrementRedeliveryCounter(exchange, 
e);
-
                 // find the error handler to use (if any)
                 ExceptionType exceptionPolicy = getExceptionPolicy(exchange, 
e);
                 if (exceptionPolicy != null) {
@@ -131,8 +129,11 @@
                     Processor processor = exceptionPolicy.getErrorHandler();
                     if (processor != null) {
                         data.failureProcessor = processor;
-                    }
+                    }                    
                 }
+                
+                logFailedDelivery("Failed delivery for exchangeId: " + 
exchange.getExchangeId() + ". On delivery attempt: " + data.redeliveryCounter + 
" caught: " + e, data, e);
+                data.redeliveryCounter = incrementRedeliveryCounter(exchange, 
e);
             }
 
             // should we redeliver or not?
@@ -153,7 +154,7 @@
 
                 // The line below shouldn't be needed, it is invoked by the 
AsyncCallback above
                 //restoreExceptionOnExchange(exchange, data.handledPredicate);
-                logger.log("Failed delivery for exchangeId: " + 
exchange.getExchangeId() + ". Handled by the failure processor: " + 
data.failureProcessor);
+                logFailedDelivery("Failed delivery for exchangeId: " + 
exchange.getExchangeId() + ". Handled by the failure processor: " + 
data.failureProcessor, data, null);
                 return sync;
             }
 
@@ -199,6 +200,20 @@
 
     }
 
+    private void logFailedDelivery(String message, RedeliveryData data, 
Throwable e) {
+        LoggingLevel newLogLevel = null;
+        if 
(data.currentRedeliveryPolicy.shouldRedeliver(data.redeliveryCounter)) {
+            newLogLevel = 
data.currentRedeliveryPolicy.getRetryAttemptedLogLevel();
+        } else {
+            newLogLevel = 
data.currentRedeliveryPolicy.getRetriesExhaustedLogLevel();
+        }
+        if (e != null) {
+            logger.log(message, e, newLogLevel);
+        } else {
+            logger.log(message, newLogLevel);
+        }
+    }
+
     public static boolean isFailureHandled(Exchange exchange) {
         return exchange.getProperty(FAILURE_HANDLED_PROPERTY) != null;
     }

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=709164&r1=709163&r2=709164&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
 Thu Oct 30 07:15:53 2008
@@ -19,6 +19,7 @@
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.impl.DefaultExchangeFormatter;
+import org.apache.camel.model.LoggingLevel;
 import org.apache.camel.processor.interceptor.ExchangeFormatter;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -139,6 +140,13 @@
         }
     }
 
+    public void log(String message, LoggingLevel loggingLevel) {
+        LoggingLevel oldLogLevel = getLevel();
+        setLevel(loggingLevel);
+        log(message);
+        setLevel(oldLogLevel);
+    }
+    
     public void log(String message) {
         switch (level) {
         case DEBUG:
@@ -176,6 +184,13 @@
         }
     }
 
+    public void log(String message, Throwable exception, LoggingLevel 
loggingLevel) {
+        LoggingLevel oldLogLevel = getLevel();
+        setLevel(loggingLevel);
+        log(message, exception);
+        setLevel(oldLogLevel);
+    }   
+    
     public void log(String message, Throwable exception) {
         switch (level) {
         case DEBUG:

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/LoggingErrorHandler.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/LoggingErrorHandler.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/LoggingErrorHandler.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/LoggingErrorHandler.java
 Thu Oct 30 07:15:53 2008
@@ -18,6 +18,7 @@
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
+import org.apache.camel.model.LoggingLevel;
 import org.apache.camel.util.ServiceHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryPolicy.java
 Thu Oct 30 07:15:53 2008
@@ -19,6 +19,7 @@
 import java.io.Serializable;
 import java.util.Random;
 
+import org.apache.camel.model.LoggingLevel;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -57,6 +58,8 @@
     // +/-15% for a 30% spread -cgs
     protected double collisionAvoidanceFactor = 0.15d;
     protected boolean useCollisionAvoidance;
+    protected LoggingLevel retriesExhaustedLogLevel = LoggingLevel.ERROR;
+    protected LoggingLevel retryAttemptedLogLevel = LoggingLevel.ERROR;
 
     public RedeliveryPolicy() {
     }
@@ -66,6 +69,8 @@
         return "RedeliveryPolicy[maximumRedeliveries=" + maximumRedeliveries
             + ", initialRedeliveryDelay=" + delay
             + ", maximumRedeliveryDelay=" + maximumRedeliveryDelay
+            + ", retriesExhaustedLogLevel=" + retriesExhaustedLogLevel
+            + ", retryAttemptedLogLevel=" + retryAttemptedLogLevel
             + ", useExponentialBackOff="  + useExponentialBackOff
             + ", backOffMultiplier=" + backOffMultiplier
             + ", useCollisionAvoidance=" + useCollisionAvoidance
@@ -88,7 +93,7 @@
         if (getMaximumRedeliveries() < 0) {
             return true;
         }
-        // redeliver until we hitted the max
+        // redeliver until we hit the max
         return redeliveryCounter <= getMaximumRedeliveries();
     }
 
@@ -213,6 +218,22 @@
         return this;
     }
 
+    /**
+     * Sets the logging level to use for log messages when retries have been 
exhausted.
+     */
+    public RedeliveryPolicy retriesExhaustedLogLevel(LoggingLevel 
retriesExhaustedLogLevel) {
+        setRetriesExhaustedLogLevel(retriesExhaustedLogLevel);
+        return this;
+    }    
+
+    /**
+     * Sets the logging level to use for log messages when retries are 
attempted.
+     */    
+    public RedeliveryPolicy retryAttemptedLogLevel(LoggingLevel 
retryAttemptedLogLevel) {
+        setRetryAttemptedLogLevel(retryAttemptedLogLevel);
+        return this;
+    }    
+    
     // Properties
     // 
-------------------------------------------------------------------------
     public double getBackOffMultiplier() {
@@ -321,4 +342,20 @@
         }
         return randomNumberGenerator;
     }
+
+    public void setRetriesExhaustedLogLevel(LoggingLevel 
retriesExhaustedLogLevel) {
+        this.retriesExhaustedLogLevel = retriesExhaustedLogLevel;        
+    }
+    
+    public LoggingLevel getRetriesExhaustedLogLevel() {
+        return retriesExhaustedLogLevel;
+    }
+
+    public void setRetryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) 
{
+        this.retryAttemptedLogLevel = retryAttemptedLogLevel;
+    }
+
+    public LoggingLevel getRetryAttemptedLogLevel() {
+        return retryAttemptedLogLevel;
+    }
 }

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/ThroughputLogger.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/ThroughputLogger.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/ThroughputLogger.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/ThroughputLogger.java
 Thu Oct 30 07:15:53 2008
@@ -20,6 +20,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.model.LoggingLevel;
 import org.apache.commons.logging.Log;
 
 /**

Modified: 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/interceptor/Tracer.java
 Thu Oct 30 07:15:53 2008
@@ -23,8 +23,8 @@
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.model.LoggingLevel;
 import org.apache.camel.model.ProcessorType;
-import org.apache.camel.processor.LoggingLevel;
 import org.apache.camel.spi.InterceptStrategy;
 
 /**

Modified: 
activemq/camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index
 (original)
+++ 
activemq/camel/trunk/camel-core/src/main/resources/org/apache/camel/model/jaxb.index
 Thu Oct 30 07:15:53 2008
@@ -31,6 +31,7 @@
 InterceptorRef
 InterceptorType
 LoadBalanceType
+LoggingLevel
 LoopType
 MarshalType
 MulticastType

Added: 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ExceptionBuilderWithRetryLoggingLevelSetTest.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ExceptionBuilderWithRetryLoggingLevelSetTest.java?rev=709164&view=auto
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ExceptionBuilderWithRetryLoggingLevelSetTest.java
 (added)
+++ 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ExceptionBuilderWithRetryLoggingLevelSetTest.java
 Thu Oct 30 07:15:53 2008
@@ -0,0 +1,204 @@
+/**
+ * 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.builder;
+
+import java.io.IOException;
+import java.net.ConnectException;
+import java.security.GeneralSecurityException;
+import java.security.KeyException;
+import java.security.KeyManagementException;
+
+import org.apache.camel.CamelExchangeException;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.model.LoggingLevel;
+import org.apache.commons.logging.Log;
+
+/**
+ * Unit test to test exception configuration
+ */
+public class ExceptionBuilderWithRetryLoggingLevelSetTest extends 
ContextTestSupport {
+
+    private static final String MESSAGE_INFO = "messageInfo";
+    private static final String RESULT_QUEUE = "mock:result";
+    private static final String ERROR_QUEUE = "mock:error";
+    private CustomLog logger;
+
+    @Override
+    protected void setUp() throws Exception {
+        logger = new CustomLog();
+        super.setUp();
+    }
+    
+    public void testExceptionIsLoggedWithCustomLogLevel() throws Exception {
+        MockEndpoint result = getMockEndpoint(RESULT_QUEUE);
+        result.expectedMessageCount(0);
+        MockEndpoint mock = getMockEndpoint(ERROR_QUEUE);
+        mock.expectedMessageCount(1);
+        mock.expectedHeaderReceived(MESSAGE_INFO, "Damm somekind of IO 
exception");
+
+        try {
+            template.sendBody("direct:a", "Hello IO");
+            fail("Should have thrown a IOException");
+        } catch (RuntimeCamelException e) {
+            assertTrue(e.getCause() instanceof IOException);
+            // expected
+        }
+
+        MockEndpoint.assertIsSatisfied(result, mock);
+        assertTrue(logger.loggedTrace && logger.loggedFatal);
+    }
+
+    public void testExceptionIsLoggedWithDefaultLevel() throws Exception {
+        MockEndpoint result = getMockEndpoint(RESULT_QUEUE);
+        result.expectedMessageCount(0);
+        MockEndpoint mock = getMockEndpoint(ERROR_QUEUE);
+        mock.expectedMessageCount(1);
+        mock.expectedHeaderReceived(MESSAGE_INFO, "Damm a NPE");
+
+        try {
+            template.sendBody("direct:a", "Hello NPE");
+            fail("Should have thrown a NullPointerException");
+        } catch (RuntimeCamelException e) {
+            assertTrue(e.getCause() instanceof NullPointerException);
+            // expected
+        }
+
+        MockEndpoint.assertIsSatisfied(result, mock);
+        assertTrue(!logger.loggedTrace && !logger.loggedFatal);
+    }    
+    
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                errorHandler(deadLetterChannel().log(logger));
+                
+                onException(NullPointerException.class)
+                    .maximumRedeliveries(0)
+                    .setHeader(MESSAGE_INFO, constant("Damm a NPE"))
+                    .to(ERROR_QUEUE);                
+                
+                // START SNIPPET: exceptionBuilder1
+                onException(IOException.class)
+                    .initialRedeliveryDelay(1000L)
+                    .maximumRedeliveries(3)
+                    .maximumRedeliveryDelay(10000L)
+                    .backOffMultiplier(1.0)
+                    .useExponentialBackOff()
+                    .retryAttemptedLogLevel(LoggingLevel.TRACE)
+                    .retriesExhaustedLogLevel(LoggingLevel.FATAL)
+                    .setHeader(MESSAGE_INFO, constant("Damm somekind of IO 
exception"))
+                    .to(ERROR_QUEUE);
+                // END SNIPPET: exceptionBuilder1
+
+                from("direct:a").process(new Processor() {
+                    public void process(Exchange exchange) throws Exception {
+                        String s = exchange.getIn().getBody(String.class);
+                        if ("Hello NPE".equals(s)) {
+                            throw new NullPointerException();
+                        } else if ("Hello IO".equals(s)) {
+                            throw new ConnectException("Forced for testing - 
can not connect to remote server");
+                        }
+                        exchange.getOut().setBody("Hello World");
+                    }
+                }).to("mock:result");
+            }
+        };
+    }
+    
+    private class CustomLog implements Log {
+
+        boolean loggedTrace = false;
+        boolean loggedFatal = false;       
+        
+        public boolean isDebugEnabled() {
+            return true;
+        }
+
+        public boolean isErrorEnabled() {
+            return true;
+        }
+
+        public boolean isFatalEnabled() {
+            return true;
+        }
+
+        public boolean isInfoEnabled() {
+            return true;
+        }
+
+        public boolean isTraceEnabled() {
+            return true;
+        }
+
+        public boolean isWarnEnabled() {
+            return true;
+        }
+
+        public void trace(Object message) {
+            assertNotNull(message);
+            loggedTrace = true;            
+        }
+
+        public void trace(Object message, Throwable t) {
+            assertNotNull(t);
+            assertNotNull(message);
+            loggedTrace = true;            
+        }
+
+        public void debug(Object message) {
+        }
+
+        public void debug(Object message, Throwable t) {
+        }
+
+        public void info(Object message) {
+        }
+
+        public void info(Object message, Throwable t) {
+        }
+
+        public void warn(Object message) {
+        }
+
+        public void warn(Object message, Throwable t) {
+        }
+
+        public void error(Object message) {
+        }
+
+        public void error(Object message, Throwable t) {
+
+        }
+
+        public void fatal(Object message) {
+            assertNotNull(message);
+            loggedFatal = true;
+        }
+
+        public void fatal(Object message, Throwable t) {
+            assertNotNull(t);
+            assertNotNull(message);
+            loggedFatal = true;
+        }
+    }
+}
+
+

Propchange: 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/ExceptionBuilderWithRetryLoggingLevelSetTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelTest.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelTest.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelTest.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DeadLetterChannelTest.java
 Thu Oct 30 07:15:53 2008
@@ -22,6 +22,7 @@
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.model.LoggingLevel;
 
 /**
  * @version $Revision$

Modified: 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FaultRetryRouteTest.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FaultRetryRouteTest.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FaultRetryRouteTest.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FaultRetryRouteTest.java
 Thu Oct 30 07:15:53 2008
@@ -23,6 +23,7 @@
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.model.LoggingLevel;
 
 public class FaultRetryRouteTest extends ContextTestSupport {
     protected MockEndpoint a;

Modified: 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FaultRouteTest.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FaultRouteTest.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FaultRouteTest.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/FaultRouteTest.java
 Thu Oct 30 07:15:53 2008
@@ -26,6 +26,7 @@
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.model.LoggingLevel;
 
 /**
  * @version $Revision$

Modified: 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TracerConfigurationTest.java
URL: 
http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TracerConfigurationTest.java?rev=709164&r1=709163&r2=709164&view=diff
==============================================================================
--- 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TracerConfigurationTest.java
 (original)
+++ 
activemq/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/TracerConfigurationTest.java
 Thu Oct 30 07:15:53 2008
@@ -19,6 +19,7 @@
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.model.LoggingLevel;
 import org.apache.camel.processor.interceptor.Tracer;
 
 /**


Reply via email to