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() {
