You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2021/05/08 11:49:39 UTC
[camel] 03/05: CAMEL-16593: Kamelets local bean - Allow to use
expression language to supply the bean WIP
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 <cl...@gmail.com>
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