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:30 UTC
(camel) 14/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 c8be513a82afb7bb873c7d13d2864c3ed9cce765
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Jan 31 09:21:12 2024 +0100
CAMEL-19749: variables - Should also copy message headers into variable when using EIP variables
---
.../main/java/org/apache/camel/reifier/RouteReifier.java | 15 ++++++---------
.../java/org/apache/camel/processor/FromVariableTest.java | 6 +++---
docs/user-manual/modules/ROOT/pages/variables.adoc | 9 ++++++---
.../org/apache/camel/dsl/yaml/FromVariableTest.groovy | 4 ++--
4 files changed, 17 insertions(+), 17 deletions(-)
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 3bdd8679223..31a92c2582e 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,7 +45,6 @@ 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;
@@ -332,7 +331,7 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> {
// wrap with variable
if (variable != null) {
- internal.addAdvice(new VariableAdvice(camelContext, variable));
+ internal.addAdvice(new VariableAdvice(variable));
}
// and create the route that wraps all of this
@@ -423,23 +422,21 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> {
}
/**
- * Advice for copying the message body into a variable
+ * Advice for moving message body into a variable when using variableReceive mode
*/
private static class VariableAdvice implements CamelInternalProcessorAdvice<Object> {
- private final HeadersMapFactory factory;
private final String name;
- public VariableAdvice(CamelContext camelContext, String name) {
- this.factory = camelContext.getCamelContextExtension().getHeadersMapFactory();
+ public VariableAdvice(String name) {
this.name = name;
}
@Override
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()));
+ // move body to variable
+ ExchangeHelper.setVariableFromMessageBodyAndHeaders(exchange, name, exchange.getMessage());
+ exchange.getMessage().setBody(null);
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 e1227bb9bce..1d06aeabecb 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
@@ -27,7 +27,7 @@ public class FromVariableTest extends ContextTestSupport {
@Test
public void testOriginalBody() throws Exception {
- getMockEndpoint("mock:foo").expectedBodiesReceived("Bye World");
+ getMockEndpoint("mock:foo").expectedBodiesReceived("Bye ");
getMockEndpoint("mock:result").expectedBodiesReceived("World");
template.sendBody("direct:start", "World");
@@ -37,10 +37,10 @@ public class FromVariableTest extends ContextTestSupport {
@Test
public void testOriginalHeaders() throws Exception {
- getMockEndpoint("mock:foo").expectedBodiesReceived("Bye World");
+ getMockEndpoint("mock:foo").expectedBodiesReceived("Bye ");
getMockEndpoint("mock:foo").expectedHeaderReceived("foo", 456);
getMockEndpoint("mock:foo").whenAnyExchangeReceived(e -> {
- Map m = e.getVariable("myKey.headers", Map.class);
+ Map m = e.getVariable("header:myKey", Map.class);
Assertions.assertNotNull(m);
Assertions.assertEquals(1, m.size());
Assertions.assertEquals(123, m.get("foo"));
diff --git a/docs/user-manual/modules/ROOT/pages/variables.adoc b/docs/user-manual/modules/ROOT/pages/variables.adoc
index e392cd26fcc..23b7d92ad00 100644
--- a/docs/user-manual/modules/ROOT/pages/variables.adoc
+++ b/docs/user-manual/modules/ROOT/pages/variables.adoc
@@ -336,10 +336,10 @@ myVar.header.level=gold
IMPORTANT: Notice the headers are stored with the syntax `variable.header.key`. In the example above the variable name is `myVar`,
and the header key is `level`, which gives: `myVar.header.level`.
-=== Using variable to store a copy of the incoming message body
+=== Using variable to store incoming message body
-You can configure the `from` to store a copy of the message body into a variable. This makes it easy to have quick access
-to the original incoming message body via the variable.
+You can configure the `from` to store the message body into a variable, instead of the `Message`. This makes it easy to have quick access
+to the original incoming message body via the variable. Notice that the body on the `Message` will be `null`.
The following example from a unit test shows how to do this. Notice how Java DSL uses `fromV` to make it possible to specify
the name of the variable. In XML and YAML DSL you specify this using the `variableReceive` parameter.
@@ -389,6 +389,9 @@ from:
----
====
+NOTE: In the examples above the transform `Bye $\{body}` will result as `Bye ` because the `Message` has no message body, as the incoming
+message body is stored in the variable `myKey` instead.
+
=== Using variables when sending and receiving messages to an endpoint
You can configure the `to` to use variables for any of the following (or both) when sending and receiving:
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 5984b103e00..5112cb1a9ca 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
@@ -44,9 +44,9 @@ class FromVariableTest extends YamlTestSupport {
'''
withMock('mock:foo') {
- expectedBodiesReceived 'Bye World'
+ expectedBodiesReceived 'Bye '
whenAnyExchangeReceived { e -> {
- Map m = e.getVariable("myKey.headers", Map.class)
+ Map m = e.getVariable("header:myKey", Map.class)
Assertions.assertNotNull(m)
Assertions.assertEquals(1, m.size())
Assertions.assertEquals(123, m.get("foo"))