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 2024/01/02 14:50:17 UTC

(camel) branch fluent created (now 343be8f235a)

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

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


      at 343be8f235a CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty. Also fixed typo.

This branch includes the following new commits:

     new 61881f2eb20 CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty
     new 42d3bca108b CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty
     new 30899993d49 CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty. Also fixed typo.
     new 343be8f235a CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty. Also fixed typo.

The 4 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.



(camel) 03/04: CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty. Also fixed typo.

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

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

commit 30899993d495b4fd79e750ef739939d010128769
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Jan 2 15:42:52 2024 +0100

    CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty. Also fixed typo.
---
 .../maven/MavenVersionManagerManualTest.java       |  2 +-
 .../camel/catalog/components/file-watch.json       |  2 +-
 .../org/apache/camel/catalog/components/ftp.json   |  2 +-
 .../org/apache/camel/catalog/components/ftps.json  |  2 +-
 .../org/apache/camel/catalog/components/sftp.json  |  2 +-
 .../camel/component/file/azure/FilesConsumer.java  |  2 +-
 .../camel/component/file/watch/file-watch.json     |  2 +-
 .../component/file/watch/FileWatchEndpoint.java    |  2 +-
 .../apache/camel/component/file/FileConsumer.java  |  2 +-
 .../camel/component/file/GenericFileConsumer.java  |  2 +-
 .../GenericFileProcessStrategySupport.java         |  2 +-
 .../apache/camel/component/file/remote/ftp.json    |  2 +-
 .../apache/camel/component/file/remote/ftps.json   |  2 +-
 .../apache/camel/component/file/remote/sftp.json   |  2 +-
 .../camel/component/file/remote/FtpConsumer.java   |  2 +-
 .../file/remote/RemoteFileConfiguration.java       |  4 +-
 .../camel/component/file/remote/SftpConsumer.java  |  2 +-
 .../camel/component/jms/JmsMessageHelper.java      |  4 +-
 .../server/core/integ5/DSAnnotationProcessor.java  |  2 +-
 .../server/core/integ5/DSAnnotationProcessor.java  |  2 +-
 .../camel/component/minio/MinioConsumer.java       |  2 +-
 .../camel/component/sjms/jms/JmsMessageHelper.java |  2 +-
 .../spring/batch/SpringBatchEndpointTest.java      |  2 +-
 .../camel/spring/processor/convertVariable.xml     | 28 -------
 .../apache/camel/test/junit5/CamelTestSupport.java |  2 +-
 .../component/whatsapp/model/UploadMedia.java      |  2 +-
 .../main/java/org/apache/camel/PropertyInject.java |  2 +-
 .../java/org/apache/camel/spi/ManagementAgent.java |  2 +-
 .../impl/engine/DefaultResourceResolvers.java      |  2 +-
 .../camel/catalog/impl/AbstractCamelCatalog.java   |  2 +-
 .../java/org/apache/camel/builder/AdviceWith.java  |  2 +-
 .../camel/processor/RemoveVariableProcessor.java   |  2 +-
 .../camel/processor/SetVariableProcessor.java      |  2 +-
 .../processor/aggregate/AggregateController.java   |  4 +-
 ...leConsumerFileExpressionThrowExceptionTest.java |  2 +-
 .../processor/converter/ConvertVariableTest.java   | 89 +++++++++-------------
 .../org/apache/camel/support/DefaultComponent.java |  2 +-
 .../org/apache/camel/support/ExchangeHelper.java   |  2 +-
 .../camel/support/builder/ExpressionBuilder.java   |  4 +-
 .../processor/ConvertVariableProcessor.java        |  2 +-
 .../ROOT/pages/using-propertyplaceholder.adoc      |  4 +-
 .../dsl/jbang/core/common/CommandLineHelper.java   |  2 +-
 .../camel/dsl/yaml/ConvertVariableTest.groovy      | 14 +---
 ...ndNoTransactionErrorHandlerConfiguredRoute.java |  2 +-
 .../itest/tx/JmsToHttpWithOnExceptionRoute.java    |  2 +-
 .../camel/maven/EipDocumentationEnricherMojo.java  |  2 +-
 46 files changed, 88 insertions(+), 139 deletions(-)

