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 042cbc00e7e269ae67753759697726c0cc055c3b
Author: Christoph Deppisch <[email protected]>
AuthorDate: Thu Oct 15 10:15:02 2026 +0200

    CAMEL-25378: Make nextSpecIndex final and allow variable overwrite
    
    - Make nextSpecIndex field final with set(0) in reset() instead of
      replacing the AtomicInteger reference
    - Allow Citrus-extracted variables to overwrite existing exchange
      variables so @variable()@ extractions are not silently dropped
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
 .../java/org/apache/camel/component/citrus/CitrusEndpoint.java     | 7 +++++--
 .../apache/camel/component/citrus/CitrusValidationProcessor.java   | 2 +-
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git 
a/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusEndpoint.java
 
b/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusEndpoint.java
index 71bb618e37b6..a1d6cb58f32a 100644
--- 
a/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusEndpoint.java
+++ 
b/components/camel-test/camel-test-citrus/src/main/java/org/apache/camel/component/citrus/CitrusEndpoint.java
@@ -44,7 +44,7 @@ public class CitrusEndpoint extends MockEndpoint {
     private String messageType;
 
     private volatile CitrusContext citrusContext;
-    private volatile AtomicInteger nextSpecIndex = new AtomicInteger(0);
+    private final AtomicInteger nextSpecIndex = new AtomicInteger(0);
 
     public CitrusEndpoint(String endpointUri, CitrusComponent component) {
         super(endpointUri, component);
@@ -104,7 +104,10 @@ public class CitrusEndpoint extends MockEndpoint {
     @Override
     public void reset() {
         super.reset();
-        nextSpecIndex = new AtomicInteger(0);
+        // guard against super constructor calling reset() before field 
initializer runs
+        if (nextSpecIndex != null) {
+            nextSpecIndex.set(0);
+        }
     }
 
     @Override
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 96765b7caa5d..092944def606 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
@@ -215,7 +215,7 @@ class CitrusValidationProcessor implements Processor {
             if (key.startsWith("citrus.") || key.startsWith("CITRUS_")) {
                 continue;
             }
-            if (!exchange.getProperties().containsKey(key) && 
!exchange.getVariables().containsKey(key)) {
+            if (!exchange.getProperties().containsKey(key)) {
                 exchange.setVariable(key, entry.getValue());
             }
         }

Reply via email to