Author: davsclaus
Date: Sat Feb 12 12:04:33 2011
New Revision: 1070059

URL: http://svn.apache.org/viewvc?rev=1070059&view=rev
Log:
CAMEL-3658: redelivery policy supports property placeholders.

Added:
    
camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentOnExceptionTest.java
      - copied, changed from r1070041, 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentRefTest.java
    
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.java
    
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.xml
      - copied, changed from r1070041, 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentRefTest.xml
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java
    
camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java
    
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/cheese.properties

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java?rev=1070059&r1=1070058&r2=1070059&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/OnExceptionDefinition.java
 Sat Feb 12 12:04:33 2011
@@ -339,6 +339,17 @@ public class OnExceptionDefinition exten
     }
 
     /**
+     * Sets the back off multiplier (supports property placeholders)
+     *
+     * @param backOffMultiplier the back off multiplier
+     * @return the builder
+     */
+    public OnExceptionDefinition backOffMultiplier(String backOffMultiplier) {
+        getOrCreateRedeliveryPolicy().backOffMultiplier(backOffMultiplier);
+        return this;
+    }
+
+    /**
      * Sets the collision avoidance factor
      *
      * @param collisionAvoidanceFactor the factor
@@ -350,6 +361,17 @@ public class OnExceptionDefinition exten
     }
 
     /**
+     * Sets the collision avoidance factor (supports property placeholders)
+     *
+     * @param collisionAvoidanceFactor the factor
+     * @return the builder
+     */
+    public OnExceptionDefinition collisionAvoidanceFactor(String 
collisionAvoidanceFactor) {
+        
getOrCreateRedeliveryPolicy().collisionAvoidanceFactor(collisionAvoidanceFactor);
+        return this;
+    }
+
+    /**
      * Sets the collision avoidance percentage
      *
      * @param collisionAvoidancePercent the percentage
@@ -372,13 +394,24 @@ public class OnExceptionDefinition exten
     }
 
     /**
+     * Sets the initial redelivery delay (supports property placeholders)
+     *
+     * @param delay delay in millis
+     * @return the builder
+     */
+    public OnExceptionDefinition redeliveryDelay(String delay) {
+        getOrCreateRedeliveryPolicy().redeliveryDelay(delay);
+        return this;
+    }
+
+    /**
      * Allow synchronous delayed redelivery.
      *
      * @see 
org.apache.camel.processor.RedeliveryPolicy#setAsyncDelayedRedelivery(boolean)
      * @return the builder
      */
     public OnExceptionDefinition asyncDelayedRedelivery() {
-        getOrCreateRedeliveryPolicy().setAsyncDelayedRedelivery(true);
+        getOrCreateRedeliveryPolicy().asyncDelayedRedelivery();
         return this;
     }
 
@@ -408,7 +441,15 @@ public class OnExceptionDefinition exten
      * Sets whether to log stacktrace for failed messages.
      */
     public OnExceptionDefinition logStackTrace(boolean logStackTrace) {
-        getOrCreateRedeliveryPolicy().setLogStackTrace(logStackTrace);
+        getOrCreateRedeliveryPolicy().logStackTrace(logStackTrace);
+        return this;
+    }
+
+    /**
+     * Sets whether to log stacktrace for failed messages (supports property 
placeholders)
+     */
+    public OnExceptionDefinition logStackTrace(String logStackTrace) {
+        getOrCreateRedeliveryPolicy().logStackTrace(logStackTrace);
         return this;
     }
 
@@ -416,7 +457,15 @@ public class OnExceptionDefinition exten
      * Sets whether to log stacktrace for failed redelivery attempts
      */
     public OnExceptionDefinition logRetryStackTrace(boolean 
logRetryStackTrace) {
-        
getOrCreateRedeliveryPolicy().setLogRetryStackTrace(logRetryStackTrace);
+        getOrCreateRedeliveryPolicy().logRetryStackTrace(logRetryStackTrace);
+        return this;
+    }
+
+    /**
+     * Sets whether to log stacktrace for failed redelivery attempts (supports 
property placeholders)
+     */
+    public OnExceptionDefinition logRetryStackTrace(String logRetryStackTrace) 
{
+        getOrCreateRedeliveryPolicy().logRetryStackTrace(logRetryStackTrace);
         return this;
     }
 
@@ -424,7 +473,15 @@ public class OnExceptionDefinition exten
      * Sets whether to log errors even if its handled
      */
     public OnExceptionDefinition logHandled(boolean logHandled) {
-        getOrCreateRedeliveryPolicy().setLogHandled(logHandled);
+        getOrCreateRedeliveryPolicy().logHandled(logHandled);
+        return this;
+    }
+
+    /**
+     * Sets whether to log errors even if its handled (supports property 
placeholders)
+     */
+    public OnExceptionDefinition logHandled(String logHandled) {
+        getOrCreateRedeliveryPolicy().logHandled(logHandled);
         return this;
     }
 
@@ -432,7 +489,15 @@ public class OnExceptionDefinition exten
      * Sets whether to log errors even if its continued
      */
     public OnExceptionDefinition logContinued(boolean logContinued) {
-        getOrCreateRedeliveryPolicy().setLogContinued(logContinued);
+        getOrCreateRedeliveryPolicy().logContinued(logContinued);
+        return this;
+    }
+
+    /**
+     * Sets whether to log errors even if its continued (supports property 
placeholders)
+     */
+    public OnExceptionDefinition logContinued(String logContinued) {
+        getOrCreateRedeliveryPolicy().logContinued(logContinued);
         return this;
     }
 
