You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2021/02/26 10:08:51 UTC

[camel] 03/09: CAMEL-12545: create a yaml based route loader (add support for enhanced ToDefinition)

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

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

commit 588f0909d245a64d1c3a3b214a28d84559d46463
Author: Luca Burgazzoli <lb...@gmail.com>
AuthorDate: Thu Feb 25 15:11:16 2021 +0100

    CAMEL-12545: create a yaml based route loader (add support for enhanced ToDefinition)
---
 .../camel-yaml-dsl-deserializers/pom.xml           |  1 +
 .../dsl/yaml/deserializers/ModelDeserializers.java | 54 ------------
 .../deserializers/ModelDeserializersResolver.java  |  2 -
 .../dsl/yaml/deserializers/CustomResolver.java     |  3 +
 .../deserializers/ToDefinitionDeserializer.java    | 98 ++++++++++++++++++++++
 .../src/generated/resources/camel-yaml-dsl.json    | 10 +--
 .../groovy/org/apache/camel/dsl/yaml/ToTest.groovy | 73 ++++++++++++++++
 7 files changed, 177 insertions(+), 64 deletions(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml
index 6f55e32..9abcfd7 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml
@@ -125,6 +125,7 @@
                             <packageName>org.apache.camel.dsl.yaml.deserializers</packageName>
                             <bannedDefinitions>
                                 <bannedDefinition>org.apache.camel.model.FromDefinition</bannedDefinition>
+                                <bannedDefinition>org.apache.camel.model.ToDefinition</bannedDefinition>
                                 <bannedDefinition>org.apache.camel.model.language.ExpressionDefinition</bannedDefinition>
                                 <bannedDefinition>org.apache.camel.model.ExpressionSubElementDefinition</bannedDefinition>
                                 <bannedDefinition>org.apache.camel.model.PropertyDefinitions</bannedDefinition>
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index 4b8acce..07a3a14 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -85,7 +85,6 @@ import org.apache.camel.model.ThreadPoolProfileDefinition;
 import org.apache.camel.model.ThreadsDefinition;
 import org.apache.camel.model.ThrottleDefinition;
 import org.apache.camel.model.ThrowExceptionDefinition;
-import org.apache.camel.model.ToDefinition;
 import org.apache.camel.model.ToDynamicDefinition;
 import org.apache.camel.model.TransactedDefinition;
 import org.apache.camel.model.TransformDefinition;
@@ -13986,59 +13985,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
 
     @YamlType(
             inline = true,
-            types = org.apache.camel.model.ToDefinition.class,
-            order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
-            nodes = "to",
-            properties = {
-                    @YamlProperty(name = "inherit-error-handler", type = "boolean"),
-                    @YamlProperty(name = "pattern", type = "string"),
-                    @YamlProperty(name = "uri", type = "string", required = true)
-            }
-    )
-    public static class ToDefinitionDeserializer extends YamlDeserializerBase<ToDefinition> {
-        public ToDefinitionDeserializer() {
-            super(ToDefinition.class);
-        }
-
-        @Override
-        protected ToDefinition newInstance() {
-            return new ToDefinition();
-        }
-
-        @Override
-        protected ToDefinition newInstance(String value) {
-            return new ToDefinition(value);
-        }
-
-        @Override
-        protected boolean setProperty(ToDefinition target, String propertyKey, String propertyName,
-                Node node) {
-            switch(propertyKey) {
-                case "inherit-error-handler": {
-                    String val = asText(node);
-                    target.setInheritErrorHandler(java.lang.Boolean.valueOf(val));
-                    break;
-                }
-                case "pattern": {
-                    String val = asText(node);
-                    target.setPattern(val);
-                    break;
-                }
-                case "uri": {
-                    String val = asText(node);
-                    target.setUri(val);
-                    break;
-                }
-                default: {
-                    return false;
-                }
-            }
-            return true;
-        }
-    }
-
-    @YamlType(
-            inline = true,
             types = org.apache.camel.model.ToDynamicDefinition.class,
             order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
             nodes = "to-d",
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
index 8d6755f..1ddeaa2 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
@@ -368,8 +368,6 @@ public final class ModelDeserializersResolver implements YamlDeserializerResolve
             case "org.apache.camel.model.ThrowExceptionDefinition": return new ModelDeserializers.ThrowExceptionDefinitionDeserializer();
             case "tidy-markup": return new ModelDeserializers.TidyMarkupDataFormatDeserializer();
             case "org.apache.camel.model.dataformat.TidyMarkupDataFormat": return new ModelDeserializers.TidyMarkupDataFormatDeserializer();
-            case "to": return new ModelDeserializers.ToDefinitionDeserializer();
-            case "org.apache.camel.model.ToDefinition": return new ModelDeserializers.ToDefinitionDeserializer();
             case "to-d": return new ModelDeserializers.ToDynamicDefinitionDeserializer();
             case "org.apache.camel.model.ToDynamicDefinition": return new ModelDeserializers.ToDynamicDefinitionDeserializer();
             case "tokenize": return new ModelDeserializers.TokenizerExpressionDeserializer();
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
index 92b9e98..20d77a0 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java
@@ -62,6 +62,9 @@ public class CustomResolver implements YamlDeserializerResolver {
                 return new SagaOptionDefinitionDeserializer();
             case "org.apache.camel.model.ProcessorDefinition":
                 return new ProcessorDefinitionDefinitionDeserializer();
+            case "to":
+            case "org.apache.camel.model.ToDefinition":
+                return new ToDefinitionDeserializer();
             default:
                 return null;
         }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/ToDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/ToDefinitionDeserializer.java
new file mode 100644
index 0000000..c6cc362
--- /dev/null
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/ToDefinitionDeserializer.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.yaml.deserializers;
+
+import java.util.Map;
+
+import org.apache.camel.dsl.yaml.common.YamlDeserializationContext;
+import org.apache.camel.dsl.yaml.common.YamlDeserializerResolver;
+import org.apache.camel.dsl.yaml.common.YamlSupport;
+import org.apache.camel.model.ToDefinition;
+import org.apache.camel.spi.annotations.YamlProperty;
+import org.apache.camel.spi.annotations.YamlType;
+import org.apache.camel.util.ObjectHelper;
+import org.snakeyaml.engine.v2.api.ConstructNode;
+import org.snakeyaml.engine.v2.nodes.MappingNode;
+import org.snakeyaml.engine.v2.nodes.Node;
+import org.snakeyaml.engine.v2.nodes.NodeTuple;
+import org.snakeyaml.engine.v2.nodes.NodeType;
+
+import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asScalarMap;
+import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asText;
+import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.getDeserializationContext;
+import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.setDeserializationContext;
+
+@YamlType(
+          inline = true,
+          types = ToDefinition.class,
+          order = YamlDeserializerResolver.ORDER_DEFAULT,
+          properties = {
+                  @YamlProperty(name = "uri", type = "string", required = true),
+                  @YamlProperty(name = "properties", type = "object")
+          })
+public class ToDefinitionDeserializer implements ConstructNode {
+    @Override
+    public Object construct(Node node) {
+        return constructFromDefinition(node);
+    }
+
+    public static ToDefinition constructFromDefinition(Node node) {
+        if (node.getNodeType() == NodeType.SCALAR) {
+            return new ToDefinition(asText(node));
+        } else if (node.getNodeType() == NodeType.MAPPING) {
+            final MappingNode mn = (MappingNode) node;
+            final YamlDeserializationContext dc = getDeserializationContext(node);
+
+            String uri = null;
+            Map<String, Object> properties = null;
+
+            for (NodeTuple tuple : mn.getValue()) {
+                final String key = asText(tuple.getKeyNode());
+                final Node val = tuple.getValueNode();
+
+                setDeserializationContext(val, dc);
+
+                switch (key) {
+                    case "uri":
+                        uri = asText(val);
+                        break;
+                    case "properties":
+                        properties = asScalarMap(tuple.getValueNode());
+                        break;
+                    default:
+                        ConstructNode cn = EndpointProducerDeserializersResolver.resolveEndpointConstructor(key);
+                        if (cn != null) {
+                            if (uri != null || properties != null) {
+                                throw new IllegalArgumentException(
+                                        "uri and properties are not supported when using Endpoint DSL ");
+                            }
+                            return (ToDefinition) cn.construct(val);
+                        } else {
+                            throw new IllegalArgumentException("Unsupported field: " + key);
+                        }
+                }
+
+                ObjectHelper.notNull("uri", "The uri must set");
+            }
+
+            return new ToDefinition(
+                    YamlSupport.createEndpointUri(dc.getCamelContext(), uri, properties));
+        }
+
+        return null;
+    }
+}
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
index 66aa9c6..4a59104 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
@@ -164,9 +164,6 @@
           "throw-exception" : {
             "$ref" : "#/items/definitions/org.apache.camel.model.ThrowExceptionDefinition"
           },
-          "to" : {
-            "$ref" : "#/items/definitions/org.apache.camel.model.ToDefinition"
-          },
           "to-d" : {
             "$ref" : "#/items/definitions/org.apache.camel.model.ToDynamicDefinition"
           },
@@ -2373,11 +2370,8 @@
         }, {
           "type" : "object",
           "properties" : {
-            "inherit-error-handler" : {
-              "type" : "boolean"
-            },
-            "pattern" : {
-              "type" : "string"
+            "properties" : {
+              "type" : "object"
             },
             "uri" : {
               "type" : "string"
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ToTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ToTest.groovy
new file mode 100644
index 0000000..ac8857e
--- /dev/null
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ToTest.groovy
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.dsl.yaml
+
+import org.apache.camel.dsl.yaml.support.YamlTestSupport
+import org.apache.camel.model.ToDefinition
+import org.apache.camel.spi.Resource
+
+class ToTest extends YamlTestSupport {
+
+    def "to definition (#resource.location)"(Resource resource) {
+        when:
+            context.routesLoader.loadRoutes(resource)
+        then:
+            with(context.routeDefinitions[0].outputs[0], ToDefinition) {
+                endpointUri == 'direct:start'
+            }
+        where:
+            resource << [
+                asResource('inline', '''
+                    - from:
+                        uri: "direct:start"
+                        steps:    
+                          - to: "direct:start"
+                    '''),
+                asResource('uri', '''
+                    - from:
+                        uri: "direct:start"
+                        steps:    
+                          - to: 
+                              uri: "direct:start"
+                    '''),
+                asResource('properties', '''
+                    - from:
+                        uri: "direct:start"
+                        steps:    
+                          - to: 
+                              uri: "direct"
+                              properties:
+                                name: "start"
+                    '''),
+                asResource('endpoint', '''
+                    - from:
+                        uri: "direct:start"
+                        steps:    
+                          - to: 
+                              direct:
+                                name: "start"
+                    '''),
+                asResource('endpoint-dsl', '''
+                    - from:
+                        uri: "direct:start"
+                        steps:    
+                          - direct:
+                              name: "start"
+                    ''')
+            ]
+    }
+}