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:45 UTC

[02/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/3d3bc4bf
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/3d3bc4bf
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/3d3bc4bf

Branch: refs/heads/parser2
Commit: 3d3bc4bf35fa222ff78eb3711734caf12430577d
Parents: d884404
Author: Claus Ibsen <da...@apache.org>
Authored: Sat Oct 7 16:59:27 2017 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Sat Oct 7 16:59:27 2017 +0200

----------------------------------------------------------------------
 .../mbean/RouteCoverageXmlParser.java           |  2 ++
 .../helper/AdvancedCamelJavaParserHelper.java   | 31 +++++++++---------
 .../camel/parser/model/CamelNodeDetails.java    | 12 +++++--
 .../parser/model/CamelNodeDetailsFactory.java   | 33 ++++++++++++++++++++
 .../parser/java/MyJavaDslRouteBuilder.java      |  6 ++--
 .../camel/parser/java/RoasterJavaDslTest.java   | 19 ++++++++++-
 6 files changed, 83 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/3d3bc4bf/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java b/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java
index 4633ece..c260e67 100644
--- a/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/RouteCoverageXmlParser.java
@@ -104,6 +104,8 @@ public final class RouteCoverageXmlParser {
                                 el.setAttribute("exchangesTotal", "" + total);
                                 long totalTime = processor.getTotalProcessingTime();
                                 el.setAttribute("totalProcessingTime", "" + totalTime);
+                                int index = processor.getIndex();
+                                el.setAttribute("index", "" + index);
                             }
                         }
                     } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/camel/blob/3d3bc4bf/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 1a5fa0b..c264930 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
@@ -24,6 +24,7 @@ import org.apache.camel.catalog.DefaultCamelCatalog;
 import org.apache.camel.catalog.JSonSchemaHelper;
 import org.apache.camel.parser.RouteBuilderParser;
 import org.apache.camel.parser.model.CamelNodeDetails;
+import org.apache.camel.parser.model.CamelNodeDetailsFactory;
 import org.apache.camel.parser.roaster.StatementFieldSource;
 import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.ASTNode;
 import org.jboss.forge.roaster._shade.org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
