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 2021/05/13 19:50:44 UTC
[camel] branch main updated (492b7e3 -> 9ad5a5d)
This is an automated email from the ASF dual-hosted git repository.
lburgazzoli pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git.
from 492b7e3 Regen
new ce1e682 CAMEL-16607: Allow to use #type and #class for local beans
new 9ad5a5d CAMEL-16607: Allow to use #type and #class for local beans. Fixed when using script as local bean.
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../camel/model/RouteTemplateScriptDefinition.java | 4 ++
.../org/apache/camel/support/SupplierRegistry.java | 20 ++++++++-
.../dsl/yaml/deserializers/ModelDeserializers.java | 6 +++
.../RouteTemplateDefinitionDeserializer.java | 39 +++---------------
dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml | 5 +++
.../src/generated/resources/camel-yaml-dsl.json | 14 ++++---
.../org/apache/camel/dsl/yaml/KameletTest.groovy | 2 +-
.../apache/camel/dsl/yaml/RouteTemplateTest.groovy | 47 +++++++++++++++++++++-
8 files changed, 93 insertions(+), 44 deletions(-)
[camel] 02/02: CAMEL-16607: Allow to use #type and #class for local
beans. Fixed when using script as local bean.
Posted by lb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lburgazzoli pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
commit 9ad5a5d503ba295f6b679caf8fee05346a1499b6
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu May 13 20:46:13 2021 +0200
CAMEL-16607: Allow to use #type and #class for local beans. Fixed when using script as local bean.
---
.../org/apache/camel/support/SupplierRegistry.java | 20 ++++++++++++++++++--
.../apache/camel/dsl/yaml/RouteTemplateTest.groovy | 2 +-
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/SupplierRegistry.java b/core/camel-support/src/main/java/org/apache/camel/support/SupplierRegistry.java
index a4683d2..fc5e3c2 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/SupplierRegistry.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/SupplierRegistry.java
@@ -48,7 +48,7 @@ public class SupplierRegistry extends SimpleRegistry {
answer = ((Supplier<?>) answer).get();
}
if (answer == null) {
- // look for first entry that is the type
+ // no direct type match then check if assignable
for (Map.Entry<Class<?>, Object> entry : map.entrySet()) {
if (type.isAssignableFrom(entry.getKey())) {
Object value = entry.getValue();
@@ -62,13 +62,29 @@ public class SupplierRegistry extends SimpleRegistry {
}
}
if (answer == null) {
+ // okay fallback to check all entries that are unassigned type (java.lang.Object)
+ for (Map.Entry<Class<?>, Object> entry : map.entrySet()) {
+ if (Object.class == entry.getKey()) {
+ Object value = entry.getValue();
+ if (value instanceof Supplier) {
+ // okay then eval the supplier to get the actual value
+ value = ((Supplier<?>) value).get();
+ }
+ if (type.isInstance(value)) {
+ answer = value;
+ break;
+ }
+ }
+ }
+ }
+ if (answer == null) {
return null;
}
try {
answer = unwrap(answer);
return type.cast(answer);
} catch (Throwable e) {
- String msg = "Found bean: " + name + " in SimpleRegistry: " + this
+ String msg = "Found bean: " + name + " in SupplierRegistry: " + this
+ " of type: " + answer.getClass().getName() + " expected type was: " + type;
throw new NoSuchBeanException(name, msg, e);
}
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteTemplateTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteTemplateTest.groovy
index 7c8ab22..b8a3293 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteTemplateTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteTemplateTest.groovy
@@ -98,7 +98,7 @@ class RouteTemplateTest extends YamlTestSupport {
beans:
- name: "myProcessor"
type: "groovy"
- script: "return new ${MyUppercaseProcessor.class.name}"
+ script: "new ${MyUppercaseProcessor.class.name}()"
from:
uri: "direct:{{directName}}"
steps:
[camel] 01/02: CAMEL-16607: Allow to use #type and #class for local
beans
Posted by lb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
lburgazzoli pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
commit ce1e6829601e61399242fe6db3762819dd3295d7
Author: Luca Burgazzoli <lb...@gmail.com>
AuthorDate: Thu May 13 17:06:31 2021 +0200
CAMEL-16607: Allow to use #type and #class for local beans
---
.../camel/model/RouteTemplateScriptDefinition.java | 4 ++
.../dsl/yaml/deserializers/ModelDeserializers.java | 6 +++
.../RouteTemplateDefinitionDeserializer.java | 39 +++---------------
dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml | 5 +++
.../src/generated/resources/camel-yaml-dsl.json | 14 ++++---
.../org/apache/camel/dsl/yaml/KameletTest.groovy | 2 +-
.../apache/camel/dsl/yaml/RouteTemplateTest.groovy | 47 +++++++++++++++++++++-
7 files changed, 75 insertions(+), 42 deletions(-)
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateScriptDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateScriptDefinition.java
index b4d583e..38c719e 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateScriptDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteTemplateScriptDefinition.java
@@ -36,6 +36,10 @@ public class RouteTemplateScriptDefinition {
public RouteTemplateScriptDefinition() {
}
+ public RouteTemplateScriptDefinition(String script) {
+ this.script = script;
+ }
+
public String getScript() {
return script;
}
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index 8a1400f..8adf1ca 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -11847,6 +11847,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
}
@YamlType(
+ inline = true,
types = org.apache.camel.model.RouteTemplateScriptDefinition.class,
order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
nodes = "template-script",
@@ -11863,6 +11864,11 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
}
@Override
+ protected RouteTemplateScriptDefinition newInstance(String value) {
+ return new RouteTemplateScriptDefinition(value);
+ }
+
+ @Override
protected boolean setProperty(RouteTemplateScriptDefinition target, String propertyKey,
String propertyName, Node node) {
switch(propertyKey) {
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteTemplateDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteTemplateDefinitionDeserializer.java
index d9d7b0f..70161b8 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteTemplateDefinitionDeserializer.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteTemplateDefinitionDeserializer.java
@@ -16,23 +16,17 @@
*/
package org.apache.camel.dsl.yaml.deserializers;
-import java.util.ArrayList;
import java.util.List;
-import java.util.function.Consumer;
-import org.apache.camel.RouteTemplateContext;
-import org.apache.camel.RuntimeCamelException;
-import org.apache.camel.dsl.yaml.common.YamlDeserializationContext;
import org.apache.camel.dsl.yaml.common.YamlDeserializerBase;
import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.model.RouteTemplateBeanDefinition;
import org.apache.camel.model.RouteTemplateDefinition;
import org.apache.camel.model.RouteTemplateParameterDefinition;
import org.apache.camel.spi.annotations.YamlIn;
import org.apache.camel.spi.annotations.YamlProperty;
import org.apache.camel.spi.annotations.YamlType;
-import org.apache.camel.util.ObjectHelper;
import org.snakeyaml.engine.v2.nodes.Node;
-import org.snakeyaml.engine.v2.nodes.SequenceNode;
@YamlIn
@YamlType(
@@ -79,36 +73,13 @@ public class RouteTemplateDefinitionDeserializer extends YamlDeserializerBase<Ro
break;
}
case "parameters": {
- List<RouteTemplateParameterDefinition> val = asFlatList(node, RouteTemplateParameterDefinition.class);
- target.setTemplateParameters(val);
+ List<RouteTemplateParameterDefinition> items = asFlatList(node, RouteTemplateParameterDefinition.class);
+ target.setTemplateParameters(items);
break;
}
case "beans": {
- final SequenceNode sn = asSequenceNode(node);
- final List<NamedBeanDefinition> beans = new ArrayList<>();
- final YamlDeserializationContext dc = getDeserializationContext(node);
-
- asFlatCollection(node, NamedBeanDefinition.class, beans);
-
- target.configure(new Consumer<RouteTemplateContext>() {
- @Override
- public void accept(RouteTemplateContext context) {
- for (int i = 0; i < beans.size(); i++) {
- NamedBeanDefinition bean = beans.get(i);
-
- ObjectHelper.notNull(bean.getName(), "The bean name must be set");
- ObjectHelper.notNull(bean.getType(), "The bean type must be set");
-
- try {
- context.bind(
- bean.getName(),
- bean.newInstance(context.getCamelContext()));
- } catch (Exception e) {
- throw new RuntimeCamelException(e);
- }
- }
- }
- });
+ List<RouteTemplateBeanDefinition> items = asFlatList(node, RouteTemplateBeanDefinition.class);
+ target.setTemplateBeans(items);
break;
}
default: {
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml b/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml
index 9d850e9..8969cc3 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/pom.xml
@@ -134,6 +134,11 @@
<artifactId>camel-kamelet</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-groovy</artifactId>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
index 017ae96..6bb22ec 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
@@ -2127,12 +2127,16 @@
"required" : [ "name" ]
},
"org.apache.camel.model.RouteTemplateScriptDefinition" : {
- "type" : "object",
- "properties" : {
- "script" : {
- "type" : "string"
+ "oneOf" : [ {
+ "type" : "string"
+ }, {
+ "type" : "object",
+ "properties" : {
+ "script" : {
+ "type" : "string"
+ }
}
- }
+ } ]
},
"org.apache.camel.model.RoutingSlipDefinition" : {
"oneOf" : [ {
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletTest.groovy
index fe3cb16..30da3ac 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/KameletTest.groovy
@@ -221,7 +221,7 @@ class KameletTest extends YamlTestSupport {
id: "myTemplate"
beans:
- name: "myProcessor"
- type: ${MyUppercaseProcessor.class.name}
+ type: "#class:${MyUppercaseProcessor.class.name}"
from:
uri: "kamelet:source"
steps:
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteTemplateTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteTemplateTest.groovy
index 2fb2281..7c8ab22 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteTemplateTest.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/RouteTemplateTest.groovy
@@ -55,7 +55,7 @@ class RouteTemplateTest extends YamlTestSupport {
id: "myTemplate"
beans:
- name: "myProcessor"
- type: ${MyUppercaseProcessor.class.name}
+ type: "#class:${MyUppercaseProcessor.class.name}"
from:
uri: "direct:{{directName}}"
steps:
@@ -84,7 +84,50 @@ class RouteTemplateTest extends YamlTestSupport {
with(context.routeTemplateDefinitions[0], RouteTemplateDefinition) {
id == 'myTemplate'
- configurer != null
+ templateBeans.size() == 1
+ }
+
+ MockEndpoint.assertIsSatisfied(context)
+ }
+
+ def "create template with script"() {
+ setup:
+ loadRoutes """
+ - template:
+ id: "myTemplate"
+ beans:
+ - name: "myProcessor"
+ type: "groovy"
+ script: "return new ${MyUppercaseProcessor.class.name}"
+ from:
+ uri: "direct:{{directName}}"
+ steps:
+ - process:
+ ref: "{{myProcessor}}"
+ - from:
+ uri: "direct:start"
+ steps:
+ - to: "direct:myId"
+ - to: "mock:result"
+ """
+
+ withMock('mock:result') {
+ expectedMessageCount 1
+ expectedBodiesReceived 'HELLO'
+ }
+ when:
+ context.addRouteFromTemplate('myId', 'myTemplate', ['directName': 'myId'])
+ context.start()
+
+ withTemplate {
+ to('direct:start').withBody('hello').send()
+ }
+ then:
+ context.routeTemplateDefinitions.size() == 1
+
+ with(context.routeTemplateDefinitions[0], RouteTemplateDefinition) {
+ id == 'myTemplate'
+ templateBeans.size() == 1
}
MockEndpoint.assertIsSatisfied(context)