You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2024/01/31 09:07:17 UTC
(camel) 01/16: CAMEL-19749: variables - Should also copy message headers into variable when using EIP variables
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 <cl...@gmail.com>
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: