You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/04/06 07:17:46 UTC

[camel] branch errorhandler-in-dsl updated (26e589ce3ed -> 223382ea7ff)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a change to branch errorhandler-in-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git


    from 26e589ce3ed CAMEL-16834: error handler in model DSL. WIP
     new 8a2798d74e3 CAMEL-16834: error handler in model DSL. WIP
     new fc3020a28e3 CAMEL-16834: error handler in model DSL. WIP
     new cbe1e9855fa CAMEL-16834: error handler in model DSL. WIP
     new 0ba443762bb CAMEL-16834: error handler in model DSL. WIP
     new 877da0ff1f2 CAMEL-16834: error handler in model DSL. WIP
     new b2c3e461055 CAMEL-16834: error handler in model DSL. WIP
     new c0e8cd88b1d CAMEL-16834: error handler in model DSL. WIP
     new 88d1ef09bd7 CAMEL-16834: error handler in model DSL. WIP
     new 223382ea7ff CAMEL-16834: error handler in model DSL. WIP

The 9 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../model/errorhandler/deadLetterChannel.json      |  26 +-
 .../model/errorhandler/defaultErrorHandler.json    |  24 +-
 .../errorhandler/transactionErrorHandler.json      |  31 +-
 .../org/apache/camel/model/redeliveryPolicy.json   |  24 +-
 .../org/apache/camel/builder/BuilderSupport.java   |  19 +-
 .../camel/builder/DeadLetterChannelBuilder.java    |   1 +
 .../camel/builder/ErrorHandlerBuilderRef.java      |   1 +
 .../camel/builder/NoErrorHandlerBuilder.java       |   1 +
 .../org/apache/camel/builder/RouteBuilder.java     |   1 +
 .../camel/model/RedeliveryPolicyDefinition.java    |  24 +-
 .../errorhandler/BaseErrorHandlerDefinition.java   |   3 +
 .../errorhandler/DeadLetterChannelDefinition.java  |  43 ++-
 .../errorhandler/DeadLetterChannelProperties.java  |   1 +
 .../DefaultErrorHandlerDefinition.java             | 403 ++++++++++++++++++++-
 .../DefaultErrorHandlerProperties.java             |   1 +
 .../errorhandler/ErrorHandlerRefProperties.java    |   1 +
 .../errorhandler/NoErrorHandlerDefinition.java     |  13 +-
 .../errorhandler/NoErrorHandlerProperties.java     |   1 +
 .../TransactionErrorHandlerDefinition.java         |  56 ++-
 .../errorhandler/DeadLetterChannelReifier.java     |   1 +
 .../errorhandler/DefaultErrorHandlerReifier.java   |   1 +
 .../errorhandler/ErrorHandlerRefReifier.java       |   1 +
 .../reifier/errorhandler/ErrorHandlerReifier.java  |  48 ++-
 .../errorhandler/NewDeadLetterChannelReifier.java  |   4 +-
 ...ier.java => NewDefaultErrorHandlerReifier.java} |  31 +-
 ...rReifier.java => NewNoErrorHandlerReifier.java} |  10 +-
 .../errorhandler/NoErrorHandlerReifier.java        |   1 +
 .../camel/builder/ContextErrorHandlerTest.java     |   8 +-
 .../ErrorHandlerRefPropertyPlaceholderTest.java    |   3 +-
 .../apache/camel/builder/ErrorHandlerRefTest.java  |   3 +-
 .../builder/RouteTemplateErrorHandlerTest.java     |   3 +-
 ...tScopedOnExceptionErrorHandlerRefIssueTest.java |   7 +-
 ...ExceptionErrorHandlerRefIssueTwoRoutesTest.java |   4 +-
 ...ScopedOnExceptionMultipleRouteBuildersTest.java |   4 +-
 ...xceptionNotHandledErrorHandlerRefIssueTest.java |   7 +-
 ...otHandledErrorHandlerRefIssueTwoRoutesTest.java |   7 +-
 ...HandledRouteScopedErrorHandlerRefIssueTest.java |   4 +-
 ...uteScopedErrorHandlerRefIssueTwoRoutesTest.java |   4 +-
 ...ceptionRouteScopedErrorHandlerRefIssueTest.java |   4 +-
 ...uteScopedErrorHandlerRefIssueTwoRoutesTest.java |   4 +-
 .../issues/OnExceptionContinuedIssueTest.java      |   5 +-
 .../OnExceptionErrorHandlerRefIssueTest.java       |   7 +-
 ...ExceptionErrorHandlerRefIssueTwoRoutesTest.java |   7 +-
 ...xceptionNotHandledErrorHandlerRefIssueTest.java |   7 +-
 ...otHandledErrorHandlerRefIssueTwoRoutesTest.java |   7 +-
 ...HandledRouteScopedErrorHandlerRefIssueTest.java |   4 +-
 ...uteScopedErrorHandlerRefIssueTwoRoutesTest.java |   4 +-
 ...ceptionRouteScopedErrorHandlerRefIssueTest.java |   4 +-
 ...uteScopedErrorHandlerRefIssueTwoRoutesTest.java |   4 +-
 ...ScopedOnExceptionMultipleRouteBuildersTest.java |   4 +-
 .../BodyOnlyAggregationStrategyTest.java           |   7 +-
 .../errorhandler/NewDeadLetterChannelTest.java     |   1 +
 .../java/org/apache/camel/xml/in/ModelParser.java  |   1 +
 53 files changed, 699 insertions(+), 196 deletions(-)
 copy core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/{NewDeadLetterChannelReifier.java => NewDefaultErrorHandlerReifier.java} (82%)
 copy core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/{NoErrorHandlerReifier.java => NewNoErrorHandlerReifier.java} (79%)


[camel] 06/09: CAMEL-16834: error handler in model DSL. WIP

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch errorhandler-in-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git

commit b2c3e4610553488451352ecde806f4d10eff3c27
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Apr 6 07:27:02 2022 +0200

    CAMEL-16834: error handler in model DSL. WIP
---
 .../apache/camel/reifier/errorhandler/DeadLetterChannelReifier.java   | 1 +
 .../apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java | 1 +
 .../org/apache/camel/reifier/errorhandler/ErrorHandlerRefReifier.java | 1 +
 .../org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java    | 4 ++--
 .../camel/reifier/errorhandler/NewDeadLetterChannelReifier.java       | 2 ++
 .../camel/reifier/errorhandler/NewDefaultErrorHandlerReifier.java     | 2 ++
 .../apache/camel/reifier/errorhandler/NewNoErrorHandlerReifier.java   | 2 ++
 .../org/apache/camel/reifier/errorhandler/NoErrorHandlerReifier.java  | 1 +
 8 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DeadLetterChannelReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DeadLetterChannelReifier.java
index 7fb4f12bd2a..9212ab9bc90 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DeadLetterChannelReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DeadLetterChannelReifier.java
@@ -28,6 +28,7 @@ import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.util.ObjectHelper;
 
