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: