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