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/16 10:44:05 UTC

[camel] 01/03: CAMEL-17304: camel-yaml-dsl - Make from consistent that it requires steps, so when you define routes in yaml dsl - its the same if you have route/from as top level or not - like in java dsl.

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 0c043cf7b77b1330eacdb945b2cb41805a11ed98
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Dec 9 16:11:20 2021 +0100

    CAMEL-17304: camel-yaml-dsl - Make from consistent that it requires steps, so when you define routes in yaml dsl - its the same if you have route/from as top level or not - like in java dsl.
---
 .../apache/camel/dsl/yaml/common/YamlSupport.java  |  8 +++++-
 .../deserializers/FromDefinitionDeserializer.java  | 16 ++++++++---
 .../deserializers/RouteDefinitionDeserializer.java |  8 +++---
 .../RouteFromDefinitionDeserializer.java           |  1 +
 .../src/generated/resources/camel-yaml-dsl.json    | 16 +++++------
 .../camel/dsl/yaml/RouteConfigurationTest.groovy   | 16 +++++------
 .../org/apache/camel/dsl/yaml/RoutesTest.groovy    | 31 +++++++++++++++++++---
 7 files changed, 67 insertions(+), 29 deletions(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlSupport.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlSupport.java
index a596677..687d067 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlSupport.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlSupport.java
@@ -29,6 +29,7 @@ import org.apache.camel.Component;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.PropertyBindingException;
 import org.apache.camel.dsl.yaml.common.exception.UnsupportedNodeTypeException;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.CamelContextCustomizer;
 import org.apache.camel.spi.EndpointUriFactory;
 import org.apache.camel.spi.PropertyConfigurer;
@@ -48,6 +49,7 @@ import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asScalarM
 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;
+import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.setSteps;
 
 public final class YamlSupport {
     private YamlSupport() {
@@ -201,7 +203,7 @@ public final class YamlSupport {
         return node;
     }
 
-    public static String creteEndpointUri(Node node, BiFunction<String, Node, String> endpointResolver) {
+    public static String creteEndpointUri(Node node, BiFunction<String, Node, String> endpointResolver, RouteDefinition route) {
         String answer = null;
 
         if (node.getNodeType() == NodeType.SCALAR) {
@@ -236,6 +238,10 @@ public final class YamlSupport {
 
                         parameters = asScalarMap(tuple.getValueNode());
                         break;
+                    case "steps":
+                        // steps must be set on the route
+                        setSteps(route, val);
+                        break;
                     default:
                         String endpointUri = endpointResolver.apply(key, val);
                         if (endpointUri != null) {
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/FromDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/FromDefinitionDeserializer.java
index ef1767f..1a62278 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/FromDefinitionDeserializer.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/FromDefinitionDeserializer.java
@@ -19,6 +19,7 @@ package org.apache.camel.dsl.yaml.deserializers;
 import org.apache.camel.dsl.yaml.common.YamlDeserializerResolver;
 import org.apache.camel.dsl.yaml.common.YamlSupport;
 import org.apache.camel.model.FromDefinition;
+import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.annotations.YamlProperty;
 import org.apache.camel.spi.annotations.YamlType;
 import org.snakeyaml.engine.v2.api.ConstructNode;
@@ -30,24 +31,33 @@ import org.snakeyaml.engine.v2.nodes.Node;
           order = YamlDeserializerResolver.ORDER_DEFAULT,
           properties = {
                   @YamlProperty(name = "uri", type = "string", required = true),
-                  @YamlProperty(name = "parameters", type = "object")
+                  @YamlProperty(name = "parameters", type = "object"),
+                  @YamlProperty(name = "steps", type = "array:org.apache.camel.model.ProcessorDefinition", required = true)
           })
 public class FromDefinitionDeserializer implements ConstructNode {
 
     @Override
     public Object construct(Node node) {
-        String uri = YamlSupport.creteEndpointUri(node, EndpointConsumerDeserializersResolver::resolveEndpointUri);
+
+        // from must be wrapped in a route, so use existing route or create a new route
+        RouteDefinition route = (RouteDefinition) node.getProperty(RouteDefinition.class.getName());
+        if (route == null) {
+            route = new RouteDefinition();
+        }
+
+        String uri = YamlSupport.creteEndpointUri(node, EndpointConsumerDeserializersResolver::resolveEndpointUri, route);
         if (uri == null) {
             throw new IllegalStateException("The endpoint URI must be set");
         }
         FromDefinition target = new FromDefinition(uri);
+        // set from as input on the route
+        route.setInput(target);
 
         // enrich model with line number
         if (node.getStartMark().isPresent()) {
             int line = node.getStartMark().get().getLine();
             target.setLineNumber(line);
         }
-
         return target;
     }
 }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteDefinitionDeserializer.java
index da7ca89..30a1e6a 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteDefinitionDeserializer.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteDefinitionDeserializer.java
@@ -38,10 +38,10 @@ import org.snakeyaml.engine.v2.nodes.NodeTuple;
                   @YamlProperty(name = "id", type = "string"),
                   @YamlProperty(name = "group", type = "string"),
                   @YamlProperty(name = "route-configuration-id", type = "string"),
-                  @YamlProperty(name = "from", type = "object:org.apache.camel.model.FromDefinition", required = true),
-                  @YamlProperty(name = "steps", type = "array:org.apache.camel.model.ProcessorDefinition", required = true)
+                  @YamlProperty(name = "from", type = "object:org.apache.camel.model.FromDefinition", required = true)
           })
 public class RouteDefinitionDeserializer extends YamlDeserializerBase<RouteDefinition> {
+
     public RouteDefinitionDeserializer() {
         super(RouteDefinition.class);
     }
@@ -62,9 +62,6 @@ public class RouteDefinitionDeserializer extends YamlDeserializerBase<RouteDefin
             setDeserializationContext(val, dc);
 
             switch (key) {
-                case "steps":
-                    setSteps(target, val);
-                    break;
                 case "id":
                     target.setId(asText(val));
                     break;
@@ -75,6 +72,7 @@ public class RouteDefinitionDeserializer extends YamlDeserializerBase<RouteDefin
                     target.setRouteConfigurationId(asText(val));
                     break;
                 case "from":
+                    val.setProperty(RouteDefinition.class.getName(), target);
                     target.setInput(asType(val, FromDefinition.class));
                     break;
                 default:
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteFromDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteFromDefinitionDeserializer.java
index 6b65b7e..6842493 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteFromDefinitionDeserializer.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteFromDefinitionDeserializer.java
@@ -30,6 +30,7 @@ import org.apache.camel.spi.annotations.YamlType;
                                 type = "object:org.apache.camel.dsl.yaml.deserializers.OutputAwareFromDefinition")
           })
 public class RouteFromDefinitionDeserializer extends OutputAwareFromDefinitionDeserializer {
+
     public RouteFromDefinitionDeserializer() {
     }
 }
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 62e992b..7fa4a6e 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
@@ -944,12 +944,18 @@
             "parameters" : {
               "type" : "object"
             },
+            "steps" : {
+              "type" : "array",
+              "items" : {
+                "$ref" : "#/items/definitions/org.apache.camel.model.ProcessorDefinition"
+              }
+            },
             "uri" : {
               "type" : "string"
             }
           }
         } ],
-        "required" : [ "uri" ]
+        "required" : [ "steps", "uri" ]
       },
       "org.apache.camel.model.GlobalOptionDefinition" : {
         "type" : "object",
@@ -2205,15 +2211,9 @@
           },
           "route-configuration-id" : {
             "type" : "string"
-          },
-          "steps" : {
-            "type" : "array",
-            "items" : {
-              "$ref" : "#/items/definitions/org.apache.camel.model.ProcessorDefinition"
-            }
           }
         },
-        "required" : [ "from", "steps" ]
+        "required" : [ "from" ]
       },
       "org.apache.camel.model.RouteTemplateBeanDefinition" : {
         "oneOf" : [ {
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteConfigurationTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteConfigurationTest.groovy
index 15550bf..ba7e9a8 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteConfigurationTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteConfigurationTest.groovy
@@ -133,16 +133,16 @@ class RouteConfigurationTest extends YamlTestSupport {
                 - route:
                     route-configuration-id: handleError 
                     from:
-                        uri: "direct:start"
-                    steps:
-                      - process: 
-                          ref: "myFailingProcessor"            
+                      uri: "direct:start"
+                      steps:
+                        - process: 
+                            ref: "myFailingProcessor"            
                 - route:
                     from:
-                        uri: "direct:start2"
-                    steps:
-                      - process: 
-                          ref: "myFailingProcessor"            
+                      uri: "direct:start2"
+                      steps:
+                        - process: 
+                            ref: "myFailingProcessor"            
             """
 
         withMock('mock:on-exception') {
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesTest.groovy
index d3baef1..fed813d 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RoutesTest.groovy
@@ -101,8 +101,8 @@ class RoutesTest extends YamlTestSupport {
                 - route:
                     from:
                       uri: "direct:info"
-                    steps:
-                      - log: "message"
+                      steps:
+                        - log: "message"
             '''
         then:
             context.routeDefinitions.size() == 1
@@ -124,8 +124,8 @@ class RoutesTest extends YamlTestSupport {
                       uri: "direct:info"
                       parameters:
                         timeout: 1234
-                    steps:
-                      - log: "message"
+                      steps:
+                        - log: "message"
             '''
         then:
             context.routeDefinitions.size() == 1
@@ -138,4 +138,27 @@ class RoutesTest extends YamlTestSupport {
                 }
             }
     }
+
+    def "load route inlined"() {
+        when:
+        loadRoutes '''
+                - route:
+                    id: demo-route
+                    from:
+                      uri: "direct:info"
+                      steps:
+                        - log: "message"
+            '''
+        then:
+        context.routeDefinitions.size() == 1
+
+        with(context.routeDefinitions[0], RouteDefinition) {
+            routeId == 'demo-route'
+            input.endpointUri == 'direct:info'
+
+            with (outputs[0], LogDefinition) {
+                message == 'message'
+            }
+        }
+    }
 }