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/02/20 13:01:23 UTC

(camel) branch rab created (now 21384d3a612)

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

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


      at 21384d3a612 CAMEL-20437: camel-main - Preserve configuration keys as-is if inside quotes or are map keys.

This branch includes the following new commits:

     new 6686f6fd7e6 CAMEL-20437: camel-spring-rabbitmq - Allow to configure advanced args on component level.
     new 21384d3a612 CAMEL-20437: camel-main - Preserve configuration keys as-is if inside quotes or are map keys.

The 2 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) 01/02: CAMEL-20437: camel-spring-rabbitmq - Allow to configure advanced args on component level.

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

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

commit 6686f6fd7e6d8ebeb9055968f52d917d8225bf06
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Feb 20 13:08:51 2024 +0100

    CAMEL-20437: camel-spring-rabbitmq - Allow to configure advanced args on component level.
---
 .../camel/catalog/components/spring-rabbitmq.json  | 11 ++++++-----
 .../SpringRabbitMQComponentConfigurer.java         | 11 +++++++++++
 .../component/springrabbit/spring-rabbitmq.json    | 11 ++++++-----
 .../springrabbit/SpringRabbitMQComponent.java      | 23 +++++++++++++++++++++-
 .../dsl/SpringRabbitmqComponentBuilderFactory.java | 20 +++++++++++++++++++
 5 files changed, 65 insertions(+), 11 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-rabbitmq.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-rabbitmq.json
