Parse java/xml route tree the same way and only include EIPs (processors with 
either in/out) and route/from


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

Branch: refs/heads/parser2
Commit: aa128355233916099551fc58ec7d3acbde9ccb92
Parents: 193c51d
Author: Claus Ibsen <[email protected]>
Authored: Mon Oct 9 16:11:37 2017 +0200
Committer: Claus Ibsen <[email protected]>
Committed: Mon Oct 9 16:11:37 2017 +0200

----------------------------------------------------------------------
 .../src/main/resources/my-camel.xml             | 19 ++++++
 .../java/sample/camel/FooApplicationTest.java   |  2 +-
 .../java/sample/camel/SampleCamelRouter.java    |  2 +-
 .../org/apache/camel/parser/XmlRouteParser.java |  4 +-
 .../helper/CamelJavaTreeParserHelper.java       | 27 ++++++--
 .../parser/helper/CamelXmlTreeParserHelper.java | 71 +++++++++++++++-----
 .../camel/parser/xml/XmlParseTreeTest.java      |  1 -
 .../apache/camel/maven/RouteCoverageMojo.java   |  4 ++
 8 files changed, 106 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/aa128355/examples/camel-example-spring-boot-xml/src/main/resources/my-camel.xml
----------------------------------------------------------------------
diff --git 
a/examples/camel-example-spring-boot-xml/src/main/resources/my-camel.xml 
b/examples/camel-example-spring-boot-xml/src/main/resources/my-camel.xml
index 4f5d773..3fc6e0f 100644
--- a/examples/camel-example-spring-boot-xml/src/main/resources/my-camel.xml
+++ b/examples/camel-example-spring-boot-xml/src/main/resources/my-camel.xml
@@ -1,3 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    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.
+
+-->
 <beans xmlns="http://www.springframework.org/schema/beans";
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        xsi:schemaLocation="

http://git-wip-us.apache.org/repos/asf/camel/blob/aa128355/examples/camel-example-spring-boot-xml/src/test/java/sample/camel/FooApplicationTest.java
----------------------------------------------------------------------
diff --git 
a/examples/camel-example-spring-boot-xml/src/test/java/sample/camel/FooApplicationTest.java
 
b/examples/camel-example-spring-boot-xml/src/test/java/sample/camel/FooApplicationTest.java
index 45f2076..5a71fc9 100644
--- 
a/examples/camel-example-spring-boot-xml/src/test/java/sample/camel/FooApplicationTest.java
+++ 
b/examples/camel-example-spring-boot-xml/src/test/java/sample/camel/FooApplicationTest.java
@@ -34,7 +34,7 @@ import static org.junit.Assert.assertTrue;
 @SpringBootTest(classes = SampleCamelApplication.class,
     properties = "greeting = Hello foo")
 @EnableRouteCoverage
