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 2022/01/07 11:39:20 UTC

[camel] branch main updated: CAMEL-17450: camel-yaml-dsl - Source location for KameletBinding

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


The following commit(s) were added to refs/heads/main by this push:
     new 0f9b546  CAMEL-17450: camel-yaml-dsl - Source location for KameletBinding
0f9b546 is described below

commit 0f9b546d41f750863522f83ffd24e55ee439e8f7
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Jan 7 12:37:25 2022 +0100

    CAMEL-17450: camel-yaml-dsl - Source location for KameletBinding
---
 .../camel/dsl/yaml/YamlRoutesBuilderLoader.java    | 67 ++++++++++++++++------
 .../camel/dsl/yaml/KameletBindingLoaderTest.groovy |  2 +
 2 files changed, 51 insertions(+), 18 deletions(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
index 60f6a30..df2c431 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
@@ -29,12 +29,14 @@ import org.apache.camel.builder.ErrorHandlerBuilder;
 import org.apache.camel.builder.NoErrorHandlerBuilder;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.builder.RouteConfigurationBuilder;
+import org.apache.camel.dsl.yaml.common.YamlDeserializationContext;
 import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport;
 import org.apache.camel.dsl.yaml.deserializers.OutputAwareFromDefinition;
 import org.apache.camel.model.OnExceptionDefinition;
 import org.apache.camel.model.RouteConfigurationDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RouteTemplateDefinition;
+import org.apache.camel.model.ToDefinition;
 import org.apache.camel.model.errorhandler.DefaultErrorHandlerProperties;
 import org.apache.camel.model.rest.RestConfigurationDefinition;
 import org.apache.camel.model.rest.RestDefinition;
@@ -83,10 +85,11 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
         return new RouteConfigurationBuilder() {
             @Override
             public void configure() throws Exception {
-                getDeserializationContext().setResource(resource);
-                setDeserializationContext(root, getDeserializationContext());
+                YamlDeserializationContext ctx = getDeserializationContext();
+                ctx.setResource(resource);
+                setDeserializationContext(root, ctx);
 
-                Object target = preConfigureNode(root);
+                Object target = preConfigureNode(root, ctx);
                 if (target == null) {
                     return;
                 }
@@ -99,7 +102,7 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
                             idx = node.getStartMark().get().getIndex();
                         }
                         if (idx == -1 || !indexes.contains(idx)) {
-                            Object item = getDeserializationContext().mandatoryResolve(node).construct(node);
+                            Object item = ctx.mandatoryResolve(node).construct(node);
                             boolean accepted = doConfigure(item);
                             if (accepted && idx != -1) {
                                 indexes.add(idx);
@@ -166,10 +169,11 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
 
             @Override
             public void configuration() throws Exception {
-                getDeserializationContext().setResource(resource);
-                setDeserializationContext(root, getDeserializationContext());
+                YamlDeserializationContext ctx = getDeserializationContext();
+                ctx.setResource(resource);
+                setDeserializationContext(root, ctx);
 
-                Object target = preConfigureNode(root);
+                Object target = preConfigureNode(root, ctx);
                 if (target == null) {
                     return;
                 }
@@ -182,7 +186,7 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
                             idx = node.getStartMark().get().getIndex();
                         }
                         if (idx == -1 || !indexes.contains(idx)) {
-                            Object item = getDeserializationContext().mandatoryResolve(node).construct(node);
+                            Object item = ctx.mandatoryResolve(node).construct(node);
                             boolean accepted = doConfiguration(item);
                             if (accepted && idx != -1) {
                                 indexes.add(idx);
@@ -205,7 +209,7 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
         };
     }
 
-    private Object preConfigureNode(Node root) throws Exception {
+    private Object preConfigureNode(Node root, YamlDeserializationContext ctx) throws Exception {
         Object target = root;
 
         // check if the yaml is a camel-k yaml with embedded binding/routes (called flow(s))
@@ -218,9 +222,9 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
             boolean binding = anyTupleMatches(mn.getValue(), "apiVersion", v -> v.startsWith(BINDING_VERSION)) &&
                     anyTupleMatches(mn.getValue(), "kind", "KameletBinding");
             if (integration) {
-                target = preConfigureIntegration(root, target);
+                target = preConfigureIntegration(root, ctx, target);
             } else if (binding) {
-                target = preConfigureKameletBinding(root, target);
+                target = preConfigureKameletBinding(root, ctx, target);
             }
         }
 
@@ -230,7 +234,7 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
     /**
      * Camel K Integration file
      */
-    private Object preConfigureIntegration(Node root, Object target) {
+    private Object preConfigureIntegration(Node root, YamlDeserializationContext ctx, Object target) {
         Node routes = nodeAt(root, "/spec/flows");
         if (routes == null) {
             routes = nodeAt(root, "/spec/flow");
@@ -244,7 +248,8 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
     /**
      * Camel K Kamelet Binding file
      */
-    private Object preConfigureKameletBinding(Node root, Object target) throws Exception {
+    private Object preConfigureKameletBinding(Node root, YamlDeserializationContext ctx, Object target) throws Exception {
+        // start with a route
         final RouteDefinition route = new RouteDefinition();
         String routeId = asText(nodeAt(root, "/metadata/name"));
         if (routeId != null) {
@@ -256,9 +261,22 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
         MappingNode source = asMappingNode(nodeAt(root, "/spec/source"));
         MappingNode sink = asMappingNode(nodeAt(root, "/spec/sink"));
         if (source != null && sink != null) {
+            int line = -1;
+            if (source.getStartMark().isPresent()) {
+                line = source.getStartMark().get().getLine();
+            }
+
             // source at the beginning (mandatory)
-            String from = extractCamelEndpointUri(source);
-            route.from(from);
+            String uri = extractCamelEndpointUri(source);
+            route.from(uri);
+
+            // enrich model with line number
+            if (line != -1) {
+                route.getInput().setLineNumber(line);
+                if (ctx != null) {
+                    route.getInput().setLocation(ctx.getResource().getLocation());
+                }
+            }
 
             // steps in the middle (optional)
             Node steps = nodeAt(root, "/spec/steps");
@@ -266,7 +284,7 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
                 SequenceNode sn = asSequenceNode(steps);
                 for (Node node : sn.getValue()) {
                     MappingNode step = asMappingNode(node);
-                    String uri = extractCamelEndpointUri(step);
+                    uri = extractCamelEndpointUri(step);
                     if (uri != null) {
                         // if kamelet then use kamelet eip instead of to
                         boolean kamelet = uri.startsWith("kamelet:");
@@ -281,8 +299,21 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
             }
 
             // sink is at the end (mandatory)
-            String to = extractCamelEndpointUri(sink);
-            route.to(to);
+            line = -1;
+            if (sink.getStartMark().isPresent()) {
+                line = sink.getStartMark().get().getLine();
+            }
+            uri = extractCamelEndpointUri(sink);
+            ToDefinition to = new ToDefinition(uri);
+            route.addOutput(to);
+
+            // enrich model with line number
+            if (line != -1) {
+                to.setLineNumber(line);
+                if (ctx != null) {
+                    to.setLocation(ctx.getResource().getLocation());
+                }
+            }
 
             // is there any error handler?
             MappingNode errorHandler = asMappingNode(nodeAt(root, "/spec/errorHandler"));
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletBindingLoaderTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletBindingLoaderTest.groovy
index df2a54d..59d8a05 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletBindingLoaderTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletBindingLoaderTest.groovy
@@ -59,9 +59,11 @@ class KameletBindingLoaderTest extends YamlTestSupport {
             with (context.routeDefinitions[0]) {
                 routeId == 'timer-event-source'
                 input.endpointUri == 'kamelet:timer-source?message=Hello+world%21'
+                input.lineNumber == 7
                 outputs.size() == 1
                 with (outputs[0], ToDefinition) {
                     endpointUri == 'kamelet:log-sink'
+                    lineNumber == 14
                 }
             }
     }