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);