index a7d53552d28..a039b772311 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-rabbitmq.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/spring-rabbitmq.json
@@ -47,11 +47,12 @@
     "allowNullBody": { "index": 21, "kind": "property", "displayName": "Allow Null Body", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to allow sending messages with no body. If this option is false and the message body is null, then an MessageConversionException is thrown." },
     "lazyStartProducer": { "index": 22, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fai [...]
     "replyTimeout": { "index": 23, "kind": "property", "displayName": "Reply Timeout", "group": "producer", "label": "producer", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Specify the timeout in milliseconds to be used when waiting for a reply message when doing request\/reply messaging. The default value is 5 seconds. A negative value indicates an indefinite timeout." },
-    "autowiredEnabled": { "index": 24, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching  [...]
-    "ignoreDeclarationExceptions": { "index": 25, "kind": "property", "displayName": "Ignore Declaration Exceptions", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Switch on ignore exceptions such as mismatched properties when declaring" },
-    "messageConverter": { "index": 26, "kind": "property", "displayName": "Message Converter", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.springframework.amqp.support.converter.MessageConverter", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom MessageConverter so you can be in control how to map to\/from a org.springframework.amqp.core.Message." },
-    "messagePropertiesConverter": { "index": 27, "kind": "property", "displayName": "Message Properties Converter", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.springrabbit.MessagePropertiesConverter", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom MessagePropertiesConverter so you can be in control how to map to\/from a org.springframework.amqp.core.MessageProperties." },
-    "headerFilterStrategy": { "index": 28, "kind": "property", "displayName": "Header Filter Strategy", "group": "filter", "label": "filter", "required": false, "type": "object", "javaType": "org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message." }
+    "args": { "index": 24, "kind": "property", "displayName": "Args", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "deprecated": false, "autowired": false, "secret": false, "description": "Specify arguments for configuring the different RabbitMQ concepts, a different prefix is required for each element: consumer. exchange. queue. binding. dlq.exchange. dlq.queue. dlq.binding. For example to [...]
+    "autowiredEnabled": { "index": 25, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching  [...]
+    "ignoreDeclarationExceptions": { "index": 26, "kind": "property", "displayName": "Ignore Declaration Exceptions", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Switch on ignore exceptions such as mismatched properties when declaring" },
+    "messageConverter": { "index": 27, "kind": "property", "displayName": "Message Converter", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.springframework.amqp.support.converter.MessageConverter", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom MessageConverter so you can be in control how to map to\/from a org.springframework.amqp.core.Message." },
+    "messagePropertiesConverter": { "index": 28, "kind": "property", "displayName": "Message Properties Converter", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.springrabbit.MessagePropertiesConverter", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom MessagePropertiesConverter so you can be in control how to map to\/from a org.springframework.amqp.core.MessageProperties." },
+    "headerFilterStrategy": { "index": 29, "kind": "property", "displayName": "Header Filter Strategy", "group": "filter", "label": "filter", "required": false, "type": "object", "javaType": "org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message." }
   },
   "headers": {
     "CamelSpringRabbitmqRoutingOverrideKey": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "To override the endpoint configuration's routing key.", "constantName": "org.apache.camel.component.springrabbit.SpringRabbitMQConstants#ROUTING_OVERRIDE_KEY" },
diff --git a/components/camel-spring-rabbitmq/src/generated/java/org/apache/camel/component/springrabbit/SpringRabbitMQComponentConfigurer.java b/components/camel-spring-rabbitmq/src/generated/java/org/apache/camel/component/springrabbit/SpringRabbitMQComponentConfigurer.java
index 9a9ffb659a2..d9923ad4f5e 100644
--- a/components/camel-spring-rabbitmq/src/generated/java/org/apache/camel/component/springrabbit/SpringRabbitMQComponentConfigurer.java
+++ b/components/camel-spring-rabbitmq/src/generated/java/org/apache/camel/component/springrabbit/SpringRabbitMQComponentConfigurer.java
@@ -25,6 +25,7 @@ public class SpringRabbitMQComponentConfigurer extends PropertyConfigurerSupport
         case "allowNullBody": target.setAllowNullBody(property(camelContext, boolean.class, value)); return true;
         case "amqpadmin":
         case "amqpAdmin": target.setAmqpAdmin(property(camelContext, org.springframework.amqp.core.AmqpAdmin.class, value)); return true;
+        case "args": target.setArgs(property(camelContext, java.util.Map.class, value)); return true;
         case "autodeclare":
         case "autoDeclare": target.setAutoDeclare(property(camelContext, boolean.class, value)); return true;
         case "autostartup":
@@ -94,6 +95,7 @@ public class SpringRabbitMQComponentConfigurer extends PropertyConfigurerSupport
         case "allowNullBody": return boolean.class;
         case "amqpadmin":
         case "amqpAdmin": return org.springframework.amqp.core.AmqpAdmin.class;
+        case "args": return java.util.Map.class;
         case "autodeclare":
         case "autoDeclare": return boolean.class;
         case "autostartup":
@@ -159,6 +161,7 @@ public class SpringRabbitMQComponentConfigurer extends PropertyConfigurerSupport
         case "allowNullBody": return target.isAllowNullBody();
         case "amqpadmin":
         case "amqpAdmin": return target.getAmqpAdmin();
+        case "args": return target.getArgs();
         case "autodeclare":
         case "autoDeclare": return target.isAutoDeclare();
         case "autostartup":
@@ -215,5 +218,13 @@ public class SpringRabbitMQComponentConfigurer extends PropertyConfigurerSupport
         default: return null;
         }
     }
+
+    @Override
+    public Object getCollectionValueType(Object target, String name, boolean ignoreCase) {
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "args": return java.lang.Object.class;
+        default: return null;
+        }
+    }
 }
 
diff --git a/components/camel-spring-rabbitmq/src/generated/resources/org/apache/camel/component/springrabbit/spring-rabbitmq.json b/components/camel-spring-rabbitmq/src/generated/resources/org/apache/camel/component/springrabbit/spring-rabbitmq.json
index a7d53552d28..a039b772311 100644
--- a/components/camel-spring-rabbitmq/src/generated/resources/org/apache/camel/component/springrabbit/spring-rabbitmq.json
+++ b/components/camel-spring-rabbitmq/src/generated/resources/org/apache/camel/component/springrabbit/spring-rabbitmq.json
@@ -47,11 +47,12 @@
     "allowNullBody": { "index": 21, "kind": "property", "displayName": "Allow Null Body", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to allow sending messages with no body. If this option is false and the message body is null, then an MessageConversionException is thrown." },
     "lazyStartProducer": { "index": 22, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fai [...]
     "replyTimeout": { "index": 23, "kind": "property", "displayName": "Reply Timeout", "group": "producer", "label": "producer", "required": false, "type": "duration", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "5000", "description": "Specify the timeout in milliseconds to be used when waiting for a reply message when doing request\/reply messaging. The default value is 5 seconds. A negative value indicates an indefinite timeout." },
-    "autowiredEnabled": { "index": 24, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching  [...]
-    "ignoreDeclarationExceptions": { "index": 25, "kind": "property", "displayName": "Ignore Declaration Exceptions", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Switch on ignore exceptions such as mismatched properties when declaring" },
-    "messageConverter": { "index": 26, "kind": "property", "displayName": "Message Converter", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.springframework.amqp.support.converter.MessageConverter", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom MessageConverter so you can be in control how to map to\/from a org.springframework.amqp.core.Message." },
-    "messagePropertiesConverter": { "index": 27, "kind": "property", "displayName": "Message Properties Converter", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.springrabbit.MessagePropertiesConverter", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom MessagePropertiesConverter so you can be in control how to map to\/from a org.springframework.amqp.core.MessageProperties." },
-    "headerFilterStrategy": { "index": 28, "kind": "property", "displayName": "Header Filter Strategy", "group": "filter", "label": "filter", "required": false, "type": "object", "javaType": "org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message." }
+    "args": { "index": 24, "kind": "property", "displayName": "Args", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "java.util.Map<java.lang.String, java.lang.Object>", "deprecated": false, "autowired": false, "secret": false, "description": "Specify arguments for configuring the different RabbitMQ concepts, a different prefix is required for each element: consumer. exchange. queue. binding. dlq.exchange. dlq.queue. dlq.binding. For example to [...]
+    "autowiredEnabled": { "index": 25, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching  [...]
+    "ignoreDeclarationExceptions": { "index": 26, "kind": "property", "displayName": "Ignore Declaration Exceptions", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Switch on ignore exceptions such as mismatched properties when declaring" },
+    "messageConverter": { "index": 27, "kind": "property", "displayName": "Message Converter", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.springframework.amqp.support.converter.MessageConverter", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom MessageConverter so you can be in control how to map to\/from a org.springframework.amqp.core.Message." },
+    "messagePropertiesConverter": { "index": 28, "kind": "property", "displayName": "Message Properties Converter", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.springrabbit.MessagePropertiesConverter", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom MessagePropertiesConverter so you can be in control how to map to\/from a org.springframework.amqp.core.MessageProperties." },
+    "headerFilterStrategy": { "index": 29, "kind": "property", "displayName": "Header Filter Strategy", "group": "filter", "label": "filter", "required": false, "type": "object", "javaType": "org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": false, "secret": false, "description": "To use a custom org.apache.camel.spi.HeaderFilterStrategy to filter header to and from Camel message." }
   },
   "headers": {
     "CamelSpringRabbitmqRoutingOverrideKey": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "To override the endpoint configuration's routing key.", "constantName": "org.apache.camel.component.springrabbit.SpringRabbitMQConstants#ROUTING_OVERRIDE_KEY" },
diff --git a/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQComponent.java b/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQComponent.java
index 6cf816a9b37..e797d780b03 100644
--- a/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQComponent.java
+++ b/components/camel-spring-rabbitmq/src/main/java/org/apache/camel/component/springrabbit/SpringRabbitMQComponent.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.springrabbit;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.camel.Endpoint;
@@ -112,6 +113,11 @@ public class SpringRabbitMQComponent extends HeaderFilterStrategyComponent {
     @Metadata(label = "producer", defaultValue = "false",
               description = "Whether to allow sending messages with no body. If this option is false and the message body is null, then an MessageConversionException is thrown.")
     private boolean allowNullBody;
+    @Metadata(label = "advanced",
+              description = "Specify arguments for configuring the different RabbitMQ concepts, a different prefix is required for each element:"
+                            + " consumer. exchange. queue. binding. dlq.exchange. dlq.queue. dlq.binding."
+                            + " For example to declare a queue with message ttl argument: queue.x-message-ttl=60000")
+    private Map<String, Object> args;
 
     @Override
     protected void doInit() throws Exception {
@@ -153,7 +159,14 @@ public class SpringRabbitMQComponent extends HeaderFilterStrategyComponent {
         endpoint.setRejectAndDontRequeue(rejectAndDontRequeue);
         endpoint.setAllowNullBody(allowNullBody);
 
-        endpoint.setArgs(PropertiesHelper.extractProperties(parameters, ARG_PREFIX));
+        if (args != null) {
+            Map<String, Object> copy = new HashMap<>(args);
+            Map<String, Object> extra = PropertiesHelper.extractProperties(parameters, ARG_PREFIX);
+            copy.putAll(extra);
+            endpoint.setArgs(copy);
+        } else {
+            endpoint.setArgs(PropertiesHelper.extractProperties(parameters, ARG_PREFIX));
+        }
         setProperties(endpoint, parameters);
 
         return endpoint;
@@ -358,4 +371,12 @@ public class SpringRabbitMQComponent extends HeaderFilterStrategyComponent {
     public void setAllowNullBody(boolean allowNullBody) {
         this.allowNullBody = allowNullBody;
     }
+
+    public Map<String, Object> getArgs() {
+        return args;
+    }
+
+    public void setArgs(Map<String, Object> args) {
+        this.args = args;
+    }
 }
diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SpringRabbitmqComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SpringRabbitmqComponentBuilderFactory.java
index eaa12c8b24e..6bda8f20206 100644
--- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SpringRabbitmqComponentBuilderFactory.java
+++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/SpringRabbitmqComponentBuilderFactory.java
@@ -470,6 +470,25 @@ public interface SpringRabbitmqComponentBuilderFactory {
             doSetProperty("replyTimeout", replyTimeout);
             return this;
         }
+        /**
+         * Specify arguments for configuring the different RabbitMQ concepts, a
+         * different prefix is required for each element: consumer. exchange.
+         * queue. binding. dlq.exchange. dlq.queue. dlq.binding. For example to
+         * declare a queue with message ttl argument: queue.x-message-ttl=60000.
+         * 
+         * The option is a: &lt;code&gt;java.util.Map&amp;lt;java.lang.String,
+         * java.lang.Object&amp;gt;&lt;/code&gt; type.
+         * 
+         * Group: advanced
+         * 
+         * @param args the value to set
+         * @return the dsl builder
+         */
+        default SpringRabbitmqComponentBuilder args(
+                java.util.Map<java.lang.String, java.lang.Object> args) {
+            doSetProperty("args", args);
+            return this;
+        }
         /**
          * Whether autowiring is enabled. This is used for automatic autowiring
          * options (the option must be marked as autowired) by looking up in the
@@ -601,6 +620,7 @@ public interface SpringRabbitmqComponentBuilderFactory {
             case "allowNullBody": ((SpringRabbitMQComponent) component).setAllowNullBody((boolean) value); return true;
             case "lazyStartProducer": ((SpringRabbitMQComponent) component).setLazyStartProducer((boolean) value); return true;
             case "replyTimeout": ((SpringRabbitMQComponent) component).setReplyTimeout((long) value); return true;
+            case "args": ((SpringRabbitMQComponent) component).setArgs((java.util.Map) value); return true;
             case "autowiredEnabled": ((SpringRabbitMQComponent) component).setAutowiredEnabled((boolean) value); return true;
             case "ignoreDeclarationExceptions": ((SpringRabbitMQComponent) component).setIgnoreDeclarationExceptions((boolean) value); return true;
             case "messageConverter": ((SpringRabbitMQComponent) component).setMessageConverter((org.springframework.amqp.support.converter.MessageConverter) value); return true;


(camel) 02/02: CAMEL-20437: camel-main - Preserve configuration keys as-is if inside quotes or are map keys.

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

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

commit 21384d3a612caf5b73ab41ff1ba53ad279b1986d
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Feb 20 13:53:13 2024 +0100

    CAMEL-20437: camel-main - Preserve configuration keys as-is if inside quotes or are map keys.
---
 .../src/main/java/org/apache/camel/Exchange.java   |  2 +-
 .../processor/aggregate/AggregateProcessor.java    | 13 ++++----
 .../java/org/apache/camel/main/MainHelper.java     |  3 +-
 .../java/org/apache/camel/util/StringHelper.java   | 38 ++++++++++++++++++++++
 .../org/apache/camel/util/StringHelperTest.java    | 11 +++++++
 5 files changed, 59 insertions(+), 8 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/Exchange.java b/core/camel-api/src/main/java/org/apache/camel/Exchange.java
index 9b591afb36b..815600f16fa 100644
--- a/core/camel-api/src/main/java/org/apache/camel/Exchange.java
+++ b/core/camel-api/src/main/java/org/apache/camel/Exchange.java
@@ -300,7 +300,7 @@ public interface Exchange extends VariableAware {
     String TIMER_PERIOD = "CamelTimerPeriod";
     String TIMER_TIME = "CamelTimerTime";
 
-    @Metadata(label = "multicast,pollEnrich,recipientList,routingSlip,toD,to,wireTap",
+    @Metadata(label = "enrich,multicast,pollEnrich,recipientList,routingSlip,toD,to,wireTap",
               description = "Endpoint URI where this Exchange is being sent to", javaType = "String")
     String TO_ENDPOINT = "CamelToEndpoint";
     @Deprecated
diff --git a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java
index be1f01b7c17..a460afa27b8 100644
--- a/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java
+++ b/core/camel-core-processor/src/main/java/org/apache/camel/processor/aggregate/AggregateProcessor.java
@@ -74,13 +74,14 @@ import org.slf4j.LoggerFactory;
 
 /**
  * An implementation of the <a href="http://camel.apache.org/aggregator2.html">Aggregator</a> pattern where a batch of
- * messages is processed (up to a maximum amount or until some timeout is reached) and messages for the same
- * correlation key are combined using some kind of {@link AggregationStrategy} (by default the latest message
- * is used) to compress many message exchanges into a smaller number of exchanges.
+ * messages is processed (up to a maximum amount or until some timeout is reached) and messages for the same correlation
+ * key are combined using some kind of {@link AggregationStrategy} (by default the latest message is used) to compress
+ * many message exchanges into a smaller number of exchanges.
  * <p/>
- * A good example of this is stock market data; you may be receiving 30,000 messages/second, and you may want to throttle
- * it right down so that multiple messages for the same stock are combined (or just the latest message is used and older
- * prices to be discarded). Another idea is to combine line item messages together into a single invoice message.
+ * A good example of this is stock market data; you may be receiving 30,000 messages/second, and you may want to
+ * throttle it right down so that multiple messages for the same stock are combined (or just the latest message is used
+ * and older prices to be discarded). Another idea is to combine line item messages together into a single invoice
+ * message.
  */
 public class AggregateProcessor extends AsyncProcessorSupport
         implements Navigate<Processor>, Traceable, ShutdownPrepared, ShutdownAware, IdAware, RouteIdAware {
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java b/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java
index ee5687b64dc..f66c7859712 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/MainHelper.java
@@ -241,7 +241,8 @@ public final class MainHelper {
 
     public static String optionKey(String key) {
         // as we ignore case for property names we should use keys in same case and without dashes
-        key = StringHelper.dashToCamelCase(key);
+        // we need to preserve inside [] and quotes
+        key = StringHelper.dashToCamelCase(key, true);
         return key;
     }
 
diff --git a/core/camel-util/src/main/java/org/apache/camel/util/StringHelper.java b/core/camel-util/src/main/java/org/apache/camel/util/StringHelper.java
index 8771410df5f..ca7b731f5af 100644
--- a/core/camel-util/src/main/java/org/apache/camel/util/StringHelper.java
+++ b/core/camel-util/src/main/java/org/apache/camel/util/StringHelper.java
@@ -532,6 +532,17 @@ public final class StringHelper {
      * @return      the string camel cased
      */
     public static String dashToCamelCase(final String text) {
+        return dashToCamelCase(text, false);
+    }
+
+    /**
+     * Converts the string from dash format into camel case (hello-great-world -> helloGreatWorld)
+     *
+     * @param  text              the string
+     * @param  skipQuotedOrKeyed flag to skip converting within quoted or keyed text
+     * @return                   the string camel cased
+     */
+    public static String dashToCamelCase(final String text, boolean skipQuotedOrKeyed) {
         if (text == null) {
             return null;
         }
@@ -546,8 +557,35 @@ public final class StringHelper {
         // there is at least 1 dash so the capacity can be shorter
         StringBuilder sb = new StringBuilder(length - 1);
         boolean upper = false;
+        int singleQuotes = 0;
+        int doubleQuotes = 0;
+        boolean skip = false;
         for (int i = 0; i < length; i++) {
             char c = text.charAt(i);
+
+            // special for skip mode where we should keep text inside quotes or keys as-is
+            if (skipQuotedOrKeyed) {
+                if (c == ']') {
+                    skip = false;
+                } else if (c == '[') {
+                    skip = true;
+                } else if (c == '\'') {
+                    singleQuotes++;
+                } else if (c == '"') {
+                    doubleQuotes++;
+                }
+                if (singleQuotes > 0) {
+                    skip = singleQuotes % 2 == 1;
+                }
+                if (doubleQuotes > 0) {
+                    skip = doubleQuotes % 2 == 1;
+                }
+                if (skip) {
+                    sb.append(c);
+                    continue;
+                }
+            }
+
             if (c == '-') {
                 upper = true;
             } else {
diff --git a/core/camel-util/src/test/java/org/apache/camel/util/StringHelperTest.java b/core/camel-util/src/test/java/org/apache/camel/util/StringHelperTest.java
index 2bd46a0e533..9a024cf18d8 100644
--- a/core/camel-util/src/test/java/org/apache/camel/util/StringHelperTest.java
+++ b/core/camel-util/src/test/java/org/apache/camel/util/StringHelperTest.java
@@ -61,6 +61,17 @@ public class StringHelperTest {
         assertEquals("available-phone-number-country", camelCaseToDash("AvailablePhoneNumberCountry"));
     }
 
+    @Test
+    public void testDashToCamelCaseSkipQuotedOrKeyed() {
+        String line = "camel.component.rabbitmq.args[queue.x-queue-type]";
+        // no preserve
+        assertEquals("camel.component.rabbitmq.args[queue.xQueueType]",
+                dashToCamelCase(line));
+
+        // preserved
+        assertEquals(line, dashToCamelCase(line, true));
+    }
+
     @Nested
     class DashToCamelCase {