@@ -440,7 +505,15 @@ public class OnExceptionDefinition exten
      * Sets whether to log retry attempts
      */
     public OnExceptionDefinition logRetryAttempted(boolean logRetryAttempted) {
-        getOrCreateRedeliveryPolicy().setLogRetryAttempted(logRetryAttempted);
+        getOrCreateRedeliveryPolicy().logRetryAttempted(logRetryAttempted);
+        return this;
+    }
+
+    /**
+     * Sets whether to log retry attempts (supports property placeholders)
+     */
+    public OnExceptionDefinition logRetryAttempted(String logRetryAttempted) {
+        getOrCreateRedeliveryPolicy().logRetryAttempted(logRetryAttempted);
         return this;
     }
 
@@ -448,7 +521,15 @@ public class OnExceptionDefinition exten
      * Sets whether to log exhausted exceptions
      */
     public OnExceptionDefinition logExhausted(boolean logExhausted) {
-        getOrCreateRedeliveryPolicy().setLogExhausted(logExhausted);
+        getOrCreateRedeliveryPolicy().logExhausted(logExhausted);
+        return this;
+    }
+
+    /**
+     * Sets whether to log exhausted exceptions (supports property 
placeholders)
+     */
+    public OnExceptionDefinition logExhausted(String logExhausted) {
+        getOrCreateRedeliveryPolicy().logExhausted(logExhausted);
         return this;
     }
 
