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 2017/10/08 12:02:46 UTC

[03/13] camel git commit: Camel java dsl parser prototype

Camel java dsl parser prototype


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/7aef6567
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/7aef6567
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/7aef6567

Branch: refs/heads/parser2
Commit: 7aef65670715aa28c838440c5ed8e39cbb8a9488
Parents: 3d3bc4b
Author: Claus Ibsen <da...@apache.org>
Authored: Sat Oct 7 17:55:08 2017 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Sat Oct 7 17:55:08 2017 +0200

----------------------------------------------------------------------
 .../parser/AdvancedRouteBuilderParser.java      |  5 +-
 .../helper/AdvancedCamelJavaParserHelper.java   | 73 ++++++++++++++++----
 .../camel/parser/model/CamelNodeDetails.java    | 41 ++++++++++-
 .../parser/model/CamelNodeDetailsFactory.java   |  4 ++
 .../camel/parser/java/RoasterJavaDslTest.java   |  5 +-
 5 files changed, 110 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/7aef6567/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/AdvancedRouteBuilderParser.java
----------------------------------------------------------------------
diff --git a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/AdvancedRouteBuilderParser.java b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/AdvancedRouteBuilderParser.java
index e3fb6d7..9159203 100644
--- a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/AdvancedRouteBuilderParser.java
+++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/AdvancedRouteBuilderParser.java
@@ -31,7 +31,8 @@ import org.jboss.forge.roaster.model.source.MethodSource;
 public class AdvancedRouteBuilderParser {
 
     // TODO: list of details, on per route
-    public static CamelNodeDetails parseRouteBuilder(JavaClassSource clazz, boolean includeInlinedRouteBuilders) {
+    public static CamelNodeDetails parseRouteBuilder(JavaClassSource clazz, String baseDir, String fullyQualifiedFileName,
+                                                     boolean includeInlinedRouteBuilders) {
         AdvancedCamelJavaParserHelper parser = new AdvancedCamelJavaParserHelper();
 
         List<MethodSource<JavaClassSource>> methods = new ArrayList<>();
@@ -47,7 +48,7 @@ public class AdvancedRouteBuilderParser {
         }
 
         for (MethodSource<JavaClassSource> configureMethod : methods) {
-            CamelNodeDetails details = parser.parseCamelRoute(clazz, configureMethod);
+            CamelNodeDetails details = parser.parseCamelRoute(clazz, baseDir, fullyQualifiedFileName, configureMethod);
             return details;
         }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/7aef6567/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/AdvancedCamelJavaParserHelper.java
----------------------------------------------------------------------
diff --git a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/AdvancedCamelJavaParserHelper.java b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/AdvancedCamelJavaParserHelper.java
index c264930..322997b 100644
--- a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/AdvancedCamelJavaParserHelper.java
+++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/AdvancedCamelJavaParserHelper.java
@@ -16,6 +16,9 @@
  */
 package org.apache.camel.parser.helper;
 
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
 import java.util.List;
 import java.util.Map;
 
@@ -57,11 +60,13 @@ import org.jboss.forge.roaster.model.source.MethodSource;
  * <p/>
  * This implementation is lower level details. For a higher level parser see {@link RouteBuilderParser}.
  */
+// TODO: rename this class
 public final class AdvancedCamelJavaParserHelper {
 
     private CamelCatalog camelCatalog = new DefaultCamelCatalog(true);
 
-    public CamelNodeDetails parseCamelRoute(JavaClassSource clazz, MethodSource<JavaClassSource> method) {
+    public CamelNodeDetails parseCamelRoute(JavaClassSource clazz, String baseDir, String fullyQualifiedFileName,
+                                            MethodSource<JavaClassSource> method) {
 
         // find any from which is the start of the route
         CamelNodeDetailsFactory nodeFactory = CamelNodeDetailsFactory.newInstance();
@@ -77,7 +82,7 @@ public final class AdvancedCamelJavaParserHelper {
                     if (statement instanceof ExpressionStatement) {
                         ExpressionStatement es = (ExpressionStatement) statement;
                         Expression exp = es.getExpression();
-                        parseExpression(nodeFactory, clazz, block, exp, route);
+                        parseExpression(nodeFactory, fullyQualifiedFileName, clazz, block, exp, route);
                     }
                 }
             }
@@ -86,28 +91,32 @@ public final class AdvancedCamelJavaParserHelper {
         // now parse the route node and build a tree structure of the EIPs
         String root = route.getOutputs().get(0).getName();
 
-        CamelNodeDetails answer = nodeFactory.newNode(null, root);
-        CamelNodeDetails parent = answer;
+        // re-create factory as we rebuild the tree
+        nodeFactory = CamelNodeDetailsFactory.newInstance();
 
-        // TODO: use camel catalog to know about these types and when to do what
+        CamelNodeDetails answer = nodeFactory.newNode(null, root);
+        answer.setFileName(fullyQualifiedFileName);
 
+        CamelNodeDetails parent = answer;
         for (int i = 1; i < route.getOutputs().size(); i++) {
+
             CamelNodeDetails node = route.getOutputs().get(i);
             String name = node.getName();
 
+            // TODO: use camel catalog to know about these types and when to do what
             // special for some EIPs
             if ("choice".equals(name)) {
-                CamelNodeDetails output = nodeFactory.newNode(parent, name);
+                CamelNodeDetails output = nodeFactory.copyNode(parent, name, node);
                 parent.addOutput(output);
                 parent = output;
             } else if ("when".equals(name)) {
                 parent = grandParent(parent, "choice");
-                CamelNodeDetails output = nodeFactory.newNode(parent, name);
+                CamelNodeDetails output = nodeFactory.copyNode(parent, name, node);
                 parent.addOutput(output);
                 parent = output;
             } else if ("otherwise".equals(name)) {
                 parent = grandParent(parent, "choice");
-                CamelNodeDetails output = nodeFactory.newNode(parent, name);
+                CamelNodeDetails output = nodeFactory.copyNode(parent, name, node);
                 parent.addOutput(output);
                 parent = output;
             } else if ("end".equals(name) || "endChoice".equals(name) || "endDoTry".equals(name)) {
@@ -121,12 +130,12 @@ public final class AdvancedCamelJavaParserHelper {
                 boolean hasOutput = hasOutput(name);
                 if (hasOutput) {
                     // has output so add as new child node
-                    CamelNodeDetails output = nodeFactory.newNode(parent, name);
+                    CamelNodeDetails output = nodeFactory.copyNode(parent, name, node);
                     parent.addOutput(output);
                     parent = output;
                 } else {
                     // add straight to itself
-                    CamelNodeDetails output = nodeFactory.newNode(parent, name);
+                    CamelNodeDetails output = nodeFactory.copyNode(parent, name, node);
                     parent.addOutput(output);
                 }
             }
@@ -161,21 +170,21 @@ public final class AdvancedCamelJavaParserHelper {
         }
     }
 
-    private void parseExpression(CamelNodeDetailsFactory nodeFactory,
+    private void parseExpression(CamelNodeDetailsFactory nodeFactory, String fullyQualifiedFileName,
                                  JavaClassSource clazz, Block block, Expression exp, CamelNodeDetails node) {
         if (exp == null) {
             return;
         }
         if (exp instanceof MethodInvocation) {
             MethodInvocation mi = (MethodInvocation) exp;
-            node = doParseCamelModels(nodeFactory, clazz, block, mi, node);
+            node = doParseCamelModels(nodeFactory, fullyQualifiedFileName, clazz, block, mi, node);
             // if the method was called on another method, then recursive
             exp = mi.getExpression();
-            parseExpression(nodeFactory, clazz, block, exp, node);
+            parseExpression(nodeFactory, fullyQualifiedFileName, clazz, block, exp, node);
         }
     }
 
-    private CamelNodeDetails doParseCamelModels(CamelNodeDetailsFactory nodeFactory,
+    private CamelNodeDetails doParseCamelModels(CamelNodeDetailsFactory nodeFactory, String fullyQualifiedFileName,
                                                 JavaClassSource clazz, Block block, MethodInvocation mi, CamelNodeDetails node) {
         String name = mi.getName().getIdentifier();
 
@@ -185,6 +194,15 @@ public final class AdvancedCamelJavaParserHelper {
         // only include if its a known Camel model
         if (isEnd || camelCatalog.findModelNames().contains(name)) {
             CamelNodeDetails newNode = nodeFactory.newNode(node, name);
+
+            // include source code details
+            int pos = mi.getName().getStartPosition();
+            int line = findLineNumber(fullyQualifiedFileName, pos);
+            if (line > -1) {
+                newNode.setLineNumber("" + line);
+            }
+            newNode.setFileName(fullyQualifiedFileName);
+
             node.addPreliminaryOutput(newNode);
             return node;
         }
@@ -251,6 +269,10 @@ public final class AdvancedCamelJavaParserHelper {
         return null;
     }
 
+    /**
+     * @deprecated currently not in use
+     */
+    @Deprecated
     public static String getLiteralValue(JavaClassSource clazz, Block block, Expression expression) {
         // unwrap parenthesis
         if (expression instanceof ParenthesizedExpression) {
@@ -392,4 +414,27 @@ public final class AdvancedCamelJavaParserHelper {
         return false;
     }
 
+    private static int findLineNumber(String fullyQualifiedFileName, int position) {
+        int lines = 0;
+
+        try {
+            int current = 0;
+            try (BufferedReader br = new BufferedReader(new FileReader(new File(fullyQualifiedFileName)))) {
+                String line;
+                while ((line = br.readLine()) != null) {
+                    lines++;
+                    current += line.length() + 1; // add 1 for line feed
+                    if (current >= position) {
+                        return lines;
+                    }
+                }
+            }
+        } catch (Exception e) {
+            // ignore
+            return -1;
+        }
+
+        return lines;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/7aef6567/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java
----------------------------------------------------------------------
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 9712347..7167eb8 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
@@ -21,11 +21,26 @@ import java.util.List;
 
 public class CamelNodeDetails {
 
+    // source code details
+    private String fileName;
+    private String lineNumber;
+    private String lineNumberEnd;
+
+    // camel node details
     private final CamelNodeDetails parent;
     private final String name;
     private final int order;
     private List<CamelNodeDetails> outputs;
 
+    public CamelNodeDetails(CamelNodeDetails parent, String name, int order, CamelNodeDetails copy) {
+        this.parent = parent;
+        this.name = name;
+        this.order = order;
+        this.fileName = copy.getFileName();
+        this.lineNumber = copy.getLineNumber();
+        this.lineNumberEnd = copy.getLineNumberEnd();
+    }
+
     public CamelNodeDetails(CamelNodeDetails parent, String name, int order) {
         this.parent = parent;
         this.name = name;
@@ -63,13 +78,37 @@ public class CamelNodeDetails {
         return outputs;
     }
 
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String getLineNumber() {
+        return lineNumber;
+    }
+
+    public void setLineNumber(String lineNumber) {
+        this.lineNumber = lineNumber;
+    }
+
+    public String getLineNumberEnd() {
+        return lineNumberEnd;
+    }
+
+    public void setLineNumberEnd(String lineNumberEnd) {
+        this.lineNumberEnd = lineNumberEnd;
+    }
+
     public String toString() {
         return name;
     }
 
     public String dump(int level) {
         StringBuilder sb = new StringBuilder();
-        sb.append(order);
+        sb.append(lineNumber);
         sb.append("\t");
         sb.append(padString(level));
         sb.append(name);

http://git-wip-us.apache.org/repos/asf/camel/blob/7aef6567/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetailsFactory.java
----------------------------------------------------------------------
diff --git a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetailsFactory.java b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetailsFactory.java
index 502c2c7..33b15c8 100644
--- a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetailsFactory.java
+++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetailsFactory.java
@@ -30,4 +30,8 @@ public class CamelNodeDetailsFactory {
     public CamelNodeDetails newNode(CamelNodeDetails parent, String name) {
         return new CamelNodeDetails(parent, name, ++order);
     }
+
+    public CamelNodeDetails copyNode(CamelNodeDetails parent, String name, CamelNodeDetails copoy) {
+        return new CamelNodeDetails(parent, name, ++order, copoy);
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/7aef6567/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterJavaDslTest.java
----------------------------------------------------------------------
diff --git a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterJavaDslTest.java b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterJavaDslTest.java
index 48e3a3c..928ac87 100644
--- a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterJavaDslTest.java
+++ b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/RoasterJavaDslTest.java
@@ -40,10 +40,13 @@ public class RoasterJavaDslTest extends CamelTestSupport {
     public void parse() throws Exception {
         JavaClassSource clazz = (JavaClassSource) Roaster.parse(new File("src/test/java/org/apache/camel/parser/java/MyJavaDslRouteBuilder.java"));
 
-        CamelNodeDetails details = AdvancedRouteBuilderParser.parseRouteBuilder(clazz, true);
+        CamelNodeDetails details = AdvancedRouteBuilderParser.parseRouteBuilder(clazz, ".",
+            "src/test/java/org/apache/camel/parser/java/MyJavaDslRouteBuilder.java",true);
         String tree = details.dump(0);
         LOG.info("\n" + tree);
 
+        String name = details.getFileName();
+        System.out.println(name);
         System.out.println(tree);
     }