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
