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";