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/08 12:47:32 UTC

[camel] 01/03: CAMEL-17294: camel-yaml-dsl - Setting enum should work with mixed case and how camel-core does it.

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 937264eb35ccf759a8a94bb9514f2da7887d392a
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Dec 8 13:39:51 2021 +0100

    CAMEL-17294: camel-yaml-dsl - Setting enum should work with mixed case and how camel-core does it.
---
 .../dsl/yaml/common/YamlDeserializerSupport.java   | 38 ++++++++++++++++++++++
 .../org/apache/camel/dsl/yaml/MarshalTest.groovy   | 11 ++++++-
 2 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerSupport.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerSupport.java
index bceef93..dbd4c23 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerSupport.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerSupport.java
@@ -155,6 +155,18 @@ public class YamlDeserializerSupport {
         return ((ScalarNode) node).getValue();
     }
 
+    public static <T> T asEnum(Node node, Class<T> type) throws YamlDeserializationException {
+        if (node == null) {
+            return null;
+        }
+        if (node.getNodeType() != NodeType.SCALAR) {
+            throw new IllegalArgumentException("Node is not SCALAR");
+        }
+
+        String text = ((ScalarNode) node).getValue();
+        return enumConverter(type, text);
+    }
+
     public static Map<String, Object> asMap(Node node) {
         if (node == null) {
             return null;
@@ -420,4 +432,30 @@ public class YamlDeserializerSupport {
 
         return null;
     }
+
+    public static <T> T enumConverter(Class<T> type, String value) {
+        if (type.isEnum()) {
+            String text = value.toString();
+            Class<Enum<?>> enumClass = (Class<Enum<?>>) type;
+
+            // we want to match case insensitive for enums
+            for (Enum<?> enumValue : enumClass.getEnumConstants()) {
+                if (enumValue.name().equalsIgnoreCase(text)) {
+                    return type.cast(enumValue);
+                }
+            }
+
+            // add support for using dash or camel cased to common used upper cased underscore style for enum constants
+            text = StringHelper.asEnumConstantValue(text);
+            for (Enum<?> enumValue : enumClass.getEnumConstants()) {
+                if (enumValue.name().equalsIgnoreCase(text)) {
+                    return type.cast(enumValue);
+                }
+            }
+
+            throw new IllegalArgumentException("Enum class " + type + " does not have any constant with value: " + text);
+        }
+
+        return null;
+    }
 }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/MarshalTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/MarshalTest.groovy
index c664853..8356b8b 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/MarshalTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/MarshalTest.groovy
@@ -68,11 +68,20 @@ class MarshalTest extends YamlTestSupport {
                              data-format-type:
                                json: {}
                           - to: "mock:result"
+                    '''),
+                asResource('data-format-library-case', '''
+                    - from:
+                        uri: "direct:start"
+                        steps:    
+                          - marshal:
+                             json: 
+                               library: gson
+                          - to: "mock:result"
                     ''')
             ]
 
             expected << [
-                'json-gson', 'json-gson', 'json-jackson', 'json-jackson'
+                'json-gson', 'json-gson', 'json-jackson', 'json-jackson', 'json-gson'
             ]
     }
 }