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 2021/12/07 13:51:55 UTC

[camel] 04/08: CAMEL-17288: camel-core - Route template parameters dash vs camel case keys and required

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

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

commit 4ef0dc7bfdc02eaf546e7172835c38896e16c5b4
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Dec 7 11:33:09 2021 +0100

    CAMEL-17288: camel-core - Route template parameters dash vs camel case keys and required
---
 .../main/java/org/apache/camel/impl/DefaultModel.java  | 15 +++++++++++++--
 .../test/resources/kamelets/error-handler.kamelet.yaml | 18 +++++++++---------
 2 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
index 83465a8..86d12af 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java
@@ -334,6 +334,7 @@ public class DefaultModel implements Model {
             throw new IllegalArgumentException("Cannot find RouteTemplate with id " + routeTemplateId);
         }
 
+        // support both camelCase and kebab-case keys
         final Map<String, Object> prop = new HashMap<>();
         // include default values first from the template (and validate that we have inputs for all required parameters)
         if (target.getTemplateParameters() != null) {
@@ -341,7 +342,7 @@ public class DefaultModel implements Model {
 
             for (RouteTemplateParameterDefinition temp : target.getTemplateParameters()) {
                 if (temp.getDefaultValue() != null) {
-                    prop.put(temp.getName(), temp.getDefaultValue());
+                    addProperty(prop, temp.getName(), temp.getDefaultValue());
                 } else {
                     if (temp.isRequired() && !routeTemplateContext.hasParameter(temp.getName())) {
                         // this is a required parameter which is missing
@@ -358,7 +359,7 @@ public class DefaultModel implements Model {
 
         // then override with user parameters part 1
         if (routeTemplateContext.getParameters() != null) {
-            prop.putAll(routeTemplateContext.getParameters());
+            routeTemplateContext.getParameters().forEach((k, v) -> addProperty(prop, k, v));
         }
         // route template context should include default template parameters from the target route template
         // so it has all parameters available
@@ -415,6 +416,16 @@ public class DefaultModel implements Model {
         return def.getId();
     }
 
+    private static void addProperty(Map<String, Object> prop, String key, Object value) {
+        prop.put(key, value);
+        // support also camelCase and kebab-case because route templates (kamelets)
+        // can be defined using different key styles
+        key = StringHelper.dashToCamelCase(key);
+        prop.put(key, value);
+        key = StringHelper.camelCaseToDash(key);
+        prop.put(key, value);
+    }
+
     private void addTemplateBeans(RouteTemplateContext routeTemplateContext, RouteTemplateDefinition target) throws Exception {
         for (RouteTemplateBeanDefinition b : target.getTemplateBeans()) {
             final Map<String, Object> props = new HashMap<>();
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/error-handler.kamelet.yaml b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/error-handler.kamelet.yaml
index f088fb2..7fcd6bd 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/error-handler.kamelet.yaml
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/resources/kamelets/error-handler.kamelet.yaml
@@ -30,27 +30,27 @@ spec:
       - kafka-service-account-secret
       - log-message
     properties:
-      kafkaBrokers:
+      kafka-brokers:
         title: Kafka Brokers
         description: the bootstrap server
         type: string
         example: "xyz-ins--rplssqfz-yyyyyyy-crojg.bf2.kafka.my-clud-service.com:443"
-      kafkaTopic:
+      kafka-topic:
         title: Kafka Topic
         description: the DLC topic
         type: string
         example: "my-dlc"
-      kafkaServiceAccountId:
+      kafka-service-account-id:
         title: Service Account ID
         description: the SA to use
         type: string
         example: "srvc-acct-xxxxxx-519b-453f-9f68-yyyyyyyyy"
-      kafkaServiceAccountSecret:
+      kafka-service-account-secret:
         title: Service Account Secret
         description: the SA secrete to use
         type: string
         example: "xxxxxxxxx-46c7-4c6c-a753-yyyyyyyyyyyyyyy"
-      logMessage:
+      log-message:
         title: Message
         description: A message warning to log
         type: string
@@ -61,13 +61,13 @@ spec:
       steps:
         # First step: send to the DLC for future processing
         - to:
-            uri: kafka:{{kafkaTopic}}
+            uri: kafka:{{kafka-topic}}
             parameters:
-              brokers: "{{kafkaBrokers}}"
+              brokers: "{{kafka-brokers}}"
               security-protocol: SASL_SSL
               sasl-mechanism: PLAIN
-              sasl-jaas-config: "org.apache.kafka.common.security.plain.PlainLoginModule required username={{kafkaServiceAccountId}} password={{kafkaServiceAccountSecret}};"
+              sasl-jaas-config: "org.apache.kafka.common.security.plain.PlainLoginModule required username={{kafka-service-account-id}} password={{kafka-service-account-secret}};"
         # Log an error message to notify about the failure
         - set-body:
-            constant: "{{logMessage}} - worry not, the event is stored in the DLC"
+            constant: "{{log-message}} - worry not, the event is stored in the DLC"
         - to: "log:error-sink"