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/14 13:25:23 UTC

[camel] 02/07: CAMEL-17331: add line number to model with camel-yaml-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 1ca215a59bb27582990f3bb669672dcdbfd0e836
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Dec 14 12:56:41 2021 +0100

    CAMEL-17331: add line number to model with camel-yaml-dsl
---
 .../dsl/yaml/common/YamlDeserializerBase.java      |  9 ++-
 .../deserializers/FromDefinitionDeserializer.java  | 10 ++-
 .../OutputAwareFromDefinitionDeserializer.java     | 18 +++--
 .../apache/camel/dsl/yaml/LineNumberTest.groovy    | 81 ++++++++++++++++++++++
 4 files changed, 112 insertions(+), 6 deletions(-)

diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerBase.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerBase.java
index 02ec14a..7e6ccdd 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerBase.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerBase.java
@@ -18,6 +18,7 @@ package org.apache.camel.dsl.yaml.common;
 
 import java.util.Locale;
 
+import org.apache.camel.LineNumberAware;
 import org.apache.camel.util.StringHelper;
 import org.snakeyaml.engine.v2.api.ConstructNode;
 import org.snakeyaml.engine.v2.nodes.MappingNode;
@@ -47,12 +48,18 @@ public abstract class YamlDeserializerBase<T> extends YamlDeserializerSupport im
         } else if (node.getNodeType() == NodeType.MAPPING) {
             MappingNode mn = (MappingNode) node;
             target = newInstance();
-
             setProperties(target, mn);
         } else {
             throw new IllegalArgumentException("Unsupported node type: " + node);
         }
 
+        // enrich model with line number
+        if (target instanceof LineNumberAware && node.getStartMark().isPresent()) {
+            int line = node.getStartMark().get().getLine();
+            LineNumberAware lna = (LineNumberAware) target;
+            lna.setLineNumber(line);
+        }
+
         return target;
     }
 
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 4df8ddf..ef1767f 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
@@ -33,13 +33,21 @@ import org.snakeyaml.engine.v2.nodes.Node;
                   @YamlProperty(name = "parameters", type = "object")
           })
 public class FromDefinitionDeserializer implements ConstructNode {
+
     @Override
     public Object construct(Node node) {
         String uri = YamlSupport.creteEndpointUri(node, EndpointConsumerDeserializersResolver::resolveEndpointUri);
         if (uri == null) {
             throw new IllegalStateException("The endpoint URI must be set");
         }
+        FromDefinition target = new FromDefinition(uri);
+
+        // enrich model with line number
+        if (node.getStartMark().isPresent()) {
+            int line = node.getStartMark().get().getLine();
+            target.setLineNumber(line);
+        }
 
-        return new FromDefinition(uri);
+        return target;
     }
 }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/OutputAwareFromDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/OutputAwareFromDefinitionDeserializer.java
index c0c81ac..55ab042 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/OutputAwareFromDefinitionDeserializer.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/OutputAwareFromDefinitionDeserializer.java
@@ -82,7 +82,13 @@ public class OutputAwareFromDefinitionDeserializer extends YamlDeserializerBase<
                         if (uri != null || properties != null) {
                             throw new IllegalArgumentException("uri and properties are not supported when using Endpoint DSL ");
                         }
-                        target.setDelegate(new FromDefinition(endpointUri));
+                        FromDefinition from = new FromDefinition(endpointUri);
+                        // enrich model with line number
+                        if (node.getStartMark().isPresent()) {
+                            int line = node.getStartMark().get().getLine();
+                            from.setLineNumber(line);
+                        }
+                        target.setDelegate(from);
                     } else {
                         throw new IllegalArgumentException("Unsupported field: " + key);
                     }
@@ -91,9 +97,13 @@ public class OutputAwareFromDefinitionDeserializer extends YamlDeserializerBase<
 
         if (target.getDelegate() == null) {
             ObjectHelper.notNull("uri", "The uri must set");
-
-            target.setDelegate(
-                    new FromDefinition(YamlSupport.createEndpointUri(dc.getCamelContext(), uri, properties)));
+            FromDefinition from = new FromDefinition(YamlSupport.createEndpointUri(dc.getCamelContext(), uri, properties));
+            // enrich model with line number
+            if (node.getStartMark().isPresent()) {
+                int line = node.getStartMark().get().getLine();
+                from.setLineNumber(line);
+            }
+            target.setDelegate(from);
         }
     }
 }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/LineNumberTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/LineNumberTest.groovy
new file mode 100644
index 0000000..402e280
--- /dev/null
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/LineNumberTest.groovy
@@ -0,0 +1,81 @@
+/*
+ * 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.FromDefinition
+import org.apache.camel.model.LogDefinition
+import org.apache.camel.model.RouteDefinition
+import org.apache.camel.model.ToDefinition
+
+class LineNumberTest extends YamlTestSupport {
+
+    def "line number definition"() {
+        when:
+            loadRoutes '''
+                - from:
+                    uri: "direct:start"
+                    steps:    
+                      - log:
+                         logging-level: "ERROR"
+                         message: "test"
+                         log-name: "yaml"
+                      - to: "direct:result"   
+            '''
+        then:
+            context.routeDefinitions.size() == 1
+
+            with(context.routeDefinitions[0].input, FromDefinition) {
+                uri == "direct:start"
+                lineNumber == 2
+            }
+            with(context.routeDefinitions[0].outputs[0], LogDefinition) {
+                loggingLevel == 'ERROR'
+                message == 'test'
+                logName == 'yaml'
+                lineNumber == 5
+            }
+            with(context.routeDefinitions[0].outputs[1], ToDefinition) {
+                uri == "direct:result"
+                lineNumber == 8
+            }
+    }
+
+    def "line number route"() {
+        when:
+        loadRoutes '''
+                - route:
+                    from:
+                      uri: "direct:info"
+                    steps:
+                      - log: "message"
+            '''
+        then:
+        context.routeDefinitions.size() == 1
+
+        with(context.routeDefinitions[0], RouteDefinition) {
+            input.lineNumber == 3
+            input.endpointUri == 'direct:info'
+
+            with (outputs[0], LogDefinition) {
+                lineNumber == 5
+                message == 'message'
+            }
+        }
+    }
+
+}