@@ -469,6 +550,22 @@ public class OnExceptionDefinition exten
     }
 
     /**
+     * Sets the maximum redeliveries (supports property placeholders)
+     * <ul>
+     * <li>5 = default value</li>
+     * <li>0 = no redeliveries</li>
+     * <li>-1 = redeliver forever</li>
+     * </ul>
+     *
+     * @param maximumRedeliveries the value
+     * @return the builder
+     */
+    public OnExceptionDefinition maximumRedeliveries(String 
maximumRedeliveries) {
+        getOrCreateRedeliveryPolicy().maximumRedeliveries(maximumRedeliveries);
+        return this;
+    }
+
+    /**
      * Turn on collision avoidance.
      *
      * @return the builder
@@ -500,6 +597,17 @@ public class OnExceptionDefinition exten
     }
 
     /**
+     * Sets the maximum delay between redelivery (supports property 
placeholders)
+     *
+     * @param maximumRedeliveryDelay the delay in millis
+     * @return the builder
+     */
+    public OnExceptionDefinition maximumRedeliveryDelay(String 
maximumRedeliveryDelay) {
+        
getOrCreateRedeliveryPolicy().maximumRedeliveryDelay(maximumRedeliveryDelay);
+        return this;
+    }
+
+    /**
      * Sets a reference to a {@link RedeliveryPolicy} to lookup in the {@link 
org.apache.camel.spi.Registry} to be used.
      *
      * @param redeliveryPolicyRef reference to use for lookup
@@ -689,9 +797,9 @@ public class OnExceptionDefinition exten
         this.useOriginalMessagePolicy = useOriginalMessagePolicy;
     }
 
-    public boolean isAsyncDelayedRedelivery() {
-        if (getRedeliveryPolicy() != null) {
-            return getRedeliveryPolicy().getAsyncDelayedRedelivery() != null 
&& getRedeliveryPolicy().getAsyncDelayedRedelivery();
+    public boolean isAsyncDelayedRedelivery(CamelContext context) {
+        if (getRedeliveryPolicy() != null ) {
+            return getRedeliveryPolicy().isAsyncDelayedRedelivery(context);
         }
         return false;
     }

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java?rev=1070059&r1=1070058&r2=1070059&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java
 Sat Feb 12 12:04:33 2011
@@ -25,6 +25,7 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.processor.RedeliveryPolicy;
 import org.apache.camel.util.CamelContextHelper;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * Represents an XML &lt;redeliveryPolicy/&gt; element
@@ -34,42 +35,42 @@ import org.apache.camel.util.CamelContex
 @XmlRootElement(name = "redeliveryPolicy")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class RedeliveryPolicyDefinition {
-    @XmlAttribute()
+    @XmlAttribute
     private String ref;
     @XmlAttribute
-    private Integer maximumRedeliveries;
+    private String maximumRedeliveries;
     @XmlAttribute
-    private Long redeliveryDelay;
+    private String redeliveryDelay;
     @XmlAttribute
-    private Boolean asyncDelayedRedelivery;
+    private String asyncDelayedRedelivery;
     @XmlAttribute
-    private Double backOffMultiplier;
+    private String backOffMultiplier;
     @XmlAttribute
-    private Boolean useExponentialBackOff;
+    private String useExponentialBackOff;
     @XmlAttribute
-    private Double collisionAvoidanceFactor;
+    private String collisionAvoidanceFactor;
     @XmlAttribute
-    private Boolean useCollisionAvoidance;
+    private String useCollisionAvoidance;
     @XmlAttribute
-    private Long maximumRedeliveryDelay;
+    private String maximumRedeliveryDelay;
     @XmlAttribute
     private LoggingLevel retriesExhaustedLogLevel;
     @XmlAttribute
     private LoggingLevel retryAttemptedLogLevel;
     @XmlAttribute
-    private Boolean logRetryAttempted;
+    private String logRetryAttempted;
     @XmlAttribute
-    private Boolean logStackTrace;
+    private String logStackTrace;
     @XmlAttribute
-    private Boolean logRetryStackTrace;
+    private String logRetryStackTrace;
     @XmlAttribute
-    private Boolean logHandled;
+    private String logHandled;
     @XmlAttribute
-    private Boolean logContinued;
+    private String logContinued;
     @XmlAttribute
-    private Boolean logExhausted;
+    private String logExhausted;
     @XmlAttribute
-    private Boolean disableRedelivery;
+    private String disableRedelivery;
     @XmlAttribute
     private String delayPattern;
 
@@ -86,60 +87,69 @@ public class RedeliveryPolicyDefinition 
             answer = new RedeliveryPolicy();
         }
 
-        // copy across the properties - if they are set
-        if (maximumRedeliveries != null) {
-            answer.setMaximumRedeliveries(maximumRedeliveries);
-        }
-        if (redeliveryDelay != null) {
-            answer.setRedeliveryDelay(redeliveryDelay);
-        }
-        if (asyncDelayedRedelivery != null && asyncDelayedRedelivery) {
-            answer.asyncDelayedRedelivery();
-        }
-        if (retriesExhaustedLogLevel != null) {
-            answer.setRetriesExhaustedLogLevel(retriesExhaustedLogLevel);
-        }
-        if (retryAttemptedLogLevel != null) {
-            answer.setRetryAttemptedLogLevel(retryAttemptedLogLevel);
-        }
-        if (backOffMultiplier != null) {
-            answer.setBackOffMultiplier(backOffMultiplier);
-        }
-        if (useExponentialBackOff != null) {
-            answer.setUseExponentialBackOff(useExponentialBackOff);
-        }
-        if (collisionAvoidanceFactor != null) {
-            answer.setCollisionAvoidanceFactor(collisionAvoidanceFactor);
-        }
-        if (useCollisionAvoidance != null) {
-            answer.setUseCollisionAvoidance(useCollisionAvoidance);
-        }
-        if (maximumRedeliveryDelay != null) {
-            answer.setMaximumRedeliveryDelay(maximumRedeliveryDelay);
-        }
-        if (logStackTrace != null) {
-            answer.setLogStackTrace(logStackTrace);
-        }
-        if (logRetryStackTrace != null) {
-            answer.setLogRetryStackTrace(logRetryStackTrace);
-        }
-        if (logHandled != null) {
-            answer.setLogHandled(logHandled);
-        }
-        if (logContinued != null) {
-            answer.setLogContinued(logContinued);
-        }
-        if (logRetryAttempted != null) {
-            answer.setLogRetryAttempted(logRetryAttempted);
-        }
-        if (logExhausted != null) {
-            answer.setLogExhausted(logExhausted);
-        }
-        if (disableRedelivery != null && disableRedelivery) {
-            answer.setMaximumRedeliveries(0);
-        }
-        if (delayPattern != null) {
-            answer.setDelayPattern(delayPattern);
+        try {
+
+            // copy across the properties - if they are set
+            if (maximumRedeliveries != null) {
+                
answer.setMaximumRedeliveries(CamelContextHelper.parseInteger(context, 
maximumRedeliveries));
+            }
+            if (redeliveryDelay != null) {
+                
answer.setRedeliveryDelay(CamelContextHelper.parseLong(context, 
redeliveryDelay));
+            }
+            if (asyncDelayedRedelivery != null) {
+                if (CamelContextHelper.parseBoolean(context, 
asyncDelayedRedelivery)) {
+                    answer.asyncDelayedRedelivery();
+                }
+            }
+            if (retriesExhaustedLogLevel != null) {
+                answer.setRetriesExhaustedLogLevel(retriesExhaustedLogLevel);
+            }
+            if (retryAttemptedLogLevel != null) {
+                answer.setRetryAttemptedLogLevel(retryAttemptedLogLevel);
+            }
+            if (backOffMultiplier != null) {
+                
answer.setBackOffMultiplier(CamelContextHelper.parseDouble(context, 
backOffMultiplier));
+            }
+            if (useExponentialBackOff != null) {
+                
answer.setUseExponentialBackOff(CamelContextHelper.parseBoolean(context, 
useExponentialBackOff));
+            }
+            if (collisionAvoidanceFactor != null) {
+                
answer.setCollisionAvoidanceFactor(CamelContextHelper.parseDouble(context, 
collisionAvoidanceFactor));
+            }
+            if (useCollisionAvoidance != null) {
+                
answer.setUseCollisionAvoidance(CamelContextHelper.parseBoolean(context, 
useCollisionAvoidance));
+            }
+            if (maximumRedeliveryDelay != null) {
+                
answer.setMaximumRedeliveryDelay(CamelContextHelper.parseLong(context, 
maximumRedeliveryDelay));
+            }
+            if (logStackTrace != null) {
+                
answer.setLogStackTrace(CamelContextHelper.parseBoolean(context, 
logStackTrace));
+            }
+            if (logRetryStackTrace != null) {
+                
answer.setLogRetryStackTrace(CamelContextHelper.parseBoolean(context, 
logRetryStackTrace));
+            }
+            if (logHandled != null) {
+                answer.setLogHandled(CamelContextHelper.parseBoolean(context, 
logHandled));
+            }
+            if (logContinued != null) {
+                
answer.setLogContinued(CamelContextHelper.parseBoolean(context, logContinued));
+            }
+            if (logRetryAttempted != null) {
+                
answer.setLogRetryAttempted(CamelContextHelper.parseBoolean(context, 
logRetryAttempted));
+            }
+            if (logExhausted != null) {
+                
answer.setLogExhausted(CamelContextHelper.parseBoolean(context, logExhausted));
+            }
+            if (disableRedelivery != null) {
+                if (CamelContextHelper.parseBoolean(context, 
disableRedelivery)) {
+                    answer.setMaximumRedeliveries(0);
+                }
+            }
+            if (delayPattern != null) {
+                answer.setDelayPattern(delayPattern);
+            }
+        } catch (Exception e) {
+            throw ObjectHelper.wrapRuntimeCamelException(e);
         }
 
         return answer;
@@ -151,6 +161,15 @@ public class RedeliveryPolicyDefinition 
 
     // Fluent API
     //-------------------------------------------------------------------------
+
+    /**
+     * Allow synchronous delayed redelivery.
+     */
+    public RedeliveryPolicyDefinition asyncDelayedRedelivery() {
+        setAsyncDelayedRedelivery("true");
+        return this;
+    }
+
     /**
      * Sets the back off multiplier
      *
@@ -158,6 +177,16 @@ public class RedeliveryPolicyDefinition 
      * @return the builder
      */
     public RedeliveryPolicyDefinition backOffMultiplier(double 
backOffMultiplier) {
+        return backOffMultiplier(Double.toString(backOffMultiplier));
+    }
+
+    /**
+     * Sets the back off multiplier (supports property placeholders)
+     *
+     * @param backOffMultiplier  the back off multiplier
+     * @return the builder
+     */
+    public RedeliveryPolicyDefinition backOffMultiplier(String 
backOffMultiplier) {
         setBackOffMultiplier(backOffMultiplier);
         return this;
     }
