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 <claus.ib...@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()); } }