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 2018/07/16 08:03:14 UTC

[camel] branch master updated: CAMEL-12640: camel route parser now includes charachter position details.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2cd9d9d  CAMEL-12640: camel route parser now includes charachter position details.
2cd9d9d is described below

commit 2cd9d9d09a613ae8739cdd2affbdad91fa7a2768
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Jul 16 10:02:51 2018 +0200

    CAMEL-12640: camel route parser now includes charachter position details.
---
 .../apache/camel/parser/RouteBuilderParser.java    | 47 ++++++++++++++++++++++
 .../org/apache/camel/parser/XmlRouteParser.java    | 16 ++++++++
 .../camel/parser/helper/XmlLineNumberParser.java   | 13 ++++--
 .../camel/parser/model/CamelEndpointDetails.java   | 24 +++++++++++
 .../camel/parser/model/CamelNodeDetails.java       |  9 +++++
 .../parser/model/CamelSimpleExpressionDetails.java | 24 +++++++++++
 .../parser/java/RoasterEndpointInjectTest.java     |  8 ++++
 .../org/apache/camel/parser/xml/XmlRouteTest.java  |  2 +
 8 files changed, 139 insertions(+), 4 deletions(-)

diff --git a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java
index b5290df..d7040aa 100644
--- a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java
+++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/RouteBuilderParser.java
@@ -171,6 +171,11 @@ public final class RouteBuilderParser {
                     if (endLine > -1) {
                         detail.setLineNumberEnd("" + endLine);
                     }
+                    detail.setAbsolutePosition(pos);
+                    int linePos = findLinePosition(clazz.toUnformattedString(), pos);
+                    if (linePos > -1) {
+                        detail.setLinePosition(linePos);
+                    }
                 }
                 // we do not know if this field is used as consumer or producer only, but we try
                 // to find out by scanning the route in the configure method below