@@ -169,7 +198,7 @@ public class RedeliveryPolicyDefinition 
      * @return the builder
      */
     public RedeliveryPolicyDefinition collisionAvoidancePercent(double 
collisionAvoidancePercent) {
-        setCollisionAvoidanceFactor(collisionAvoidancePercent * 0.01d);
+        setCollisionAvoidanceFactor(Double.toString(collisionAvoidancePercent 
* 0.01d));
         return this;
     }
 
@@ -180,6 +209,16 @@ public class RedeliveryPolicyDefinition 
      * @return the builder
      */
     public RedeliveryPolicyDefinition collisionAvoidanceFactor(double 
collisionAvoidanceFactor) {
+        return 
collisionAvoidanceFactor(Double.toString(collisionAvoidanceFactor));
+    }
+
+    /**
+     * Sets the collision avoidance factor (supports property placeholders)
+     *
+     * @param collisionAvoidanceFactor  the factor
+     * @return the builder
+     */
+    public RedeliveryPolicyDefinition collisionAvoidanceFactor(String 
collisionAvoidanceFactor) {
         setCollisionAvoidanceFactor(collisionAvoidanceFactor);
         return this;
     }
@@ -191,6 +230,16 @@ public class RedeliveryPolicyDefinition 
      * @return the builder
      */
     public RedeliveryPolicyDefinition redeliveryDelay(long delay) {
+        return redeliveryDelay(Long.toString(delay));
+    }
+
+    /**
+     * Sets the initial redelivery delay (supports property placeholders)
+     *
+     * @param delay  delay in millis
+     * @return the builder
+     */
+    public RedeliveryPolicyDefinition redeliveryDelay(String delay) {
         setRedeliveryDelay(delay);
         return this;
     }
@@ -225,6 +274,17 @@ public class RedeliveryPolicyDefinition 
      * @return the builder
      */
     public RedeliveryPolicyDefinition logStackTrace(boolean logStackTrace) {
+        return logStackTrace(Boolean.toString(logStackTrace));
+    }
+
+    /**
+     * Sets whether stack traces should be logged (supports property 
placeholders)
+     * Can be used to include or reduce verbose.
+     *
+     * @param logStackTrace  whether stack traces should be logged or not
+     * @return the builder
+     */
+    public RedeliveryPolicyDefinition logStackTrace(String logStackTrace) {
         setLogStackTrace(logStackTrace);
         return this;
     }
