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

christophd pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit d2ec84933cf0482981b88b0821a2245d782ed669
Author: Christoph Deppisch <[email protected]>
AuthorDate: Thu Oct 15 16:53:41 2026 +0200

    CAMEL-25378: Only write back new or changed variables after Citrus 
validation
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
 .../component/citrus/CitrusValidationProcessor.java     | 12 +++++++++---
 .../camel/component/citrus/CitrusVariableTest.java      | 17 +++++++++++++++++
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git 
a/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusValidationProcessor.java
 
b/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusValidationProcessor.java
index 47af6a7b5510..29d491d79cb2 100644
--- 
a/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusValidationProcessor.java
+++ 
b/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusValidationProcessor.java
@@ -17,10 +17,12 @@
 package org.apache.camel.component.citrus;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 import java.util.function.Supplier;
 
 import org.apache.camel.Exchange;
@@ -66,6 +68,7 @@ class CitrusValidationProcessor implements Processor {
     public void process(Exchange exchange) throws Exception {
         TestContext testContext = testContextSupplier.get();
         propagateExchangeVariables(exchange, testContext);
+        Map<String, Object> propagated = new 
HashMap<>(testContext.getVariables());
 
         try {
             if (spec != null) {
@@ -83,7 +86,7 @@ class CitrusValidationProcessor implements Processor {
                 applyResponse(exchange, responseSpec, testContext);
             }
         } finally {
-            writeBackExtractedVariables(exchange, testContext);
+            writeBackExtractedVariables(exchange, testContext, propagated);
         }
     }
 
@@ -209,13 +212,16 @@ class CitrusValidationProcessor implements Processor {
         }
     }
 
-    private void writeBackExtractedVariables(Exchange exchange, TestContext 
testContext) {
+    private void writeBackExtractedVariables(Exchange exchange, TestContext 
testContext, Map<String, Object> propagated) {
         for (Map.Entry<String, Object> entry : 
testContext.getVariables().entrySet()) {
             String key = entry.getKey();
             if (key.startsWith("citrus.") || key.startsWith("CITRUS_")) {
                 continue;
             }
-            exchange.setVariable(key, entry.getValue());
+            Object value = entry.getValue();
+            if (!propagated.containsKey(key) || 
!Objects.equals(propagated.get(key), value)) {
+                exchange.setVariable(key, value);
+            }
         }
     }
 }
diff --git 
a/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusVariableTest.java
 
b/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusVariableTest.java
index f3081e8f8ba4..6c56ddf524e2 100644
--- 
a/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusVariableTest.java
+++ 
b/components/camel-test/camel-test-citrus/src/test/java/org/apache/camel/component/citrus/CitrusVariableTest.java
@@ -73,6 +73,23 @@ class CitrusVariableTest extends CamelTestSupport {
         assertThat(result.getProperty("orderId")).isEqualTo("old-value");
     }
 
+    @Test
+    void shouldNotWriteBackPropagatedPropertiesAsVariables() throws Exception {
+        CitrusEndpoint citrus = 
context.getEndpoint("citrus:validate/test?messageType=json", 
CitrusEndpoint.class);
+
+        citrus.validateAll().body("{\"status\": \"ok\"}");
+        citrus.expectedMessageCount(1);
+
+        Exchange result = template.send("direct:start", exchange -> {
+            exchange.setProperty("myProp", "propValue");
+            exchange.getIn().setBody("{\"status\": \"ok\"}");
+        });
+
+        citrus.assertIsSatisfied();
+        assertThat(result.getProperty("myProp")).isEqualTo("propValue");
+        assertThat(result.getVariables().containsKey("myProp")).isFalse();
+    }
+
     @Override
     protected RoutesBuilder createRouteBuilder() {
         return new RouteBuilder() {

Reply via email to