diff --git a/catalog/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenVersionManagerManualTest.java b/catalog/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenVersionManagerManualTest.java
index 93a82165ebc..5cc9e1c2e9d 100644
--- a/catalog/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenVersionManagerManualTest.java
+++ b/catalog/camel-catalog-maven/src/test/java/org/apache/camel/catalog/maven/MavenVersionManagerManualTest.java
@@ -145,7 +145,7 @@ public class MavenVersionManagerManualTest {
         String current = manager.getLoadedVersion();
         assertNull(current);
 
-        // version 2.99 does not exists and cannot be loaded
+        // version 2.99 does not exist and cannot be loaded
         boolean loaded = manager.loadVersion("2.99");
         assertFalse(loaded);
     }
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/file-watch.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/file-watch.json
index 89d5eb47bea..bbb4a426370 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/file-watch.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/file-watch.json
@@ -46,7 +46,7 @@
   "properties": {
     "path": { "index": 0, "kind": "path", "displayName": "Path", "group": "consumer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Path of directory to consume events from." },
     "antInclude": { "index": 1, "kind": "parameter", "displayName": "Ant Include", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "**", "description": "ANT style pattern to match files. The file is matched against path relative to endpoint path. Pattern must be also relative (not starting with slash)" },
-    "autoCreate": { "index": 2, "kind": "parameter", "displayName": "Auto Create", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Auto create directory if does not exists." },
+    "autoCreate": { "index": 2, "kind": "parameter", "displayName": "Auto Create", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Auto create directory if does not exist." },
     "events": { "index": 3, "kind": "parameter", "displayName": "Events", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CREATE,MODIFY,DELETE", "description": "Comma separated list of events to watch. Possible values: CREATE,MODIFY,DELETE" },
     "recursive": { "index": 4, "kind": "parameter", "displayName": "Recursive", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Watch recursive in current and child directories (including newly created directories)." },
     "useFileHashing": { "index": 5, "kind": "parameter", "displayName": "Use File Hashing", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Enables or disables file hashing to detect duplicate events. If you disable this, you can get some events multiple times on some platforms and JDKs. Check java.nio.file.WatchService limitations for your target [...]
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ftp.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ftp.json
index 0785da794f0..d43d29a086d 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ftp.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ftp.json
@@ -71,7 +71,7 @@
     "exceptionHandler": { "index": 25, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...]
     "exchangePattern": { "index": 26, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
     "handleDirectoryParserAbsoluteResult": { "index": 27, "kind": "parameter", "displayName": "Handle Directory Parser Absolute Result", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.FtpConfiguration", "configurationField": "configuration", "description": "Allows you to s [...]
-    "ignoreFileNotFoundOrPermissionError": { "index": 28, "kind": "parameter", "displayName": "Ignore File Not Found Or Permission Error", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.FtpConfiguration", "configurationField": "configuration", "description": "Whether to ig [...]
+    "ignoreFileNotFoundOrPermissionError": { "index": 28, "kind": "parameter", "displayName": "Ignore File Not Found Or Permission Error", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.FtpConfiguration", "configurationField": "configuration", "description": "Whether to ig [...]
     "inProgressRepository": { "index": 29, "kind": "parameter", "displayName": "In Progress Repository", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files bei [...]
     "localWorkDirectory": { "index": 30, "kind": "parameter", "displayName": "Local Work Directory", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume  [...]
     "onCompletionExceptionHandler": { "index": 31, "kind": "parameter", "displayName": "On Completion Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where t [...]
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ftps.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ftps.json
index da791d32c42..8b420525c3c 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ftps.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/ftps.json
@@ -72,7 +72,7 @@
     "exceptionHandler": { "index": 25, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...]
     "exchangePattern": { "index": 26, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
     "handleDirectoryParserAbsoluteResult": { "index": 27, "kind": "parameter", "displayName": "Handle Directory Parser Absolute Result", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration", "configurationField": "configuration", "description": "Allows you to  [...]
-    "ignoreFileNotFoundOrPermissionError": { "index": 28, "kind": "parameter", "displayName": "Ignore File Not Found Or Permission Error", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration", "configurationField": "configuration", "description": "Whether to i [...]
+    "ignoreFileNotFoundOrPermissionError": { "index": 28, "kind": "parameter", "displayName": "Ignore File Not Found Or Permission Error", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration", "configurationField": "configuration", "description": "Whether to i [...]
     "inProgressRepository": { "index": 29, "kind": "parameter", "displayName": "In Progress Repository", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files bei [...]
     "localWorkDirectory": { "index": 30, "kind": "parameter", "displayName": "Local Work Directory", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume  [...]
     "onCompletionExceptionHandler": { "index": 31, "kind": "parameter", "displayName": "On Completion Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where t [...]
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/sftp.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/sftp.json
index b5ac8cf9cc4..3deaca51c44 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/sftp.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/sftp.json
@@ -66,7 +66,7 @@
     "download": { "index": 21, "kind": "parameter", "displayName": "Download", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the FTP consumer should download the file. If this option is set to false, then the message body will be null, but the consumer will still trigger a Camel Exchange that has details abou [...]
     "exceptionHandler": { "index": 22, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...]
     "exchangePattern": { "index": 23, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
-    "ignoreFileNotFoundOrPermissionError": { "index": 24, "kind": "parameter", "displayName": "Ignore File Not Found Or Permission Error", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.SftpConfiguration", "configurationField": "configuration", "description": "Whether to i [...]
+    "ignoreFileNotFoundOrPermissionError": { "index": 24, "kind": "parameter", "displayName": "Ignore File Not Found Or Permission Error", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.SftpConfiguration", "configurationField": "configuration", "description": "Whether to i [...]
     "inProgressRepository": { "index": 25, "kind": "parameter", "displayName": "In Progress Repository", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files bei [...]
     "localWorkDirectory": { "index": 26, "kind": "parameter", "displayName": "Local Work Directory", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume  [...]
     "onCompletionExceptionHandler": { "index": 27, "kind": "parameter", "displayName": "On Completion Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where t [...]
diff --git a/components/camel-azure/camel-azure-files/src/main/java/org/apache/camel/component/file/azure/FilesConsumer.java b/components/camel-azure/camel-azure-files/src/main/java/org/apache/camel/component/file/azure/FilesConsumer.java
index d40d1305f3f..d329a0452dd 100644
--- a/components/camel-azure/camel-azure-files/src/main/java/org/apache/camel/component/file/azure/FilesConsumer.java
+++ b/components/camel-azure/camel-azure-files/src/main/java/org/apache/camel/component/file/azure/FilesConsumer.java
@@ -182,7 +182,7 @@ public class FilesConsumer extends RemoteFileConsumer<ShareFileItem> {
         } catch (GenericFileOperationFailedException e) {
             if (ignoreCannotRetrieveFile(null, null, e)) {
                 LOG.debug(
-                        "Cannot list files in directory {} due directory does not exists or file permission error.",
+                        "Cannot list files in directory {} due directory does not exist or file permission error.",
                         dir);
                 return null;
             } else {
diff --git a/components/camel-file-watch/src/generated/resources/org/apache/camel/component/file/watch/file-watch.json b/components/camel-file-watch/src/generated/resources/org/apache/camel/component/file/watch/file-watch.json
index 89d5eb47bea..bbb4a426370 100644
--- a/components/camel-file-watch/src/generated/resources/org/apache/camel/component/file/watch/file-watch.json
+++ b/components/camel-file-watch/src/generated/resources/org/apache/camel/component/file/watch/file-watch.json
@@ -46,7 +46,7 @@
   "properties": {
     "path": { "index": 0, "kind": "path", "displayName": "Path", "group": "consumer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Path of directory to consume events from." },
     "antInclude": { "index": 1, "kind": "parameter", "displayName": "Ant Include", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "**", "description": "ANT style pattern to match files. The file is matched against path relative to endpoint path. Pattern must be also relative (not starting with slash)" },
-    "autoCreate": { "index": 2, "kind": "parameter", "displayName": "Auto Create", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Auto create directory if does not exists." },
+    "autoCreate": { "index": 2, "kind": "parameter", "displayName": "Auto Create", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Auto create directory if does not exist." },
     "events": { "index": 3, "kind": "parameter", "displayName": "Events", "group": "consumer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "CREATE,MODIFY,DELETE", "description": "Comma separated list of events to watch. Possible values: CREATE,MODIFY,DELETE" },
     "recursive": { "index": 4, "kind": "parameter", "displayName": "Recursive", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Watch recursive in current and child directories (including newly created directories)." },
     "useFileHashing": { "index": 5, "kind": "parameter", "displayName": "Use File Hashing", "group": "consumer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Enables or disables file hashing to detect duplicate events. If you disable this, you can get some events multiple times on some platforms and JDKs. Check java.nio.file.WatchService limitations for your target [...]
diff --git a/components/camel-file-watch/src/main/java/org/apache/camel/component/file/watch/FileWatchEndpoint.java b/components/camel-file-watch/src/main/java/org/apache/camel/component/file/watch/FileWatchEndpoint.java
index 5390c0e95e2..60d0a08a346 100644
--- a/components/camel-file-watch/src/main/java/org/apache/camel/component/file/watch/FileWatchEndpoint.java
+++ b/components/camel-file-watch/src/main/java/org/apache/camel/component/file/watch/FileWatchEndpoint.java
@@ -41,7 +41,7 @@ public class FileWatchEndpoint extends DefaultEndpoint implements MultipleConsum
     @UriParam(description = "Comma separated list of events to watch. Possible values: CREATE,MODIFY,DELETE",
               defaultValue = "CREATE,MODIFY,DELETE")
     private String events = "CREATE,MODIFY,DELETE";
-    @UriParam(description = "Auto create directory if does not exists.", defaultValue = "true")
+    @UriParam(description = "Auto create directory if does not exist.", defaultValue = "true")
     private boolean autoCreate = true;
     @UriParam(description = "Watch recursive in current and child directories (including newly created directories).",
               defaultValue = "true")
diff --git a/components/camel-file/src/main/java/org/apache/camel/component/file/FileConsumer.java b/components/camel-file/src/main/java/org/apache/camel/component/file/FileConsumer.java
index 8090f71550d..1e871a0b5b2 100644
--- a/components/camel-file/src/main/java/org/apache/camel/component/file/FileConsumer.java
+++ b/components/camel-file/src/main/java/org/apache/camel/component/file/FileConsumer.java
@@ -160,7 +160,7 @@ public class FileConsumer extends GenericFileConsumer<File> implements ResumeAwa
 
         File directory = new File(fileName);
         if (!directory.exists() || !directory.isDirectory()) {
-            LOG.debug("Cannot poll as directory does not exists or its not a directory: {}", directory);
+            LOG.debug("Cannot poll as directory does not exist or its not a directory: {}", directory);
             if (getEndpoint().isDirectoryMustExist()) {
                 throw new GenericFileOperationFailedException("Directory does not exist: " + directory);
             }
diff --git a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
index 1684de25ed5..7fae79851b1 100644
--- a/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
+++ b/components/camel-file/src/main/java/org/apache/camel/component/file/GenericFileConsumer.java
@@ -445,7 +445,7 @@ public abstract class GenericFileConsumer<T> extends ScheduledBatchPollingConsum
 
                 if (!retrieved) {
                     if (ignoreCannotRetrieveFile(name, exchange, cause)) {
-                        LOG.trace("Cannot retrieve file {} maybe it does not exists. Ignoring.", name);
+                        LOG.trace("Cannot retrieve file {} maybe it does not exist. Ignoring.", name);
                         // remove file from the in progress list as we could not
                         // retrieve it, but should ignore
                         endpoint.getInProgressRepository().remove(absoluteFileName);
diff --git a/components/camel-file/src/main/java/org/apache/camel/component/file/strategy/GenericFileProcessStrategySupport.java b/components/camel-file/src/main/java/org/apache/camel/component/file/strategy/GenericFileProcessStrategySupport.java
index cafdd64956d..d5cf22e8cb3 100644
--- a/components/camel-file/src/main/java/org/apache/camel/component/file/strategy/GenericFileProcessStrategySupport.java
+++ b/components/camel-file/src/main/java/org/apache/camel/component/file/strategy/GenericFileProcessStrategySupport.java
@@ -131,7 +131,7 @@ public abstract class GenericFileProcessStrategySupport<T> extends ServiceSuppor
         try {
             operations.deleteFile(to.getAbsoluteFilePath());
         } catch (GenericFileOperationFailedException e) {
-            // ignore the file does not exists
+            // ignore the file does not exist
         }
 
         // make parent folder if missing
diff --git a/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftp.json b/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftp.json
index 0785da794f0..d43d29a086d 100644
--- a/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftp.json
+++ b/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftp.json
@@ -71,7 +71,7 @@
     "exceptionHandler": { "index": 25, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...]
     "exchangePattern": { "index": 26, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
     "handleDirectoryParserAbsoluteResult": { "index": 27, "kind": "parameter", "displayName": "Handle Directory Parser Absolute Result", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.FtpConfiguration", "configurationField": "configuration", "description": "Allows you to s [...]
-    "ignoreFileNotFoundOrPermissionError": { "index": 28, "kind": "parameter", "displayName": "Ignore File Not Found Or Permission Error", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.FtpConfiguration", "configurationField": "configuration", "description": "Whether to ig [...]
+    "ignoreFileNotFoundOrPermissionError": { "index": 28, "kind": "parameter", "displayName": "Ignore File Not Found Or Permission Error", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.FtpConfiguration", "configurationField": "configuration", "description": "Whether to ig [...]
     "inProgressRepository": { "index": 29, "kind": "parameter", "displayName": "In Progress Repository", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files bei [...]
     "localWorkDirectory": { "index": 30, "kind": "parameter", "displayName": "Local Work Directory", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume  [...]
     "onCompletionExceptionHandler": { "index": 31, "kind": "parameter", "displayName": "On Completion Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where t [...]
diff --git a/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftps.json b/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftps.json
index da791d32c42..8b420525c3c 100644
--- a/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftps.json
+++ b/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/ftps.json
@@ -72,7 +72,7 @@
     "exceptionHandler": { "index": 25, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...]
     "exchangePattern": { "index": 26, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
     "handleDirectoryParserAbsoluteResult": { "index": 27, "kind": "parameter", "displayName": "Handle Directory Parser Absolute Result", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration", "configurationField": "configuration", "description": "Allows you to  [...]
-    "ignoreFileNotFoundOrPermissionError": { "index": 28, "kind": "parameter", "displayName": "Ignore File Not Found Or Permission Error", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration", "configurationField": "configuration", "description": "Whether to i [...]
+    "ignoreFileNotFoundOrPermissionError": { "index": 28, "kind": "parameter", "displayName": "Ignore File Not Found Or Permission Error", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.FtpsConfiguration", "configurationField": "configuration", "description": "Whether to i [...]
     "inProgressRepository": { "index": 29, "kind": "parameter", "displayName": "In Progress Repository", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files bei [...]
     "localWorkDirectory": { "index": 30, "kind": "parameter", "displayName": "Local Work Directory", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume  [...]
     "onCompletionExceptionHandler": { "index": 31, "kind": "parameter", "displayName": "On Completion Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where t [...]
diff --git a/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/sftp.json b/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/sftp.json
index b5ac8cf9cc4..3deaca51c44 100644
--- a/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/sftp.json
+++ b/components/camel-ftp/src/generated/resources/org/apache/camel/component/file/remote/sftp.json
@@ -66,7 +66,7 @@
     "download": { "index": 21, "kind": "parameter", "displayName": "Download", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the FTP consumer should download the file. If this option is set to false, then the message body will be null, but the consumer will still trigger a Camel Exchange that has details abou [...]
     "exceptionHandler": { "index": 22, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By de [...]
     "exchangePattern": { "index": 23, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." },
-    "ignoreFileNotFoundOrPermissionError": { "index": 24, "kind": "parameter", "displayName": "Ignore File Not Found Or Permission Error", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.SftpConfiguration", "configurationField": "configuration", "description": "Whether to i [...]
+    "ignoreFileNotFoundOrPermissionError": { "index": 24, "kind": "parameter", "displayName": "Ignore File Not Found Or Permission Error", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.file.remote.SftpConfiguration", "configurationField": "configuration", "description": "Whether to i [...]
     "inProgressRepository": { "index": 25, "kind": "parameter", "displayName": "In Progress Repository", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.IdempotentRepository", "deprecated": false, "autowired": false, "secret": false, "description": "A pluggable in-progress repository org.apache.camel.spi.IdempotentRepository. The in-progress repository is used to account the current in progress files bei [...]
     "localWorkDirectory": { "index": 26, "kind": "parameter", "displayName": "Local Work Directory", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "When consuming, a local work directory can be used to store the remote file content directly in local files, to avoid loading the content into memory. This is beneficial, if you consume  [...]
     "onCompletionExceptionHandler": { "index": 27, "kind": "parameter", "displayName": "On Completion Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom org.apache.camel.spi.ExceptionHandler to handle any thrown exceptions that happens during the file on completion process where t [...]
diff --git a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java
index f40526aa4bf..cde23eff2ac 100644
--- a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java
+++ b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java
@@ -248,7 +248,7 @@ public class FtpConsumer extends RemoteFileConsumer<FTPFile> {
             }
         } catch (GenericFileOperationFailedException e) {
             if (ignoreCannotRetrieveFile(null, null, e)) {
-                LOG.debug("Cannot list files in directory {} due directory does not exists or file permission error.", dir);
+                LOG.debug("Cannot list files in directory {} due directory does not exist or file permission error.", dir);
             } else {
                 throw e;
             }
diff --git a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java
index f650f5daa4f..299ce271df3 100644
--- a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java
+++ b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java
@@ -105,7 +105,7 @@ public abstract class RemoteFileConfiguration extends GenericFileConfiguration {
     private boolean useList = true;
     @UriParam(label = "consumer,advanced", description = "Whether to ignore when (trying to list files in "
                                                          + "directories or when downloading a file), which does not exist or due to permission error. <p/> "
-                                                         + "By default when a directory or file does not exists or insufficient permission, then an exception "
+                                                         + "By default when a directory or file does not exist or insufficient permission, then an exception "
                                                          + "is thrown. Setting this option to <tt>true</tt> allows to ignore that instead.")
     private boolean ignoreFileNotFoundOrPermissionError;
     @UriParam(label = "producer,advanced", defaultValue = "true", description = "Whether to send a noop command "
@@ -395,7 +395,7 @@ public abstract class RemoteFileConfiguration extends GenericFileConfiguration {
      * Whether to ignore when (trying to list files in directories or when downloading a file), which does not exist or
      * due to permission error.
      * <p/>
-     * By default when a directory or file does not exists or insufficient permission, then an exception is thrown.
+     * By default when a directory or file does not exist or insufficient permission, then an exception is thrown.
      * Setting this option to <tt>true</tt> allows to ignore that instead.
      */
     public void setIgnoreFileNotFoundOrPermissionError(boolean ignoreFileNotFoundOrPermissionError) {
diff --git a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java
index 67b438fcd00..ab71bdc56ca 100644
--- a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java
+++ b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java
@@ -203,7 +203,7 @@ public class SftpConsumer extends RemoteFileConsumer<SftpRemoteFile> {
             }
         } catch (GenericFileOperationFailedException e) {
             if (ignoreCannotRetrieveFile(null, null, e)) {
-                LOG.debug("Cannot list files in directory {} due directory does not exists or file permission error.", dir);
+                LOG.debug("Cannot list files in directory {} due directory does not exist or file permission error.", dir);
             } else {
                 throw e;
             }
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java
index 3f10d4767dd..0557ec55ab6 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java
@@ -110,7 +110,7 @@ public final class JmsMessageHelper {
      *
      * @param  jmsMessage   the JMS message
      * @param  name         name of the property to get
-     * @return              the property value, or <tt>null</tt> if does not exists
+     * @return              the property value, or <tt>null</tt> if does not exist
      * @throws JMSException can be thrown
      */
     public static Object getProperty(Message jmsMessage, String name) throws JMSException {
@@ -126,7 +126,7 @@ public final class JmsMessageHelper {
      *
      * @param  jmsMessage the JMS message
      * @param  name       name of the property to get
-     * @return            the property value, or <tt>null</tt> if does not exists or failure to get the value
+     * @return            the property value, or <tt>null</tt> if does not exist or failure to get the value
      */
     public static Long getSafeLongProperty(Message jmsMessage, String name) {
         try {
diff --git a/components/camel-ldap/src/test/java/org/apache/directory/server/core/integ5/DSAnnotationProcessor.java b/components/camel-ldap/src/test/java/org/apache/directory/server/core/integ5/DSAnnotationProcessor.java
index d9cbcd0a89c..fb226a2c62e 100644
--- a/components/camel-ldap/src/test/java/org/apache/directory/server/core/integ5/DSAnnotationProcessor.java
+++ b/components/camel-ldap/src/test/java/org/apache/directory/server/core/integ5/DSAnnotationProcessor.java
@@ -162,7 +162,7 @@ public final class DSAnnotationProcessor {
                 try {
                     isLoaded = schemaManager.load(schemaName);
                 } catch (LdapUnwillingToPerformException lutpe) {
-                    // Cannot load the schema, it does not exists
+                    // Cannot load the schema, it does not exist
                     LOG.error(lutpe.getMessage());
                     continue;
                 }
diff --git a/components/camel-ldif/src/test/java/org/apache/directory/server/core/integ5/DSAnnotationProcessor.java b/components/camel-ldif/src/test/java/org/apache/directory/server/core/integ5/DSAnnotationProcessor.java
index d9cbcd0a89c..fb226a2c62e 100644
--- a/components/camel-ldif/src/test/java/org/apache/directory/server/core/integ5/DSAnnotationProcessor.java
+++ b/components/camel-ldif/src/test/java/org/apache/directory/server/core/integ5/DSAnnotationProcessor.java
@@ -162,7 +162,7 @@ public final class DSAnnotationProcessor {
                 try {
                     isLoaded = schemaManager.load(schemaName);
                 } catch (LdapUnwillingToPerformException lutpe) {
-                    // Cannot load the schema, it does not exists
+                    // Cannot load the schema, it does not exist
                     LOG.error(lutpe.getMessage());
                     continue;
                 }
diff --git a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConsumer.java b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConsumer.java
index deaf5e4eda8..d52d75a055f 100644
--- a/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConsumer.java
+++ b/components/camel-minio/src/main/java/org/apache/camel/component/minio/MinioConsumer.java
@@ -91,7 +91,7 @@ public class MinioConsumer extends ScheduledBatchPollingConsumer {
                         LOG.trace("Destination Bucket created");
                     } else {
                         throw new IllegalArgumentException(
-                                "Destination Bucket does not exists, set autoCreateBucket option for bucket auto creation");
+                                "Destination Bucket does not exist, set autoCreateBucket option for bucket auto creation");
                     }
                 }
             } else {
diff --git a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/JmsMessageHelper.java b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/JmsMessageHelper.java
index 342a6e3d9d2..1d67dad7c23 100644
--- a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/JmsMessageHelper.java
+++ b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/jms/JmsMessageHelper.java
@@ -105,7 +105,7 @@ public final class JmsMessageHelper {
      *
      * @param  jmsMessage   the JMS message
      * @param  name         name of the property to get
-     * @return              the property value, or <tt>null</tt> if does not exists
+     * @return              the property value, or <tt>null</tt> if does not exist
      * @throws JMSException can be thrown
      */
     public static Object getProperty(Message jmsMessage, String name) throws JMSException {
diff --git a/components/camel-spring-batch/src/test/java/org/apache/camel/component/spring/batch/SpringBatchEndpointTest.java b/components/camel-spring-batch/src/test/java/org/apache/camel/component/spring/batch/SpringBatchEndpointTest.java
index 0d61747856a..7ffed647595 100644
--- a/components/camel-spring-batch/src/test/java/org/apache/camel/component/spring/batch/SpringBatchEndpointTest.java
+++ b/components/camel-spring-batch/src/test/java/org/apache/camel/component/spring/batch/SpringBatchEndpointTest.java
@@ -123,7 +123,7 @@ public class SpringBatchEndpointTest extends CamelTestSupport {
         mockEndpoint.expectedMessageCount(0);
         errorEndpoint.expectedMessageCount(1);
 
-        //dynamic job should fail as header is present but the job does not exists
+        //dynamic job should fail as header is present but the job does not exist
         header(SpringBatchConstants.JOB_NAME).append("thisJobDoesNotExsistAtAll" + Date.from(Instant.now()));
         sendBody("direct:dyanmic?block=false", "Start the job, please.");
 
diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/convertVariable.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/convertVariable.xml
index 57c958bec68..d1728df8088 100644
--- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/convertVariable.xml
+++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/convertVariable.xml
@@ -30,70 +30,42 @@
 
         <route>
             <from uri="direct:start"/>
-            <setVariable name="foo">
-                <header>foo</header>
-            </setVariable>
-            <removeHeader name="foo"/>
             <convertVariableTo name="foo" type="java.lang.Integer"/>
             <to uri="mock:result"/>
         </route>
 
         <route>
             <from uri="direct:optional"/>
-            <setVariable name="foo">
-                <header>foo</header>
-            </setVariable>
-            <removeHeader name="foo"/>
             <convertVariableTo name="foo" type="java.lang.Integer" mandatory="false"/>
             <to uri="mock:result"/>
         </route>
 
         <route>
             <from uri="direct:invalid"/>
-            <setVariable name="foo">
-                <header>foo</header>
-            </setVariable>
-            <removeHeader name="foo"/>
             <convertVariableTo name="foo" type="java.util.Date"/>
             <to uri="mock:result"/>
         </route>
 
         <route>
             <from uri="direct:charset"/>
-            <setVariable name="foo">
-                <header>foo</header>
-            </setVariable>
-            <removeHeader name="foo"/>
             <convertVariableTo name="foo" type="java.lang.byte[]" charset="iso-8859-1"/>
             <to uri="mock:result"/>
         </route>
 
         <route>
             <from uri="direct:charset2"/>
-            <setVariable name="foo">
-                <header>foo</header>
-            </setVariable>
-            <removeHeader name="foo"/>
             <convertVariableTo name="foo" type="java.lang.byte[]" charset="utf-16"/>
             <to uri="mock:result"/>
         </route>
         
         <route>
             <from uri="direct:charset3"/>
-            <setVariable name="foo">
-                <header>foo</header>
-            </setVariable>
-            <removeHeader name="foo"/>
             <convertVariableTo name="foo" type="java.lang.String" charset="utf-16"/>
             <to uri="mock:result"/>
         </route>
 
         <route>
             <from uri="direct:bar"/>
-            <setVariable name="foo">
-                <header>foo</header>
-            </setVariable>
-            <removeHeader name="foo"/>
             <convertVariableTo name="foo" toName="bar" type="java.lang.Integer"/>
             <to uri="mock:result"/>
         </route>
diff --git a/components/camel-test/camel-test-junit5/src/main/java/org/apache/camel/test/junit5/CamelTestSupport.java b/components/camel-test/camel-test-junit5/src/main/java/org/apache/camel/test/junit5/CamelTestSupport.java
index 4c8ab045c1c..53bc6fe693a 100644
--- a/components/camel-test/camel-test-junit5/src/main/java/org/apache/camel/test/junit5/CamelTestSupport.java
+++ b/components/camel-test/camel-test-junit5/src/main/java/org/apache/camel/test/junit5/CamelTestSupport.java
@@ -861,7 +861,7 @@ public abstract class CamelTestSupport
      * @param  create                  whether or not to allow the endpoint to be created if it doesn't exist
      * @return                         the mock endpoint or an {@link NoSuchEndpointException} is thrown if it could not
      *                                 be resolved
-     * @throws NoSuchEndpointException is the mock endpoint does not exists
+     * @throws NoSuchEndpointException is the mock endpoint does not exist
      */
     protected MockEndpoint getMockEndpoint(String uri, boolean create) throws NoSuchEndpointException {
         // look for existing mock endpoints that have the same queue name, and
diff --git a/components/camel-whatsapp/src/main/java/org/apache/camel/component/whatsapp/model/UploadMedia.java b/components/camel-whatsapp/src/main/java/org/apache/camel/component/whatsapp/model/UploadMedia.java
index ff3f4985280..35972ef447e 100644
--- a/components/camel-whatsapp/src/main/java/org/apache/camel/component/whatsapp/model/UploadMedia.java
+++ b/components/camel-whatsapp/src/main/java/org/apache/camel/component/whatsapp/model/UploadMedia.java
@@ -34,7 +34,7 @@ public class UploadMedia {
         this.contentType = Objects.requireNonNull(contentType);
 
         if (!file.exists()) {
-            throw new RuntimeCamelException("The file provided does not exists");
+            throw new RuntimeCamelException("The file provided does not exist");
         }
     }
 
diff --git a/core/camel-api/src/main/java/org/apache/camel/PropertyInject.java b/core/camel-api/src/main/java/org/apache/camel/PropertyInject.java
index e7e1341bf36..387a42fcdf4 100644
--- a/core/camel-api/src/main/java/org/apache/camel/PropertyInject.java
+++ b/core/camel-api/src/main/java/org/apache/camel/PropertyInject.java
@@ -37,7 +37,7 @@ public @interface PropertyInject {
     String value();
 
     /**
-     * Default value to use if the property does not exists or has no value
+     * Default value to use if the property does not exist or has no value
      */
     String defaultValue() default "";
 
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/ManagementAgent.java b/core/camel-api/src/main/java/org/apache/camel/spi/ManagementAgent.java
index dba8ccd9057..4e1ee22dd01 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/ManagementAgent.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/ManagementAgent.java
@@ -72,7 +72,7 @@ public interface ManagementAgent extends Service {
      *
      * @param  name  the mbean name
      * @param  mbean the client interface, such as from the {@link org.apache.camel.api.management.mbean} package.
-     * @return       the client or <tt>null</tt> if mbean does not exists
+     * @return       the client or <tt>null</tt> if mbean does not exist
      */
     <T> T newProxyClient(ObjectName name, Class<T> mbean);
 
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultResourceResolvers.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultResourceResolvers.java
index d789261bc85..4caca72c06a 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultResourceResolvers.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultResourceResolvers.java
@@ -73,7 +73,7 @@ public final class DefaultResourceResolvers {
                 @Override
                 public InputStream getInputStream() throws IOException {
                     if (!exists()) {
-                        throw new FileNotFoundException(path + " does not exists");
+                        throw new FileNotFoundException(path + " does not exist");
                     }
                     if (path.isDirectory()) {
                         throw new FileNotFoundException(path + " is a directory");
diff --git a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java
index 5f4584431a7..93ed919158a 100644
--- a/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java
+++ b/core/camel-core-catalog/src/main/java/org/apache/camel/catalog/impl/AbstractCamelCatalog.java
@@ -379,7 +379,7 @@ public abstract class AbstractCamelCatalog {
             }
         }
 
-        // now check if all required values are there, and that a default value does not exists
+        // now check if all required values are there, and that a default value does not exist
         for (BaseOptionModel row : rows.values()) {
             if (row.isRequired()) {
                 String name = row.getName();
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/AdviceWith.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/AdviceWith.java
index 4b210df3f82..a0407c3fa20 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/AdviceWith.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/AdviceWith.java
@@ -314,7 +314,7 @@ public final class AdviceWith {
                     }
                 }
                 if (rd == null) {
-                    throw new IllegalArgumentException("Cannot advice route as route with id: " + routeId + " does not exists");
+                    throw new IllegalArgumentException("Cannot advice route as route with id: " + routeId + " does not exist");
                 }
             } else {
                 // grab first route
diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/RemoveVariableProcessor.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/RemoveVariableProcessor.java
index bcc150ebfbd..51be33783c7 100644
--- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/RemoveVariableProcessor.java
+++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/RemoveVariableProcessor.java
@@ -66,7 +66,7 @@ public class RemoveVariableProcessor extends AsyncProcessorSupport
                     repo.removeVariable(key);
                 } else {
                     exchange.setException(
-                            new IllegalArgumentException("VariableRepository with id: " + id + " does not exists"));
+                            new IllegalArgumentException("VariableRepository with id: " + id + " does not exist"));
                 }
             } else {
                 exchange.removeVariable(key);
diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/SetVariableProcessor.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/SetVariableProcessor.java
index f0690902e27..85acea646bf 100644
--- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/SetVariableProcessor.java
+++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/SetVariableProcessor.java
@@ -79,7 +79,7 @@ public class SetVariableProcessor extends AsyncProcessorSupport implements Trace
                     repo.setVariable(key, newVariable);
                 } else {
                     exchange.setException(
-                            new IllegalArgumentException("VariableRepository with id: " + id + " does not exists"));
+                            new IllegalArgumentException("VariableRepository with id: " + id + " does not exist"));
                 }
             } else {
                 exchange.setVariable(key, newVariable);
diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateController.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateController.java
index 6254f90f12e..3616b674f78 100644
--- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateController.java
+++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateController.java
@@ -40,7 +40,7 @@ public interface AggregateController {
      * To force completing a specific group by its key.
      *
      * @param  key the key
-     * @return     <tt>1</tt> if the group was forced completed, <tt>0</tt> if the group does not exists
+     * @return     <tt>1</tt> if the group was forced completed, <tt>0</tt> if the group does not exist
      */
     int forceCompletionOfGroup(String key);
 
@@ -55,7 +55,7 @@ public interface AggregateController {
      * To force discarding a specific group by its key.
      *
      * @param  key the key
-     * @return     <tt>1</tt> if the group was forced discarded, <tt>0</tt> if the group does not exists
+     * @return     <tt>1</tt> if the group was forced discarded, <tt>0</tt> if the group does not exist
      */
     int forceDiscardingOfGroup(String key);
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileExpressionThrowExceptionTest.java b/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileExpressionThrowExceptionTest.java
index c3374abca64..e75c22b0cd4 100644
--- a/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileExpressionThrowExceptionTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/component/file/FileConsumerFileExpressionThrowExceptionTest.java
@@ -61,7 +61,7 @@ public class FileConsumerFileExpressionThrowExceptionTest extends ContextTestSup
                 from(fileUri("bean"
                              + "?pollStrategy=#myPoll&initialDelay=0&delay=10&fileName=${bean:counter?method=next}.txt&delete=true"))
                         .to("mock:result");
-                // specify a method name that does not exists
+                // specify a method name that does not exist
             }
         });
 
diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/converter/ConvertVariableTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/converter/ConvertVariableTest.java
index 0f9724ed120..112a74282d7 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/converter/ConvertVariableTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/converter/ConvertVariableTest.java
@@ -22,10 +22,9 @@ import java.util.Date;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.Exchange;
+import org.apache.camel.FluentProducerTemplate;
 import org.apache.camel.NoSuchVariableException;
 import org.apache.camel.NoTypeConversionAvailableException;
-import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.builder.ExchangeBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.junit.jupiter.api.Test;
@@ -38,6 +37,8 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 public class ConvertVariableTest extends ContextTestSupport {
 
+    private FluentProducerTemplate fluent;
+
     @Test
     public void testConvertBodyTo() {
         try {
@@ -57,17 +58,16 @@ public class ConvertVariableTest extends ContextTestSupport {
     public void testConvertBodyCharset() throws Exception {
         context.addRoutes(new RouteBuilder() {
             public void configure() {
-                from("direct:foo").setVariable("foo", header("foo")).removeHeader("foo")
+                from("direct:foo")
                         .convertVariableTo("foo", byte[].class, "iso-8859-1").to("mock:foo");
             }
         });
 
         getMockEndpoint("mock:foo").expectedMessageCount(1);
-        // do not propagate charset to avoid side effects with double conversion
-        // etc
+        // do not propagate charset to avoid side effects with double conversion etc
         getMockEndpoint("mock:foo").message(0).exchangeProperty(Exchange.CHARSET_NAME).isNull();
 
-        template.sendBodyAndHeader("direct:foo", null, "foo", "Hello World");
+        fluent.to("direct:foo").withVariable("foo", "Hello World").send();
 
         assertMockEndpointsSatisfied();
     }
@@ -76,7 +76,7 @@ public class ConvertVariableTest extends ContextTestSupport {
     public void testConvertBodyCharsetWithExistingCharsetName() throws Exception {
         context.addRoutes(new RouteBuilder() {
             public void configure() {
-                from("direct:foo").setVariable("foo", header("foo")).removeHeader("foo")
+                from("direct:foo")
                         .convertVariableTo("foo", byte[].class, "iso-8859-1").to("mock:foo");
             }
         });
@@ -86,10 +86,9 @@ public class ConvertVariableTest extends ContextTestSupport {
         // etc
         getMockEndpoint("mock:foo").message(0).exchangeProperty(Exchange.CHARSET_NAME).isEqualTo("UTF-8");
 
-        Exchange srcExchange = ExchangeBuilder.anExchange(context).withProperty(Exchange.CHARSET_NAME, "UTF-8")
-                .withHeader("foo", "Hello World").build();
-
-        template.send("direct:foo", srcExchange);
+        fluent.to("direct:foo").withVariable("foo", "Hello World")
+                .withExchangeProperty(Exchange.CHARSET_NAME, "UTF-8")
+                .send();
 
         assertMockEndpointsSatisfied();
     }
@@ -99,7 +98,7 @@ public class ConvertVariableTest extends ContextTestSupport {
         MockEndpoint result = getMockEndpoint("mock:result");
         result.expectedVariableReceived("foo", 11);
 
-        template.sendBodyAndHeader("direct:start", null, "foo", 11);
+        fluent.to("direct:start").withVariable("foo", 11).send();
 
         assertMockEndpointsSatisfied();
     }
@@ -112,7 +111,7 @@ public class ConvertVariableTest extends ContextTestSupport {
         result.message(0).variable("foo").isInstanceOf(String.class);
         result.message(0).variable("bar").isInstanceOf(Integer.class);
 
-        template.sendBodyAndHeader("direct:bar", null, "foo", "11");
+        fluent.to("direct:bar").withVariable("foo", "11").send();
 
         assertMockEndpointsSatisfied();
     }
@@ -120,18 +119,15 @@ public class ConvertVariableTest extends ContextTestSupport {
     @Test
     public void testConvertToIntegerNotMandatory() throws Exception {
         // mandatory should fail
-        try {
-            template.sendBodyAndHeader("direct:start", null, "foo", Double.NaN);
-            fail();
-        } catch (Exception e) {
-            assertIsInstanceOf(NoTypeConversionAvailableException.class, e.getCause());
-        }
+        Exchange out = fluent.to("direct:start").withVariable("foo", Double.NaN).send();
+        assertTrue(out.isFailed());
+        assertIsInstanceOf(NoTypeConversionAvailableException.class, out.getException());
 
         // optional should cause null body
         getMockEndpoint("mock:result").expectedMessageCount(1);
         getMockEndpoint("mock:result").message(0).body().isNull();
 
-        template.sendBodyAndHeader("direct:optional", null, "foo", Double.NaN);
+        fluent.to("direct:optional").withVariable("foo", Double.NaN).send();
 
         assertMockEndpointsSatisfied();
     }
@@ -141,13 +137,10 @@ public class ConvertVariableTest extends ContextTestSupport {
         MockEndpoint result = getMockEndpoint("mock:result");
         result.expectedMessageCount(0);
 
-        try {
-            template.sendBodyAndHeader("direct:start", null, "foo", null);
-            fail("Should have thrown an exception");
-        } catch (Exception e) {
-            NoSuchVariableException nv = assertIsInstanceOf(NoSuchVariableException.class, e.getCause());
-            assertEquals("foo", nv.getVariableName());
-        }
+        Exchange out = fluent.to("direct:start").withVariable("foo", null).send();
+        assertTrue(out.isFailed());
+        NoSuchVariableException nv = assertIsInstanceOf(NoSuchVariableException.class, out.getException());
+        assertEquals("foo", nv.getVariableName());
 
         assertMockEndpointsSatisfied();
     }
@@ -156,13 +149,9 @@ public class ConvertVariableTest extends ContextTestSupport {
     public void testConvertFailed() throws Exception {
         getMockEndpoint("mock:result").expectedMessageCount(0);
 
-        try {
-            template.sendBodyAndHeader("direct:invalid", null, "foo", "11");
-            fail("Should have thrown an exception");
-        } catch (RuntimeCamelException e) {
-            boolean b = e.getCause() instanceof NoTypeConversionAvailableException;
-            assertTrue(b);
-        }
+        Exchange out = fluent.to("direct:invalid").withVariable("foo", "11").send();
+        assertTrue(out.isFailed());
+        assertIsInstanceOf(NoTypeConversionAvailableException.class, out.getException());
 
         assertMockEndpointsSatisfied();
     }
@@ -174,7 +163,7 @@ public class ConvertVariableTest extends ContextTestSupport {
         MockEndpoint result = getMockEndpoint("mock:result");
         result.expectedVariableReceived("foo", body);
 
-        template.sendBodyAndHeader("direct:charset", null, "foo", "Hello World");
+        fluent.to("direct:charset").withVariable("foo", "Hello World").send();
 
         assertMockEndpointsSatisfied();
     }
@@ -186,7 +175,7 @@ public class ConvertVariableTest extends ContextTestSupport {
         MockEndpoint result = getMockEndpoint("mock:result");
         result.expectedVariableReceived("foo", body);
 
-        template.sendBodyAndHeader("direct:charset3", null, "foo", new ByteArrayInputStream(body.getBytes("utf-16")));
+        fluent.to("direct:charset3").withVariable("foo", new ByteArrayInputStream(body.getBytes("utf-16"))).send();
 
         assertMockEndpointsSatisfied();
     }
@@ -199,7 +188,7 @@ public class ConvertVariableTest extends ContextTestSupport {
         result.expectedVariableReceived("foo", body);
         result.expectedMessageCount(1);
 
-        template.sendBodyAndHeader("direct:charset2", null, "foo", "Hello World");
+        fluent.to("direct:charset2").withVariable("foo", "Hello World").send();
 
         // should NOT be okay as we expected utf-8 but got it in utf-16
         result.assertIsNotSatisfied();
@@ -215,7 +204,7 @@ public class ConvertVariableTest extends ContextTestSupport {
         result.expectedVariableReceived("foo", body);
         result.expectedMessageCount(1);
 
-        template.sendBodyAndHeader("direct:charset3", null, "foo", new ByteArrayInputStream(body.getBytes("utf-8")));
+        fluent.to("direct:charset3").withVariable("foo", new ByteArrayInputStream(body.getBytes("utf-8"))).send();
 
         // should NOT be okay as we expected utf-8 but got it in utf-16
         result.assertIsNotSatisfied();
@@ -225,21 +214,15 @@ public class ConvertVariableTest extends ContextTestSupport {
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                from("direct:start").setVariable("foo", header("foo")).removeHeader("foo")
-                        .convertVariableTo("foo", Integer.class).to("mock:result");
-                from("direct:optional").setVariable("foo", header("foo")).removeHeader("foo")
-                        .convertVariableTo("foo", Integer.class, false).to("mock:result");
-                from("direct:invalid").setVariable("foo", header("foo")).removeHeader("foo")
-                        .convertVariableTo("foo", Date.class).to("mock:result");
-                from("direct:charset").setVariable("foo", header("foo")).removeHeader("foo")
-                        .convertVariableTo("foo", byte[].class, "iso-8859-1").to("mock:result");
-                from("direct:charset2").setVariable("foo", header("foo")).removeHeader("foo")
-                        .convertVariableTo("foo", byte[].class, "utf-16").to("mock:result");
-                from("direct:charset3").setVariable("foo", header("foo")).removeHeader("foo")
-                        .convertVariableTo("foo", String.class, "utf-16").to("mock:result");
-                from("direct:bar").setVariable("foo", header("foo")).removeHeader("foo")
-                        .convertVariableTo("foo", "bar", Integer.class).to("mock:result");
-
+                fluent = context.createFluentProducerTemplate();
+
+                from("direct:start").convertVariableTo("foo", Integer.class).to("mock:result");
+                from("direct:optional").convertVariableTo("foo", Integer.class, false).to("mock:result");
+                from("direct:invalid").convertVariableTo("foo", Date.class).to("mock:result");
+                from("direct:charset").convertVariableTo("foo", byte[].class, "iso-8859-1").to("mock:result");
+                from("direct:charset2").convertVariableTo("foo", byte[].class, "utf-16").to("mock:result");
+                from("direct:charset3").convertVariableTo("foo", String.class, "utf-16").to("mock:result");
+                from("direct:bar").convertVariableTo("foo", "bar", Integer.class).to("mock:result");
             }
         };
     }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java
index 2599063264f..dd9ad5e8d19 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultComponent.java
@@ -482,7 +482,7 @@ public abstract class DefaultComponent extends ServiceSupport implements Compone
      * @param  parameters the parameters
      * @param  key        the key
      * @param  type       the requested type to convert the value from the parameter
-     * @return            the converted value parameter, <tt>null</tt> if parameter does not exists.
+     * @return            the converted value parameter, <tt>null</tt> if parameter does not exist.
      * @see               #resolveAndRemoveReferenceParameter(Map, String, Class)
      */
     public <T> T getAndRemoveParameter(Map<String, Object> parameters, String key, Class<T> type) {
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
index 5ea365e297d..81eb2e51647 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
@@ -1092,7 +1092,7 @@ public final class ExchangeHelper {
                 repo.setVariable(name, value);
             } else {
                 exchange.setException(
-                        new IllegalArgumentException("VariableRepository with id: " + id + " does not exists"));
+                        new IllegalArgumentException("VariableRepository with id: " + id + " does not exist"));
             }
         } else {
             exchange.setVariable(name, value);
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java b/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
index aac8847f5d1..12271bde384 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/builder/ExpressionBuilder.java
@@ -212,7 +212,7 @@ public class ExpressionBuilder {
                         key = StringHelper.after(key, ":");
                         return repo.getVariable(key);
                     } else {
-                        throw new IllegalArgumentException("VariableRepository with id: " + id + " does not exists");
+                        throw new IllegalArgumentException("VariableRepository with id: " + id + " does not exist");
                     }
                 } else {
                     return exchange.getVariable(key);
@@ -289,7 +289,7 @@ public class ExpressionBuilder {
                         }
                         return value;
                     } else {
-                        throw new IllegalArgumentException("VariableRepository with id: " + id + " does not exists");
+                        throw new IllegalArgumentException("VariableRepository with id: " + id + " does not exist");
                     }
                 } else {
                     return exchange.getVariable(key, type);
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/processor/ConvertVariableProcessor.java b/core/camel-support/src/main/java/org/apache/camel/support/processor/ConvertVariableProcessor.java
index 9287902a0d7..de3dae523a8 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/processor/ConvertVariableProcessor.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/processor/ConvertVariableProcessor.java
@@ -115,7 +115,7 @@ public class ConvertVariableProcessor extends ServiceSupport
             key = StringHelper.after(key, ":");
             repo = factory.getVariableRepository(id);
             if (repo == null) {
-                throw new IllegalArgumentException("VariableRepository with id: " + id + " does not exists");
+                throw new IllegalArgumentException("VariableRepository with id: " + id + " does not exist");
             }
             value = repo.getVariable(key);
         } else {
diff --git a/docs/user-manual/modules/ROOT/pages/using-propertyplaceholder.adoc b/docs/user-manual/modules/ROOT/pages/using-propertyplaceholder.adoc
index baae2a53925..4f20e952d98 100644
--- a/docs/user-manual/modules/ROOT/pages/using-propertyplaceholder.adoc
+++ b/docs/user-manual/modules/ROOT/pages/using-propertyplaceholder.adoc
@@ -59,7 +59,7 @@ which is defined with the `?` (question mark) as prefix in the key name, as show
 {{?myBufferSize}}
 ----
 
-If a value for the key exists then the value is used, however if the key does not exists,
+If a value for the key exists then the value is used, however if the key does not exist,
 then Camel understands this, such as when used in xref:endpoint.adoc[Endpoints]:
 
 [source,text]
@@ -633,7 +633,7 @@ Then these values can be used in your Camel routes such as:
 </camelContext>
 ----
 
-You can also provide a default value in case a key does not exists:
+You can also provide a default value in case a key does not exist:
 
 [source,xml]
 ----
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CommandLineHelper.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CommandLineHelper.java
index 9ebcb1dfc23..518af842471 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CommandLineHelper.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/CommandLineHelper.java
@@ -81,7 +81,7 @@ public final class CommandLineHelper {
                 throw new RuntimeException(ex);
             }
         } else {
-            printer.println(USER_CONFIG + " does not exists");
+            printer.println(USER_CONFIG + " does not exist");
         }
     }
 
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ConvertVariableTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ConvertVariableTest.groovy
index 637c0aa1886..d127b8bd52e 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ConvertVariableTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ConvertVariableTest.groovy
@@ -18,7 +18,6 @@ package org.apache.camel.dsl.yaml
 
 import org.apache.camel.component.mock.MockEndpoint
 import org.apache.camel.dsl.yaml.support.YamlTestSupport
-import org.apache.camel.model.ConvertHeaderDefinition
 import org.apache.camel.model.ConvertVariableDefinition
 import org.junit.jupiter.api.Assertions
 
@@ -30,9 +29,6 @@ class ConvertVariableTest extends YamlTestSupport {
                 - from:
                     uri: "direct:start"
                     steps:    
-                      - setVariable:
-                          name: foo
-                          constant: "Hello World"
                       - convertVariableTo:
                           name: foo  
                           type: "java.lang.String"
@@ -47,12 +43,13 @@ class ConvertVariableTest extends YamlTestSupport {
             context.start()
 
             withTemplate {
+                withVariable("foo", "Hello World")
                 to('direct:start').send()
             }
         then:
             context.routeDefinitions.size() == 1
 
-            with(context.routeDefinitions[0].outputs[1], ConvertVariableDefinition) {
+            with(context.routeDefinitions[0].outputs[0], ConvertVariableDefinition) {
                 name == 'foo'
                 type == 'java.lang.String'
                 charset == 'UTF8'
@@ -67,9 +64,6 @@ class ConvertVariableTest extends YamlTestSupport {
                 - from:
                     uri: "direct:start"
                     steps:
-                      - setVariable:
-                          name: foo
-                          constant: "Hello World"
                       - convertVariableTo:
                           name: foo
                           toName: bar
@@ -85,12 +79,12 @@ class ConvertVariableTest extends YamlTestSupport {
         context.start()
 
         withTemplate {
-            to('direct:start').withHeader("foo", 'test'.bytes).send()
+            to('direct:start').withVariable("foo", 'test'.bytes).send()
         }
         then:
         context.routeDefinitions.size() == 1
 
-        with(context.routeDefinitions[0].outputs[1], ConvertVariableDefinition) {
+        with(context.routeDefinitions[0].outputs[0], ConvertVariableDefinition) {
             name == 'foo'
             toName == 'bar'
             type == 'java.lang.String'
diff --git a/tests/camel-itest/src/test/java/org/apache/camel/itest/tx/JmsToHttpWithOnExceptionAndNoTransactionErrorHandlerConfiguredRoute.java b/tests/camel-itest/src/test/java/org/apache/camel/itest/tx/JmsToHttpWithOnExceptionAndNoTransactionErrorHandlerConfiguredRoute.java
index e34b9b6d30f..3ff925f8acc 100644
--- a/tests/camel-itest/src/test/java/org/apache/camel/itest/tx/JmsToHttpWithOnExceptionAndNoTransactionErrorHandlerConfiguredRoute.java
+++ b/tests/camel-itest/src/test/java/org/apache/camel/itest/tx/JmsToHttpWithOnExceptionAndNoTransactionErrorHandlerConfiguredRoute.java
@@ -73,7 +73,7 @@ public class JmsToHttpWithOnExceptionAndNoTransactionErrorHandlerConfiguredRoute
             if ("unknown".equals(user)) {
                 // no page for a unknown user
                 exchange.getMessage().setHeader(Exchange.HTTP_RESPONSE_CODE, 404);
-                exchange.getMessage().setBody("Page does not exists");
+                exchange.getMessage().setBody("Page does not exist");
                 return;
             } else if ("guest".equals(user)) {
                 // not okay for guest user
diff --git a/tests/camel-itest/src/test/java/org/apache/camel/itest/tx/JmsToHttpWithOnExceptionRoute.java b/tests/camel-itest/src/test/java/org/apache/camel/itest/tx/JmsToHttpWithOnExceptionRoute.java
index 951c406af4c..91a5eede018 100644
--- a/tests/camel-itest/src/test/java/org/apache/camel/itest/tx/JmsToHttpWithOnExceptionRoute.java
+++ b/tests/camel-itest/src/test/java/org/apache/camel/itest/tx/JmsToHttpWithOnExceptionRoute.java
@@ -91,7 +91,7 @@ public class JmsToHttpWithOnExceptionRoute extends RouteBuilder {
             if ("unknown".equals(user)) {
                 // no page for a unknown user
                 exchange.getMessage().setHeader(Exchange.HTTP_RESPONSE_CODE, 404);
-                exchange.getMessage().setBody("Page does not exists");
+                exchange.getMessage().setBody("Page does not exist");
                 return;
             } else if ("guest".equals(user)) {
                 // not okay for guest user
diff --git a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/EipDocumentationEnricherMojo.java b/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/EipDocumentationEnricherMojo.java
index b33141a5ecb..f4facfe32f0 100644
--- a/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/EipDocumentationEnricherMojo.java
+++ b/tooling/maven/camel-eip-documentation-enricher-maven-plugin/src/main/java/org/apache/camel/maven/EipDocumentationEnricherMojo.java
@@ -131,7 +131,7 @@ public class EipDocumentationEnricherMojo extends AbstractMojo {
             throw new MojoExecutionException("pathToModelDir parameter must not be null");
         }
 
-        // skip if input file does not exists
+        // skip if input file does not exist
         if (inputCamelSchemaFile == null || !inputCamelSchemaFile.exists()) {
             getLog().info("Input Camel schema file: " + inputCamelSchemaFile + " does not exist. Skip EIP document enrichment");
             return;


(camel) 01/04: CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty

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

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

commit 61881f2eb207d575628c4f51d5ef8c0523b39ae4
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Jan 2 14:54:26 2024 +0100

    CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty
---
 .../org/apache/camel/FluentProducerTemplate.java   |  42 ++++++++
 .../impl/engine/DefaultFluentProducerTemplate.java | 119 ++++++++++++++++++---
 .../org/apache/camel/support/ExchangeHelper.java   |  27 +++++
 3 files changed, 172 insertions(+), 16 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/FluentProducerTemplate.java b/core/camel-api/src/main/java/org/apache/camel/FluentProducerTemplate.java
index e26f177f9a2..adf0a3b3f38 100644
--- a/core/camel-api/src/main/java/org/apache/camel/FluentProducerTemplate.java
+++ b/core/camel-api/src/main/java/org/apache/camel/FluentProducerTemplate.java
@@ -191,6 +191,48 @@ public interface FluentProducerTemplate extends Service {
      */
     FluentProducerTemplate withHeader(String key, Object value);
 
+    /**
+     * Set the exchange properties
+     *
+     * <b>Important:</b> You can either only use either withExchange, or withProcessor or a combination of
+     * withBody/withHeaders to construct the message to be sent.
+     *
+     * @param properties the exchange properties
+     */
+    FluentProducerTemplate withExchangeProperties(Map<String, Object> properties);
+
+    /**
+     * Set the exchange property
+     *
+     * <b>Important:</b> You can either only use either withExchange, or withProcessor or a combination of
+     * withBody/withHeaders to construct the message to be sent.
+     *
+     * @param key   the key of the exchange property
+     * @param value the value of the exchange property
+     */
+    FluentProducerTemplate withExchangeProperty(String key, Object value);
+
+    /**
+     * Set the variables
+     *
+     * <b>Important:</b> You can either only use either withExchange, or withProcessor or a combination of
+     * withBody/withHeaders to construct the message to be sent.
+     *
+     * @param variables the variables
+     */
+    FluentProducerTemplate withVariables(Map<String, Object> variables);
+
+    /**
+     * Set the exchange property
+     *
+     * <b>Important:</b> You can either only use either withExchange, or withProcessor or a combination of
+     * withBody/withHeaders to construct the message to be sent.
+     *
+     * @param key   the key of the variable
+     * @param value the value of the variable
+     */
+    FluentProducerTemplate withVariable(String key, Object value);
+
     /**
      * Set the message body
      *
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java
index e82381e50b5..851bf2ce845 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java
@@ -51,8 +51,10 @@ import org.apache.camel.util.ObjectHelper;
  */
 public class DefaultFluentProducerTemplate extends ServiceSupport implements FluentProducerTemplate {
 
-    // transient state of endpoint, headers and body which needs to be thread local scoped to be thread-safe
+    // transient state of endpoint, headers, exchange properties, variables, and body which needs to be thread local scoped to be thread-safe
     private Map<String, Object> headers;
+    private Map<String, Object> exchangeProperties;
+    private Map<String, Object> variables;
     private Object body;
     private Supplier<Exchange> exchangeSupplier;
     private Supplier<Processor> processorSupplier;
@@ -207,6 +209,74 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
         return clone;
     }
 
+    @Override
+    public FluentProducerTemplate withExchangeProperties(Map<String, Object> properties) {
+        DefaultFluentProducerTemplate clone = checkCloned();
+
+        if (clone.processorSupplier != null) {
+            throw new IllegalArgumentException("Cannot use both withExchangeProperties and withProcessor with FluentProducerTemplate");
+        }
+
+        Map<String, Object> map = clone.exchangeProperties;
+        if (map == null) {
+            map = new LinkedHashMap<>();
+            clone.exchangeProperties = map;
+        }
+        map.putAll(properties);
+        return clone;
+    }
+
+    @Override
+    public FluentProducerTemplate withExchangeProperty(String key, Object value) {
+        DefaultFluentProducerTemplate clone = checkCloned();
+
+        if (clone.processorSupplier != null) {
+            throw new IllegalArgumentException("Cannot use both withExchangeProperty and withProcessor with FluentProducerTemplate");
+        }
+
+        Map<String, Object> map = clone.exchangeProperties;
+        if (map == null) {
+            map = new LinkedHashMap<>();
+            clone.exchangeProperties = map;
+        }
+        map.put(key, value);
+        return clone;
+    }
+
+    @Override
+    public FluentProducerTemplate withVariables(Map<String, Object> variables) {
+        DefaultFluentProducerTemplate clone = checkCloned();
+
+        if (clone.processorSupplier != null) {
+            throw new IllegalArgumentException("Cannot use both withVariables and withProcessor with FluentProducerTemplate");
+        }
+
+        Map<String, Object> map = clone.variables;
+        if (map == null) {
+            map = new LinkedHashMap<>();
+            clone.variables = map;
+        }
+        map.putAll(variables);
+        return clone;
+    }
+
+    @Override
+    public FluentProducerTemplate withVariable(String key, Object value) {
+        DefaultFluentProducerTemplate clone = checkCloned();
+
+        if (clone.processorSupplier != null) {
+            throw new IllegalArgumentException("Cannot use both withVariable and withProcessor with FluentProducerTemplate");
+        }
+
+        Map<String, Object> map = clone.variables;
+        if (map == null) {
+            map = new LinkedHashMap<>();
+            clone.variables = map;
+        }
+        map.put(key, value);
+        return clone;
+    }
+
     @Override
     public FluentProducerTemplate withBody(Object body) {
         DefaultFluentProducerTemplate clone = checkCloned();
@@ -387,21 +457,24 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
         // Determine the target endpoint
         final Endpoint target = clone.target();
 
-        Future<T> result;
-        if (ObjectHelper.isNotEmpty(clone.headers)) {
-            // Make a copy of the headers and body so that async processing won't
-            // be invalidated by subsequent reuse of the template
-            final Map<String, Object> headersCopy = new HashMap<>(clone.headers);
-            final Object bodyCopy = clone.body;
-
-            result = clone.template().asyncRequestBodyAndHeaders(target, bodyCopy, headersCopy, type);
-        } else {
-            // Make a copy of the and body so that async processing won't be
-            // invalidated by subsequent reuse of the template
-            final Object bodyCopy = clone.body;
-
-            result = clone.template().asyncRequestBody(target, bodyCopy, type);
-        }
+        Future<T> result =
+                clone.template().asyncSend(target, exchange -> {
+                    // Make a copy of the headers and body so that async processing won't
+                    // be invalidated by subsequent reuse of the template
+                    Object bodyCopy = clone.body;
+
+                    exchange.setPattern(ExchangePattern.InOut);
+                    exchange.getMessage().setBody(bodyCopy);
+                    if (clone.headers != null) {
+                        exchange.getMessage().setHeaders(new HashMap<>(clone.headers));
+                    }
+                    if (clone.exchangeProperties != null) {
+                        exchange.getProperties().putAll(clone.exchangeProperties);
+                    }
+                    if (clone.variables != null) {
+                        clone.variables.forEach((k, v) -> ExchangeHelper.setVariable(exchange, k, v));
+                    }
+                }).thenApply(answer -> answer.getContext().getTypeConverter().convertTo(type, answer));
 
         // reset cloned flag so when we use it again it has to set values again
         cloned = false;
@@ -537,22 +610,36 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
             if (headers != null) {
                 exchange.getIn().getHeaders().putAll(headers);
             }
+            if (exchangeProperties != null) {
+                exchange.getProperties().putAll(exchangeProperties);
+            }
             if (body != null) {
                 exchange.getIn().setBody(body);
             }
+            if (variables != null) {
+                variables.forEach((k, v) -> ExchangeHelper.setVariable(exchange, k, v));
+            }
         };
     }
 
     private Processor defaultAsyncProcessor() {
         final Map<String, Object> headersCopy = ObjectHelper.isNotEmpty(this.headers) ? new HashMap<>(this.headers) : null;
+        final Map<String, Object> propertiesCopy = ObjectHelper.isNotEmpty(this.exchangeProperties) ? new HashMap<>(this.exchangeProperties) : null;
+        final Map<String, Object> variablesCopy = ObjectHelper.isNotEmpty(this.variables) ? new HashMap<>(this.variables) : null;
         final Object bodyCopy = this.body;
         return exchange -> {
             if (headersCopy != null) {
                 exchange.getIn().getHeaders().putAll(headersCopy);
             }
+            if (propertiesCopy != null) {
+                exchange.getProperties().putAll(propertiesCopy);
+            }
             if (bodyCopy != null) {
                 exchange.getIn().setBody(bodyCopy);
             }
+            if (variablesCopy != null) {
+                variablesCopy.forEach((k, v) -> ExchangeHelper.setVariable(exchange, k, v));
+            }
         };
     }
 
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
index 9f45cd44431..004d0dacb99 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
@@ -50,6 +50,8 @@ import org.apache.camel.TypeConversionException;
 import org.apache.camel.WrappedFile;
 import org.apache.camel.spi.NormalizedEndpointUri;
 import org.apache.camel.spi.UnitOfWork;
+import org.apache.camel.spi.VariableRepository;
+import org.apache.camel.spi.VariableRepositoryFactory;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.Scanner;
@@ -1070,4 +1072,29 @@ public final class ExchangeHelper {
             exchange.getOut().setBody(body);
         }
     }
+
+    /**
+     * Sets the variable
+     *
+     * @param exchange  the exchange
+     * @param name  the variable name. Can be prefixed with repo-id:name to lookup the variable from a specific
+     *              repository. If no repo-id is provided, then the variable is set on the exchange
+     * @param value the value of the variable
+     */
+    public static void setVariable(Exchange exchange, String name, Object value) {
+        String id = StringHelper.before(name, ":");
+        if (id != null) {
+            VariableRepositoryFactory factory = exchange.getContext().getCamelContextExtension().getContextPlugin(VariableRepositoryFactory.class);
+            VariableRepository repo = factory.getVariableRepository(id);
+            if (repo != null) {
+                name = StringHelper.after(name, ":");
+                repo.setVariable(name, value);
+            } else {
+                exchange.setException(
+                        new IllegalArgumentException("VariableRepository with id: " + id + " does not exists"));
+            }
+        } else {
+            exchange.setVariable(name, value);
+        }
+    }
 }


(camel) 02/04: CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty

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

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

commit 42d3bca108bc0706b935bf88fe74bc2a9b49ff8b
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Jan 2 15:20:15 2024 +0100

    CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty
---
 .../impl/engine/DefaultFluentProducerTemplate.java | 47 ++++++++++++----------
 .../camel/builder/FluentProducerTemplateTest.java  | 27 +++++++++++++
 .../org/apache/camel/support/ExchangeHelper.java   | 11 ++---
 3 files changed, 58 insertions(+), 27 deletions(-)

diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java
index 851bf2ce845..b1063041a6e 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java
@@ -214,7 +214,8 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
         DefaultFluentProducerTemplate clone = checkCloned();
 
         if (clone.processorSupplier != null) {
-            throw new IllegalArgumentException("Cannot use both withExchangeProperties and withProcessor with FluentProducerTemplate");
+            throw new IllegalArgumentException(
+                    "Cannot use both withExchangeProperties and withProcessor with FluentProducerTemplate");
         }
 
         Map<String, Object> map = clone.exchangeProperties;
@@ -231,7 +232,8 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
         DefaultFluentProducerTemplate clone = checkCloned();
 
         if (clone.processorSupplier != null) {
-            throw new IllegalArgumentException("Cannot use both withExchangeProperty and withProcessor with FluentProducerTemplate");
+            throw new IllegalArgumentException(
+                    "Cannot use both withExchangeProperty and withProcessor with FluentProducerTemplate");
         }
 
         Map<String, Object> map = clone.exchangeProperties;
@@ -457,24 +459,23 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
         // Determine the target endpoint
         final Endpoint target = clone.target();
 
-        Future<T> result =
-                clone.template().asyncSend(target, exchange -> {
-                    // Make a copy of the headers and body so that async processing won't
-                    // be invalidated by subsequent reuse of the template
-                    Object bodyCopy = clone.body;
-
-                    exchange.setPattern(ExchangePattern.InOut);
-                    exchange.getMessage().setBody(bodyCopy);
-                    if (clone.headers != null) {
-                        exchange.getMessage().setHeaders(new HashMap<>(clone.headers));
-                    }
-                    if (clone.exchangeProperties != null) {
-                        exchange.getProperties().putAll(clone.exchangeProperties);
-                    }
-                    if (clone.variables != null) {
-                        clone.variables.forEach((k, v) -> ExchangeHelper.setVariable(exchange, k, v));
-                    }
-                }).thenApply(answer -> answer.getContext().getTypeConverter().convertTo(type, answer));
+        Future<T> result = clone.template().asyncSend(target, exchange -> {
+            // Make a copy of the headers and body so that async processing won't
+            // be invalidated by subsequent reuse of the template
+            Object bodyCopy = clone.body;
+
+            exchange.setPattern(ExchangePattern.InOut);
+            exchange.getMessage().setBody(bodyCopy);
+            if (clone.headers != null) {
+                exchange.getMessage().setHeaders(new HashMap<>(clone.headers));
+            }
+            if (clone.exchangeProperties != null) {
+                exchange.getProperties().putAll(clone.exchangeProperties);
+            }
+            if (clone.variables != null) {
+                clone.variables.forEach((k, v) -> ExchangeHelper.setVariable(exchange, k, v));
+            }
+        }).thenApply(answer -> answer.getMessage().getBody(type));
 
         // reset cloned flag so when we use it again it has to set values again
         cloned = false;
@@ -624,8 +625,10 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu
 
     private Processor defaultAsyncProcessor() {
         final Map<String, Object> headersCopy = ObjectHelper.isNotEmpty(this.headers) ? new HashMap<>(this.headers) : null;
-        final Map<String, Object> propertiesCopy = ObjectHelper.isNotEmpty(this.exchangeProperties) ? new HashMap<>(this.exchangeProperties) : null;
-        final Map<String, Object> variablesCopy = ObjectHelper.isNotEmpty(this.variables) ? new HashMap<>(this.variables) : null;
+        final Map<String, Object> propertiesCopy
+                = ObjectHelper.isNotEmpty(this.exchangeProperties) ? new HashMap<>(this.exchangeProperties) : null;
+        final Map<String, Object> variablesCopy
+                = ObjectHelper.isNotEmpty(this.variables) ? new HashMap<>(this.variables) : null;
         final Object bodyCopy = this.body;
         return exchange -> {
             if (headersCopy != null) {
diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/FluentProducerTemplateTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/FluentProducerTemplateTest.java
index 7ef05345095..bbb9636c951 100644
--- a/core/camel-core/src/test/java/org/apache/camel/builder/FluentProducerTemplateTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/builder/FluentProducerTemplateTest.java
@@ -333,6 +333,30 @@ public class FluentProducerTemplateTest extends ContextTestSupport {
                 .to(context.getEndpoint("direct:inout")).request(Integer.class));
     }
 
+    @Test
+    public void testWithVariable() {
+        FluentProducerTemplate template = DefaultFluentProducerTemplate.on(context);
+
+        assertEquals("Hello World", template.withVariable("foo", "World").withBody("Hello")
+                .to("direct:var").request(String.class));
+
+        assertEquals("Hello Moon", template.withVariable("foo", "Moon").withVariable("global:planet", "Mars").withBody("Hello")
+                .to("direct:var").request(String.class));
+        assertEquals("Mars", context.getVariable("planet"));
+    }
+
+    @Test
+    public void testWithExchangeProperty() {
+        FluentProducerTemplate template = DefaultFluentProducerTemplate.on(context);
+
+        assertEquals("Hello World", template.withExchangeProperty("foo", "World").withBody("Hello")
+                .to("direct:ep").request(String.class));
+
+        assertEquals("Hello Moon",
+                template.withExchangeProperty("foo", "Moon").withExchangeProperty("planet", "Mars").withBody("Hello")
+                        .to("direct:ep").request(String.class));
+    }
+
     @Test
     public void testAsyncRequest() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:async");
@@ -473,6 +497,9 @@ public class FluentProducerTemplateTest extends ContextTestSupport {
 
                 from("direct:red").setBody().simple("Red ${body}");
 
+                from("direct:var").transform().simple("${body} ${variable.foo}");
+
+                from("direct:ep").transform().simple("${body} ${exchangeProperty.foo}");
             }
         };
     }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
index 004d0dacb99..5ea365e297d 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
@@ -1076,15 +1076,16 @@ public final class ExchangeHelper {
     /**
      * Sets the variable
      *
-     * @param exchange  the exchange
-     * @param name  the variable name. Can be prefixed with repo-id:name to lookup the variable from a specific
-     *              repository. If no repo-id is provided, then the variable is set on the exchange
-     * @param value the value of the variable
+     * @param exchange the exchange
+     * @param name     the variable name. Can be prefixed with repo-id:name to lookup the variable from a specific
+     *                 repository. If no repo-id is provided, then the variable is set on the exchange
+     * @param value    the value of the variable
      */
     public static void setVariable(Exchange exchange, String name, Object value) {
         String id = StringHelper.before(name, ":");
         if (id != null) {
-            VariableRepositoryFactory factory = exchange.getContext().getCamelContextExtension().getContextPlugin(VariableRepositoryFactory.class);
+            VariableRepositoryFactory factory
+                    = exchange.getContext().getCamelContextExtension().getContextPlugin(VariableRepositoryFactory.class);
             VariableRepository repo = factory.getVariableRepository(id);
             if (repo != null) {
                 name = StringHelper.after(name, ":");


(camel) 04/04: CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty. Also fixed typo.

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

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

commit 343be8f235abba04f870cf6bb0198a77c0021aa5
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Jan 2 15:50:03 2024 +0100

    CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty. Also fixed typo.
---
 .../org/apache/camel/processor/converter/ConvertVariableTest.java | 8 ++++++--
 .../groovy/org/apache/camel/dsl/yaml/ConvertVariableTest.groovy   | 2 +-
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/converter/ConvertVariableTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/converter/ConvertVariableTest.java
index 112a74282d7..bafb26a1027 100644
--- a/core/camel-core/src/test/java/org/apache/camel/processor/converter/ConvertVariableTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/processor/converter/ConvertVariableTest.java
@@ -27,6 +27,7 @@ import org.apache.camel.NoSuchVariableException;
 import org.apache.camel.NoTypeConversionAvailableException;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledOnOs;
 import org.junit.jupiter.api.condition.OS;
@@ -39,6 +40,11 @@ public class ConvertVariableTest extends ContextTestSupport {
 
     private FluentProducerTemplate fluent;
 
+    @BeforeEach
+    public void setupTemplate() {
+        fluent = context.createFluentProducerTemplate();
+    }
+
     @Test
     public void testConvertBodyTo() {
         try {
@@ -214,8 +220,6 @@ public class ConvertVariableTest extends ContextTestSupport {
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
-                fluent = context.createFluentProducerTemplate();
-
                 from("direct:start").convertVariableTo("foo", Integer.class).to("mock:result");
                 from("direct:optional").convertVariableTo("foo", Integer.class, false).to("mock:result");
                 from("direct:invalid").convertVariableTo("foo", Date.class).to("mock:result");
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ConvertVariableTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ConvertVariableTest.groovy
index d127b8bd52e..d9e4be95098 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ConvertVariableTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ConvertVariableTest.groovy
@@ -73,7 +73,7 @@ class ConvertVariableTest extends YamlTestSupport {
             '''
 
         withMock('mock:result') {
-            expectedVariableReceived("foo", 'Hello World')
+            expectedVariableReceived("foo", 'test')
         }
         when:
         context.start()