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 b2016c1cf57 CAMEL-22018: camel-core - Exchange.getVariables should 
include message headers (#17867)
b2016c1cf57 is described below

commit b2016c1cf571948916d6ff4655e7b366ccd20607
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Thu Apr 24 21:53:54 2025 +0200

    CAMEL-22018: camel-core - Exchange.getVariables should include message 
headers (#17867)
    
    * CAMEL-22018: camel-core - Exchange.getVariables should include message 
headers
---
 .../language/groovy/GroovyExpressionTest.java      | 13 ++++++
 .../org/apache/camel/language/VariableTest.java    | 12 +++++
 .../camel/support/ExchangeVariableRepository.java  | 53 ++++++++--------------
 3 files changed, 45 insertions(+), 33 deletions(-)

diff --git 
a/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/GroovyExpressionTest.java
 
b/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/GroovyExpressionTest.java
index 9a01173e65b..946d1b90fec 100644
--- 
a/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/GroovyExpressionTest.java
+++ 
b/components/camel-groovy/src/test/java/org/apache/camel/language/groovy/GroovyExpressionTest.java
@@ -27,6 +27,7 @@ import org.slf4j.LoggerFactory;
 import static org.apache.camel.test.junit5.TestSupport.assertExpression;
 import static org.apache.camel.test.junit5.TestSupport.assertInMessageHeader;
 import static org.apache.camel.test.junit5.TestSupport.assertPredicate;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
@@ -68,6 +69,18 @@ public class GroovyExpressionTest {
         assertPredicate(GroovyLanguage.groovy("variables['cheese'] == 
'gauda'"), exchange, true);
     }
 
+    @Test
+    public void testVariableHeaders() {
+        exchange.removeVariable("cheese");
+        exchange.setVariable("header:myKey.foo", "abc");
+        exchange.setVariable("header:myKey.bar", 123);
+        exchange.setVariable("myOtherKey", "Hello Again");
+
+        assertEquals("Hello Again", 
GroovyLanguage.groovy("variables['myOtherKey']").evaluate(exchange));
+        assertEquals("abc", 
GroovyLanguage.groovy("variables['header:myKey.foo']").evaluate(exchange));
+        assertEquals(123, 
GroovyLanguage.groovy("variables['header:myKey.bar']").evaluate(exchange));
+    }
+
     @Test
     public void testException() {
         Exception e = new IllegalArgumentException("Forced");
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/language/VariableTest.java 
b/core/camel-core/src/test/java/org/apache/camel/language/VariableTest.java
index 41f6654c8d5..de57895162a 100644
--- a/core/camel-core/src/test/java/org/apache/camel/language/VariableTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/language/VariableTest.java
@@ -46,6 +46,7 @@ public class VariableTest extends LanguageTestSupport {
 
     @Test
     public void testVariableHeaders() {
+        exchange.removeVariable("cheese");
         exchange.setVariable("header:myKey.foo", "abc");
         exchange.setVariable("header:myKey.bar", 123);
         exchange.setVariable("myOtherKey", "Hello Again");
@@ -58,6 +59,17 @@ public class VariableTest extends LanguageTestSupport {
         assertEquals(2, map.size());
         assertEquals("abc", map.get("foo"));
         assertEquals(123, map.get("bar"));
+
+        // getVariables should also include the headers
+        map = exchange.getVariables();
+        assertEquals(3, map.size());
+        assertEquals("Hello Again", map.get("myOtherKey"));
+        assertEquals("abc", map.get("header:myKey.foo"));
+        assertEquals(123, map.get("header:myKey.bar"));
+
+        exchange.removeVariable("header:myKey");
+        map = exchange.getVariables();
+        assertEquals(1, map.size());
     }
 
     @Test
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeVariableRepository.java
 
b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeVariableRepository.java
index 0e144ce3627..ff21700260d 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeVariableRepository.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeVariableRepository.java
@@ -16,8 +16,9 @@
  */
 package org.apache.camel.support;
 
+import java.util.HashSet;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.Set;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
@@ -31,8 +32,6 @@ import org.apache.camel.util.StringHelper;
  */
 final class ExchangeVariableRepository extends AbstractVariableRepository {
 
-    private final Map<String, Object> headers = new ConcurrentHashMap<>(8);
-
     public ExchangeVariableRepository(CamelContext camelContext) {
         setCamelContext(camelContext);
         // ensure its started
@@ -41,7 +40,6 @@ final class ExchangeVariableRepository extends 
AbstractVariableRepository {
 
     void copyFrom(ExchangeVariableRepository source) {
         setVariables(source.getVariables());
-        this.headers.putAll(source.headers);
     }
 
     @Override
@@ -56,54 +54,43 @@ final class ExchangeVariableRepository extends 
AbstractVariableRepository {
                 prefix = prefix + ".";
                 // we want all headers for a given variable
                 Map<String, Object> map = new CaseInsensitiveMap();
-                for (Map.Entry<String, Object> entry : headers.entrySet()) {
+                for (Map.Entry<String, Object> entry : 
getVariables().entrySet()) {
                     String key = entry.getKey();
-                    if (key.startsWith(prefix)) {
+                    if (key.startsWith(name + ".")) {
                         key = StringHelper.after(key, prefix);
                         map.put(key, entry.getValue());
                     }
                 }
                 return map;
-            } else {
-                return headers.get(prefix);
             }
         }
         return super.getVariable(name);
     }
 
-    @Override
-    public void setVariable(String name, Object value) {
-        String id = StringHelper.before(name, ":");
-        if ("header".equals(id)) {
-            name = StringHelper.after(name, ":");
-            if (value != null) {
-                // avoid the NullPointException
-                headers.put(name, value);
-            } else {
-                // if the value is null, we just remove the key from the map
-                headers.remove(name);
-            }
-        } else {
-            super.setVariable(name, value);
-        }
-    }
-
     @Override
     public Object removeVariable(String name) {
         String id = StringHelper.before(name, ":");
         if ("header".equals(id)) {
-            name = StringHelper.after(name, ":");
-            return headers.remove(name);
+            String prefix = StringHelper.after(name, ":");
+            if (prefix == null || prefix.isBlank()) {
+                throw new IllegalArgumentException("Variable " + name + " must 
have header key");
+            }
+            if (!prefix.contains(".")) {
+                // we want to remove all headers for a given variable
+                Set<String> toRemove = new HashSet<>();
+                for (Map.Entry<String, Object> entry : 
getVariables().entrySet()) {
+                    String key = entry.getKey();
+                    if (key.startsWith(name + ".")) {
+                        toRemove.add(key);
+                    }
+                }
+                toRemove.forEach(super::removeVariable);
+                return null;
+            }
         }
         return super.removeVariable(name);
     }
 
-    @Override
-    public void clear() {
-        super.clear();
-        headers.clear();
-    }
-
     @Override
     public String getId() {
         return "exchange";

Reply via email to