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

davsclaus pushed a commit to branch var-headers
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 6217381bbd2c1f048bdf50e463aed01bfd1ec52d
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Jan 29 14:03:11 2024 +0100

    CAMEL-19749: variables - Should also copy message headers into variable 
when using EIP variables
---
 .../java/org/apache/camel/language/VariableTest.java | 20 ++++++++++++++++++++
 .../camel/support/ExchangeVariableRepository.java    | 15 +++++++++++++++
 2 files changed, 35 insertions(+)

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 95486d2a77d..41eeb16aa1b 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
@@ -20,6 +20,10 @@ import org.apache.camel.LanguageTestSupport;
 import org.apache.camel.language.variable.VariableLanguage;
 import org.junit.jupiter.api.Test;
 
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class VariableTest extends LanguageTestSupport {
@@ -39,6 +43,22 @@ public class VariableTest extends LanguageTestSupport {
         assertPredicate("varLocal", false);
     }
 
+    @Test
+    public void testVariableHeaders() throws Exception {
+        exchange.setVariable("myKey.header.foo", "abc");
+        exchange.setVariable("myKey.header.bar", 123);
+        exchange.setVariable("myOtherKey", "Hello Again");
+
+        assertExpression("myKey.header.foo", "abc");
+        assertExpression("myKey.header.bar", 123);
+
+        Map map = exchange.getVariable("myKey.headers", Map.class);
+        assertNotNull(map);
+        assertEquals(2, map.size());
+        assertEquals("abc", map.get("foo"));
+        assertEquals(123, map.get("bar"));
+    }
+
     @Test
     public void testSingleton() {
         VariableLanguage prop = new VariableLanguage();
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 14f74be0760..b913ef26056 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
@@ -26,6 +26,8 @@ import org.apache.camel.StreamCache;
 import org.apache.camel.spi.BrowsableVariableRepository;
 import org.apache.camel.spi.VariableRepository;
 import org.apache.camel.support.service.ServiceSupport;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.util.StringHelper;
 
 /**
  * {@link VariableRepository} which is local per {@link Exchange} to hold 
request-scoped variables.
@@ -42,6 +44,19 @@ class ExchangeVariableRepository extends ServiceSupport 
implements BrowsableVari
     @Override
     public Object getVariable(String name) {
         Object answer = variables.get(name);
+        if (answer == null && name.endsWith(".headers")) {
+            String prefix = name.substring(0, name.length() - 1) + "."; // 
xxx.headers -> xxx.header.
+            // we want all headers for a given variable
+            Map<String, Object> map = new CaseInsensitiveMap();
+            for (Map.Entry<String, Object> entry : variables.entrySet()) {
+                String key = entry.getKey();
+                if (key.startsWith(prefix)) {
+                    key = StringHelper.after(key, prefix);
+                    map.put(key, entry.getValue());
+                }
+            }
+            return map;
+        }
         if (answer instanceof StreamCache sc) {
             // reset so the cache is ready to be used as a variable
             sc.reset();

Reply via email to