This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new a7a4d3359c54 CAMEL-22817: camel-route-coverage - Improve coverage
information to better match when using advicing (#20696)
a7a4d3359c54 is described below
commit a7a4d3359c54ef41ca642fc9f07e1d25b25503f0
Author: Claus Ibsen <[email protected]>
AuthorDate: Tue Jan 6 15:58:43 2026 +0100
CAMEL-22817: camel-route-coverage - Improve coverage information to better
match when using advicing (#20696)
---
.../org/apache/camel/maven/RouteCoverageMojo.java | 7 ++--
.../parser/helper/CamelXmlTreeParserHelper.java | 7 ++++
.../camel/parser/helper/RouteCoverageHelper.java | 39 +++++++++++++++-------
.../camel/parser/model/CamelNodeDetails.java | 10 ++++++
.../apache/camel/parser/model/CoverageData.java | 22 ++++++++++--
5 files changed, 68 insertions(+), 17 deletions(-)
diff --git
a/catalog/camel-report-maven-plugin/src/main/java/org/apache/camel/maven/RouteCoverageMojo.java
b/catalog/camel-report-maven-plugin/src/main/java/org/apache/camel/maven/RouteCoverageMojo.java
index 12f0c920143b..46e6161f87be 100644
---
a/catalog/camel-report-maven-plugin/src/main/java/org/apache/camel/maven/RouteCoverageMojo.java
+++
b/catalog/camel-report-maven-plugin/src/main/java/org/apache/camel/maven/RouteCoverageMojo.java
@@ -643,13 +643,16 @@ public class RouteCoverageMojo extends AbstractMojo {
boolean found = false;
while (!found && it.hasNext()) {
CoverageData holder = it.next();
- found = holder.getNode().equals(node.getName());
+ // match by id / line number / and then EIP name
+ found = (holder.getNodeId() != null &&
holder.getNodeId().equals(node.getNodeId()))
+ || (holder.getLineNumber() > 0 && holder.getLineNumber()
== data.getLineNumber())
+ || (holder.getNode().equals(node.getName()));
if (found) {
data.setCount(holder.getCount());
}
}
- if (node.getOutputs() != null) {
+ if (!node.getOutputs().isEmpty()) {
level.addAndGet(1);
for (CamelNodeDetails child : node.getOutputs()) {
gatherRouteCoverageSummary(child, it, level, answer);
diff --git
a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java
b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java
index aedbc9cf3459..9cea18ed299e 100644
---
a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java
+++
b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/CamelXmlTreeParserHelper.java
@@ -84,6 +84,12 @@ public final class CamelXmlTreeParserHelper {
// skip when/otherwise (as we do this in Java DSL)
boolean isWhenOrOtherwise = "when".equals(name) ||
"otherwise".equals(name);
+ String id = null;
+ Node nid = node.getAttributes().getNamedItem("id");
+ if (nid != null) {
+ id = nid.getNodeValue();
+ }
+
// only include if its a known Camel model (dont include languages)
if (isRoute || isEip) {
// skip route as we just keep from (and also skip when/otherwise)
@@ -92,6 +98,7 @@ public final class CamelXmlTreeParserHelper {
String lineNumberEnd = (String)
node.getUserData(XmlLineNumberParser.LINE_NUMBER_END);
newNode = nodeFactory.newNode(parent, name);
newNode.setRouteId(parent.getRouteId());
+ newNode.setNodeId(id);
newNode.setFileName(parent.getFileName());
newNode.setLineNumber(lineNumber);
newNode.setLineNumberEnd(lineNumberEnd);
diff --git
a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/RouteCoverageHelper.java
b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/RouteCoverageHelper.java
index 1a6962314145..6746380aa97a 100644
---
a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/RouteCoverageHelper.java
+++
b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/helper/RouteCoverageHelper.java
@@ -72,7 +72,7 @@ public final class RouteCoverageHelper {
if (routeId.equals(id)) {
// parse each route and build a List<CoverageData> for
line by line coverage data
AtomicInteger counter = new AtomicInteger();
- parseRouteData(catalog, route, answer, counter);
+ parseRouteData(catalog, route, answer, counter,
routeId);
}
}
}
@@ -117,7 +117,7 @@ public final class RouteCoverageHelper {
// parse each route and build a List<CoverageData> for
line by line coverage data
AtomicInteger counter = new AtomicInteger();
List<CoverageData> list = new ArrayList<>();
- parseRouteData(catalog, route, list, counter);
+ parseRouteData(catalog, route, list, counter, id);
if (id != null && !list.isEmpty()) {
list.get(0).setRouteId(id);
}
@@ -147,10 +147,12 @@ public final class RouteCoverageHelper {
NodeList routes = dom.getElementsByTagName("route");
for (int i = 0; i < routes.getLength(); i++) {
Node route = routes.item(i);
+ Node n = route.getAttributes().getNamedItem("id");
+ String id = n != null ? n.getNodeValue() : null;
// parse each route and build a List<CoverageData> for
line by line coverage data
AtomicInteger counter = new AtomicInteger();
List<CoverageData> data = new ArrayList<>();
- parseRouteData(catalog, route, data, counter);
+ parseRouteData(catalog, route, data, counter, id);
// create a key which is based on the file name without
extension
String key = file.getName();
// strip .xml extension
@@ -169,7 +171,8 @@ public final class RouteCoverageHelper {
return answer;
}
- private static void parseRouteData(CamelCatalog catalog, Node node,
List<CoverageData> data, AtomicInteger counter) {
+ private static void parseRouteData(
+ CamelCatalog catalog, Node node, List<CoverageData> data,
AtomicInteger counter, String routeId) {
// must be a known EIP model
String key = node.getNodeName();
boolean valid = catalog.findModelNames().contains(key); // skip route
as we use from instead
@@ -196,12 +199,26 @@ public final class RouteCoverageHelper {
if (holder != null && holder.getNode().equals(key)) {
count += holder.getCount();
}
+
+ String id = null;
+ Node nid = node.getAttributes().getNamedItem("id");
+ if (nid != null) {
+ id = nid.getNodeValue();
+ }
+ int lineNumber = 0;
+ Node ln = node.getAttributes().getNamedItem("sourceLineNumber");
+ if (ln != null) {
+ lineNumber = Integer.parseInt(ln.getNodeValue());
+ }
+
+ CoverageData cd = new CoverageData(id, key, count, routeId);
+ cd.setLineNumber(lineNumber);
if (holder == null) {
// add new
- data.add(counter.get(), new CoverageData(key, count));
+ data.add(counter.get(), cd);
} else {
// replace existing
- data.set(counter.get(), new CoverageData(key, count));
+ data.set(counter.get(), cd);
}
// advance counter
counter.incrementAndGet();
@@ -209,12 +226,10 @@ public final class RouteCoverageHelper {
// any children
NodeList children = node.getChildNodes();
- if (children != null) {
- for (int i = 0; i < children.getLength(); i++) {
- Node child = children.item(i);
- if (child instanceof Element) {
- parseRouteData(catalog, child, data, counter);
- }
+ for (int i = 0; i < children.getLength(); i++) {
+ Node child = children.item(i);
+ if (child instanceof Element) {
+ parseRouteData(catalog, child, data, counter, routeId);
}
}
}
diff --git
a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java
b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java
index 16d786e0c9af..c986c427633f 100644
---
a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java
+++
b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CamelNodeDetails.java
@@ -38,12 +38,14 @@ public class CamelNodeDetails {
private final int order;
private List<CamelNodeDetails> outputs;
private String routeId;
+ private String nodeId;
public CamelNodeDetails(CamelNodeDetails parent, String name, int order,
CamelNodeDetails copy) {
this.parent = parent;
this.name = name;
this.order = order;
this.routeId = copy.getRouteId();
+ this.nodeId = copy.getNodeId();
this.fileName = copy.getFileName();
this.lineNumber = copy.getLineNumber();
this.lineNumberEnd = copy.getLineNumberEnd();
@@ -99,6 +101,14 @@ public class CamelNodeDetails {
this.routeId = routeId;
}
+ public String getNodeId() {
+ return nodeId;
+ }
+
+ public void setNodeId(String nodeId) {
+ this.nodeId = nodeId;
+ }
+
public String getFileName() {
return fileName;
}
diff --git
a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CoverageData.java
b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CoverageData.java
index 13bfeb4f80d9..371e13436b3f 100644
---
a/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CoverageData.java
+++
b/catalog/camel-route-parser/src/main/java/org/apache/camel/parser/model/CoverageData.java
@@ -21,13 +21,17 @@ package org.apache.camel.parser.model;
*/
public class CoverageData {
+ private final String nodeId;
private final String node;
private final int count;
private String routeId;
+ private int lineNumber;
- public CoverageData(String node, int count) {
+ public CoverageData(String nodeId, String node, int count, String routeId)
{
+ this.nodeId = nodeId;
this.node = node;
this.count = count;
+ this.routeId = routeId;
}
public String getNode() {
@@ -38,11 +42,23 @@ public class CoverageData {
return count;
}
+ public String getRouteId() {
+ return routeId;
+ }
+
public void setRouteId(String routeId) {
this.routeId = routeId;
}
- public String getRouteId() {
- return routeId;
+ public String getNodeId() {
+ return nodeId;
+ }
+
+ public int getLineNumber() {
+ return lineNumber;
+ }
+
+ public void setLineNumber(int lineNumber) {
+ this.lineNumber = lineNumber;
}
}