@@ -226,6 +231,11 @@ public final class RouteBuilderParser {
                         if (lineEnd > -1) {
                             detail.setLineNumberEnd("" + lineEnd);
                         }
+                        detail.setAbsolutePosition(result.getPosition());
+                        int linePos = findLinePosition(clazz.toUnformattedString(), result.getPosition());
+                        if (linePos > -1) {
+                            detail.setLinePosition(linePos);
+                        }
                         detail.setEndpointComponentName(endpointComponentName(result.getElement()));
                         detail.setConsumerOnly(true);
                         detail.setProducerOnly(false);
@@ -273,6 +283,11 @@ public final class RouteBuilderParser {
                     if (endLine > -1) {
                         detail.setLineNumberEnd("" + endLine);
                     }
+                    detail.setAbsolutePosition(result.getPosition());
+                    int linePos = findLinePosition(clazz.toUnformattedString(), result.getPosition());
+                    if (linePos > -1) {
+                        detail.setLinePosition(linePos);
+                    }
                     detail.setEndpointComponentName(endpointComponentName(result.getElement()));
                     detail.setConsumerOnly(false);
                     detail.setProducerOnly(true);
@@ -315,6 +330,11 @@ public final class RouteBuilderParser {
                     if (endLine > -1) {
                         detail.setLineNumberEnd("" + endLine);
                     }
+                    detail.setAbsolutePosition(result.getPosition());
+                    int linePos = findLinePosition(clazz.toUnformattedString(), result.getPosition());
+                    if (linePos > -1) {
+                        detail.setLinePosition(linePos);
+                    }
                     detail.setSimple(result.getElement());
 
                     boolean predicate = result.getPredicate() != null ? result.getPredicate() : false;
@@ -402,6 +422,33 @@ public final class RouteBuilderParser {
         return lines;
     }
 
+    private static int findLinePosition(String content, int position) {
+        int lines = 0;
+
+        try {
+            int current = 0;
+            try (BufferedReader br = new BufferedReader(new StringReader(content))) {
+                String line;
+                while ((line = br.readLine()) != null) {
+                    lines++;
+                    current += line.length() + 1; // add 1 for line feed
+                    if (current >= position) {
+                        int prev = current - (line.length() + 1);
+                        // find relative position now
+                        int rel = position - prev;
+                        // add +1
+                        return rel + 1;
+                    }
+                }
+            }
+        } catch (Exception e) {
+            // ignore
+            return -1;
+        }
+
+        return lines;
+    }
+
     private static String endpointComponentName(String uri) {
         if (uri != null) {
             int idx = uri.indexOf(":");
diff --git a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java
index 3c9e5ee..3515a3f 100644
--- a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java
+++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java
@@ -90,6 +90,11 @@ public final class XmlRouteParser {
                 node.setLineNumber(lineNumber);
                 node.setLineNumberEnd(lineNumberEnd);
 
+                String column = (String) route.getUserData(XmlLineNumberParser.COLUMN_NUMBER);
+                if (column != null) {
+                    node.setLinePosition(Integer.valueOf(column));
+                }
+
                 // parse the route and gather all its EIPs
                 List<CamelNodeDetails> tree = parser.parseCamelRouteTree(route, routeId, node, baseDir, fullyQualifiedFileName);
                 answer.addAll(tree);
@@ -150,6 +155,12 @@ public final class XmlRouteParser {
                     detail.setFileName(fileName);
                     detail.setLineNumber(lineNumber);
                     detail.setLineNumberEnd(lineNumberEnd);
+
+                    String column = (String) node.getUserData(XmlLineNumberParser.COLUMN_NUMBER);
+                    if (column != null) {
+                        detail.setLinePosition(Integer.valueOf(column));
+                    }
+
                     detail.setEndpointInstance(id);
                     detail.setEndpointUri(uri);
                     detail.setEndpointComponentName(endpointComponentName(uri));
@@ -199,6 +210,11 @@ public final class XmlRouteParser {
                 detail.setLineNumberEnd(lineNumberEnd);
                 detail.setSimple(simple);
 
+                String column = (String) node.getUserData(XmlLineNumberParser.COLUMN_NUMBER);
+                if (column != null) {
+                    detail.setLinePosition(Integer.valueOf(column));
+                }
+
                 // is it used as predicate or not
                 boolean asPredicate = isSimplePredicate(node);
                 detail.setPredicate(asPredicate);
diff --git a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/XmlLineNumberParser.java b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/XmlLineNumberParser.java
index 35eae1c..0206c75 100644
--- a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/XmlLineNumberParser.java
+++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/XmlLineNumberParser.java
@@ -44,6 +44,7 @@ import org.xml.sax.helpers.DefaultHandler;
  *   String columnNumber = (String) node.getUserData(XmlLineNumberParser.COLUMN_NUMBER);
  *   String columnNumberEnd = (String) node.getUserData(XmlLineNumberParser.COLUMN_NUMBER_END);
  * </pre>
+ * Mind that start and end numbers are the same for single-level XML tags.
  */
 public final class XmlLineNumberParser {
 
@@ -137,8 +138,10 @@ public final class XmlLineNumberParser {
                         el.setAttribute(attributes.getQName(i), attributes.getValue(i));
                     }
 
-                    el.setUserData(LINE_NUMBER, String.valueOf(this.locator.getLineNumber()), null);
-                    el.setUserData(COLUMN_NUMBER, String.valueOf(this.locator.getColumnNumber()), null);
+                    String ln = String.valueOf(this.locator.getLineNumber());
+                    String cn = String.valueOf(this.locator.getColumnNumber());
+                    el.setUserData(LINE_NUMBER, ln, null);
+                    el.setUserData(COLUMN_NUMBER, cn, null);
                     elementStack.push(el);
                 }
             }
@@ -161,8 +164,10 @@ public final class XmlLineNumberParser {
                         parentEl.appendChild(closedEl);
                     }
 
-                    closedEl.setUserData(LINE_NUMBER_END, String.valueOf(this.locator.getLineNumber()), null);
-                    closedEl.setUserData(COLUMN_NUMBER_END, String.valueOf(this.locator.getColumnNumber()), null);
+                    String ln = String.valueOf(this.locator.getLineNumber());
+                    String cn = String.valueOf(this.locator.getColumnNumber());
+                    closedEl.setUserData(LINE_NUMBER_END, ln, null);
+                    closedEl.setUserData(COLUMN_NUMBER_END, cn, null);
                 }
             }
 
diff --git a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelEndpointDetails.java b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelEndpointDetails.java
index a74b75d..1b23091 100644
--- a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelEndpointDetails.java
+++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelEndpointDetails.java
@@ -24,6 +24,8 @@ public class CamelEndpointDetails {
     private String fileName;
     private String lineNumber;
     private String lineNumberEnd;
+    private int absolutePosition;
+    private int linePosition;
     private String className;
     private String methodName;
     private String endpointComponentName;
@@ -56,6 +58,28 @@ public class CamelEndpointDetails {
         this.lineNumberEnd = lineNumberEnd;
     }
 
+    public int getAbsolutePosition() {
+        return absolutePosition;
+    }
+
+    /**
+     * The absolute position where 0 is the beginning of the file. This is only available for Java DSL.
+     */
+    public void setAbsolutePosition(int absolutePosition) {
+        this.absolutePosition = absolutePosition;
+    }
+
+    public int getLinePosition() {
+        return linePosition;
+    }
+
+    /**
+     * The relative position in the line number (start line).
+     */
+    public void setLinePosition(int linePosition) {
+        this.linePosition = linePosition;
+    }
+
     public String getClassName() {
         return className;
     }
diff --git a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java
index d759037..b70e5f2 100644
--- a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java
+++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java
@@ -25,6 +25,7 @@ public class CamelNodeDetails {
     private String fileName;
     private String lineNumber;
     private String lineNumberEnd;
+    private int linePosition;
 
     // java source code details
     private String className;
@@ -118,6 +119,14 @@ public class CamelNodeDetails {
         this.lineNumberEnd = lineNumberEnd;
     }
 
+    public int getLinePosition() {
+        return linePosition;
+    }
+
+    public void setLinePosition(int linePosition) {
+        this.linePosition = linePosition;
+    }
+
     public String getClassName() {
         return className;
     }
diff --git a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java
index 9d6db11..7480746 100644
--- a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java
+++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelSimpleExpressionDetails.java
@@ -24,6 +24,8 @@ public class CamelSimpleExpressionDetails {
     private String fileName;
     private String lineNumber;
     private String lineNumberEnd;
+    private int absolutePosition;
+    private int linePosition;
     private String className;
     private String methodName;
     private String simple;
@@ -54,6 +56,28 @@ public class CamelSimpleExpressionDetails {
         this.lineNumberEnd = lineNumberEnd;
     }
 
+    public int getAbsolutePosition() {
+        return absolutePosition;
+    }
+
+    /**
+     * The absolute position where 0 is the beginning of the file. This is only available for Java DSL.
+     */
+    public void setAbsolutePosition(int absolutePosition) {
+        this.absolutePosition = absolutePosition;
+    }
+
+    public int getLinePosition() {
+        return linePosition;
+    }
+
+    /**
+     * The relative position in the begin line number.
+     */
+    public void setLinePosition(int linePosition) {
+        this.linePosition = linePosition;
+    }
+
     public String getClassName() {
         return className;
     }
diff --git a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterEndpointInjectTest.java b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterEndpointInjectTest.java
index 8e872fd..34bc0a4 100644
--- a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterEndpointInjectTest.java
+++ b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterEndpointInjectTest.java
@@ -48,19 +48,27 @@ public class RoasterEndpointInjectTest {
         Assert.assertEquals("timer:foo?period=4999", details.get(0).getEndpointUri());
         Assert.assertEquals("28", details.get(0).getLineNumber());
         Assert.assertEquals("28", details.get(0).getLineNumberEnd());
+        Assert.assertEquals(1062, details.get(0).getAbsolutePosition());
+        Assert.assertEquals(10, details.get(0).getLinePosition());
 
         Assert.assertEquals("log:a", details.get(1).getEndpointUri());
         Assert.assertEquals("32", details.get(1).getLineNumber());
         Assert.assertEquals("32", details.get(1).getLineNumberEnd());
+        Assert.assertEquals(1145, details.get(1).getAbsolutePosition());
+        Assert.assertEquals(10, details.get(1).getLinePosition());
 
         Assert.assertEquals("netty4-http:http:someserver:80/hello", details.get(2).getEndpointUri());
         Assert.assertEquals("36", details.get(2).getLineNumber());
         Assert.assertEquals("36", details.get(2).getLineNumberEnd());
+        Assert.assertEquals(1203, details.get(2).getAbsolutePosition());
+        Assert.assertEquals(10, details.get(2).getLinePosition());
 
         // spans 2 lines
         Assert.assertEquals("mock:foo?retainFirst=1", details.get(5).getEndpointUri());
         Assert.assertEquals("45", details.get(5).getLineNumber());
         Assert.assertEquals("46", details.get(5).getLineNumberEnd());
+        Assert.assertEquals(1457, details.get(5).getAbsolutePosition());
+        Assert.assertEquals(17, details.get(5).getLinePosition());
 
         List<ParserResult> list = CamelJavaParserHelper.parseCamelConsumerUris(method, true, true);
         for (ParserResult result : list) {
diff --git a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlRouteTest.java b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlRouteTest.java
index 05be852..ed72feb 100644
--- a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlRouteTest.java
+++ b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlRouteTest.java
@@ -46,6 +46,8 @@ public class XmlRouteTest {
         }
         Assert.assertEquals("stream:in?promptMessage=Enter something:", endpoints.get(0).getEndpointUri());
         Assert.assertEquals("stream:out", endpoints.get(1).getEndpointUri());
+        Assert.assertEquals("39", endpoints.get(1).getLineNumber());
+        Assert.assertEquals(29, endpoints.get(1).getLinePosition());
     }
 
 }