@@ -63,8 +64,9 @@ public final class AdvancedCamelJavaParserHelper {
     public CamelNodeDetails parseCamelRoute(JavaClassSource clazz, MethodSource<JavaClassSource> method) {
 
         // find any from which is the start of the route
+        CamelNodeDetailsFactory nodeFactory = CamelNodeDetailsFactory.newInstance();
 
-        CamelNodeDetails route = new CamelNodeDetails(null, "route");
+        CamelNodeDetails route = nodeFactory.newNode(null, "route");
 
         if (method != null) {
             MethodDeclaration md = (MethodDeclaration) method.getInternal();
@@ -75,8 +77,7 @@ public final class AdvancedCamelJavaParserHelper {
                     if (statement instanceof ExpressionStatement) {
                         ExpressionStatement es = (ExpressionStatement) statement;
                         Expression exp = es.getExpression();
-
-                        parseExpression(clazz, block, exp, route);
+                        parseExpression(nodeFactory, clazz, block, exp, route);
                     }
                 }
             }
@@ -85,7 +86,7 @@ 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 = new CamelNodeDetails(null, root);
+        CamelNodeDetails answer = nodeFactory.newNode(null, root);
         CamelNodeDetails parent = answer;
 
         // TODO: use camel catalog to know about these types and when to do what
@@ -96,17 +97,17 @@ public final class AdvancedCamelJavaParserHelper {
 
             // special for some EIPs
             if ("choice".equals(name)) {
-                CamelNodeDetails output = new CamelNodeDetails(parent, name);
+                CamelNodeDetails output = nodeFactory.newNode(parent, name);
                 parent.addOutput(output);
                 parent = output;
             } else if ("when".equals(name)) {
                 parent = grandParent(parent, "choice");
-                CamelNodeDetails output = new CamelNodeDetails(parent, name);
+                CamelNodeDetails output = nodeFactory.newNode(parent, name);
                 parent.addOutput(output);
                 parent = output;
             } else if ("otherwise".equals(name)) {
                 parent = grandParent(parent, "choice");
-                CamelNodeDetails output = new CamelNodeDetails(parent, name);
+                CamelNodeDetails output = nodeFactory.newNode(parent, name);
                 parent.addOutput(output);
                 parent = output;
             } else if ("end".equals(name) || "endChoice".equals(name) || "endDoTry".equals(name)) {
@@ -120,12 +121,12 @@ public final class AdvancedCamelJavaParserHelper {
                 boolean hasOutput = hasOutput(name);
                 if (hasOutput) {
                     // has output so add as new child node
-                    CamelNodeDetails output = new CamelNodeDetails(parent, name);
+                    CamelNodeDetails output = nodeFactory.newNode(parent, name);
                     parent.addOutput(output);
                     parent = output;
                 } else {
                     // add straight to itself
-                    CamelNodeDetails output = new CamelNodeDetails(parent, name);
+                    CamelNodeDetails output = nodeFactory.newNode(parent, name);
                     parent.addOutput(output);
                 }
             }
@@ -160,20 +161,22 @@ public final class AdvancedCamelJavaParserHelper {
         }
     }
 
-    private void parseExpression(JavaClassSource clazz, Block block, Expression exp, CamelNodeDetails node) {
+    private void parseExpression(CamelNodeDetailsFactory nodeFactory,
+                                 JavaClassSource clazz, Block block, Expression exp, CamelNodeDetails node) {
         if (exp == null) {
             return;
         }
         if (exp instanceof MethodInvocation) {
             MethodInvocation mi = (MethodInvocation) exp;
-            node = doParseCamelModels(clazz, block, mi, node);
+            node = doParseCamelModels(nodeFactory, clazz, block, mi, node);
             // if the method was called on another method, then recursive
             exp = mi.getExpression();
-            parseExpression(clazz, block, exp, node);
+            parseExpression(nodeFactory, clazz, block, exp, node);
         }
     }
 
-    private CamelNodeDetails doParseCamelModels(JavaClassSource clazz, Block block, MethodInvocation mi, CamelNodeDetails node) {
+    private CamelNodeDetails doParseCamelModels(CamelNodeDetailsFactory nodeFactory,
+                                                JavaClassSource clazz, Block block, MethodInvocation mi, CamelNodeDetails node) {
         String name = mi.getName().getIdentifier();
 
         // special for Java DSL having some endXXX
@@ -181,7 +184,7 @@ public final class AdvancedCamelJavaParserHelper {
 
         // only include if its a known Camel model
         if (isEnd || camelCatalog.findModelNames().contains(name)) {
-            CamelNodeDetails newNode = new CamelNodeDetails(node, name);
+            CamelNodeDetails newNode = nodeFactory.newNode(node, name);
             node.addPreliminaryOutput(newNode);
             return node;
         }

http://git-wip-us.apache.org/repos/asf/camel/blob/3d3bc4bf/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 76c3bba..9712347 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,13 +21,15 @@ import java.util.List;
 
 public class CamelNodeDetails {
 
+    private final CamelNodeDetails parent;
     private final String name;
+    private final int order;
     private List<CamelNodeDetails> outputs;
-    private CamelNodeDetails parent;
 
-    public CamelNodeDetails(CamelNodeDetails parent, String name) {
+    public CamelNodeDetails(CamelNodeDetails parent, String name, int order) {
         this.parent = parent;
         this.name = name;
+        this.order = order;
     }
 
     public void addPreliminaryOutput(CamelNodeDetails output) {
@@ -53,6 +55,10 @@ public class CamelNodeDetails {
         return name;
     }
 
+    public int getOrder() {
+        return order;
+    }
+
     public List<CamelNodeDetails> getOutputs() {
         return outputs;
     }
@@ -63,6 +69,8 @@ public class CamelNodeDetails {
 
     public String dump(int level) {
         StringBuilder sb = new StringBuilder();
+        sb.append(order);
+        sb.append("\t");
         sb.append(padString(level));
         sb.append(name);
         if (outputs != null) {

http://git-wip-us.apache.org/repos/asf/camel/blob/3d3bc4bf/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
new file mode 100644
index 0000000..502c2c7
--- /dev/null
+++ b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetailsFactory.java
@@ -0,0 +1,33 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.parser.model;
+
+public class CamelNodeDetailsFactory {
+
+    private int order;
+
+    private CamelNodeDetailsFactory() {
+    }
+
+    public static CamelNodeDetailsFactory newInstance() {
+        return new CamelNodeDetailsFactory();
+    }
+
+    public CamelNodeDetails newNode(CamelNodeDetails parent, String name) {
+        return new CamelNodeDetails(parent, name, ++order);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/3d3bc4bf/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyJavaDslRouteBuilder.java
----------------------------------------------------------------------
diff --git a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyJavaDslRouteBuilder.java b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyJavaDslRouteBuilder.java
index 91ff71f..1a98ab8 100644
--- a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyJavaDslRouteBuilder.java
+++ b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/java/MyJavaDslRouteBuilder.java
@@ -22,7 +22,7 @@ public class MyJavaDslRouteBuilder extends RouteBuilder {
 
     @Override
     public void configure() throws Exception {
-        from("timer:foo").routeId("bar")
+        from("direct:start").routeId("bar")
             .log("I was here")
             .setHeader("foo", constant("123"))
             .choice()
@@ -31,8 +31,8 @@ public class MyJavaDslRouteBuilder extends RouteBuilder {
                 .when(header("bar"))
                     .toD("log:b")
                 .otherwise()
-                    .wireTap("mock:tap")
+                    .log("none")
             .end()
-            .to("log:b");
+            .to("mock:result");
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/3d3bc4bf/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 841c608..48e3a3c 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
@@ -20,16 +20,22 @@ import java.io.File;
 
 import org.apache.camel.parser.AdvancedRouteBuilderParser;
 import org.apache.camel.parser.model.CamelNodeDetails;
+import org.apache.camel.test.junit4.CamelTestSupport;
 import org.jboss.forge.roaster.Roaster;
 import org.jboss.forge.roaster.model.source.JavaClassSource;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class RoasterJavaDslTest {
+public class RoasterJavaDslTest extends CamelTestSupport {
 
     private static final Logger LOG = LoggerFactory.getLogger(RoasterJavaDslTest.class);
 
+    @Override
+    public boolean isDumpRouteCoverage() {
+        return true;
+    }
+
     @Test
     public void parse() throws Exception {
         JavaClassSource clazz = (JavaClassSource) Roaster.parse(new File("src/test/java/org/apache/camel/parser/java/MyJavaDslRouteBuilder.java"));
@@ -41,4 +47,15 @@ public class RoasterJavaDslTest {
         System.out.println(tree);
     }
 
+    @Test
+    public void testRouteCoverage() throws Exception {
+        context.addRoutes(new MyJavaDslRouteBuilder());
+
+        getMockEndpoint("mock:result").expectedMessageCount(1);
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
 }