-//@Ignore // enable me to run this test as well so we can cover testing the 
route completely
+@Ignore // enable me to run this test as well so we can cover testing the 
route completely
 public class FooApplicationTest {
 
     @Autowired

http://git-wip-us.apache.org/repos/asf/camel/blob/aa128355/examples/camel-example-spring-boot/src/main/java/sample/camel/SampleCamelRouter.java
----------------------------------------------------------------------
diff --git 
a/examples/camel-example-spring-boot/src/main/java/sample/camel/SampleCamelRouter.java
 
b/examples/camel-example-spring-boot/src/main/java/sample/camel/SampleCamelRouter.java
index d8e7d2e..4b11938 100644
--- 
a/examples/camel-example-spring-boot/src/main/java/sample/camel/SampleCamelRouter.java
+++ 
b/examples/camel-example-spring-boot/src/main/java/sample/camel/SampleCamelRouter.java
@@ -30,7 +30,7 @@ public class SampleCamelRouter extends RouteBuilder {
     @Override
     public void configure() throws Exception {
         from("timer:hello?period={{timer.period}}").routeId("hello")
-                .transform(method("myBean", "saySomething"))
+                .transform().method("myBean", "saySomething")
                 .filter(simple("${body} contains 'foo'"))
                     .to("log:foo")
                 .end()

http://git-wip-us.apache.org/repos/asf/camel/blob/aa128355/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/XmlRouteParser.java
----------------------------------------------------------------------
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 d6696b4..5512837 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
@@ -70,6 +70,8 @@ public final class XmlRouteParser {
             // find any from which is the start of the route
             CamelNodeDetailsFactory nodeFactory = 
CamelNodeDetailsFactory.newInstance();
 
+            CamelXmlTreeParserHelper parser = new CamelXmlTreeParserHelper();
+
             List<Node> routes = CamelXmlHelper.findAllRoutes(dom);
             for (Node route : routes) {
                 // parse each route and build
@@ -90,7 +92,7 @@ public final class XmlRouteParser {
                 node.setLineNumberEnd(lineNumberEnd);
 
                 // parse the route and gather all its EIPs
-                List<CamelNodeDetails> tree = 
CamelXmlTreeParserHelper.parseCamelRouteTree(route, routeId, node, baseDir, 
fullyQualifiedFileName);
+                List<CamelNodeDetails> tree = 
parser.parseCamelRouteTree(route, routeId, node, baseDir, 
fullyQualifiedFileName);
                 answer.addAll(tree);
             }
         }

http://git-wip-us.apache.org/repos/asf/camel/blob/aa128355/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaTreeParserHelper.java
----------------------------------------------------------------------
diff --git 
a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaTreeParserHelper.java
 
b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaTreeParserHelper.java
index ee4e9ab..d3d1531 100644
--- 
a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaTreeParserHelper.java
+++ 
b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelJavaTreeParserHelper.java
@@ -171,6 +171,21 @@ public final class CamelJavaTreeParserHelper {
         return false;
     }
 
+    private boolean hasInput(String name) {
+        String json = camelCatalog.modelJSonSchema(name);
+        List<Map<String, String>> rows = 
JSonSchemaHelper.parseJsonSchema("model", json, false);
+        return isModelInput(rows);
+    }
+
+    private static boolean isModelInput(List<Map<String, String>> rows) {
+        for (Map<String, String> row : rows) {
+            if (row.containsKey("input")) {
+                return "true".equals(row.get("input"));
+            }
+        }
+        return false;
+    }
+
     private static CamelNodeDetails grandParent(CamelNodeDetails node, String 
parentName) {
         if (node == null) {
             return null;
@@ -203,11 +218,13 @@ public final class CamelJavaTreeParserHelper {
         String name = mi.getName().getIdentifier();
 
         // special for Java DSL having some endXXX
-        boolean isEnd = "end".equals(name) || "endChoice".equals(name) || 
"endDoTry".equals(name);
-        boolean isRouteId = "routeId".equals(name);
+        boolean isEnd = "end".equals(name) || "endChoice".equals(name) || 
"endDoTry".equals(name) || "endHystrix".equals(name) || 
"endParent".equals(name) || "endRest".equals(name);
+        boolean isRoute = "route".equals(name) || "from".equals(name) || 
"routeId".equals(name);
+        // must be an eip model that has either input or output as we only 
want to track processors (also accept from)
+        boolean isEip = camelCatalog.findModelNames().contains(name) && 
(hasInput(name) || hasOutput(name));
 
-        // only include if its a known Camel model
-        if (isEnd || isRouteId || 
camelCatalog.findModelNames().contains(name)) {
+        // only include if its a known Camel model (dont include languages)
+        if (isEnd || isRoute || isEip) {
             CamelNodeDetails newNode = nodeFactory.newNode(node, name);
 
             // include source code details
@@ -221,7 +238,7 @@ public final class CamelJavaTreeParserHelper {
             newNode.setClassName(clazz.getQualifiedName());
             newNode.setMethodName(configureMethod.getName());
 
-            if (isRouteId) {
+            if ("routeId".equals(name)) {
                 // grab the route id
                 List args = mi.arguments();
                 if (args != null && args.size() > 0) {

http://git-wip-us.apache.org/repos/asf/camel/blob/aa128355/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java
----------------------------------------------------------------------
diff --git 
a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java
 
b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java
index 6125304..25396ba 100644
--- 
a/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java
+++ 
b/tooling/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java
@@ -18,7 +18,11 @@ package org.apache.camel.parser.helper;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
+import org.apache.camel.catalog.CamelCatalog;
+import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.catalog.JSonSchemaHelper;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
@@ -27,10 +31,9 @@ import org.apache.camel.parser.model.CamelNodeDetailsFactory;
 
 public final class CamelXmlTreeParserHelper {
 
-    private CamelXmlTreeParserHelper() {
-    }
+    private final CamelCatalog camelCatalog = new DefaultCamelCatalog(true);
 
-    public static List<CamelNodeDetails> parseCamelRouteTree(Node xmlNode, 
String routeId, CamelNodeDetails route,
+    public List<CamelNodeDetails> parseCamelRouteTree(Node xmlNode, String 
routeId, CamelNodeDetails route,
                                                              String baseDir, 
String fullyQualifiedFileName) {
 
         CamelNodeDetailsFactory nodeFactory = 
CamelNodeDetailsFactory.newInstance();
@@ -63,21 +66,29 @@ public final class CamelXmlTreeParserHelper {
         return answer;
     }
 
-    private static void walkXmlTree(CamelNodeDetailsFactory nodeFactory, Node 
node, CamelNodeDetails parent) {
+    private void walkXmlTree(CamelNodeDetailsFactory nodeFactory, Node node, 
CamelNodeDetails parent) {
         CamelNodeDetails newNode = null;
 
         String name = node.getNodeName();
-        // skip route as we just keep from
-        if (!"route".equals(name)) {
-            String lineNumber = (String) 
node.getUserData(XmlLineNumberParser.LINE_NUMBER);
-            String lineNumberEnd = (String) 
node.getUserData(XmlLineNumberParser.LINE_NUMBER_END);
-            newNode = nodeFactory.newNode(parent, name);
-            newNode.setRouteId(parent.getRouteId());
-            newNode.setFileName(parent.getFileName());
-            newNode.setLineNumber(lineNumber);
-            newNode.setLineNumberEnd(lineNumberEnd);
-
-            parent.addOutput(newNode);
+
+        boolean isRoute = "route".equals(name) || "from".equals(name);
+        // must be an eip model that has either input or output as we only 
want to track processors (also accept from)
+        boolean isEip = camelCatalog.findModelNames().contains(name) && 
(hasInput(name) || hasOutput(name));
+
+        // only include if its a known Camel model (dont include languages)
+        if (isRoute || isEip) {
+            // skip route as we just keep from
+            if (!"route".equals(name)) {
+                String lineNumber = (String) 
node.getUserData(XmlLineNumberParser.LINE_NUMBER);
+                String lineNumberEnd = (String) 
node.getUserData(XmlLineNumberParser.LINE_NUMBER_END);
+                newNode = nodeFactory.newNode(parent, name);
+                newNode.setRouteId(parent.getRouteId());
+                newNode.setFileName(parent.getFileName());
+                newNode.setLineNumber(lineNumber);
+                newNode.setLineNumberEnd(lineNumberEnd);
+
+                parent.addOutput(newNode);
+            }
         }
 
         NodeList children = node.getChildNodes();
@@ -90,4 +101,34 @@ public final class CamelXmlTreeParserHelper {
 
     }
 
+    private boolean hasOutput(String name) {
+        String json = camelCatalog.modelJSonSchema(name);
+        List<Map<String, String>> rows = 
JSonSchemaHelper.parseJsonSchema("model", json, false);
+        return isModelOutput(rows);
+    }
+
+    private static boolean isModelOutput(List<Map<String, String>> rows) {
+        for (Map<String, String> row : rows) {
+            if (row.containsKey("output")) {
+                return "true".equals(row.get("output"));
+            }
+        }
+        return false;
+    }
+
+    private boolean hasInput(String name) {
+        String json = camelCatalog.modelJSonSchema(name);
+        List<Map<String, String>> rows = 
JSonSchemaHelper.parseJsonSchema("model", json, false);
+        return isModelInput(rows);
+    }
+
+    private static boolean isModelInput(List<Map<String, String>> rows) {
+        for (Map<String, String> row : rows) {
+            if (row.containsKey("input")) {
+                return "true".equals(row.get("input"));
+            }
+        }
+        return false;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/aa128355/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlParseTreeTest.java
----------------------------------------------------------------------
diff --git 
a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlParseTreeTest.java
 
b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlParseTreeTest.java
index 3fc26ff..e4b8fe4 100644
--- 
a/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlParseTreeTest.java
+++ 
b/tooling/camel-route-parser/src/test/java/org/apache/camel/parser/xml/XmlParseTreeTest.java
@@ -52,7 +52,6 @@ public class XmlParseTreeTest {
 
         assertTrue(tree.contains("32\tfrom"));
         assertTrue(tree.contains("35\t  transform"));
-        assertTrue(tree.contains("36\t    simple"));
         assertTrue(tree.contains("39\t  to"));
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/aa128355/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RouteCoverageMojo.java
----------------------------------------------------------------------
diff --git 
a/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RouteCoverageMojo.java
 
b/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RouteCoverageMojo.java
index 6bd22ff..8a1dfb6 100644
--- 
a/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RouteCoverageMojo.java
+++ 
b/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/RouteCoverageMojo.java
@@ -247,6 +247,10 @@ public class RouteCoverageMojo extends AbstractExecMojo {
         Iterator<KeyValueHolder<String, Integer>> it = coverageData.iterator();
         AtomicInteger level = new AtomicInteger();
         gatherRouteCoverageSummary(route, it, level, answer);
+
+        // walk again and remove all from route that are not in coverage data 
as they are not part of the Camel route (expression, configurations etc)
+        it = coverageData.iterator();
+
         return answer;
     }
 

Reply via email to