This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch CAMEL-16593
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 97c5b840087119d2e3a7c9aaebeac82afeedfe18
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat May 8 13:00:27 2021 +0200

    CAMEL-16593: Kamelets local bean - Allow to use expression language to 
supply the bean WIP
---
 .../model/RouteTemplateBeanFactoryDefinition.java  | 58 ++++++++++++++++++++++
 .../camel/model/RouteTemplateDefinition.java       | 18 +++++++
 .../camel/builder/RouteTemplateLocalBeanTest.java  | 31 ++++++++++++
 3 files changed, 107 insertions(+)

diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateBeanFactoryDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateBeanFactoryDefinition.java
index 604e886..c3ee3b8 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateBeanFactoryDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateBeanFactoryDefinition.java
@@ -20,6 +20,7 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.XmlValue;
 
 import org.apache.camel.spi.Metadata;
@@ -31,6 +32,8 @@ import org.apache.camel.spi.Metadata;
 @XmlRootElement(name = "templateBeanFactory")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class RouteTemplateBeanFactoryDefinition {
+    @XmlTransient
+    private RouteTemplateDefinition parent;
     // it only makes sense to use the languages that are general purpose 
scripting languages
     @XmlAttribute(required = true)
     @Metadata(enums = "bean,groovy,joor,mvel,ognl,spel")
@@ -38,6 +41,13 @@ public class RouteTemplateBeanFactoryDefinition {
     @XmlValue
     private String script;
 
+    public RouteTemplateBeanFactoryDefinition() {
+    }
+
+    public RouteTemplateBeanFactoryDefinition(RouteTemplateDefinition parent) {
+        this.parent = parent;
+    }
+
     public String getLanguage() {
         return language;
     }
@@ -62,4 +72,52 @@ public class RouteTemplateBeanFactoryDefinition {
     public void setScript(String script) {
         this.script = script;
     }
+
+    // fluent builders
+    // ----------------------------------------------------
+
+    public RouteTemplateDefinition bean(Class<?> type) {
+        return bean(type, null);
+    }
+
+    public RouteTemplateDefinition bean(Class<?> type, String method) {
+        setLanguage("bean");
+        if (method != null) {
+            setScript(type.getName() + "?method=" + method);
+        } else {
+            setScript(type.getName());
+        }
+        return parent;
+    }
+
+    public RouteTemplateDefinition groovy(String script) {
+        setLanguage("groovy");
+        setScript(script);
+        return parent;
+    }
+
+    public RouteTemplateDefinition joor(String script) {
+        setLanguage("joor");
+        setScript(script);
+        return parent;
+    }
+
+    public RouteTemplateDefinition mvel(String script) {
+        setLanguage("mvel");
+        setScript(script);
+        return parent;
+    }
+
+    public RouteTemplateDefinition ognl(String script) {
+        setLanguage("ognl");
+        setScript(script);
+        return parent;
+    }
+
+    public RouteTemplateDefinition spel(String script) {
+        setLanguage("spel");
+        setScript(script);
+        return parent;
+    }
+
 }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java
index 2bd3ec3..eb0d56d 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateDefinition.java
@@ -276,6 +276,24 @@ public class RouteTemplateDefinition extends 
OptionalIdentifiedDefinition {
     }
 
     /**
+     * Adds a local bean the route template uses (via fluent builder).
+     *
+     * @param name     the name of the bean
+     * @return fluent builder to choose which language and script to use for 
creating the bean
+     */
+    public RouteTemplateBeanFactoryDefinition templateBean(String name) {
+        if (templateBeans == null) {
+            templateBeans = new ArrayList<>();
+        }
+        RouteTemplateBeanDefinition def = new RouteTemplateBeanDefinition();
+        def.setName(name);
+        RouteTemplateBeanFactoryDefinition bf = new 
RouteTemplateBeanFactoryDefinition(this);
+        def.setBeanFactory(bf);
+        templateBeans.add(def);
+        return bf;
+    }
+
+    /**
      * Sets a configurer which allows to do configuration while the route 
template is being used to create a route. This
      * gives control over the creating process, such as binding local beans 
and doing other kind of customization.
      *
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateLocalBeanTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateLocalBeanTest.java
index 896c610..ef1a036 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateLocalBeanTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/builder/RouteTemplateLocalBeanTest.java
@@ -484,6 +484,37 @@ public class RouteTemplateLocalBeanTest extends 
ContextTestSupport {
         context.stop();
     }
 
+    @Test
+    public void testLocalBeanExpressionFluent() throws Exception {
+        context.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                
routeTemplate("myTemplate").templateParameter("foo").templateParameter("bar")
+                        
.templateBean("myBar").bean(RouteTemplateLocalBeanTest.class, 
"createBuilderProcessor")
+                        .from("direct:{{foo}}")
+                        .to("bean:{{bar}}");
+            }
+        });
+
+        context.start();
+
+        TemplatedRouteBuilder.builder(context, "myTemplate")
+                .parameter("foo", "one")
+                .parameter("bar", "myBar")
+                .routeId("myRoute")
+                .add();
+
+        assertEquals(1, context.getRoutes().size());
+
+        Object out = template.requestBody("direct:one", "World");
+        assertEquals("Builder World", out);
+
+        // should not be a global bean
+        assertNull(context.getRegistry().lookupByName("myBar"));
+
+        context.stop();
+    }
+
     private class BuilderProcessor implements Processor {
 
         @Override

Reply via email to