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