You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2020/10/19 20:18:36 UTC
[camel] branch master updated: route template: add template
parameters to RouteTemplateDefinition::Converter function
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 <lb...@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);