This is an automated email from the ASF dual-hosted git repository.

nfilotto pushed a commit to branch 
CAMEL-18260/reflect-changes-in-backlog-tracer-event-message
in repository https://gitbox.apache.org/repos/asf/camel.git

commit f70b75c1e90c18d1a80c80af3a649374daf9a38e
Author: Nicolas Filotto <[email protected]>
AuthorDate: Fri Jul 8 16:26:10 2022 +0200

    CAMEL-18260: debugger - Reflect exchange changes on 
BacklogTracerEventMessage
---
 .../camel/impl/debugger/BacklogDebugger.java       | 38 +++++++++++++++++++---
 .../camel/management/BacklogDebuggerTest.java      | 22 +++++++++++++
 2 files changed, 56 insertions(+), 4 deletions(-)

diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogDebugger.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogDebugger.java
index f95315ed42f..d495793a4ec 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogDebugger.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogDebugger.java
@@ -382,6 +382,7 @@ public final class BacklogDebugger extends ServiceSupport {
                 } else {
                     se.getExchange().getMessage().setBody(body);
                 }
+                refreshBacklogTracerEventMessage(nodeId, se);
             }
         }
     }
@@ -392,6 +393,7 @@ public final class BacklogDebugger extends ServiceSupport {
             logger.log("Breakpoint at node " + nodeId + " is removing message 
body on exchangeId: "
                        + se.getExchange().getExchangeId());
             se.getExchange().getMessage().setBody(null);
+            refreshBacklogTracerEventMessage(nodeId, se);
         }
     }
 
@@ -418,6 +420,7 @@ public final class BacklogDebugger extends ServiceSupport {
             } else {
                 se.getExchange().getMessage().setHeader(headerName, value);
             }
+            refreshBacklogTracerEventMessage(nodeId, se);
         }
     }
 
@@ -435,6 +438,7 @@ public final class BacklogDebugger extends ServiceSupport {
             logger.log("Breakpoint at node " + nodeId + " is removing message 
header on exchangeId: "
                        + se.getExchange().getExchangeId() + " with header: " + 
headerName);
             se.getExchange().getMessage().removeHeader(headerName);
+            refreshBacklogTracerEventMessage(nodeId, se);
         }
     }
 
@@ -595,6 +599,34 @@ public final class BacklogDebugger extends ServiceSupport {
         suspendedBreakpointMessages.clear();
     }
 
+    /**
+     * Refresh the content of the existing backlog tracer event message 
corresponding to the given node id with the new
+     * content of exchange.
+     * 
+     * @param nodeId            the node id for the breakpoint
+     * @param suspendedExchange the content of the new suspended exchange to 
use to refresh the backlog tracer event
+     *                          message.
+     */
+    private void refreshBacklogTracerEventMessage(String nodeId, 
SuspendedExchange suspendedExchange) {
+        suspendedBreakpointMessages.computeIfPresent(
+                nodeId,
+                (nId, message) -> new DefaultBacklogTracerEventMessage(
+                        message.getUid(), message.getTimestamp(), 
message.getRouteId(), message.getToNode(),
+                        message.getExchangeId(),
+                        dumpAsXml(suspendedExchange.getExchange())));
+    }
+
+    /**
+     * Dumps the message as a generic XML structure.
+     *
+     * @param  exchange the exchange to dump as XML
+     * @return          the XML
+     */
+    private String dumpAsXml(Exchange exchange) {
+        return MessageHelper.dumpAsXml(exchange.getIn(), true, 2, 
isBodyIncludeStreams(), isBodyIncludeFiles(),
+                getBodyMaxChars());
+    }
+
     /**
      * Represents a {@link org.apache.camel.spi.Breakpoint} that has a {@link 
Condition} on a specific node id.
      */
@@ -623,8 +655,7 @@ public final class BacklogDebugger extends ServiceSupport {
             String toNode = definition.getId();
             String routeId = CamelContextHelper.getRouteId(definition);
             String exchangeId = exchange.getExchangeId();
-            String messageAsXml = MessageHelper.dumpAsXml(exchange.getIn(), 
true, 2, isBodyIncludeStreams(),
-                    isBodyIncludeFiles(), getBodyMaxChars());
+            String messageAsXml = dumpAsXml(exchange);
             long uid = debugCounter.incrementAndGet();
 
             BacklogTracerEventMessage msg
@@ -686,8 +717,7 @@ public final class BacklogDebugger extends ServiceSupport {
             String toNode = definition.getId();
             String routeId = CamelContextHelper.getRouteId(definition);
             String exchangeId = exchange.getExchangeId();
-            String messageAsXml = MessageHelper.dumpAsXml(exchange.getIn(), 
true, 2, isBodyIncludeStreams(),
-                    isBodyIncludeFiles(), getBodyMaxChars());
+            String messageAsXml = dumpAsXml(exchange);
             long uid = debugCounter.incrementAndGet();
 
             BacklogTracerEventMessage msg
diff --git 
a/core/camel-management/src/test/java/org/apache/camel/management/BacklogDebuggerTest.java
 
b/core/camel-management/src/test/java/org/apache/camel/management/BacklogDebuggerTest.java
index 21386b3526c..1d1cc1c443c 100644
--- 
a/core/camel-management/src/test/java/org/apache/camel/management/BacklogDebuggerTest.java
+++ 
b/core/camel-management/src/test/java/org/apache/camel/management/BacklogDebuggerTest.java
@@ -250,6 +250,28 @@ public class BacklogDebuggerTest extends 
ManagementTestSupport {
                 "Should contain our added header");
         assertTrue(xml.contains("<exchangeProperty name=\"food\" 
type=\"java.lang.Integer\">987</exchangeProperty>"),
                 "Should contain our added exchange property");
+
+        // update body and header
+        mbeanServer.invoke(on, "setMessageBodyOnBreakpoint", new Object[] { 
"bar", "555", "java.lang.Integer" },
+                new String[] { "java.lang.String", "java.lang.Object", 
"java.lang.String" });
+        mbeanServer.invoke(on, "setMessageHeaderOnBreakpoint", new Object[] { 
"bar", "wine", "456", "java.lang.Integer" },
+                new String[] { "java.lang.String", "java.lang.String", 
"java.lang.Object", "java.lang.String" });
+        mbeanServer.invoke(on, "setExchangePropertyOnBreakpoint", new Object[] 
{ "bar", "drink", "798", "java.lang.Integer" },
+                new String[] { "java.lang.String", "java.lang.String", 
"java.lang.Object", "java.lang.String" });
+
+        // the message should be updated
+        xml = (String) mbeanServer.invoke(on, "dumpTracedMessagesAsXml", new 
Object[] { "bar", true },
+                new String[] { "java.lang.String", "boolean" });
+        assertNotNull(xml);
+        log.info(xml);
+
+        assertTrue(xml.contains("555"), "Should contain our body");
+        assertTrue(xml.contains("<toNode>bar</toNode>"), "Should contain bar 
node");
+        assertTrue(xml.contains("<header key=\"wine\" 
type=\"java.lang.Integer\">456</header>"),
+                "Should contain our added header");
+        assertTrue(xml.contains("<exchangeProperty name=\"drink\" 
type=\"java.lang.Integer\">798</exchangeProperty>"),
+                "Should contain our added exchange property");
+
         resetMocks();
         mock.expectedMessageCount(1);
 

Reply via email to