+@Deprecated
 public class DeadLetterChannelReifier extends DefaultErrorHandlerReifier<DeadLetterChannelProperties> {
 
     public DeadLetterChannelReifier(Route route, ErrorHandlerFactory definition) {
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java
index 445b69ab887..400919a16a7 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/DefaultErrorHandlerReifier.java
@@ -28,6 +28,7 @@ import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.spi.ExecutorServiceManager;
 import org.apache.camel.spi.ThreadPoolProfile;
 
+@Deprecated
 public class DefaultErrorHandlerReifier<T extends DefaultErrorHandlerProperties> extends ErrorHandlerReifier<T> {
 
     public DefaultErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerRefReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerRefReifier.java
index 186773c63f0..e5fadb1b85e 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerRefReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerRefReifier.java
@@ -24,6 +24,7 @@ import org.apache.camel.model.errorhandler.ErrorHandlerHelper;
 import org.apache.camel.model.errorhandler.ErrorHandlerRefProperties;
 import org.apache.camel.util.ObjectHelper;
 
+@Deprecated
 public class ErrorHandlerRefReifier extends ErrorHandlerReifier<ErrorHandlerRefProperties> {
 
     public ErrorHandlerRefReifier(Route route, ErrorHandlerFactory definition) {
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
index e48f144ab9c..a29395d0e18 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
@@ -94,7 +94,7 @@ public abstract class ErrorHandlerReifier<T extends ErrorHandlerFactory> extends
     }
 
     private static ErrorHandlerReifier<? extends ErrorHandlerFactory> coreReifier(Route route, ErrorHandlerFactory definition) {
-        // TODO: legacy, should
+        // TODO: old which should be removed when new are working
         if (definition instanceof DeadLetterChannelProperties) {
             return new DeadLetterChannelReifier(route, definition);
         } else if (definition instanceof DefaultErrorHandlerProperties) {
@@ -112,7 +112,7 @@ public abstract class ErrorHandlerReifier<T extends ErrorHandlerFactory> extends
         } else if (definition instanceof NoErrorHandlerDefinition) {
             return new NewNoErrorHandlerReifier(route, definition);
         }
-        // TODO: ref properties?
+        // TODO: ref properties? used by spring
         //        } else if (definition instanceof ErrorHandlerRefProperties) {
         //            return new ErrorHandlerRefReifier(route, definition);
 
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDeadLetterChannelReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDeadLetterChannelReifier.java
index f1b4f5875ab..bb40161b46b 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDeadLetterChannelReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDeadLetterChannelReifier.java
@@ -37,6 +37,8 @@ import org.apache.camel.util.ObjectHelper;
 
 public class NewDeadLetterChannelReifier extends ErrorHandlerReifier<DeadLetterChannelDefinition> {
 
+    // TODO: Rename when working
+
     public NewDeadLetterChannelReifier(Route route, DeadLetterChannelDefinition definition) {
         super(route, definition);
     }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDefaultErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDefaultErrorHandlerReifier.java
index cbdb97c1862..265c2262c71 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDefaultErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDefaultErrorHandlerReifier.java
@@ -37,6 +37,8 @@ import org.apache.camel.spi.ThreadPoolProfile;
 
 public class NewDefaultErrorHandlerReifier extends ErrorHandlerReifier<DefaultErrorHandlerDefinition> {
 
+    // TODO: Rename when working
+
     public NewDefaultErrorHandlerReifier(Route route, DefaultErrorHandlerDefinition definition) {
         super(route, definition);
     }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewNoErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewNoErrorHandlerReifier.java
index d75640ecb87..94f89371c8e 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewNoErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewNoErrorHandlerReifier.java
@@ -25,6 +25,8 @@ import org.apache.camel.spi.ErrorHandler;
 
 public class NewNoErrorHandlerReifier extends ErrorHandlerReifier<NoErrorHandlerDefinition> {
 
+    // TODO: Rename when working
+
     public NewNoErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {
         super(route, (NoErrorHandlerDefinition) definition);
     }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NoErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NoErrorHandlerReifier.java
index 35d1ac5ae22..9d15013322a 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NoErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NoErrorHandlerReifier.java
@@ -23,6 +23,7 @@ import org.apache.camel.model.errorhandler.NoErrorHandlerProperties;
 import org.apache.camel.processor.errorhandler.NoErrorHandler;
 import org.apache.camel.spi.ErrorHandler;
 
+@Deprecated
 public class NoErrorHandlerReifier extends ErrorHandlerReifier<NoErrorHandlerProperties> {
 
     public NoErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {


[camel] 02/09: CAMEL-16834: error handler in model DSL. WIP

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch errorhandler-in-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git

commit fc3020a28e331fc086f49c74745960976e8be82d
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Apr 5 16:22:25 2022 +0200

    CAMEL-16834: error handler in model DSL. WIP
---
 .../org/apache/camel/model/redeliveryPolicy.json   | 24 ++++++++---------
 .../camel/model/RedeliveryPolicyDefinition.java    | 24 ++++++++---------
 .../errorhandler/DeadLetterChannelDefinition.java  | 18 +++++++++++++
 .../DefaultErrorHandlerDefinition.java             |  3 +++
 .../reifier/errorhandler/ErrorHandlerReifier.java  | 31 +++++++++++++---------
 5 files changed, 64 insertions(+), 36 deletions(-)

diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/redeliveryPolicy.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/redeliveryPolicy.json
index b4b43682a8a..d0475843b8f 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/redeliveryPolicy.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/redeliveryPolicy.json
@@ -13,28 +13,28 @@
   },
   "properties": {
     "maximumRedeliveries": { "kind": "attribute", "displayName": "Maximum Redeliveries", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum redeliveries x = redeliver at most x times 0 = no redeliveries -1 = redeliver forever" },
-    "redeliveryDelay": { "kind": "attribute", "displayName": "Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the initial redelivery delay" },
+    "redeliveryDelay": { "kind": "attribute", "displayName": "Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the initial redelivery delay" },
     "asyncDelayedRedelivery": { "kind": "attribute", "displayName": "Async Delayed Redelivery", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allow asynchronous delayed redelivery. The route, in particular the consumer's component, must support the Asynchronous Routing Engine (e.g. seda)." },
-    "backOffMultiplier": { "kind": "attribute", "displayName": "Back Off Multiplier", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the back off multiplier" },
+    "backOffMultiplier": { "kind": "attribute", "displayName": "Back Off Multiplier", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "2.0", "description": "Sets the back off multiplier" },
     "useExponentialBackOff": { "kind": "attribute", "displayName": "Use Exponential Back Off", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Turn on exponential backk off" },
-    "collisionAvoidanceFactor": { "kind": "attribute", "displayName": "Collision Avoidance Factor", "label": "advanced", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the collision avoidance factor" },
+    "collisionAvoidanceFactor": { "kind": "attribute", "displayName": "Collision Avoidance Factor", "label": "advanced", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "0.15", "description": "Sets the collision avoidance factor" },
     "useCollisionAvoidance": { "kind": "attribute", "displayName": "Use Collision Avoidance", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Turn on collision avoidance." },
-    "maximumRedeliveryDelay": { "kind": "attribute", "displayName": "Maximum Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum delay between redelivery" },
-    "retriesExhaustedLogLevel": { "kind": "attribute", "displayName": "Retries Exhausted Log Level", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the logging level to use when retries have been exhausted" },
-    "retryAttemptedLogLevel": { "kind": "attribute", "displayName": "Retry Attempted Log Level", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the logging level to use for logging retry attempts" },
-    "retryAttemptedLogInterval": { "kind": "attribute", "displayName": "Retry Attempted Log Interval", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the interval to use for logging retry attempts" },
-    "logRetryAttempted": { "kind": "attribute", "displayName": "Log Retry Attempted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether retry attempts should be logged or not. Can be used to include or reduce verbose." },
-    "logStackTrace": { "kind": "attribute", "displayName": "Log Stack Trace", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether stack traces should be logged. Can be used to include or reduce verbose." },
+    "maximumRedeliveryDelay": { "kind": "attribute", "displayName": "Maximum Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "60000", "description": "Sets the maximum delay between redelivery" },
+    "retriesExhaustedLogLevel": { "kind": "attribute", "displayName": "Retries Exhausted Log Level", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Sets the logging level to use when retries have been exhausted" },
+    "retryAttemptedLogLevel": { "kind": "attribute", "displayName": "Retry Attempted Log Level", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "DEBUG", "description": "Sets the logging level to use for logging retry attempts" },
+    "retryAttemptedLogInterval": { "kind": "attribute", "displayName": "Retry Attempted Log Interval", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1", "description": "Sets the interval to use for logging retry attempts" },
+    "logRetryAttempted": { "kind": "attribute", "displayName": "Log Retry Attempted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether retry attempts should be logged or not. Can be used to include or reduce verbose." },
+    "logStackTrace": { "kind": "attribute", "displayName": "Log Stack Trace", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether stack traces should be logged. Can be used to include or reduce verbose." },
     "logRetryStackTrace": { "kind": "attribute", "displayName": "Log Retry Stack Trace", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether stack traces should be logged when an retry attempt failed. Can be used to include or reduce verbose." },
     "logHandled": { "kind": "attribute", "displayName": "Log Handled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether handled exceptions should be logged or not. Can be used to include or reduce verbose." },
-    "logNewException": { "kind": "attribute", "displayName": "Log New Exception", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether new exceptions should be logged or not. Can be used to include or reduce verbose. A new exception is an exception that was thrown while handling a previous exception." },
+    "logNewException": { "kind": "attribute", "displayName": "Log New Exception", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether new exceptions should be logged or not. Can be used to include or reduce verbose. A new exception is an exception that was thrown while handling a previous exception." },
     "logContinued": { "kind": "attribute", "displayName": "Log Continued", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether continued exceptions should be logged or not. Can be used to include or reduce verbose." },
-    "logExhausted": { "kind": "attribute", "displayName": "Log Exhausted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted exceptions should be logged or not. Can be used to include or reduce verbose." },
+    "logExhausted": { "kind": "attribute", "displayName": "Log Exhausted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether exhausted exceptions should be logged or not. Can be used to include or reduce verbose." },
     "logExhaustedMessageHistory": { "kind": "attribute", "displayName": "Log Exhausted Message History", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted exceptions should be logged including message history or not (supports property placeholders). Can be used to include or reduce verbose." },
     "logExhaustedMessageBody": { "kind": "attribute", "displayName": "Log Exhausted Message Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted message body should be logged including message history or not (supports property placeholders). Can be used to include or reduce verbose. Requires logExhaustedMessageHistory to be  [...]
     "disableRedelivery": { "kind": "attribute", "displayName": "Disable Redelivery", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Disables redelivery (same as setting maximum redeliveries to 0)" },
     "delayPattern": { "kind": "attribute", "displayName": "Delay Pattern", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the delay pattern with delay intervals." },
-    "allowRedeliveryWhileStopping": { "kind": "attribute", "displayName": "Allow Redelivery While Stopping", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Controls whether to allow redelivery while stopping\/shutting down a route that uses error handling." },
+    "allowRedeliveryWhileStopping": { "kind": "attribute", "displayName": "Allow Redelivery While Stopping", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls whether to allow redelivery while stopping\/shutting down a route that uses error handling." },
     "exchangeFormatterRef": { "kind": "attribute", "displayName": "Exchange Formatter Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the reference of the instance of org.apache.camel.spi.ExchangeFormatter to generate the log message from exchange." }
   }
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java
index afdace5c24b..dfbc09903ad 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java
@@ -36,40 +36,40 @@ public class RedeliveryPolicyDefinition implements Cloneable {
     @Metadata(javaType = "java.lang.Integer")
     private String maximumRedeliveries;
     @XmlAttribute
-    @Metadata(javaType = "java.time.Duration")
+    @Metadata(javaType = "java.time.Duration", defaultValue = "1000")
     private String redeliveryDelay;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String asyncDelayedRedelivery;
     @XmlAttribute
-    @Metadata(javaType = "java.lang.Double")
+    @Metadata(javaType = "java.lang.Double", defaultValue = "2.0")
     private String backOffMultiplier;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String useExponentialBackOff;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Double")
+    @Metadata(label = "advanced", javaType = "java.lang.Double", defaultValue = "0.15")
     private String collisionAvoidanceFactor;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String useCollisionAvoidance;
     @XmlAttribute
-    @Metadata(javaType = "java.time.Duration")
+    @Metadata(javaType = "java.time.Duration", defaultValue = "60000")
     private String maximumRedeliveryDelay;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "org.apache.camel.LoggingLevel")
+    @Metadata(label = "advanced", javaType = "org.apache.camel.LoggingLevel", defaultValue = "ERROR")
     private String retriesExhaustedLogLevel;
     @XmlAttribute
-    @Metadata(javaType = "org.apache.camel.LoggingLevel")
+    @Metadata(javaType = "org.apache.camel.LoggingLevel", defaultValue = "DEBUG")
     private String retryAttemptedLogLevel;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Integer")
+    @Metadata(label = "advanced", javaType = "java.lang.Integer", defaultValue = "1")
     private String retryAttemptedLogInterval;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true")
     private String logRetryAttempted;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true")
     private String logStackTrace;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
@@ -78,13 +78,13 @@ public class RedeliveryPolicyDefinition implements Cloneable {
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String logHandled;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true")
     private String logNewException;
     @XmlAttribute
     @Metadata(javaType = "java.lang.Boolean")
     private String logContinued;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true")
     private String logExhausted;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
@@ -99,7 +99,7 @@ public class RedeliveryPolicyDefinition implements Cloneable {
     @Metadata(label = "advanced")
     private String delayPattern;
     @XmlAttribute
-    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true")
     private String allowRedeliveryWhileStopping;
     @XmlAttribute
     @Metadata(label = "advanced")
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java
index 75a01a5804e..b9cd738814f 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java
@@ -21,6 +21,7 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
 
+import org.apache.camel.Endpoint;
 import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.spi.Metadata;
 
@@ -40,6 +41,23 @@ public class DeadLetterChannelDefinition extends DefaultErrorHandlerDefinition {
     @Metadata(defaultValue = "true")
     private String deadLetterHandleNewException;
 
+    public DeadLetterChannelDefinition() {
+        // DLC do not log exhausted by default
+        getRedeliveryPolicy().setLogExhausted("false");
+    }
+
+    public DeadLetterChannelDefinition(Endpoint deadLetter) {
+        setDeadLetterUri(deadLetter.getEndpointUri());
+        // DLC do not log exhausted by default
+        getRedeliveryPolicy().setLogExhausted("false");
+    }
+
+    public DeadLetterChannelDefinition(String uri) {
+        setDeadLetterUri(uri);
+        // DLC do not log exhausted by default
+        getRedeliveryPolicy().setLogExhausted("false");
+    }
+
     public String getDeadLetterUri() {
         return deadLetterUri;
     }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java
index a2f3d918ed8..60501a5d008 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java
@@ -395,6 +395,9 @@ public class DefaultErrorHandlerDefinition extends BaseErrorHandlerDefinition im
     }
 
     public RedeliveryPolicyDefinition getRedeliveryPolicy() {
+        if (redeliveryPolicy == null) {
+            redeliveryPolicy = new RedeliveryPolicyDefinition();
+        }
         return redeliveryPolicy;
     }
 
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
index 4b163bdd563..400d45a6d48 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
@@ -261,35 +261,42 @@ public abstract class ErrorHandlerReifier<T extends ErrorHandlerFactory> extends
         }
         Map<RedeliveryOption, String> policy = new HashMap<>();
         setOption(policy, RedeliveryOption.maximumRedeliveries, definition.getMaximumRedeliveries());
-        setOption(policy, RedeliveryOption.redeliveryDelay, definition.getRedeliveryDelay());
+        setOption(policy, RedeliveryOption.redeliveryDelay, definition.getRedeliveryDelay(), "1000");
         setOption(policy, RedeliveryOption.asyncDelayedRedelivery, definition.getAsyncDelayedRedelivery());
-        setOption(policy, RedeliveryOption.backOffMultiplier, definition.getBackOffMultiplier());
+        setOption(policy, RedeliveryOption.backOffMultiplier, definition.getBackOffMultiplier(), "2");
         setOption(policy, RedeliveryOption.useExponentialBackOff, definition.getUseExponentialBackOff());
-        setOption(policy, RedeliveryOption.collisionAvoidanceFactor, definition.getCollisionAvoidanceFactor());
+        setOption(policy, RedeliveryOption.collisionAvoidanceFactor, definition.getCollisionAvoidanceFactor(), "0.15");
         setOption(policy, RedeliveryOption.useCollisionAvoidance, definition.getUseCollisionAvoidance());
-        setOption(policy, RedeliveryOption.maximumRedeliveryDelay, definition.getMaximumRedeliveryDelay());
-        setOption(policy, RedeliveryOption.retriesExhaustedLogLevel, definition.getRetriesExhaustedLogLevel());
-        setOption(policy, RedeliveryOption.retryAttemptedLogLevel, definition.getRetryAttemptedLogLevel());
-        setOption(policy, RedeliveryOption.retryAttemptedLogInterval, definition.getRetryAttemptedLogInterval());
-        setOption(policy, RedeliveryOption.logRetryAttempted, definition.getLogRetryAttempted());
-        setOption(policy, RedeliveryOption.logStackTrace, definition.getLogStackTrace());
+        setOption(policy, RedeliveryOption.maximumRedeliveryDelay, definition.getMaximumRedeliveryDelay(), "60000");
+        setOption(policy, RedeliveryOption.retriesExhaustedLogLevel, definition.getRetriesExhaustedLogLevel(), "ERROR");
+        setOption(policy, RedeliveryOption.retryAttemptedLogLevel, definition.getRetryAttemptedLogLevel(), "DEBUG");
+        setOption(policy, RedeliveryOption.retryAttemptedLogInterval, definition.getRetryAttemptedLogInterval(), "1");
+        setOption(policy, RedeliveryOption.logRetryAttempted, definition.getLogRetryAttempted(), "true");
+        setOption(policy, RedeliveryOption.logStackTrace, definition.getLogStackTrace(), "true");
         setOption(policy, RedeliveryOption.logRetryStackTrace, definition.getLogRetryStackTrace());
         setOption(policy, RedeliveryOption.logHandled, definition.getLogHandled());
-        setOption(policy, RedeliveryOption.logNewException, definition.getLogNewException());
+        setOption(policy, RedeliveryOption.logNewException, definition.getLogNewException(), "true");
         setOption(policy, RedeliveryOption.logContinued, definition.getLogContinued());
-        setOption(policy, RedeliveryOption.logExhausted, definition.getLogExhausted());
+        setOption(policy, RedeliveryOption.logExhausted, definition.getLogExhausted(), "true");
         setOption(policy, RedeliveryOption.logExhaustedMessageHistory, definition.getLogExhaustedMessageHistory());
         setOption(policy, RedeliveryOption.logExhaustedMessageBody, definition.getLogExhaustedMessageBody());
         setOption(policy, RedeliveryOption.disableRedelivery, definition.getDisableRedelivery());
         setOption(policy, RedeliveryOption.delayPattern, definition.getDelayPattern());
-        setOption(policy, RedeliveryOption.allowRedeliveryWhileStopping, definition.getAllowRedeliveryWhileStopping());
+        setOption(policy, RedeliveryOption.allowRedeliveryWhileStopping, definition.getAllowRedeliveryWhileStopping(), "true");
         setOption(policy, RedeliveryOption.exchangeFormatterRef, definition.getExchangeFormatterRef());
         return policy;
     }
 
     private static void setOption(Map<RedeliveryOption, String> policy, RedeliveryOption option, Object value) {
+        setOption(policy, option, value, null);
+    }
+
+    private static void setOption(
+            Map<RedeliveryOption, String> policy, RedeliveryOption option, Object value, Object defaultValue) {
         if (value != null) {
             policy.put(option, value.toString());
+        } else if (defaultValue != null) {
+            policy.put(option, defaultValue.toString());
         }
     }
 


[camel] 01/09: CAMEL-16834: error handler in model DSL. WIP

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch errorhandler-in-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 8a2798d74e3582034d34ab6fee73a2348d0f0347
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Apr 5 16:09:07 2022 +0200

    CAMEL-16834: error handler in model DSL. WIP
---
 .../errorhandler/DeadLetterChannelDefinition.java  |  21 +-
 .../DefaultErrorHandlerDefinition.java             | 382 ++++++++++++++++++++-
 2 files changed, 401 insertions(+), 2 deletions(-)

diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java
index b541bfa511f..75a01a5804e 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java
@@ -32,7 +32,6 @@ import org.apache.camel.spi.Metadata;
 @XmlAccessorType(XmlAccessType.FIELD)
 public class DeadLetterChannelDefinition extends DefaultErrorHandlerDefinition {
 
-    // TODO: fluent builders
     // TODO: label, java type, ref
 
     @XmlAttribute(required = true)
@@ -89,4 +88,24 @@ public class DeadLetterChannelDefinition extends DefaultErrorHandlerDefinition {
         super.cloneBuilder(other);
     }
 
+    /**
+     * Whether the dead letter channel should handle (and ignore) any new exception that may been thrown during sending
+     * the message to the dead letter endpoint.
+     * <p/>
+     * The default value is <tt>true</tt> which means any such kind of exception is handled and ignored. Set this to
+     * <tt>false</tt> to let the exception be propagated back on the {@link org.apache.camel.Exchange}. This can be used
+     * in situations where you use transactions, and want to use Camel's dead letter channel to deal with exceptions
+     * during routing, but if the dead letter channel itself fails because of a new exception being thrown, then by
+     * setting this to <tt>false</tt> the new exceptions is propagated back and set on the
+     * {@link org.apache.camel.Exchange}, which allows the transaction to detect the exception, and rollback.
+     *
+     * @param  handleNewException <tt>true</tt> to handle (and ignore), <tt>false</tt> to catch and propagated the
+     *                            exception on the {@link org.apache.camel.Exchange}
+     * @return                    the builder
+     */
+    public DefaultErrorHandlerDefinition deadLetterHandleNewException(boolean handleNewException) {
+        setDeadLetterHandleNewException(handleNewException ? "true" : "false");
+        return this;
+    }
+
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java
index 68e2ce03d5f..a2f3d918ed8 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java
@@ -25,14 +25,18 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlTransient;
 
+import org.apache.camel.Expression;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.model.RedeliveryPolicyDefinition;
+import org.apache.camel.processor.errorhandler.DefaultErrorHandler;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.spi.CamelLogger;
 import org.apache.camel.spi.Metadata;
+import org.apache.camel.support.ExpressionToPredicateAdapter;
+import org.slf4j.LoggerFactory;
 
 /**
  * Default error handler.
@@ -42,7 +46,6 @@ import org.apache.camel.spi.Metadata;
 @XmlAccessorType(XmlAccessType.FIELD)
 public class DefaultErrorHandlerDefinition extends BaseErrorHandlerDefinition implements ErrorHandlerBuilder {
 
-    // TODO: fluent builders
     // TODO: label, java type, ref
 
     @XmlTransient
@@ -401,4 +404,381 @@ public class DefaultErrorHandlerDefinition extends BaseErrorHandlerDefinition im
     public void setRedeliveryPolicy(RedeliveryPolicyDefinition redeliveryPolicy) {
         this.redeliveryPolicy = redeliveryPolicy;
     }
+
+    // Builder methods
+    // -------------------------------------------------------------------------
+    public DefaultErrorHandlerDefinition backOffMultiplier(double backOffMultiplier) {
+        getRedeliveryPolicy().backOffMultiplier(backOffMultiplier);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition collisionAvoidancePercent(double collisionAvoidancePercent) {
+        getRedeliveryPolicy().collisionAvoidancePercent(collisionAvoidancePercent);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition redeliveryDelay(long delay) {
+        getRedeliveryPolicy().redeliveryDelay(delay);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition delayPattern(String delayPattern) {
+        getRedeliveryPolicy().delayPattern(delayPattern);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition maximumRedeliveries(int maximumRedeliveries) {
+        getRedeliveryPolicy().maximumRedeliveries(maximumRedeliveries);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition disableRedelivery() {
+        getRedeliveryPolicy().maximumRedeliveries(0);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition maximumRedeliveryDelay(long maximumRedeliveryDelay) {
+        getRedeliveryPolicy().maximumRedeliveryDelay(maximumRedeliveryDelay);
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition useCollisionAvoidance() {
+        getRedeliveryPolicy().useCollisionAvoidance();
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition useExponentialBackOff() {
+        getRedeliveryPolicy().useExponentialBackOff();
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition retriesExhaustedLogLevel(LoggingLevel retriesExhaustedLogLevel) {
+        getRedeliveryPolicy().setRetriesExhaustedLogLevel(retriesExhaustedLogLevel.name());
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition retryAttemptedLogLevel(LoggingLevel retryAttemptedLogLevel) {
+        getRedeliveryPolicy().setRetryAttemptedLogLevel(retryAttemptedLogLevel.name());
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition retryAttemptedLogInterval(int retryAttemptedLogInterval) {
+        getRedeliveryPolicy().setRetryAttemptedLogInterval(String.valueOf(retryAttemptedLogInterval));
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logStackTrace(boolean logStackTrace) {
+        getRedeliveryPolicy().setLogStackTrace(logStackTrace ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logRetryStackTrace(boolean logRetryStackTrace) {
+        getRedeliveryPolicy().setLogRetryStackTrace(logRetryStackTrace ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logHandled(boolean logHandled) {
+        getRedeliveryPolicy().setLogHandled(logHandled ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logNewException(boolean logNewException) {
+        getRedeliveryPolicy().setLogNewException(logNewException ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logExhausted(boolean logExhausted) {
+        getRedeliveryPolicy().setLogExhausted(logExhausted ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logRetryAttempted(boolean logRetryAttempted) {
+        getRedeliveryPolicy().setLogRetryAttempted(logRetryAttempted ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logExhaustedMessageHistory(boolean logExhaustedMessageHistory) {
+        getRedeliveryPolicy().setLogExhaustedMessageHistory(logExhaustedMessageHistory ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition logExhaustedMessageBody(boolean logExhaustedMessageBody) {
+        getRedeliveryPolicy().setLogExhaustedMessageBody(logExhaustedMessageBody ? "true" : "false");
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition exchangeFormatterRef(String exchangeFormatterRef) {
+        getRedeliveryPolicy().setExchangeFormatterRef(exchangeFormatterRef);
+        return this;
+    }
+
+    /**
+     * Will allow asynchronous delayed redeliveries. The route, in particular the consumer's component, must support the
+     * Asynchronous Routing Engine (e.g. seda)
+     *
+     * @see    RedeliveryPolicy#setAsyncDelayedRedelivery(boolean)
+     * @return the builder
+     */
+    public DefaultErrorHandlerDefinition asyncDelayedRedelivery() {
+        getRedeliveryPolicy().setAsyncDelayedRedelivery("true");
+        return this;
+    }
+
+    /**
+     * Controls whether to allow redelivery while stopping/shutting down a route that uses error handling.
+     *
+     * @param  allowRedeliveryWhileStopping <tt>true</tt> to allow redelivery, <tt>false</tt> to reject redeliveries
+     * @return                              the builder
+     */
+    public DefaultErrorHandlerDefinition allowRedeliveryWhileStopping(boolean allowRedeliveryWhileStopping) {
+        getRedeliveryPolicy().setAllowRedeliveryWhileStopping(allowRedeliveryWhileStopping ? "true" : "false");
+        return this;
+    }
+
+    /**
+     * Sets the thread pool to be used for redelivery.
+     *
+     * @param  executorService the scheduled thread pool to use
+     * @return                 the builder.
+     */
+    public DefaultErrorHandlerDefinition executorService(ScheduledExecutorService executorService) {
+        setExecutorServiceBean(executorService);
+        return this;
+    }
+
+    /**
+     * Sets a reference to a thread pool to be used for redelivery.
+     *
+     * @param  ref reference to a scheduled thread pool
+     * @return     the builder.
+     */
+    public DefaultErrorHandlerDefinition executorServiceRef(String ref) {
+        setExecutorServiceRef(ref);
+        return this;
+    }
+
+    /**
+     * Sets the logger used for caught exceptions
+     *
+     * @param  logger the logger
+     * @return        the builder
+     */
+    public DefaultErrorHandlerDefinition logger(CamelLogger logger) {
+        setLoggerBean(logger);
+        return this;
+    }
+
+    /**
+     * Sets the logging level of exceptions caught
+     *
+     * @param  level the logging level
+     * @return       the builder
+     */
+    public DefaultErrorHandlerDefinition loggingLevel(LoggingLevel level) {
+        setLevel(level);
+        return this;
+    }
+
+    /**
+     * Sets the log used for caught exceptions
+     *
+     * @param  log the logger
+     * @return     the builder
+     */
+    public DefaultErrorHandlerDefinition log(org.slf4j.Logger log) {
+        if (loggerBean == null) {
+            loggerBean = new CamelLogger(LoggerFactory.getLogger(DefaultErrorHandler.class), LoggingLevel.ERROR);
+        }
+        loggerBean.setLog(log);
+        return this;
+    }
+
+    /**
+     * Sets the log used for caught exceptions
+     *
+     * @param  log the log name
+     * @return     the builder
+     */
+    public DefaultErrorHandlerDefinition log(String log) {
+        return log(LoggerFactory.getLogger(log));
+    }
+
+    /**
+     * Sets the log used for caught exceptions
+     *
+     * @param  log the log class
+     * @return     the builder
+     */
+    public DefaultErrorHandlerDefinition log(Class<?> log) {
+        return log(LoggerFactory.getLogger(log));
+    }
+
+    /**
+     * Sets a processor that should be processed <b>before</b> a redelivery attempt.
+     * <p/>
+     * Can be used to change the {@link org.apache.camel.Exchange} <b>before</b> its being redelivered.
+     *
+     * @param  processor the processor
+     * @return           the builder
+     */
+    public DefaultErrorHandlerDefinition onRedelivery(Processor processor) {
+        setOnRedeliveryProcessor(processor);
+        return this;
+    }
+
+    /**
+     * Sets a reference for the processor to use <b>before</b> a redelivery attempt.
+     *
+     * @param  onRedeliveryRef the processor's reference
+     * @return                 the builder
+     * @see                    #onRedelivery(Processor)
+     */
+    public DefaultErrorHandlerDefinition onRedeliveryRef(String onRedeliveryRef) {
+        setOnRedeliveryRef(onRedeliveryRef);
+        return this;
+    }
+
+    /**
+     * Sets the retry while expression.
+     * <p/>
+     * Will continue retrying until expression evaluates to <tt>false</tt>.
+     *
+     * @param  retryWhile expression that determines when to stop retrying
+     * @return            the builder
+     */
+    public DefaultErrorHandlerDefinition retryWhile(Expression retryWhile) {
+        setRetryWhilePredicate(ExpressionToPredicateAdapter.toPredicate(retryWhile));
+        return this;
+    }
+
+    public DefaultErrorHandlerDefinition retryWhileRef(String retryWhileRef) {
+        setRetryWhileRef(retryWhileRef);
+        return this;
+    }
+
+    /**
+     * Will use the original input {@link org.apache.camel.Message} (original body and headers) when an
+     * {@link org.apache.camel.Exchange} is moved to the dead letter queue.
+     * <p/>
+     * <b>Notice:</b> this only applies when all redeliveries attempt have failed and the
+     * {@link org.apache.camel.Exchange} is doomed for failure. <br/>
+     * Instead of using the current inprogress {@link org.apache.camel.Exchange} IN message we use the original IN
+     * message instead. This allows you to store the original input in the dead letter queue instead of the inprogress
+     * snapshot of the IN message. For instance if you route transform the IN body during routing and then failed. With
+     * the original exchange store in the dead letter queue it might be easier to manually re submit the
+     * {@link org.apache.camel.Exchange} again as the IN message is the same as when Camel received it. So you should be
+     * able to send the {@link org.apache.camel.Exchange} to the same input.
+     * <p/>
+     * The difference between useOriginalMessage and useOriginalBody is that the former includes both the original body
+     * and headers, where as the latter only includes the original body. You can use the latter to enrich the message
+     * with custom headers and include the original message body. The former wont let you do this, as its using the
+     * original message body and headers as they are. You cannot enable both useOriginalMessage and useOriginalBody.
+     * <p/>
+     * <b>Important:</b> The original input means the input message that are bounded by the current
+     * {@link org.apache.camel.spi.UnitOfWork}. An unit of work typically spans one route, or multiple routes if they
+     * are connected using internal endpoints such as direct or seda. When messages is passed via external endpoints
+     * such as JMS or HTTP then the consumer will create a new unit of work, with the message it received as input as
+     * the original input. Also some EIP patterns such as splitter, multicast, will create a new unit of work boundary
+     * for the messages in their sub-route (eg the split message); however these EIPs have an option named
+     * <tt>shareUnitOfWork</tt> which allows to combine with the parent unit of work in regard to error handling and
+     * therefore use the parent original message.
+     * <p/>
+     * By default this feature is off.
+     *
+     * @return the builder
+     * @see    #useOriginalBody()
+     */
+    public DefaultErrorHandlerDefinition useOriginalMessage() {
+        setUseOriginalMessage("true");
+        return this;
+    }
+
+    /**
+     * Will use the original input {@link org.apache.camel.Message} body (original body only) when an
+     * {@link org.apache.camel.Exchange} is moved to the dead letter queue.
+     * <p/>
+     * <b>Notice:</b> this only applies when all redeliveries attempt have failed and the
+     * {@link org.apache.camel.Exchange} is doomed for failure. <br/>
+     * Instead of using the current inprogress {@link org.apache.camel.Exchange} IN message we use the original IN
+     * message instead. This allows you to store the original input in the dead letter queue instead of the inprogress
+     * snapshot of the IN message. For instance if you route transform the IN body during routing and then failed. With
+     * the original exchange store in the dead letter queue it might be easier to manually re submit the
+     * {@link org.apache.camel.Exchange} again as the IN message is the same as when Camel received it. So you should be
+     * able to send the {@link org.apache.camel.Exchange} to the same input.
+     * <p/>
+     * The difference between useOriginalMessage and useOriginalBody is that the former includes both the original body
+     * and headers, where as the latter only includes the original body. You can use the latter to enrich the message
+     * with custom headers and include the original message body. The former wont let you do this, as its using the
+     * original message body and headers as they are. You cannot enable both useOriginalMessage and useOriginalBody.
+     * <p/>
+     * <b>Important:</b> The original input means the input message that are bounded by the current
+     * {@link org.apache.camel.spi.UnitOfWork}. An unit of work typically spans one route, or multiple routes if they
+     * are connected using internal endpoints such as direct or seda. When messages is passed via external endpoints
+     * such as JMS or HTTP then the consumer will create a new unit of work, with the message it received as input as
+     * the original input. Also some EIP patterns such as splitter, multicast, will create a new unit of work boundary
+     * for the messages in their sub-route (eg the split message); however these EIPs have an option named
+     * <tt>shareUnitOfWork</tt> which allows to combine with the parent unit of work in regard to error handling and
+     * therefore use the parent original message.
+     * <p/>
+     * By default this feature is off.
+     *
+     * @return the builder
+     * @see    #useOriginalMessage()
+     */
+    public DefaultErrorHandlerDefinition useOriginalBody() {
+        setUseOriginalBody("true");
+        return this;
+    }
+
+    /**
+     * Sets a custom {@link org.apache.camel.Processor} to prepare the {@link org.apache.camel.Exchange} before handled
+     * by the failure processor / dead letter channel. This allows for example to enrich the message before sending to a
+     * dead letter queue.
+     *
+     * @param  processor the processor
+     * @return           the builder
+     */
+    public DefaultErrorHandlerDefinition onPrepareFailure(Processor processor) {
+        setOnPrepareFailureProcessor(processor);
+        return this;
+    }
+
+    /**
+     * Sets a reference for the processor to use before handled by the failure processor.
+     *
+     * @param  onPrepareFailureRef the processor's reference
+     * @return                     the builder
+     * @see                        #onPrepareFailure(Processor)
+     */
+    public DefaultErrorHandlerDefinition onPrepareFailureRef(String onPrepareFailureRef) {
+        setOnPrepareFailureRef(onPrepareFailureRef);
+        return this;
+    }
+
+    /**
+     * Sets a custom {@link org.apache.camel.Processor} to process the {@link org.apache.camel.Exchange} just after an
+     * exception was thrown. This allows to execute the processor at the same time the exception was thrown.
+     * <p/>
+     * Important: Any exception thrown from this processor will be ignored.
+     *
+     * @param  processor the processor
+     * @return           the builder
+     */
+    public DefaultErrorHandlerDefinition onExceptionOccurred(Processor processor) {
+        setOnExceptionOccurredProcessor(processor);
+        return this;
+    }
+
+    /**
+     * Sets a reference for the processor to use just after an exception was thrown.
+     *
+     * @param  onExceptionOccurredRef the processor's reference
+     * @return                        the builder
+     * @see                           #onExceptionOccurred(Processor)
+     */
+    public DefaultErrorHandlerDefinition onExceptionOccurredRef(String onExceptionOccurredRef) {
+        setOnExceptionOccurredRef(onExceptionOccurredRef);
+        return this;
+    }
+
 }


[camel] 05/09: CAMEL-16834: error handler in model DSL. WIP

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch errorhandler-in-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 877da0ff1f2f0618391aaed7a5de63f30ee72b8a
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Apr 6 07:22:32 2022 +0200

    CAMEL-16834: error handler in model DSL. WIP
---
 .../apache/camel/reifier/errorhandler/NewDeadLetterChannelReifier.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDeadLetterChannelReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDeadLetterChannelReifier.java
index e62d4113e2d..f1b4f5875ab 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDeadLetterChannelReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDeadLetterChannelReifier.java
@@ -53,7 +53,7 @@ public class NewDeadLetterChannelReifier extends ErrorHandlerReifier<DeadLetterC
 
         DeadLetterChannel answer = new DeadLetterChannel(
                 camelContext, processor, logger,
-                getProcessor(definition.getOnRedeliveryProcessor(), definition.getRedeliveryPolicyRef()),
+                getProcessor(definition.getOnRedeliveryProcessor(), definition.getOnRedeliveryRef()),
                 redeliveryPolicy, deadLetterProcessor,
                 definition.getDeadLetterUri(),
                 parseBoolean(definition.getDeadLetterHandleNewException(), true),


[camel] 03/09: CAMEL-16834: error handler in model DSL. WIP

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch errorhandler-in-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git

commit cbe1e9855faf6fee0b1c38dd31c51027ef0ab487
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Apr 5 18:31:05 2022 +0200

    CAMEL-16834: error handler in model DSL. WIP
---
 .../errorhandler/DeadLetterChannelProperties.java  |   1 +
 .../DefaultErrorHandlerProperties.java             |   1 +
 .../errorhandler/ErrorHandlerRefProperties.java    |   1 +
 .../errorhandler/NoErrorHandlerProperties.java     |   1 +
 .../reifier/errorhandler/ErrorHandlerReifier.java  |  17 +--
 .../NewDefaultErrorHandlerReifier.java             | 134 +++++++++++++++++++++
 .../errorhandler/NewNoErrorHandlerReifier.java}    |  26 ++--
 .../errorhandler/NewDeadLetterChannelTest.java     |   1 +
 8 files changed, 165 insertions(+), 17 deletions(-)

diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelProperties.java
index 8ce8e0483e9..3996624619e 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelProperties.java
@@ -19,6 +19,7 @@ package org.apache.camel.model.errorhandler;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Predicate;
 
+@Deprecated
 public interface DeadLetterChannelProperties extends DefaultErrorHandlerProperties {
 
     // has no additional configurations
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerProperties.java
index 4688c8c1f1c..ba2d352faf2 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerProperties.java
@@ -24,6 +24,7 @@ import org.apache.camel.Processor;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
 import org.apache.camel.spi.CamelLogger;
 
+@Deprecated
 public interface DefaultErrorHandlerProperties extends ErrorHandlerFactory {
 
     boolean hasLogger();
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
index d9ce7801c96..e1a57a28bf1 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
@@ -18,6 +18,7 @@ package org.apache.camel.model.errorhandler;
 
 import org.apache.camel.ErrorHandlerFactory;
 
+@Deprecated
 public interface ErrorHandlerRefProperties extends ErrorHandlerFactory {
 
     String DEFAULT_ERROR_HANDLER_BUILDER = "CamelDefaultErrorHandlerBuilder";
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java
index babb993df96..94a9ee886f6 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerProperties.java
@@ -18,6 +18,7 @@ package org.apache.camel.model.errorhandler;
 
 import org.apache.camel.ErrorHandlerFactory;
 
+@Deprecated
 public interface NoErrorHandlerProperties extends ErrorHandlerFactory {
 
     // no configuration
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
index 400d45a6d48..e48f144ab9c 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java
@@ -36,8 +36,10 @@ import org.apache.camel.model.OnExceptionDefinition;
 import org.apache.camel.model.RedeliveryPolicyDefinition;
 import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.model.errorhandler.DeadLetterChannelProperties;
+import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
 import org.apache.camel.model.errorhandler.DefaultErrorHandlerProperties;
 import org.apache.camel.model.errorhandler.ErrorHandlerRefProperties;
+import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
 import org.apache.camel.model.errorhandler.NoErrorHandlerProperties;
 import org.apache.camel.processor.errorhandler.ErrorHandlerSupport;
 import org.apache.camel.processor.errorhandler.ExceptionPolicy;
@@ -92,6 +94,7 @@ public abstract class ErrorHandlerReifier<T extends ErrorHandlerFactory> extends
     }
 
     private static ErrorHandlerReifier<? extends ErrorHandlerFactory> coreReifier(Route route, ErrorHandlerFactory definition) {
+        // TODO: legacy, should
         if (definition instanceof DeadLetterChannelProperties) {
             return new DeadLetterChannelReifier(route, definition);
         } else if (definition instanceof DefaultErrorHandlerProperties) {
@@ -104,14 +107,14 @@ public abstract class ErrorHandlerReifier<T extends ErrorHandlerFactory> extends
 
         if (definition instanceof DeadLetterChannelDefinition) {
             return new NewDeadLetterChannelReifier(route, (DeadLetterChannelDefinition) definition);
-            //        } else if (definition instanceof DefaultErrorHandlerDefinition) {
-            //            return new DefaultErrorHandlerReifier<>(route, definition);
-            // TODO: ref properties?
-            //        } else if (definition instanceof ErrorHandlerRefProperties) {
-            //            return new ErrorHandlerRefReifier(route, definition);
-            //        } else if (definition instanceof NoErrorHandlerDefinition) {
-            //            return new NoErrorHandlerReifier(route, definition);
+        } else if (definition instanceof DefaultErrorHandlerDefinition) {
+            return new NewDefaultErrorHandlerReifier(route, (DefaultErrorHandlerDefinition) definition);
+        } else if (definition instanceof NoErrorHandlerDefinition) {
+            return new NewNoErrorHandlerReifier(route, definition);
         }
+        // TODO: ref properties?
+        //        } else if (definition instanceof ErrorHandlerRefProperties) {
+        //            return new ErrorHandlerRefReifier(route, definition);
 
         return null;
     }
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDefaultErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDefaultErrorHandlerReifier.java
new file mode 100644
index 00000000000..cbdb97c1862
--- /dev/null
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewDefaultErrorHandlerReifier.java
@@ -0,0 +1,134 @@
+/*
+ * 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.reifier.errorhandler;
+
+import java.util.concurrent.ScheduledExecutorService;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Predicate;
+import org.apache.camel.Processor;
+import org.apache.camel.Route;
+import org.apache.camel.model.RedeliveryPolicyDefinition;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
+import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
+import org.apache.camel.processor.FatalFallbackErrorHandler;
+import org.apache.camel.processor.SendProcessor;
+import org.apache.camel.processor.errorhandler.DefaultErrorHandler;
+import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
+import org.apache.camel.spi.CamelLogger;
+import org.apache.camel.spi.ExecutorServiceManager;
+import org.apache.camel.spi.Language;
+import org.apache.camel.spi.ThreadPoolProfile;
+
+public class NewDefaultErrorHandlerReifier extends ErrorHandlerReifier<DefaultErrorHandlerDefinition> {
+
+    public NewDefaultErrorHandlerReifier(Route route, DefaultErrorHandlerDefinition definition) {
+        super(route, definition);
+    }
+
+    @Override
+    public Processor createErrorHandler(Processor processor) throws Exception {
+        // optimize to use shared default instance if using out of the box settings
+
+        RedeliveryPolicy redeliveryPolicy = resolveRedeliveryPolicy(definition, camelContext);
+        CamelLogger logger = resolveLogger(definition, camelContext);
+
+        DefaultErrorHandler answer = new DefaultErrorHandler(
+                camelContext, processor, logger,
+                getProcessor(definition.getOnRedeliveryProcessor(), definition.getOnRedeliveryRef()),
+                redeliveryPolicy,
+                getPredicate(definition.getRetryWhilePredicate(), definition.getRetryWhileRef()),
+                getExecutorService(definition.getExecutorServiceBean(), definition.getExecutorServiceRef()),
+                getProcessor(definition.getOnPrepareFailureProcessor(), definition.getOnPrepareFailureRef()),
+                getProcessor(definition.getOnExceptionOccurredProcessor(), definition.getOnExceptionOccurredRef()));
+        // configure error handler before we can use it
+        configure(answer);
+        return answer;
+    }
+
+    private Predicate resolveRetryWhilePolicy(DeadLetterChannelDefinition definition, CamelContext camelContext) {
+        Predicate answer = definition.getRetryWhilePredicate();
+
+        if (answer == null && definition.getRetryWhileRef() != null) {
+            // it is a bean expression
+            Language bean = camelContext.resolveLanguage("bean");
+            answer = bean.createPredicate(definition.getRetryWhileRef());
+            answer.initPredicate(camelContext);
+        }
+
+        return answer;
+    }
+
+    private CamelLogger resolveLogger(DefaultErrorHandlerDefinition definition, CamelContext camelContext) {
+        CamelLogger answer = definition.getLoggerBean();
+        if (answer == null && definition.getLoggerRef() != null) {
+            answer = mandatoryLookup(definition.getLoggerRef(), CamelLogger.class);
+        }
+        return answer;
+    }
+
+    private Processor createDeadLetterChannelProcessor(String uri) {
+        // wrap in our special safe fallback error handler if sending to
+        // dead letter channel fails
+        Processor child = new SendProcessor(camelContext.getEndpoint(uri), ExchangePattern.InOnly);
+        // force MEP to be InOnly so when sending to DLQ we would not expect
+        // a reply if the MEP was InOut
+        return new FatalFallbackErrorHandler(child, true);
+    }
+
+    private RedeliveryPolicy resolveRedeliveryPolicy(DefaultErrorHandlerDefinition definition, CamelContext camelContext) {
+        RedeliveryPolicy answer = null;
+        RedeliveryPolicyDefinition def = definition.getRedeliveryPolicy();
+        if (def != null) {
+            answer = ErrorHandlerReifier.createRedeliveryPolicy(def, camelContext, null);
+        }
+        if (def == null && definition.getRedeliveryPolicyRef() != null) {
+            answer = mandatoryLookup(definition.getRedeliveryPolicyRef(), RedeliveryPolicy.class);
+        }
+        if (answer == null) {
+            answer = RedeliveryPolicy.DEFAULT_POLICY;
+        }
+        return answer;
+    }
+
+    protected synchronized ScheduledExecutorService getExecutorService(
+            ScheduledExecutorService executorService, String executorServiceRef) {
+        if (executorService == null || executorService.isShutdown()) {
+            // camel context will shutdown the executor when it shutdown so no
+            // need to shut it down when stopping
+            if (executorServiceRef != null) {
+                executorService = lookupByNameAndType(executorServiceRef, ScheduledExecutorService.class);
+                if (executorService == null) {
+                    ExecutorServiceManager manager = camelContext.getExecutorServiceManager();
+                    ThreadPoolProfile profile = manager.getThreadPoolProfile(executorServiceRef);
+                    executorService = manager.newScheduledThreadPool(this, executorServiceRef, profile);
+                }
+                if (executorService == null) {
+                    throw new IllegalArgumentException("ExecutorService " + executorServiceRef + " not found in registry.");
+                }
+            } else {
+                // no explicit configured thread pool, so leave it up to the
+                // error handler to decide if it need a default thread pool from
+                // CamelContext#getErrorHandlerExecutorService
+                executorService = null;
+            }
+        }
+        return executorService;
+    }
+
+}
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewNoErrorHandlerReifier.java
similarity index 53%
copy from core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
copy to core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewNoErrorHandlerReifier.java
index d9ce7801c96..d75640ecb87 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/ErrorHandlerRefProperties.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/NewNoErrorHandlerReifier.java
@@ -14,19 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.model.errorhandler;
+package org.apache.camel.reifier.errorhandler;
 
 import org.apache.camel.ErrorHandlerFactory;
+import org.apache.camel.Processor;
+import org.apache.camel.Route;
+import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
+import org.apache.camel.processor.errorhandler.NoErrorHandler;
+import org.apache.camel.spi.ErrorHandler;
 
-public interface ErrorHandlerRefProperties extends ErrorHandlerFactory {
+public class NewNoErrorHandlerReifier extends ErrorHandlerReifier<NoErrorHandlerDefinition> {
 
-    String DEFAULT_ERROR_HANDLER_BUILDER = "CamelDefaultErrorHandlerBuilder";
+    public NewNoErrorHandlerReifier(Route route, ErrorHandlerFactory definition) {
+        super(route, (NoErrorHandlerDefinition) definition);
+    }
 
-    String getRef();
-
-    void setRef(String ref);
-
-    boolean isSupportTransacted();
-
-    void setSupportTransacted(boolean supportTransacted);
+    @Override
+    public Processor createErrorHandler(Processor processor) throws Exception {
+        ErrorHandler answer = new NoErrorHandler(processor);
+        configure(answer);
+        return answer;
+    }
 }
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/errorhandler/NewDeadLetterChannelTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/errorhandler/NewDeadLetterChannelTest.java
index 2379ac835f8..6c65af6aa6f 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/errorhandler/NewDeadLetterChannelTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/errorhandler/NewDeadLetterChannelTest.java
@@ -21,6 +21,7 @@ import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.junit.jupiter.api.Test;
 
+@Deprecated
 public class NewDeadLetterChannelTest extends ContextTestSupport {
 
     @Test


[camel] 07/09: CAMEL-16834: error handler in model DSL. WIP

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch errorhandler-in-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git

commit c0e8cd88b1d4d4eba77c4eb9c64610d5c60daeb0
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Apr 6 08:00:54 2022 +0200

    CAMEL-16834: error handler in model DSL. WIP
---
 .../model/errorhandler/deadLetterChannel.json      | 26 +++++-----
 .../model/errorhandler/defaultErrorHandler.json    | 24 +++++-----
 .../errorhandler/transactionErrorHandler.json      | 29 +++++------
 .../errorhandler/BaseErrorHandlerDefinition.java   |  3 ++
 .../errorhandler/DeadLetterChannelDefinition.java  |  4 +-
 .../DefaultErrorHandlerDefinition.java             | 18 ++++---
 .../TransactionErrorHandlerDefinition.java         | 56 +++++++++++++++++++---
 .../java/org/apache/camel/xml/in/ModelParser.java  |  1 +
 8 files changed, 106 insertions(+), 55 deletions(-)

diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/deadLetterChannel.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/deadLetterChannel.json
index 276e0f1e050..dc4e2e492fe 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/deadLetterChannel.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/deadLetterChannel.json
@@ -13,19 +13,19 @@
   },
   "properties": {
     "deadLetterUri": { "kind": "attribute", "displayName": "Dead Letter Uri", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The dead letter endpoint uri for the Dead Letter error handler." },
-    "deadLetterHandleNewException": { "kind": "attribute", "displayName": "Dead Letter Handle New Exception", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "true", "description": "Whether the dead letter channel should handle (and ignore) any new exception that may been thrown during sending the message to the dead letter endpoint. The default value is true which means any such kind of except [...]
-    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
-    "level": { "kind": "attribute", "displayName": "Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
-    "rollbackLoggingLevel": { "kind": "attribute", "displayName": "Rollback Logging Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "WARN", "description": "Sets the logging level to use for logging transactional rollback. This option is default WARN." },
-    "logName": { "kind": "attribute", "displayName": "Log Name", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
-    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and the org.apache [...]
-    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and the org.apache.camel.E [...]
-    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
-    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown from this processor will be ign [...]
-    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
-    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
-    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
-    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
+    "deadLetterHandleNewException": { "kind": "attribute", "displayName": "Dead Letter Handle New Exception", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the dead letter channel should handle (and ignore) any new exception that may been thrown during sending the message to the dead letter endpoint. The default value is true which means an [...]
+    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
+    "level": { "kind": "attribute", "displayName": "Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
+    "rollbackLoggingLevel": { "kind": "attribute", "displayName": "Rollback Logging Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "WARN", "description": "Sets the logging level to use for logging transactional rollback. This option is default WARN." },
+    "logName": { "kind": "attribute", "displayName": "Log Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
+    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have fail [...]
+    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and t [...]
+    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
+    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown  [...]
+    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
+    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
+    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.errorhandler.RedeliveryPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
+    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
     "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the redelivery settings" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/defaultErrorHandler.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/defaultErrorHandler.json
index b005124e34d..f696e9581b9 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/defaultErrorHandler.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/defaultErrorHandler.json
@@ -12,18 +12,18 @@
     "output": false
   },
   "properties": {
-    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
-    "level": { "kind": "attribute", "displayName": "Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
-    "rollbackLoggingLevel": { "kind": "attribute", "displayName": "Rollback Logging Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "WARN", "description": "Sets the logging level to use for logging transactional rollback. This option is default WARN." },
-    "logName": { "kind": "attribute", "displayName": "Log Name", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
-    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and the org.apache [...]
-    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and the org.apache.camel.E [...]
-    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
-    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown from this processor will be ign [...]
-    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
-    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
-    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
-    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
+    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
+    "level": { "kind": "attribute", "displayName": "Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
+    "rollbackLoggingLevel": { "kind": "attribute", "displayName": "Rollback Logging Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "WARN", "description": "Sets the logging level to use for logging transactional rollback. This option is default WARN." },
+    "logName": { "kind": "attribute", "displayName": "Log Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
+    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have fail [...]
+    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and t [...]
+    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
+    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown  [...]
+    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
+    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
+    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.errorhandler.RedeliveryPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
+    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
     "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the redelivery settings" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
   }
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json
index 5ead1d35c39..f9f7610902a 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json
@@ -12,20 +12,21 @@
     "output": false
   },
   "properties": {
-    "transactionTemplateRef": { "kind": "attribute", "displayName": "Transaction Template Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to the spring transaction template to use." },
-    "transactionManagerRef": { "kind": "attribute", "displayName": "Transaction Manager Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to the spring platform transaction manager to use." },
-    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
-    "level": { "kind": "attribute", "displayName": "Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
-    "rollbackLoggingLevel": { "kind": "attribute", "displayName": "Rollback Logging Level", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "WARN", "description": "Sets the logging level to use for logging transactional rollback. This option is default WARN." },
-    "logName": { "kind": "attribute", "displayName": "Log Name", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
-    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and the org.apache [...]
-    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and the org.apache.camel.E [...]
-    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
-    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown from this processor will be ign [...]
-    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
-    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
-    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
-    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
+    "transactedPolicy": { "kind": "attribute", "displayName": "Transacted Policy", "required": false, "type": "object", "javaType": "org.apache.camel.spi.TransactedPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "The transacted policy to use that is configured for either Spring or JTA based transactions." },
+    "transactionTemplateRef": { "kind": "attribute", "displayName": "Transaction Template Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to the spring transaction template (org.springframework.transaction.support.TransactionTemplate) to use." },
+    "transactionManagerRef": { "kind": "attribute", "displayName": "Transaction Manager Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to the spring platform transaction manager (org.springframework.transaction.PlatformTransactionManager) to use." },
+    "loggerRef": { "kind": "attribute", "displayName": "Logger Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "References to a logger to use as logger for the error handler" },
+    "level": { "kind": "attribute", "displayName": "Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Logging level to use when using the logging error handler type." },
+    "rollbackLoggingLevel": { "kind": "attribute", "displayName": "Rollback Logging Level", "label": "advanced", "required": false, "type": "enum", "javaType": "org.apache.camel.LoggingLevel", "enum": [ "debug", "error", "info", "off", "trace", "warn" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "WARN", "description": "Sets the logging level to use for logging transactional rollback. This option is default WARN." },
+    "logName": { "kind": "attribute", "displayName": "Log Name", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Name of the logger to use for the logging error handler" },
+    "useOriginalMessage": { "kind": "attribute", "displayName": "Use Original Message", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message (original body and headers) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have fail [...]
+    "useOriginalBody": { "kind": "attribute", "displayName": "Use Original Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Will use the original input org.apache.camel.Message body (original body only) when an org.apache.camel.Exchange is moved to the dead letter queue. Notice: this only applies when all redeliveries attempt have failed and t [...]
+    "onRedeliveryRef": { "kind": "attribute", "displayName": "On Redelivery Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed before a redelivery attempt. Can be used to change the org.apache.camel.Exchange before its being redelivered." },
+    "onExceptionOccurredRef": { "kind": "attribute", "displayName": "On Exception Occurred Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor that should be processed just after an exception occurred. Can be used to perform custom logging about the occurred exception at the exact time it happened. Important: Any exception thrown  [...]
+    "onPrepareFailureRef": { "kind": "attribute", "displayName": "On Prepare Failure Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a processor to prepare the org.apache.camel.Exchange before handled by the failure processor \/ dead letter channel. This allows for example to enrich the message before sending to a dead letter queue." },
+    "retryWhileRef": { "kind": "attribute", "displayName": "Retry While Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a retry while predicate. Will continue retrying until the predicate evaluates to false." },
+    "redeliveryPolicyRef": { "kind": "attribute", "displayName": "Redelivery Policy Ref", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.processor.errorhandler.RedeliveryPolicy", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a RedeliveryPolicy to be used for redelivery settings." },
+    "executorServiceRef": { "kind": "attribute", "displayName": "Executor Service Ref", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.concurrent.ScheduledExecutorService", "deprecated": false, "autowired": false, "secret": false, "description": "Sets a reference to a thread pool to be used by the error handler" },
     "redeliveryPolicy": { "kind": "element", "displayName": "Redelivery Policy", "required": false, "type": "object", "javaType": "org.apache.camel.model.RedeliveryPolicyDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the redelivery settings" },
     "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }
   }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/BaseErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/BaseErrorHandlerDefinition.java
index 5e5343811bf..58ca5986d62 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/BaseErrorHandlerDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/BaseErrorHandlerDefinition.java
@@ -19,6 +19,9 @@ package org.apache.camel.model.errorhandler;
 import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.model.IdentifiedType;
 
+/**
+ * Base class for error handler models.
+ */
 public abstract class BaseErrorHandlerDefinition extends IdentifiedType implements ErrorHandlerFactory {
 
 }
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java
index b9cd738814f..bdeafcdc0a3 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java
@@ -33,12 +33,10 @@ import org.apache.camel.spi.Metadata;
 @XmlAccessorType(XmlAccessType.FIELD)
 public class DeadLetterChannelDefinition extends DefaultErrorHandlerDefinition {
 
-    // TODO: label, java type, ref
-
     @XmlAttribute(required = true)
     private String deadLetterUri;
     @XmlAttribute
-    @Metadata(defaultValue = "true")
+    @Metadata(label = "advanced", defaultValue = "true", javaType = "java.lang.Boolean")
     private String deadLetterHandleNewException;
 
     public DeadLetterChannelDefinition() {
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java
index 60501a5d008..c65787f28f8 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java
@@ -46,8 +46,6 @@ import org.slf4j.LoggerFactory;
 @XmlAccessorType(XmlAccessType.FIELD)
 public class DefaultErrorHandlerDefinition extends BaseErrorHandlerDefinition implements ErrorHandlerBuilder {
 
-    // TODO: label, java type, ref
-
     @XmlTransient
     private CamelLogger loggerBean;
     @XmlTransient
@@ -62,32 +60,40 @@ public class DefaultErrorHandlerDefinition extends BaseErrorHandlerDefinition im
     private Predicate retryWhilePredicate;
 
     @XmlAttribute
+    @Metadata(label = "advanced")
     private String loggerRef;
     @XmlAttribute
-    @Metadata(defaultValue = "ERROR")
+    @Metadata(label = "advanced", defaultValue = "ERROR")
     private LoggingLevel level;
     @XmlAttribute
-    @Metadata(defaultValue = "WARN")
+    @Metadata(label = "advanced", defaultValue = "WARN")
     private LoggingLevel rollbackLoggingLevel;
     @XmlAttribute
+    @Metadata(label = "advanced")
     private String logName;
     @XmlAttribute
-    @Metadata(javaType = "java.lang.Boolean")
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String useOriginalMessage;
     @XmlAttribute
-    @Metadata(javaType = "java.lang.Boolean")
+    @Metadata(label = "advanced", javaType = "java.lang.Boolean")
     private String useOriginalBody;
     @XmlAttribute
+    @Metadata(label = "advanced", javaType = "org.apache.camel.Processor")
     private String onRedeliveryRef;
     @XmlAttribute
+    @Metadata(label = "advanced", javaType = "org.apache.camel.Processor")
     private String onExceptionOccurredRef;
     @XmlAttribute
+    @Metadata(label = "advanced", javaType = "org.apache.camel.Processor")
     private String onPrepareFailureRef;
     @XmlAttribute
+    @Metadata(label = "advanced", javaType = "org.apache.camel.Processor")
     private String retryWhileRef;
     @XmlAttribute
+    @Metadata(label = "advanced", javaType = "org.apache.camel.processor.errorhandler.RedeliveryPolicy")
     private String redeliveryPolicyRef;
     @XmlAttribute
+    @Metadata(label = "advanced", javaType = "java.util.concurrent.ScheduledExecutorService")
     private String executorServiceRef;
     @XmlElement
     private RedeliveryPolicyDefinition redeliveryPolicy;
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/TransactionErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/TransactionErrorHandlerDefinition.java
index 3c2525660c3..6b37c1792f8 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/TransactionErrorHandlerDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/TransactionErrorHandlerDefinition.java
@@ -25,20 +25,21 @@ import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.spi.Metadata;
 
 /**
- * Transactional error handler.
+ * Transactional error handler (requires either camel-spring or camel-jta using traditional JTA transactions).
  */
 @Metadata(label = "configuration,error")
 @XmlRootElement(name = "transactionErrorHandler")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class TransactionErrorHandlerDefinition extends DefaultErrorHandlerDefinition {
 
-    // TODO: fluent builders
-    // TODO: label, java type, ref
-    // TODO: spring and jta
-
     @XmlAttribute
+    @Metadata(javaType = "org.apache.camel.spi.TransactedPolicy")
+    private String transactedPolicy;
+    @XmlAttribute
+    @Metadata(label = "advanced")
     private String transactionTemplateRef;
     @XmlAttribute
+    @Metadata(label = "advanced")
     private String transactionManagerRef;
 
     @Override
@@ -54,17 +55,30 @@ public class TransactionErrorHandlerDefinition extends DefaultErrorHandlerDefini
     }
 
     protected void cloneBuilder(TransactionErrorHandlerDefinition other) {
+        other.setTransactedPolicy(getTransactedPolicy());
         other.setTransactionManagerRef(getTransactionManagerRef());
         other.setTransactionTemplateRef(getTransactionTemplateRef());
         super.cloneBuilder(other);
     }
 
+    public String getTransactedPolicy() {
+        return transactedPolicy;
+    }
+
+    /**
+     * The transacted policy to use that is configured for either Spring or JTA based transactions.
+     */
+    public void setTransactedPolicy(String transactedPolicy) {
+        this.transactedPolicy = transactedPolicy;
+    }
+
     public String getTransactionTemplateRef() {
         return transactionTemplateRef;
     }
 
     /**
-     * References to the spring transaction template to use.
+     * References to the spring transaction template (org.springframework.transaction.support.TransactionTemplate) to
+     * use.
      */
     public void setTransactionTemplateRef(String transactionTemplateRef) {
         this.transactionTemplateRef = transactionTemplateRef;
@@ -75,10 +89,38 @@ public class TransactionErrorHandlerDefinition extends DefaultErrorHandlerDefini
     }
 
     /**
-     * References to the spring platform transaction manager to use.
+     * References to the spring platform transaction manager
+     * (org.springframework.transaction.PlatformTransactionManager) to use.
      */
     public void setTransactionManagerRef(String transactionManagerRef) {
         this.transactionManagerRef = transactionManagerRef;
     }
 
+    /**
+     * References to the spring transaction template (org.springframework.transaction.support.TransactionTemplate) to
+     * use.
+     */
+    public TransactionErrorHandlerDefinition transactedPolicy(String transactedPolicy) {
+        setTransactedPolicy(transactedPolicy);
+        return this;
+    }
+
+    /**
+     * References to the spring transaction template (org.springframework.transaction.support.TransactionTemplate) to
+     * use.
+     */
+    public TransactionErrorHandlerDefinition transactionTemplate(String transactionTemplateRef) {
+        setTransactionTemplateRef(transactionTemplateRef);
+        return this;
+    }
+
+    /**
+     * References to the spring platform transaction manager
+     * (org.springframework.transaction.PlatformTransactionManager) to use.
+     */
+    public TransactionErrorHandlerDefinition transactionManager(String transactionManagerRef) {
+        setTransactionManagerRef(transactionManagerRef);
+        return this;
+    }
+
 }
diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
index 47dd3f00c76..860d83138cd 100644
--- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
+++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
@@ -2582,6 +2582,7 @@ public class ModelParser extends BaseParser {
     protected TransactionErrorHandlerDefinition doParseTransactionErrorHandlerDefinition() throws IOException, XmlPullParserException {
         return doParse(new TransactionErrorHandlerDefinition(), (def, key, val) -> {
             switch (key) {
+                case "transactedPolicy": def.setTransactedPolicy(val); break;
                 case "transactionManagerRef": def.setTransactionManagerRef(val); break;
                 case "transactionTemplateRef": def.setTransactionTemplateRef(val); break;
                 default: return defaultErrorHandlerDefinitionAttributeHandler().accept(def, key, val);


[camel] 08/09: CAMEL-16834: error handler in model DSL. WIP

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch errorhandler-in-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 88d1ef09bd7de3a380f17cc2a7ec272feea827ba
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Apr 6 08:57:55 2022 +0200

    CAMEL-16834: error handler in model DSL. WIP
---
 .../errorhandler/transactionErrorHandler.json      |  2 +-
 .../org/apache/camel/builder/BuilderSupport.java   | 26 +++++++---------------
 .../errorhandler/NoErrorHandlerDefinition.java     | 13 ++++++++++-
 3 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json
index f9f7610902a..903c5119d04 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/errorhandler/transactionErrorHandler.json
@@ -3,7 +3,7 @@
     "kind": "model",
     "name": "transactionErrorHandler",
     "title": "Transaction Error Handler",
-    "description": "Transactional error handler.",
+    "description": "Transactional error handler (requires either camel-spring or camel-jta using traditional JTA transactions).",
     "deprecated": false,
     "label": "configuration,error",
     "javaType": "org.apache.camel.model.errorhandler.TransactionErrorHandlerDefinition",
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
index fd0d67e9b1c..b21929a1e47 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
@@ -27,6 +27,8 @@ import org.apache.camel.Expression;
 import org.apache.camel.NoSuchEndpointException;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
+import org.apache.camel.model.errorhandler.DefaultErrorHandlerDefinition;
+import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
 import org.apache.camel.model.language.DatasonnetExpression;
 import org.apache.camel.model.language.ExchangePropertyExpression;
 import org.apache.camel.model.language.HeaderExpression;
@@ -417,8 +419,8 @@ public abstract class BuilderSupport implements CamelContextAware {
      *
      * @return the builder
      */
-    public DefaultErrorHandlerBuilder defaultErrorHandler() {
-        return new DefaultErrorHandlerBuilder();
+    public DefaultErrorHandlerDefinition defaultErrorHandler() {
+        return new DefaultErrorHandlerDefinition();
     }
 
     /**
@@ -427,8 +429,8 @@ public abstract class BuilderSupport implements CamelContextAware {
      *
      * @return the builder
      */
-    public NoErrorHandlerBuilder noErrorHandler() {
-        return new NoErrorHandlerBuilder();
+    public NoErrorHandlerDefinition noErrorHandler() {
+        return new NoErrorHandlerDefinition();
     }
 
     /**
@@ -442,18 +444,6 @@ public abstract class BuilderSupport implements CamelContextAware {
         return new DeadLetterChannelDefinition(deadLetterUri);
     }
 
-    //    /**
-    //     * <a href="http://camel.apache.org/dead-letter-channel.html">Dead Letter Channel EIP:</a> is a error handler for
-    //     * handling messages that could not be delivered to it's intended destination.
-    //     *
-    //     * @param  deadLetterUri uri to the dead letter endpoint storing dead messages
-    //     * @return               the builder
-    //     */
-    //    @Deprecated
-    //    public DeadLetterChannelBuilder deadLetterChannel(String deadLetterUri) {
-    //        return new DeadLetterChannelBuilder(deadLetterUri);
-    //    }
-    //
     /**
      * <a href="http://camel.apache.org/dead-letter-channel.html">Dead Letter Channel EIP:</a> is a error handler for
      * handling messages that could not be delivered to it's intended destination.
@@ -461,8 +451,8 @@ public abstract class BuilderSupport implements CamelContextAware {
      * @param  deadLetterEndpoint dead letter endpoint storing dead messages
      * @return                    the builder
      */
-    public DeadLetterChannelBuilder deadLetterChannel(Endpoint deadLetterEndpoint) {
-        return new DeadLetterChannelBuilder(deadLetterEndpoint);
+    public DeadLetterChannelDefinition deadLetterChannel(Endpoint deadLetterEndpoint) {
+        return new DeadLetterChannelDefinition(deadLetterEndpoint);
     }
 
     // Properties
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerDefinition.java
index 31dfa7284ba..cf6c9d4efed 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/NoErrorHandlerDefinition.java
@@ -20,6 +20,7 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
+import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.spi.Metadata;
 
 /**
@@ -28,6 +29,16 @@ import org.apache.camel.spi.Metadata;
 @Metadata(label = "configuration,error")
 @XmlRootElement(name = "noErrorHandler")
 @XmlAccessorType(XmlAccessType.FIELD)
-public class NoErrorHandlerDefinition extends BaseErrorHandlerDefinition {
+public class NoErrorHandlerDefinition extends BaseErrorHandlerDefinition implements ErrorHandlerBuilder {
 
+    @Override
+    public boolean supportTransacted() {
+        return false;
+    }
+
+    @Override
+    public ErrorHandlerBuilder cloneBuilder() {
+        // clone is not needed
+        return this;
+    }
 }


[camel] 09/09: CAMEL-16834: error handler in model DSL. WIP

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch errorhandler-in-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 223382ea7ffecc547c7951a78eb3738217bf421f
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Apr 6 09:17:29 2022 +0200

    CAMEL-16834: error handler in model DSL. WIP
---
 .../java/org/apache/camel/builder/ErrorHandlerBuilderRef.java     | 1 +
 .../main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java | 1 +
 .../src/main/java/org/apache/camel/builder/RouteBuilder.java      | 1 +
 .../java/org/apache/camel/builder/ContextErrorHandlerTest.java    | 8 +++++---
 .../camel/builder/ErrorHandlerRefPropertyPlaceholderTest.java     | 3 ++-
 .../test/java/org/apache/camel/builder/ErrorHandlerRefTest.java   | 3 ++-
 .../org/apache/camel/builder/RouteTemplateErrorHandlerTest.java   | 3 ++-
 .../issues/ContextScopedOnExceptionErrorHandlerRefIssueTest.java  | 7 +++----
 ...ContextScopedOnExceptionErrorHandlerRefIssueTwoRoutesTest.java | 4 ++--
 .../issues/ContextScopedOnExceptionMultipleRouteBuildersTest.java | 4 ++--
 ...ontextScopedOnExceptionNotHandledErrorHandlerRefIssueTest.java | 7 +++----
 ...pedOnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java | 7 +++----
 ...dOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java | 4 ++--
 ...ionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java | 4 ++--
 ...ntextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest.java | 4 ++--
 ...edOnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java | 4 ++--
 .../org/apache/camel/issues/OnExceptionContinuedIssueTest.java    | 5 ++---
 .../apache/camel/issues/OnExceptionErrorHandlerRefIssueTest.java  | 7 +++----
 .../issues/OnExceptionErrorHandlerRefIssueTwoRoutesTest.java      | 7 +++----
 .../issues/OnExceptionNotHandledErrorHandlerRefIssueTest.java     | 7 +++----
 .../OnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java   | 7 +++----
 .../OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java | 4 ++--
 ...ionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java | 4 ++--
 .../issues/OnExceptionRouteScopedErrorHandlerRefIssueTest.java    | 4 ++--
 .../OnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java  | 4 ++--
 .../issues/RouteScopedOnExceptionMultipleRouteBuildersTest.java   | 4 ++--
 26 files changed, 59 insertions(+), 59 deletions(-)

diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
index 88b069b4eb9..6808adce971 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/ErrorHandlerBuilderRef.java
@@ -22,6 +22,7 @@ import org.apache.camel.model.errorhandler.ErrorHandlerRefProperties;
 /**
  * Represents a proxy to an error handler builder which is resolved by named reference
  */
+@Deprecated
 public class ErrorHandlerBuilderRef extends ErrorHandlerBuilderSupport implements ErrorHandlerRefProperties {
 
     public static final String DEFAULT_ERROR_HANDLER_BUILDER = ErrorHandlerRefProperties.DEFAULT_ERROR_HANDLER_BUILDER;
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java
index f1ee2930635..62b333f6cf8 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/NoErrorHandlerBuilder.java
@@ -25,6 +25,7 @@ import org.apache.camel.model.errorhandler.NoErrorHandlerProperties;
  * unsure; however it can be useful sometimes to disable an error handler inside a complex route so that exceptions
  * bubble up to the parent {@link Processor}
  */
+@Deprecated
 public class NoErrorHandlerBuilder extends ErrorHandlerBuilderSupport implements NoErrorHandlerProperties {
 
     @Override
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
index d661d533285..f20e21886be 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
@@ -368,6 +368,7 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
      *
      * @param ref reference to the error handler to use
      */
+    @Deprecated
     public void errorHandler(String ref) {
         if (!getRouteCollection().getRoutes().isEmpty()) {
             throw new IllegalArgumentException("errorHandler must be defined before any routes in the RouteBuilder");
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/ContextErrorHandlerTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/ContextErrorHandlerTest.java
index 54715126718..1826dbac415 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/ContextErrorHandlerTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/ContextErrorHandlerTest.java
@@ -25,6 +25,8 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.impl.engine.DefaultRoute;
+import org.apache.camel.model.RedeliveryPolicyDefinition;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.processor.SendProcessor;
 import org.apache.camel.processor.errorhandler.DeadLetterChannel;
 import org.apache.camel.processor.errorhandler.RedeliveryPolicy;
@@ -40,10 +42,10 @@ public class ContextErrorHandlerTest extends ContextTestSupport {
     public void setUp() throws Exception {
         setUseRouteBuilder(false);
         super.setUp();
-        RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
+        RedeliveryPolicyDefinition redeliveryPolicy = new RedeliveryPolicyDefinition();
         redeliveryPolicy.maximumRedeliveries(1);
-        redeliveryPolicy.setUseExponentialBackOff(true);
-        DeadLetterChannelBuilder deadLetterChannelBuilder = new DeadLetterChannelBuilder("mock:error");
+        redeliveryPolicy.setUseExponentialBackOff("true");
+        DeadLetterChannelDefinition deadLetterChannelBuilder = new DeadLetterChannelDefinition("mock:error");
         deadLetterChannelBuilder.setRedeliveryPolicy(redeliveryPolicy);
         context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(deadLetterChannelBuilder);
     }
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerRefPropertyPlaceholderTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerRefPropertyPlaceholderTest.java
index be7869504a7..05bdf0c797c 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerRefPropertyPlaceholderTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerRefPropertyPlaceholderTest.java
@@ -20,6 +20,7 @@ import java.util.Properties;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.junit.jupiter.api.Test;
 
 public class ErrorHandlerRefPropertyPlaceholderTest extends ContextTestSupport {
@@ -43,7 +44,7 @@ public class ErrorHandlerRefPropertyPlaceholderTest extends ContextTestSupport {
                 prop.put("myErrorHandler", "myDead");
                 context.getPropertiesComponent().setOverrideProperties(prop);
 
-                DeadLetterChannelBuilder dlc = new DeadLetterChannelBuilder("mock:dead");
+                DeadLetterChannelDefinition dlc = new DeadLetterChannelDefinition("mock:dead");
                 context.getRegistry().bind("myDead", dlc);
 
                 errorHandler("{{myErrorHandler}}");
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerRefTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerRefTest.java
index 96e7c5f5eca..794a87a389c 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerRefTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/ErrorHandlerRefTest.java
@@ -18,6 +18,7 @@ package org.apache.camel.builder;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.junit.jupiter.api.Test;
 
 public class ErrorHandlerRefTest extends ContextTestSupport {
@@ -37,7 +38,7 @@ public class ErrorHandlerRefTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                DeadLetterChannelBuilder dlc = new DeadLetterChannelBuilder("mock:dead");
+                DeadLetterChannelDefinition dlc = new DeadLetterChannelDefinition("mock:dead");
                 context.getRegistry().bind("myDead", dlc);
 
                 errorHandler("myDead");
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateErrorHandlerTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateErrorHandlerTest.java
index 33c5d53d531..907dcea1e84 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateErrorHandlerTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateErrorHandlerTest.java
@@ -19,6 +19,7 @@ package org.apache.camel.builder;
 import org.apache.camel.Channel;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.impl.engine.DefaultRoute;
+import org.apache.camel.model.errorhandler.NoErrorHandlerDefinition;
 import org.apache.camel.processor.errorhandler.NoErrorHandler;
 import org.junit.jupiter.api.Test;
 
@@ -30,7 +31,7 @@ public class RouteTemplateErrorHandlerTest {
     @Test
     public void testDefineRouteTemplate() throws Exception {
         try (DefaultCamelContext context = new DefaultCamelContext()) {
-            context.getRegistry().bind("myErrorHandler", new NoErrorHandlerBuilder());
+            context.getRegistry().bind("myErrorHandler", new NoErrorHandlerDefinition());
             context.addRoutes(new RouteBuilder() {
                 @Override
                 public void configure() throws Exception {
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTest.java
index a1aa39f764c..1ffc66a9e0d 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTest.java
@@ -17,9 +17,8 @@
 package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -42,7 +41,7 @@ public class ContextScopedOnExceptionErrorHandlerRefIssueTest extends ContextTes
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
@@ -51,7 +50,7 @@ public class ContextScopedOnExceptionErrorHandlerRefIssueTest extends ContextTes
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 onException(IllegalArgumentException.class).handled(true).to("mock:handled").end();
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTwoRoutesTest.java
index cb831e996ed..3e191840b6a 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionErrorHandlerRefIssueTwoRoutesTest.java
@@ -19,9 +19,9 @@ package org.apache.camel.issues;
 import java.io.IOException;
 
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -55,7 +55,7 @@ public class ContextScopedOnExceptionErrorHandlerRefIssueTwoRoutesTest extends C
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionMultipleRouteBuildersTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionMultipleRouteBuildersTest.java
index e43421cace6..ad9feeff02e 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionMultipleRouteBuildersTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionMultipleRouteBuildersTest.java
@@ -19,8 +19,8 @@ package org.apache.camel.issues;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.ExtendedCamelContext;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.junit.jupiter.api.Test;
 
 public class ContextScopedOnExceptionMultipleRouteBuildersTest extends ContextTestSupport {
@@ -52,7 +52,7 @@ public class ContextScopedOnExceptionMultipleRouteBuildersTest extends ContextTe
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = super.createCamelContext();
-        context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(new DeadLetterChannelBuilder("mock:dead"));
+        context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(new DeadLetterChannelDefinition("mock:dead"));
         return context;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTest.java
index f1d1029381c..e20e4bc25ef 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTest.java
@@ -18,9 +18,8 @@ package org.apache.camel.issues;
 
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -52,7 +51,7 @@ public class ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTest extends
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
@@ -63,7 +62,7 @@ public class ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTest extends
             public void configure() throws Exception {
                 onException(IllegalArgumentException.class).handled(false).to("mock:handled").end();
 
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 from("direct:start").to("mock:a").throwException(new IllegalArgumentException("Damn"));
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java
index 76fc4100c2d..fdb015b0185 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java
@@ -20,9 +20,8 @@ import java.io.IOException;
 
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -65,7 +64,7 @@ public class ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
@@ -74,7 +73,7 @@ public class ContextScopedOnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 onException(IllegalArgumentException.class).handled(false).to("mock:handled").end();
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java
index d5552c6b35d..aa0c069c931 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java
@@ -18,9 +18,9 @@ package org.apache.camel.issues;
 
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -52,7 +52,7 @@ public class ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTe
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
index 98ff479573c..a24466012cb 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
@@ -20,9 +20,9 @@ import java.io.IOException;
 
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -65,7 +65,7 @@ public class ContextScopedOnExceptionNotHandledRouteScopedErrorHandlerRefIssueTw
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest.java
index 9a74d3a07d1..fd6fcd87b8f 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest.java
@@ -17,9 +17,9 @@
 package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -42,7 +42,7 @@ public class ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTest extends
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
index 99676a12bdc..853a5102af6 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
@@ -19,9 +19,9 @@ package org.apache.camel.issues;
 import java.io.IOException;
 
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -55,7 +55,7 @@ public class ContextScopedOnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTes
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionContinuedIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionContinuedIssueTest.java
index 3754e75f152..522137928f0 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionContinuedIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionContinuedIssueTest.java
@@ -20,9 +20,8 @@ import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.DefaultErrorHandlerBuilder;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.junit.jupiter.api.Test;
 
 public class OnExceptionContinuedIssueTest extends ContextTestSupport {
@@ -34,7 +33,7 @@ public class OnExceptionContinuedIssueTest extends ContextTestSupport {
 
     @Test
     public void testOnExceptionWrappedMatch() throws Exception {
-        final DefaultErrorHandlerBuilder defaultErrorHandlerBuilder = new DeadLetterChannelBuilder("direct:dead");
+        final DeadLetterChannelDefinition defaultErrorHandlerBuilder = new DeadLetterChannelDefinition("direct:dead");
         defaultErrorHandlerBuilder.redeliveryDelay(0); // run fast
         defaultErrorHandlerBuilder.maximumRedeliveries(2);
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTest.java
index 312f41a2823..b8257c02d6d 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTest.java
@@ -17,9 +17,8 @@
 package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -42,7 +41,7 @@ public class OnExceptionErrorHandlerRefIssueTest extends ContextTestSupport {
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
@@ -51,7 +50,7 @@ public class OnExceptionErrorHandlerRefIssueTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 from("direct:start").onException(IllegalArgumentException.class).handled(true).to("mock:handled").end()
                         .to("mock:a")
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTwoRoutesTest.java
index 53f0d6d07fe..075e60baeb7 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionErrorHandlerRefIssueTwoRoutesTest.java
@@ -17,9 +17,8 @@
 package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -53,7 +52,7 @@ public class OnExceptionErrorHandlerRefIssueTwoRoutesTest extends ContextTestSup
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
@@ -62,7 +61,7 @@ public class OnExceptionErrorHandlerRefIssueTwoRoutesTest extends ContextTestSup
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 from("direct:foo").to("mock:foo").throwException(new IllegalArgumentException("Damn Foo"));
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTest.java
index a26e7b0d8ef..c8cbc6fbf1b 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTest.java
@@ -18,9 +18,8 @@ package org.apache.camel.issues;
 
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -52,7 +51,7 @@ public class OnExceptionNotHandledErrorHandlerRefIssueTest extends ContextTestSu
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
@@ -61,7 +60,7 @@ public class OnExceptionNotHandledErrorHandlerRefIssueTest extends ContextTestSu
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 from("direct:start").onException(IllegalArgumentException.class).handled(false).to("mock:handled").end()
                         .to("mock:a")
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java
index 3b8087cfa04..7349aa94b54 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest.java
@@ -18,9 +18,8 @@ package org.apache.camel.issues;
 
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
-import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -63,7 +62,7 @@ public class OnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest extends Cont
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
@@ -72,7 +71,7 @@ public class OnExceptionNotHandledErrorHandlerRefIssueTwoRoutesTest extends Cont
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                errorHandler(new ErrorHandlerBuilderRef("myDLC"));
+                errorHandler("myDLC");
 
                 from("direct:foo").to("mock:foo").throwException(new IllegalArgumentException("Damn Foo"));
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java
index 36de67ed835..c262e0c2429 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest.java
@@ -18,9 +18,9 @@ package org.apache.camel.issues;
 
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -52,7 +52,7 @@ public class OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTest extends Co
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
index 32411495be3..838ddabd639 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
@@ -18,9 +18,9 @@ package org.apache.camel.issues;
 
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -63,7 +63,7 @@ public class OnExceptionNotHandledRouteScopedErrorHandlerRefIssueTwoRoutesTest e
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTest.java
index 4eaf557345e..d8b28186360 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTest.java
@@ -17,9 +17,9 @@
 package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -42,7 +42,7 @@ public class OnExceptionRouteScopedErrorHandlerRefIssueTest extends ContextTestS
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
index 827b1dfa336..5c126dd1296 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/OnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest.java
@@ -17,9 +17,9 @@
 package org.apache.camel.issues;
 
 import org.apache.camel.ContextTestSupport;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.spi.Registry;
 import org.junit.jupiter.api.Test;
 
@@ -53,7 +53,7 @@ public class OnExceptionRouteScopedErrorHandlerRefIssueTwoRoutesTest extends Con
     @Override
     protected Registry createRegistry() throws Exception {
         Registry jndi = super.createRegistry();
-        jndi.bind("myDLC", new DeadLetterChannelBuilder("mock:dead"));
+        jndi.bind("myDLC", new DeadLetterChannelDefinition("mock:dead"));
         return jndi;
     }
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/issues/RouteScopedOnExceptionMultipleRouteBuildersTest.java b/core/camel-core/src/test/java/org/apache/camel/issues/RouteScopedOnExceptionMultipleRouteBuildersTest.java
index a7a3e8a497f..8c94f7a14fc 100644
--- a/core/camel-core/src/test/java/org/apache/camel/issues/RouteScopedOnExceptionMultipleRouteBuildersTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/issues/RouteScopedOnExceptionMultipleRouteBuildersTest.java
@@ -19,9 +19,9 @@ package org.apache.camel.issues;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.ExtendedCamelContext;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.junit.jupiter.api.Test;
 
 public class RouteScopedOnExceptionMultipleRouteBuildersTest extends ContextTestSupport {
@@ -53,7 +53,7 @@ public class RouteScopedOnExceptionMultipleRouteBuildersTest extends ContextTest
     @Override
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = new DefaultCamelContext(createRegistry());
-        context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(new DeadLetterChannelBuilder("mock:dead"));
+        context.adapt(ExtendedCamelContext.class).setErrorHandlerFactory(new DeadLetterChannelDefinition("mock:dead"));
         return context;
     }
 


[camel] 04/09: CAMEL-16834: error handler in model DSL. WIP

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch errorhandler-in-dsl
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 0ba443762bb0cf0f49bb06cf90b86dd2461afd3d
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Apr 6 07:02:14 2022 +0200

    CAMEL-16834: error handler in model DSL. WIP
---
 .../org/apache/camel/builder/BuilderSupport.java    | 21 +++++++++++++++++----
 .../camel/builder/DeadLetterChannelBuilder.java     |  1 +
 .../aggregator/BodyOnlyAggregationStrategyTest.java |  7 +++----
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
index d528efde45e..fd0d67e9b1c 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/BuilderSupport.java
@@ -26,6 +26,7 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.Expression;
 import org.apache.camel.NoSuchEndpointException;
 import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.model.errorhandler.DeadLetterChannelDefinition;
 import org.apache.camel.model.language.DatasonnetExpression;
 import org.apache.camel.model.language.ExchangePropertyExpression;
 import org.apache.camel.model.language.HeaderExpression;
@@ -437,10 +438,22 @@ public abstract class BuilderSupport implements CamelContextAware {
      * @param  deadLetterUri uri to the dead letter endpoint storing dead messages
      * @return               the builder
      */
-    public DeadLetterChannelBuilder deadLetterChannel(String deadLetterUri) {
-        return new DeadLetterChannelBuilder(deadLetterUri);
-    }
-
+    public DeadLetterChannelDefinition deadLetterChannel(String deadLetterUri) {
+        return new DeadLetterChannelDefinition(deadLetterUri);
+    }
+
+    //    /**
+    //     * <a href="http://camel.apache.org/dead-letter-channel.html">Dead Letter Channel EIP:</a> is a error handler for
+    //     * handling messages that could not be delivered to it's intended destination.
+    //     *
+    //     * @param  deadLetterUri uri to the dead letter endpoint storing dead messages
+    //     * @return               the builder
+    //     */
+    //    @Deprecated
+    //    public DeadLetterChannelBuilder deadLetterChannel(String deadLetterUri) {
+    //        return new DeadLetterChannelBuilder(deadLetterUri);
+    //    }
+    //
     /**
      * <a href="http://camel.apache.org/dead-letter-channel.html">Dead Letter Channel EIP:</a> is a error handler for
      * handling messages that could not be delivered to it's intended destination.
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
index 7bc8e032255..323e431c065 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/DeadLetterChannelBuilder.java
@@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory;
  * A builder of a <a href="http://camel.apache.org/dead-letter-channel.html">Dead Letter Channel</a>
  */
 @Configurer
+@Deprecated
 public class DeadLetterChannelBuilder extends DefaultErrorHandlerBuilder implements DeadLetterChannelProperties {
 
     public DeadLetterChannelBuilder() {
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/BodyOnlyAggregationStrategyTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/BodyOnlyAggregationStrategyTest.java
index ab577c834fb..854d781a8e7 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/BodyOnlyAggregationStrategyTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/aggregator/BodyOnlyAggregationStrategyTest.java
@@ -18,9 +18,9 @@ package org.apache.camel.processor.aggregator;
 
 import org.apache.camel.AggregationStrategy;
 import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExtendedExchange;
-import org.apache.camel.builder.DeadLetterChannelBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.junit.jupiter.api.Test;
 
@@ -45,11 +45,10 @@ public class BodyOnlyAggregationStrategyTest extends ContextTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                DeadLetterChannelBuilder deadLetterChannelBuilder = deadLetterChannel("direct:error");
-                deadLetterChannelBuilder.setUseOriginalMessage(true);
+                ErrorHandlerFactory dh = deadLetterChannel("direct:error").useOriginalMessage();
 
                 from("direct:failingRoute")
-                        .errorHandler(deadLetterChannelBuilder)
+                        .errorHandler(dh)
                         .to("mock:failingRoute")
                         .throwException(new RuntimeException("Boem!"));