@@ -237,54 +297,109 @@ public class RedeliveryPolicyDefinition 
      * @return the builder
      */
     public RedeliveryPolicyDefinition logRetryStackTrace(boolean 
logRetryStackTrace) {
+        return logRetryStackTrace(Boolean.toString(logRetryStackTrace));
+    }
+
+    /**
+     * Sets whether stack traces should be logged when an retry attempt failed 
(supports property placeholders).
+     * Can be used to include or reduce verbose.
+     *
+     * @param logRetryStackTrace  whether stack traces should be logged or not
+     * @return the builder
+     */
+    public RedeliveryPolicyDefinition logRetryStackTrace(String 
logRetryStackTrace) {
         setLogRetryStackTrace(logRetryStackTrace);
         return this;
     }
 
     /**
-     * Sets whether retry attempts should be logged or not
+     * Sets whether retry attempts should be logged or not.
      * Can be used to include or reduce verbose.
      *
      * @param logRetryAttempted  whether retry attempts should be logged or not
      * @return the builder
      */
     public RedeliveryPolicyDefinition logRetryAttempted(boolean 
logRetryAttempted) {
+        return logRetryAttempted(Boolean.toString(logRetryAttempted));
+    }
+
+    /**
+     * Sets whether retry attempts should be logged or not (supports property 
placeholders).
+     * Can be used to include or reduce verbose.
+     *
+     * @param logRetryAttempted  whether retry attempts should be logged or not
+     * @return the builder
+     */
+    public RedeliveryPolicyDefinition logRetryAttempted(String 
logRetryAttempted) {
         setLogRetryAttempted(logRetryAttempted);
         return this;
     }
 
     /**
-     * Sets whether handled exceptions should be logged or not
+     * Sets whether handled exceptions should be logged or not.
      * Can be used to include or reduce verbose.
      *
      * @param logHandled  whether handled exceptions should be logged or not
      * @return the builder
      */
     public RedeliveryPolicyDefinition logHandled(boolean logHandled) {
+        return logHandled(Boolean.toString(logHandled));
+    }
+
+    /**
+     * Sets whether handled exceptions should be logged or not (supports 
property placeholders).
+     * Can be used to include or reduce verbose.
+     *
+     * @param logHandled  whether handled exceptions should be logged or not
+     * @return the builder
+     */
+    public RedeliveryPolicyDefinition logHandled(String logHandled) {
         setLogHandled(logHandled);
         return this;
     }
 
     /**
-     * Sets whether continued exceptions should be logged or not
+     * Sets whether continued exceptions should be logged or not.
      * Can be used to include or reduce verbose.
      *
      * @param logContinued  whether continued exceptions should be logged or 
not
      * @return the builder
      */
     public RedeliveryPolicyDefinition logContinued(boolean logContinued) {
+        return logContinued(Boolean.toString(logContinued));
+    }
+
+    /**
+     * Sets whether continued exceptions should be logged or not (supports 
property placeholders).
+     * Can be used to include or reduce verbose.
+     *
+     * @param logContinued  whether continued exceptions should be logged or 
not
+     * @return the builder
+     */
+    public RedeliveryPolicyDefinition logContinued(String logContinued) {
         setLogContinued(logContinued);
         return this;
     }
 
     /**
-     * Sets whether exhausted exceptions should be logged or not
+     * Sets whether exhausted exceptions should be logged or not.
      * Can be used to include or reduce verbose.
      *
      * @param logExhausted  whether exhausted exceptions should be logged or 
not
      * @return the builder
      */
     public RedeliveryPolicyDefinition logExhausted(boolean logExhausted) {
+        return logExhausted(Boolean.toString(logExhausted));
+    }
+
+    /**
+     * Sets whether exhausted exceptions should be logged or not (supports 
property placeholders).
+     * Can be used to include or reduce verbose.
+     *
+     * @param logExhausted  whether exhausted exceptions should be logged or 
not
+     * @return the builder
+     */
+    public RedeliveryPolicyDefinition logExhausted(String logExhausted) {
         setLogExhausted(logExhausted);
         return this;
     }
@@ -301,6 +416,21 @@ public class RedeliveryPolicyDefinition 
      * @return the builder
      */
     public RedeliveryPolicyDefinition maximumRedeliveries(int 
maximumRedeliveries) {
+        return maximumRedeliveries(Integer.toString(maximumRedeliveries));
+    }
+
+    /**
+     * Sets the maximum redeliveries (supports property placeholders)
+     * <ul>
+     *   <li>x = redeliver at most x times</li>
+     *   <li>0 = no redeliveries</li>
+     *   <li>-1 = redeliver forever</li>
+     * </ul>
+     *
+     * @param maximumRedeliveries  the value
+     * @return the builder
+     */
+    public RedeliveryPolicyDefinition maximumRedeliveries(String 
maximumRedeliveries) {
         setMaximumRedeliveries(maximumRedeliveries);
         return this;
     }
@@ -311,7 +441,7 @@ public class RedeliveryPolicyDefinition 
      * @return the builder
      */
     public RedeliveryPolicyDefinition useCollisionAvoidance() {
-        setUseCollisionAvoidance(Boolean.TRUE);
+        setUseCollisionAvoidance("true");
         return this;
     }
 
@@ -321,7 +451,7 @@ public class RedeliveryPolicyDefinition 
      * @return the builder
      */
     public RedeliveryPolicyDefinition useExponentialBackOff() {
-        setUseExponentialBackOff(Boolean.TRUE);
+        setUseExponentialBackOff("true");
         return this;
     }
 
@@ -332,6 +462,16 @@ public class RedeliveryPolicyDefinition 
      * @return the builder
      */
     public RedeliveryPolicyDefinition maximumRedeliveryDelay(long 
maximumRedeliveryDelay) {
+        return maximumRedeliveryDelay(Long.toString(maximumRedeliveryDelay));
+    }
+
+    /**
+     * Sets the maximum delay between redelivery (supports property 
placeholders)
+     *
+     * @param maximumRedeliveryDelay  the delay in millis
+     * @return the builder
+     */
+    public RedeliveryPolicyDefinition maximumRedeliveryDelay(String 
maximumRedeliveryDelay) {
         setMaximumRedeliveryDelay(maximumRedeliveryDelay);
         return this;
     }
@@ -361,148 +501,160 @@ public class RedeliveryPolicyDefinition 
     // Properties
     //-------------------------------------------------------------------------
 
