This is an automated email from the ASF dual-hosted git repository. lburgazzoli pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new 671adc2 route template: add template parameters to RouteTemplateDefinition::Converter function 671adc2 is described below commit 671adc2d97453bd6080e9fa04bf4317d4375df3f Author: Luca Burgazzoli <lburgazz...@gmail.com> AuthorDate: Mon Oct 19 18:41:31 2020 +0200 route template: add template parameters to RouteTemplateDefinition::Converter function --- .../java/org/apache/camel/impl/DefaultModel.java | 18 +++++----- .../camel/model/RouteTemplateDefinition.java | 40 ++++++++++++++++++---- .../camel/builder/RouteTemplateConverterTest.java | 34 +++++++++++++++--- 3 files changed, 73 insertions(+), 19 deletions(-) diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java index f545d28..b1d2d02 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java @@ -223,10 +223,11 @@ public class DefaultModel implements Model { throw new IllegalArgumentException("Cannot find RouteTemplate with id " + routeTemplateId); } - StringJoiner templatesBuilder = new StringJoiner(", "); final Map<String, Object> prop = new HashMap<>(); // include default values first from the template (and validate that we have inputs for all required parameters) if (target.getTemplateParameters() != null) { + StringJoiner templatesBuilder = new StringJoiner(", "); + for (RouteTemplateParameterDefinition temp : target.getTemplateParameters()) { if (temp.getDefaultValue() != null) { prop.put(temp.getName(), temp.getDefaultValue()); @@ -237,18 +238,19 @@ public class DefaultModel implements Model { } } } + if (templatesBuilder.length() > 0) { + throw new IllegalArgumentException( + "Route template " + routeTemplateId + " the following mandatory parameters must be provided: " + + templatesBuilder.toString()); + } } - if (templatesBuilder.length() > 0) { - throw new IllegalArgumentException( - "Route template " + routeTemplateId + " the following mandatory parameters must be provided: " - + templatesBuilder.toString()); - } + // then override with user parameters if (parameters != null) { prop.putAll(parameters); } - RouteTemplateDefinition.Converter converter = RouteTemplateDefinition::asRouteDefinition; + RouteTemplateDefinition.Converter converter = RouteTemplateDefinition.Converter.DEFAULT_CONVERTER; for (Map.Entry<String, RouteTemplateDefinition.Converter> entry : routeTemplateConverters.entrySet()) { final String key = entry.getKey(); @@ -266,7 +268,7 @@ public class DefaultModel implements Model { } } - RouteDefinition def = converter.apply(target); + RouteDefinition def = converter.apply(target, prop); if (routeId != null) { def.setId(routeId); } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java index c4c1252..e5fa49f 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java @@ -17,6 +17,7 @@ package org.apache.camel.model; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -30,7 +31,6 @@ import org.apache.camel.Endpoint; import org.apache.camel.builder.EndpointConsumerBuilder; import org.apache.camel.spi.AsEndpointUri; import org.apache.camel.spi.Metadata; -import org.apache.camel.util.function.ThrowingFunction; /** * Defines a route template (parameterized routes) @@ -46,14 +46,14 @@ public class RouteTemplateDefinition extends OptionalIdentifiedDefinition { @XmlElement(name = "route", required = true) private RouteDefinition route = new RouteDefinition(); - public void setTemplateParameters(List<RouteTemplateParameterDefinition> templateParameters) { - this.templateParameters = templateParameters; - } - public List<RouteTemplateParameterDefinition> getTemplateParameters() { return templateParameters; } + public void setTemplateParameters(List<RouteTemplateParameterDefinition> templateParameters) { + this.templateParameters = templateParameters; + } + public RouteDefinition getRoute() { return route; } @@ -216,6 +216,34 @@ public class RouteTemplateDefinition extends OptionalIdentifiedDefinition { } @FunctionalInterface - public interface Converter extends ThrowingFunction<RouteTemplateDefinition, RouteDefinition, Exception> { + public interface Converter { + /** + * Default implementation that uses {@link #asRouteDefinition()} to convert a {@link RouteTemplateDefinition} to + * a {@link RouteDefinition} + */ + Converter DEFAULT_CONVERTER = new Converter() { + @Override + public RouteDefinition apply(RouteTemplateDefinition in, Map<String, Object> parameters) throws Exception { + return in.asRouteDefinition(); + } + }; + + /** + * @deprecated use {@link #apply(RouteTemplateDefinition, Map)} + */ + @Deprecated + default RouteDefinition apply(RouteTemplateDefinition in) throws Exception { + return apply(in, Collections.emptyMap()); + } + + /** + * Convert a {@link RouteTemplateDefinition} to a {@link RouteDefinition}. + * + * @param in the {@link RouteTemplateDefinition} to convert + * @param parameters parameters that are given to the {@link Model#addRouteFromTemplate(String, String, Map)}. + * Implementors are free to add or remove additional parameter. + * @return the generated {@link RouteDefinition} + */ + RouteDefinition apply(RouteTemplateDefinition in, Map<String, Object> parameters) throws Exception; } } diff --git a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateConverterTest.java b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateConverterTest.java index c884969..158b8e7 100644 --- a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateConverterTest.java +++ b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateConverterTest.java @@ -26,11 +26,12 @@ import org.junit.jupiter.api.Test; import static org.apache.camel.util.CollectionHelper.mapOf; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; public class RouteTemplateConverterTest extends ContextTestSupport { @Test public void testCreateRouteFromRouteTemplateWithDefaultConverter() throws Exception { - context.addRouteTemplateDefinitionConverter("myTemplate1", RouteTemplateDefinition::asRouteDefinition); + context.addRouteTemplateDefinitionConverter("myTemplate1", RouteTemplateDefinition.Converter.DEFAULT_CONVERTER); context.addRouteFromTemplate("first", "myTemplate1", mapOf("foo", "one", "bar", "cheese")); assertEquals(1, context.getRouteDefinitions().size()); @@ -42,7 +43,7 @@ public class RouteTemplateConverterTest extends ContextTestSupport { @Test public void testCreateRouteFromRouteTemplateWithCustomConverter() throws Exception { - context.addRouteTemplateDefinitionConverter("myTemplate1", template -> { + context.addRouteTemplateDefinitionConverter("myTemplate1", (template, params) -> { final RouteDefinition def = template.asRouteDefinition(); final String inUri = def.getInput().getEndpointUri(); def.setInput(null); @@ -60,8 +61,31 @@ public class RouteTemplateConverterTest extends ContextTestSupport { } @Test - public void testCreateRouteFromRouteTemplateWithCustomConverterPatter() throws Exception { - context.addRouteTemplateDefinitionConverter("myTemplate[12]", template -> { + public void testCreateRouteFromRouteTemplateWithCustomConverterAndProperties() throws Exception { + context.addRouteTemplateDefinitionConverter("myTemplate1", (template, params) -> { + Object timeout = params.remove("timeout"); + + assertNotNull(timeout); + + final RouteDefinition def = template.asRouteDefinition(); + final String inUri = def.getInput().getEndpointUri(); + def.setInput(null); + def.setInput(new FromDefinition(inUri + "?timeout=" + timeout)); + return def; + }); + + context.addRouteFromTemplate("first", "myTemplate1", mapOf("foo", "one", "bar", "cheese", "timeout", "60s")); + + assertEquals(1, context.getRouteDefinitions().size()); + assertEquals(1, context.getRoutes().size()); + + assertEquals("direct:{{foo}}?timeout=60s", context.getRouteDefinition("first").getInput().getEndpointUri()); + assertEquals("direct://one?timeout=60s", context.getRoute("first").getEndpoint().getEndpointUri()); + } + + @Test + public void testCreateRouteFromRouteTemplateWithCustomConverterPatter() { + context.addRouteTemplateDefinitionConverter("myTemplate[12]", (template, params) -> { final RouteDefinition def = template.asRouteDefinition(); final String inUri = def.getInput().getEndpointUri(); def.setInput(null); @@ -90,7 +114,7 @@ public class RouteTemplateConverterTest extends ContextTestSupport { @Test public void testCreateRouteFromRouteTemplateWithCustomConverterGlob() { - context.addRouteTemplateDefinitionConverter("*", template -> { + context.addRouteTemplateDefinitionConverter("*", (template, params) -> { final RouteDefinition def = template.asRouteDefinition(); final String inUri = def.getInput().getEndpointUri(); def.setInput(null);