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 <[email protected]> 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' ] } }
