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

Reply via email to