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'
]
}
}