-    public Double getBackOffMultiplier() {
-        return backOffMultiplier;
+    public String getRef() {
+        return ref;
     }
 
-    public void setBackOffMultiplier(Double backOffMultiplier) {
-        this.backOffMultiplier = backOffMultiplier;
+    public void setRef(String ref) {
+        this.ref = ref;
     }
 
-    public Double getCollisionAvoidanceFactor() {
-        return collisionAvoidanceFactor;
+    public String getMaximumRedeliveries() {
+        return maximumRedeliveries;
     }
 
-    public void setCollisionAvoidanceFactor(Double collisionAvoidanceFactor) {
-        this.collisionAvoidanceFactor = collisionAvoidanceFactor;
+    public void setMaximumRedeliveries(String maximumRedeliveries) {
+        this.maximumRedeliveries = maximumRedeliveries;
     }
 
-    public Long getRedeliveryDelay() {
+    public String getRedeliveryDelay() {
         return redeliveryDelay;
     }
 
-    public void setRedeliveryDelay(Long delay) {
-        this.redeliveryDelay = delay;
+    public void setRedeliveryDelay(String redeliveryDelay) {
+        this.redeliveryDelay = redeliveryDelay;
     }
 
-    public Boolean getAsyncDelayedRedelivery() {
+    public String getAsyncDelayedRedelivery() {
         return asyncDelayedRedelivery;
     }
 
-    public void setAsyncDelayedRedelivery(Boolean asyncDelayedRedelivery) {
-        this.asyncDelayedRedelivery = asyncDelayedRedelivery;
-    }
+    public boolean isAsyncDelayedRedelivery(CamelContext context) {
+        if (getAsyncDelayedRedelivery() == null) {
+            return false;
+        }
 
-    public Integer getMaximumRedeliveries() {
-        return maximumRedeliveries;
+        try {
+            return CamelContextHelper.parseBoolean(context, 
getAsyncDelayedRedelivery());
+        } catch (Exception e) {
+            throw ObjectHelper.wrapRuntimeCamelException(e);
+        }
     }
 
-    public void setMaximumRedeliveries(Integer maximumRedeliveries) {
-        this.maximumRedeliveries = maximumRedeliveries;
+    public void setAsyncDelayedRedelivery(String asyncDelayedRedelivery) {
+        this.asyncDelayedRedelivery = asyncDelayedRedelivery;
     }
 
-    public Boolean getUseCollisionAvoidance() {
-        return useCollisionAvoidance;
+    public String getBackOffMultiplier() {
+        return backOffMultiplier;
     }
 
-    public void setUseCollisionAvoidance(Boolean useCollisionAvoidance) {
-        this.useCollisionAvoidance = useCollisionAvoidance;
+    public void setBackOffMultiplier(String backOffMultiplier) {
+        this.backOffMultiplier = backOffMultiplier;
     }
 
-    public Boolean getUseExponentialBackOff() {
+    public String getUseExponentialBackOff() {
         return useExponentialBackOff;
     }
 
-    public void setUseExponentialBackOff(Boolean useExponentialBackOff) {
+    public void setUseExponentialBackOff(String useExponentialBackOff) {
         this.useExponentialBackOff = useExponentialBackOff;
     }
 
-    public Long getMaximumRedeliveryDelay() {
-        return maximumRedeliveryDelay;
+    public String getCollisionAvoidanceFactor() {
+        return collisionAvoidanceFactor;
     }
 
-    public void setMaximumRedeliveryDelay(Long maximumRedeliveryDelay) {
-        this.maximumRedeliveryDelay = maximumRedeliveryDelay;
+    public void setCollisionAvoidanceFactor(String collisionAvoidanceFactor) {
+        this.collisionAvoidanceFactor = collisionAvoidanceFactor;
     }
 
-    public void setRetriesExhaustedLogLevel(LoggingLevel 
retriesExhaustedLogLevel) {
-        this.retriesExhaustedLogLevel = retriesExhaustedLogLevel;
+    public String getUseCollisionAvoidance() {
+        return useCollisionAvoidance;
+    }
+
+    public void setUseCollisionAvoidance(String useCollisionAvoidance) {
+        this.useCollisionAvoidance = useCollisionAvoidance;
+    }
+
+    public String getMaximumRedeliveryDelay() {
+        return maximumRedeliveryDelay;
+    }
+
+    public void setMaximumRedeliveryDelay(String maximumRedeliveryDelay) {
+        this.maximumRedeliveryDelay = maximumRedeliveryDelay;
     }
 
     public LoggingLevel getRetriesExhaustedLogLevel() {
         return retriesExhaustedLogLevel;
-    } 
+    }
 
-    public void setRetryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) 
{
-        this.retryAttemptedLogLevel = retryAttemptedLogLevel;
+    public void setRetriesExhaustedLogLevel(LoggingLevel 
retriesExhaustedLogLevel) {
+        this.retriesExhaustedLogLevel = retriesExhaustedLogLevel;
     }
 
     public LoggingLevel getRetryAttemptedLogLevel() {
         return retryAttemptedLogLevel;
     }
 
-    public String getRef() {
-        return ref;
-    }
-
-    public void setRef(String ref) {
-        this.ref = ref;
+    public void setRetryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) 
{
+        this.retryAttemptedLogLevel = retryAttemptedLogLevel;
     }
 
-    public Boolean getLogStackTrace() {
-        return logStackTrace;
+    public String getLogRetryAttempted() {
+        return logRetryAttempted;
     }
 
-    public void setLogStackTrace(Boolean logStackTrace) {
-        this.logStackTrace = logStackTrace;
+    public void setLogRetryAttempted(String logRetryAttempted) {
+        this.logRetryAttempted = logRetryAttempted;
     }
 
-    public Boolean getDisableRedelivery() {
-        return disableRedelivery;
+    public String getLogStackTrace() {
+        return logStackTrace;
     }
 
-    public void setDisableRedelivery(Boolean disableRedelivery) {
-        this.disableRedelivery = disableRedelivery;
+    public void setLogStackTrace(String logStackTrace) {
+        this.logStackTrace = logStackTrace;
     }
 
-    public Boolean isLogRetryStackTrace() {
+    public String getLogRetryStackTrace() {
         return logRetryStackTrace;
     }
 
-    public void setLogRetryStackTrace(Boolean logRetryStackTrace) {
+    public void setLogRetryStackTrace(String logRetryStackTrace) {
         this.logRetryStackTrace = logRetryStackTrace;
     }
 
-    public Boolean isLogHandled() {
+    public String getLogHandled() {
         return logHandled;
     }
 
-    public void setLogHandled(Boolean logHandled) {
+    public void setLogHandled(String logHandled) {
         this.logHandled = logHandled;
     }
 
-    public Boolean getLogContinued() {
+    public String getLogContinued() {
         return logContinued;
     }
 
-    public void setLogContinued(Boolean logContinued) {
+    public void setLogContinued(String logContinued) {
         this.logContinued = logContinued;
     }
 
-    public Boolean isLogRetryAttempted() {
-        return logRetryAttempted;
+    public String getLogExhausted() {
+        return logExhausted;
     }
 
-    public void setLogRetryAttempted(Boolean logRetryAttempted) {
-        this.logRetryAttempted = logRetryAttempted;
+    public void setLogExhausted(String logExhausted) {
+        this.logExhausted = logExhausted;
     }
 
-    public Boolean isLogExhausted() {
-        return logExhausted;
+    public String getDisableRedelivery() {
+        return disableRedelivery;
     }
 
-    public void setLogExhausted(Boolean logExhausted) {
-        this.logExhausted = logExhausted;
+    public void setDisableRedelivery(String disableRedelivery) {
+        this.disableRedelivery = disableRedelivery;
     }
 
     public String getDelayPattern() {

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java?rev=1070059&r1=1070058&r2=1070059&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/processor/RedeliveryErrorHandler.java
 Sat Feb 12 12:04:33 2011
@@ -517,7 +517,7 @@ public abstract class RedeliveryErrorHan
             data.continuedPredicate = exceptionPolicy.getContinuedPolicy();
             data.retryWhilePredicate = exceptionPolicy.getRetryWhilePolicy();
             data.useOriginalInMessage = exceptionPolicy.isUseOriginalMessage();
-            data.asyncDelayedRedelivery = 
exceptionPolicy.isAsyncDelayedRedelivery();
+            data.asyncDelayedRedelivery = 
exceptionPolicy.isAsyncDelayedRedelivery(exchange.getContext());
 
             // route specific failure handler?
             Processor processor = exceptionPolicy.getErrorHandler();

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java?rev=1070059&r1=1070058&r2=1070059&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/CamelContextHelper.java
 Sat Feb 12 12:04:33 2011
@@ -243,6 +243,31 @@ public final class CamelContextHelper {
     }
 
     /**
+     * Parses the given text and converts it to a Double and handling property 
placeholders as well
+     *
+     * @param camelContext the camel context
+     * @param text  the text
+     * @return the double vale, or <tt>null</tt> if the text was <tt>null</tt>
+     * @throws Exception is thrown if illegal argument or type conversion not 
possible
+     */
+    public static Double parseDouble(CamelContext camelContext, String text) 
throws Exception {
+        // ensure we support property placeholders
+        String s = camelContext.resolvePropertyPlaceholders(text);
+        if (s != null) {
+            try {
+                return 
camelContext.getTypeConverter().mandatoryConvertTo(Double.class, s);
+            } catch (NumberFormatException e) {
+                if (s.equals(text)) {
+                    throw new IllegalArgumentException("Error parsing [" + s + 
"] as an Integer.", e);
+                } else {
+                    throw new IllegalArgumentException("Error parsing [" + s + 
"] from property " + text + " as an Integer.", e);
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
      * Parses the given text and converts it to an Boolean and handling 
property placeholders as well
      *
      * @param camelContext the camel context

Copied: 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentOnExceptionTest.java
 (from r1070041, 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentRefTest.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentOnExceptionTest.java?p2=camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentOnExceptionTest.java&p1=camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentRefTest.java&r1=1070041&r2=1070059&rev=1070059&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentRefTest.java
 (original)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/component/properties/PropertiesComponentOnExceptionTest.java
 Sat Feb 12 12:04:33 2011
@@ -20,49 +20,46 @@ import java.util.Properties;
 
 import org.apache.camel.CamelContext;
 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;
 
 /**
  * @version $Revision$
  */
-public class PropertiesComponentRefTest extends ContextTestSupport {
+public class PropertiesComponentOnExceptionTest extends ContextTestSupport {
 
-    @Override
-    public boolean isUseRouteBuilder() {
-        return false;
-    }
-
-    public void testPropertiesComponent() throws Exception {
-        context.addRoutes(new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("{{start}}").to("properties:{{cool.result}}");
-            }
-        });
-        context.start();
-
-        getMockEndpoint("mock:result").expectedMessageCount(1);
-
-        template.sendBody("direct:start", "Hello World");
+    public void testPropertiesComponentOnException() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:dead");
+        mock.expectedMessageCount(1);
+        mock.message(0).header(Exchange.REDELIVERED).isEqualTo(true);
+        mock.message(0).header(Exchange.REDELIVERY_COUNTER).isEqualTo(3);
+
+        try {
+            template.sendBody("direct:start", "Hello World");
+            fail("Should throw exception");
+        } catch (Exception e) {
+            // expected
+        }
 
         assertMockEndpointsSatisfied();
     }
 
-    public void testPropertiesComponentLocationsOverride() throws Exception {
-        context.addRoutes(new RouteBuilder() {
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                
from("direct:start").to("properties:{{bar.end}}?locations=ref:coolBar");
-            }
-        });
-        context.start();
-
-        getMockEndpoint("mock:bar").expectedMessageCount(1);
+                onException(Exception.class)
+                    .redeliveryDelay("{{delay}}")
+                    .maximumRedeliveries("{{max}}")
+                    .to("mock:dead");
 
-        template.sendBody("direct:start", "Hello World");
-
-        assertMockEndpointsSatisfied();
+                from("direct:start")
+                    .throwException(new IllegalAccessException("Damn"));
+            }
+        };
     }
 
     @Override
@@ -70,15 +67,9 @@ public class PropertiesComponentRefTest 
         JndiRegistry jndi = super.createRegistry();
 
         Properties cool = new Properties();
-        cool.put("cool.end", "mock:end");
-        cool.put("cool.result", "mock:result");
-        cool.put("start", "direct:start");
-        jndi.bind("myCoolProperties", cool);
-
-        Properties bar = new Properties();
-        bar.put("bar.end", "mock:bar");
-        bar.put("dude", "direct:bar");
-        jndi.bind("coolBar", bar);
+        cool.put("delay", "25");
+        cool.put("max", "3");
+        jndi.bind("myprop", cool);
 
         return jndi;
     }
@@ -89,7 +80,7 @@ public class PropertiesComponentRefTest 
 
         PropertiesComponent pc = new PropertiesComponent();
         pc.setCamelContext(context);
-        pc.setLocations(new String[]{"ref:myCoolProperties"});
+        pc.setLocations(new String[]{"ref:myprop"});
         context.addComponent("properties", pc);
 
         return context;

Added: 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/java/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.java?rev=1070059&view=auto
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.java
 (added)
+++ 
camel/trunk/components/camel-spring/src/test/java/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.java
 Sat Feb 12 12:04:33 2011
@@ -0,0 +1,32 @@
+/**
+ * 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.component.properties;
+
+import org.apache.camel.CamelContext;
+
+import static 
org.apache.camel.spring.processor.SpringTestHelper.createSpringCamelContext;
+
+/**
+ * @version $Revision$
+ */
+public class SpringPropertiesComponentOnExceptionTest extends 
PropertiesComponentOnExceptionTest {
+
+    protected CamelContext createCamelContext() throws Exception {
+        return createSpringCamelContext(this, 
"org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.xml");
+    }
+
+}

Copied: 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.xml
 (from r1070041, 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentRefTest.xml)
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.xml?p2=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.xml&p1=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentRefTest.xml&r1=1070041&r2=1070059&rev=1070059&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentRefTest.xml
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/SpringPropertiesComponentOnExceptionTest.xml
 Sat Feb 12 12:04:33 2011
@@ -22,15 +22,22 @@
        http://camel.apache.org/schema/spring 
http://camel.apache.org/schema/spring/camel-spring.xsd
     ">
 
-    <bean id="coolProperties" 
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
-        <property name="location" 
value="classpath:org/apache/camel/component/properties/cheese.properties"/>
+    <bean id="damn" class="java.lang.IllegalArgumentException">
+        <constructor-arg index="0" value="Damn"/>
     </bean>
 
     <camelContext xmlns="http://camel.apache.org/schema/spring";>
-        <propertyPlaceholder id="properties" location="ref:coolProperties"/>
+        <propertyPlaceholder id="properties" 
location="org/apache/camel/component/properties/cheese.properties"/>
+
+        <onException>
+            <exception>java.lang.Exception</exception>
+            <redeliveryPolicy redeliveryDelay="{{delay}}" 
maximumRedeliveries="{{max}}"/>
+            <to uri="mock:dead"/>
+        </onException>
+
         <route>
             <from uri="direct:start"/>
-            <to uri="{{cool.end}}"/>
+            <throwException ref="damn"/>
         </route>
 
     </camelContext>

Modified: 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/cheese.properties
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/cheese.properties?rev=1070059&r1=1070058&r2=1070059&view=diff
==============================================================================
--- 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/cheese.properties
 (original)
+++ 
camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/component/properties/cheese.properties
 Sat Feb 12 12:04:33 2011
@@ -20,3 +20,6 @@ cool.bar=bar
 
 myCoolCharset=iso-8859-1
 slipDelimiter=##
+
+delay=25
+max=3
\ No newline at end of file


Reply via email to