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());
}
}