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 9172b879c8e07ce9b958da883a65b9ad33e23bdd Author: Claus Ibsen <[email protected]> AuthorDate: Mon Jan 29 09:32:30 2024 +0100 CAMEL-19749: variables - Should also copy message headers into variable when using EIP variables --- .../camel/spring/processor/FromVariableTest.xml | 2 ++ .../org/apache/camel/reifier/RouteReifier.java | 8 ++++++-- .../apache/camel/processor/FromVariableTest.java | 24 ++++++++++++++++++++++ .../apache/camel/dsl/yaml/FromVariableTest.groovy | 15 +++++++++++++- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/FromVariableTest.xml b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/FromVariableTest.xml index 1f578ec457d..595d382242e 100644 --- a/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/FromVariableTest.xml +++ b/components/camel-spring-xml/src/test/resources/org/apache/camel/spring/processor/FromVariableTest.xml @@ -29,6 +29,8 @@ <jmxAgent id="jmx" disabled="true"/> <route> <from uri="direct:start" variableReceive="myKey"/> + <setHeader name="foo"><constant>456</constant></setHeader> + <setHeader name="bar"><constant>Murphy</constant></setHeader> <transform><simple>Bye ${body}</simple></transform> <to uri="mock:foo"/> <setBody> diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java index d53870207a7..3bdd8679223 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java @@ -45,6 +45,7 @@ import org.apache.camel.reifier.rest.RestBindingReifier; import org.apache.camel.spi.CamelInternalProcessorAdvice; import org.apache.camel.spi.Contract; import org.apache.camel.spi.ErrorHandlerAware; +import org.apache.camel.spi.HeadersMapFactory; import org.apache.camel.spi.InternalProcessor; import org.apache.camel.spi.LifecycleStrategy; import org.apache.camel.spi.ManagementInterceptStrategy; @@ -331,7 +332,7 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> { // wrap with variable if (variable != null) { - internal.addAdvice(new VariableAdvice(variable)); + internal.addAdvice(new VariableAdvice(camelContext, variable)); } // and create the route that wraps all of this @@ -426,9 +427,11 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> { */ private static class VariableAdvice implements CamelInternalProcessorAdvice<Object> { + private final HeadersMapFactory factory; private final String name; - public VariableAdvice(String name) { + public VariableAdvice(CamelContext camelContext, String name) { + this.factory = camelContext.getCamelContextExtension().getHeadersMapFactory(); this.name = name; } @@ -436,6 +439,7 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> { public Object before(Exchange exchange) throws Exception { Object body = exchange.getMessage().getBody(); ExchangeHelper.setVariable(exchange, name, body); + ExchangeHelper.setVariable(exchange, name + ".headers", factory.newMap(exchange.getMessage().getHeaders())); return null; } diff --git a/core/camel-core/src/test/java/org/apache/camel/processor/FromVariableTest.java b/core/camel-core/src/test/java/org/apache/camel/processor/FromVariableTest.java index 3dfc5800ee8..cc1364e31e0 100644 --- a/core/camel-core/src/test/java/org/apache/camel/processor/FromVariableTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/processor/FromVariableTest.java @@ -18,8 +18,11 @@ package org.apache.camel.processor; import org.apache.camel.ContextTestSupport; import org.apache.camel.builder.RouteBuilder; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.Map; + public class FromVariableTest extends ContextTestSupport { @Test @@ -32,12 +35,33 @@ public class FromVariableTest extends ContextTestSupport { assertMockEndpointsSatisfied(); } + @Test + public void testOriginalHeaders() throws Exception { + getMockEndpoint("mock:foo").expectedBodiesReceived("Bye World"); + getMockEndpoint("mock:foo").expectedHeaderReceived("foo", 456); + getMockEndpoint("mock:foo").whenAnyExchangeReceived(e -> { + Map m = e.getVariable("myKey.headers", Map.class); + Assertions.assertNotNull(m); + Assertions.assertEquals(1, m.size()); + Assertions.assertEquals(123, m.get("foo")); + }); + + getMockEndpoint("mock:result").expectedBodiesReceived("World"); + getMockEndpoint("mock:result").expectedHeaderReceived("foo", 456); + + template.sendBodyAndHeader("direct:start", "World", "foo", 123); + + assertMockEndpointsSatisfied(); + } + @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { fromV("direct:start", "myKey") + .setHeader("foo", constant(456)) + .setHeader("bar", constant("Murphy")) .transform().simple("Bye ${body}") .to("mock:foo") .setBody(simple("${variable:myKey}")) diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/FromVariableTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/FromVariableTest.groovy index 7316a4f874a..5984b103e00 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/FromVariableTest.groovy +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/FromVariableTest.groovy @@ -18,6 +18,7 @@ package org.apache.camel.dsl.yaml import org.apache.camel.component.mock.MockEndpoint import org.apache.camel.dsl.yaml.support.YamlTestSupport +import org.junit.jupiter.api.Assertions class FromVariableTest extends YamlTestSupport { @@ -28,6 +29,12 @@ class FromVariableTest extends YamlTestSupport { uri: "direct:start" variableReceive: "myKey" steps: + - setHeader: + name: foo + constant: "456" + - setHeader: + name: bar + constant: "Murphy" - transform: simple: "Bye ${body}" - to: "mock:foo" @@ -38,6 +45,12 @@ class FromVariableTest extends YamlTestSupport { withMock('mock:foo') { expectedBodiesReceived 'Bye World' + whenAnyExchangeReceived { e -> { + Map m = e.getVariable("myKey.headers", Map.class) + Assertions.assertNotNull(m) + Assertions.assertEquals(1, m.size()) + Assertions.assertEquals(123, m.get("foo")) + }} } withMock('mock:result') { expectedBodiesReceived 'World' @@ -47,7 +60,7 @@ class FromVariableTest extends YamlTestSupport { context.start() withTemplate { - to('direct:start').withBody('World').send() + to('direct:start').withBody('World').withHeader("foo", 123).send() } then:
