This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch fluent in repository https://gitbox.apache.org/repos/asf/camel.git
commit 42d3bca108bc0706b935bf88fe74bc2a9b49ff8b Author: Claus Ibsen <[email protected]> AuthorDate: Tue Jan 2 15:20:15 2024 +0100 CAMEL-20289: camel-core - FluentProducerTemplate - Add withVariable and withProperty --- .../impl/engine/DefaultFluentProducerTemplate.java | 47 ++++++++++++---------- .../camel/builder/FluentProducerTemplateTest.java | 27 +++++++++++++ .../org/apache/camel/support/ExchangeHelper.java | 11 ++--- 3 files changed, 58 insertions(+), 27 deletions(-) diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java index 851bf2ce845..b1063041a6e 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFluentProducerTemplate.java @@ -214,7 +214,8 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu DefaultFluentProducerTemplate clone = checkCloned(); if (clone.processorSupplier != null) { - throw new IllegalArgumentException("Cannot use both withExchangeProperties and withProcessor with FluentProducerTemplate"); + throw new IllegalArgumentException( + "Cannot use both withExchangeProperties and withProcessor with FluentProducerTemplate"); } Map<String, Object> map = clone.exchangeProperties; @@ -231,7 +232,8 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu DefaultFluentProducerTemplate clone = checkCloned(); if (clone.processorSupplier != null) { - throw new IllegalArgumentException("Cannot use both withExchangeProperty and withProcessor with FluentProducerTemplate"); + throw new IllegalArgumentException( + "Cannot use both withExchangeProperty and withProcessor with FluentProducerTemplate"); } Map<String, Object> map = clone.exchangeProperties; @@ -457,24 +459,23 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu // Determine the target endpoint final Endpoint target = clone.target(); - Future<T> result = - clone.template().asyncSend(target, exchange -> { - // Make a copy of the headers and body so that async processing won't - // be invalidated by subsequent reuse of the template - Object bodyCopy = clone.body; - - exchange.setPattern(ExchangePattern.InOut); - exchange.getMessage().setBody(bodyCopy); - if (clone.headers != null) { - exchange.getMessage().setHeaders(new HashMap<>(clone.headers)); - } - if (clone.exchangeProperties != null) { - exchange.getProperties().putAll(clone.exchangeProperties); - } - if (clone.variables != null) { - clone.variables.forEach((k, v) -> ExchangeHelper.setVariable(exchange, k, v)); - } - }).thenApply(answer -> answer.getContext().getTypeConverter().convertTo(type, answer)); + Future<T> result = clone.template().asyncSend(target, exchange -> { + // Make a copy of the headers and body so that async processing won't + // be invalidated by subsequent reuse of the template + Object bodyCopy = clone.body; + + exchange.setPattern(ExchangePattern.InOut); + exchange.getMessage().setBody(bodyCopy); + if (clone.headers != null) { + exchange.getMessage().setHeaders(new HashMap<>(clone.headers)); + } + if (clone.exchangeProperties != null) { + exchange.getProperties().putAll(clone.exchangeProperties); + } + if (clone.variables != null) { + clone.variables.forEach((k, v) -> ExchangeHelper.setVariable(exchange, k, v)); + } + }).thenApply(answer -> answer.getMessage().getBody(type)); // reset cloned flag so when we use it again it has to set values again cloned = false; @@ -624,8 +625,10 @@ public class DefaultFluentProducerTemplate extends ServiceSupport implements Flu private Processor defaultAsyncProcessor() { final Map<String, Object> headersCopy = ObjectHelper.isNotEmpty(this.headers) ? new HashMap<>(this.headers) : null; - final Map<String, Object> propertiesCopy = ObjectHelper.isNotEmpty(this.exchangeProperties) ? new HashMap<>(this.exchangeProperties) : null; - final Map<String, Object> variablesCopy = ObjectHelper.isNotEmpty(this.variables) ? new HashMap<>(this.variables) : null; + final Map<String, Object> propertiesCopy + = ObjectHelper.isNotEmpty(this.exchangeProperties) ? new HashMap<>(this.exchangeProperties) : null; + final Map<String, Object> variablesCopy + = ObjectHelper.isNotEmpty(this.variables) ? new HashMap<>(this.variables) : null; final Object bodyCopy = this.body; return exchange -> { if (headersCopy != null) { diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/FluentProducerTemplateTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/FluentProducerTemplateTest.java index 7ef05345095..bbb9636c951 100644 --- a/core/camel-core/src/test/java/org/apache/camel/builder/FluentProducerTemplateTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/builder/FluentProducerTemplateTest.java @@ -333,6 +333,30 @@ public class FluentProducerTemplateTest extends ContextTestSupport { .to(context.getEndpoint("direct:inout")).request(Integer.class)); } + @Test + public void testWithVariable() { + FluentProducerTemplate template = DefaultFluentProducerTemplate.on(context); + + assertEquals("Hello World", template.withVariable("foo", "World").withBody("Hello") + .to("direct:var").request(String.class)); + + assertEquals("Hello Moon", template.withVariable("foo", "Moon").withVariable("global:planet", "Mars").withBody("Hello") + .to("direct:var").request(String.class)); + assertEquals("Mars", context.getVariable("planet")); + } + + @Test + public void testWithExchangeProperty() { + FluentProducerTemplate template = DefaultFluentProducerTemplate.on(context); + + assertEquals("Hello World", template.withExchangeProperty("foo", "World").withBody("Hello") + .to("direct:ep").request(String.class)); + + assertEquals("Hello Moon", + template.withExchangeProperty("foo", "Moon").withExchangeProperty("planet", "Mars").withBody("Hello") + .to("direct:ep").request(String.class)); + } + @Test public void testAsyncRequest() throws Exception { MockEndpoint mock = getMockEndpoint("mock:async"); @@ -473,6 +497,9 @@ public class FluentProducerTemplateTest extends ContextTestSupport { from("direct:red").setBody().simple("Red ${body}"); + from("direct:var").transform().simple("${body} ${variable.foo}"); + + from("direct:ep").transform().simple("${body} ${exchangeProperty.foo}"); } }; } diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java index 004d0dacb99..5ea365e297d 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java @@ -1076,15 +1076,16 @@ public final class ExchangeHelper { /** * Sets the variable * - * @param exchange the exchange - * @param name the variable name. Can be prefixed with repo-id:name to lookup the variable from a specific - * repository. If no repo-id is provided, then the variable is set on the exchange - * @param value the value of the variable + * @param exchange the exchange + * @param name the variable name. Can be prefixed with repo-id:name to lookup the variable from a specific + * repository. If no repo-id is provided, then the variable is set on the exchange + * @param value the value of the variable */ public static void setVariable(Exchange exchange, String name, Object value) { String id = StringHelper.before(name, ":"); if (id != null) { - VariableRepositoryFactory factory = exchange.getContext().getCamelContextExtension().getContextPlugin(VariableRepositoryFactory.class); + VariableRepositoryFactory factory + = exchange.getContext().getCamelContextExtension().getContextPlugin(VariableRepositoryFactory.class); VariableRepository repo = factory.getVariableRepository(id); if (repo != null) { name = StringHelper.after(name, ":");
