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
The following commit(s) were added to refs/heads/main by this push: new a8a540a yaml-dsl: make it simple to configure route local beans a8a540a is described below commit a8a540acfc1168a59d6c27cf86d4bc24ed98cea0 Author: Luca Burgazzoli <lburgazz...@gmail.com> AuthorDate: Fri Jun 11 17:03:44 2021 +0200 yaml-dsl: make it simple to configure route local beans --- .../camel-yaml-dsl-deserializers/pom.xml | 1 + .../dsl/yaml/deserializers/ModelDeserializers.java | 66 ------------- .../deserializers/ModelDeserializersResolver.java | 2 - .../dsl/yaml/deserializers/CustomResolver.java | 2 + .../RouteTemplateBeanDefinitionDeserializer.java | 102 +++++++++++++++++++++ .../src/generated/resources/camel-yaml-dsl.json | 3 + .../org/apache/camel/dsl/yaml/KameletTest.groovy | 72 +++++++++++++++ .../apache/camel/dsl/yaml/RouteTemplateTest.groovy | 90 ++++++++++++++++++ 8 files changed, 270 insertions(+), 68 deletions(-) diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml index d905c97..830a186 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml @@ -131,6 +131,7 @@ <bannedDefinition>org.apache.camel.model.RouteTemplateDefinition</bannedDefinition> <bannedDefinition>org.apache.camel.model.RouteTemplateContextRefDefinition</bannedDefinition> <bannedDefinition>org.apache.camel.model.RouteTemplatesDefinition</bannedDefinition> + <bannedDefinition>org.apache.camel.model.RouteTemplateBeanDefinition</bannedDefinition> <bannedDefinition>org.apache.camel.model.RoutesDefinition</bannedDefinition> <bannedDefinition>org.apache.camel.model.RestsDefinition</bannedDefinition> </bannedDefinitions> 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 224868e..73b408c 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 @@ -71,7 +71,6 @@ import org.apache.camel.model.RollbackDefinition; import org.apache.camel.model.RouteBuilderDefinition; import org.apache.camel.model.RouteContextRefDefinition; import org.apache.camel.model.RouteDefinition; -import org.apache.camel.model.RouteTemplateBeanDefinition; import org.apache.camel.model.RouteTemplateParameterDefinition; import org.apache.camel.model.RouteTemplateScriptDefinition; import org.apache.camel.model.RoutingSlipDefinition; @@ -12195,71 +12194,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport { } @YamlType( - inline = true, - types = org.apache.camel.model.RouteTemplateBeanDefinition.class, - order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1, - nodes = "template-bean", - properties = { - @YamlProperty(name = "bean-type", type = "string"), - @YamlProperty(name = "name", type = "string", required = true), - @YamlProperty(name = "property", type = "array:org.apache.camel.model.PropertyDefinition"), - @YamlProperty(name = "script", type = "object:org.apache.camel.model.RouteTemplateScriptDefinition"), - @YamlProperty(name = "type", type = "string", required = true) - } - ) - public static class RouteTemplateBeanDefinitionDeserializer extends YamlDeserializerBase<RouteTemplateBeanDefinition> { - public RouteTemplateBeanDefinitionDeserializer() { - super(RouteTemplateBeanDefinition.class); - } - - @Override - protected RouteTemplateBeanDefinition newInstance() { - return new RouteTemplateBeanDefinition(); - } - - @Override - protected RouteTemplateBeanDefinition newInstance(String value) { - return new RouteTemplateBeanDefinition(value); - } - - @Override - protected boolean setProperty(RouteTemplateBeanDefinition target, String propertyKey, - String propertyName, Node node) { - switch(propertyKey) { - case "bean-type": { - String val = asText(node); - target.setBeanType(val); - break; - } - case "name": { - String val = asText(node); - target.setName(val); - break; - } - case "property": { - java.util.List<org.apache.camel.model.PropertyDefinition> val = asFlatList(node, org.apache.camel.model.PropertyDefinition.class); - target.setProperties(val); - break; - } - case "script": { - org.apache.camel.model.RouteTemplateScriptDefinition val = asType(node, org.apache.camel.model.RouteTemplateScriptDefinition.class); - target.setScript(val); - break; - } - case "type": { - String val = asText(node); - target.setType(val); - break; - } - default: { - return false; - } - } - return true; - } - } - - @YamlType( types = org.apache.camel.model.RouteTemplateParameterDefinition.class, order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1, nodes = "template-parameter", diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java index eae4520..965e470 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java @@ -300,8 +300,6 @@ public final class ModelDeserializersResolver implements YamlDeserializerResolve case "org.apache.camel.model.RouteContextRefDefinition": return new ModelDeserializers.RouteContextRefDefinitionDeserializer(); case "route": return new ModelDeserializers.RouteDefinitionDeserializer(); case "org.apache.camel.model.RouteDefinition": return new ModelDeserializers.RouteDefinitionDeserializer(); - case "template-bean": return new ModelDeserializers.RouteTemplateBeanDefinitionDeserializer(); - case "org.apache.camel.model.RouteTemplateBeanDefinition": return new ModelDeserializers.RouteTemplateBeanDefinitionDeserializer(); case "template-parameter": return new ModelDeserializers.RouteTemplateParameterDefinitionDeserializer(); case "org.apache.camel.model.RouteTemplateParameterDefinition": return new ModelDeserializers.RouteTemplateParameterDefinitionDeserializer(); case "template-script": return new ModelDeserializers.RouteTemplateScriptDefinitionDeserializer(); diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java index f962eb3..08ac067 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/CustomResolver.java @@ -41,6 +41,8 @@ public class CustomResolver implements YamlDeserializerResolver { case "template": case "org.apache.camel.model.RouteTemplateDefinition": return new RouteTemplateDefinitionDeserializer(); + case "org.apache.camel.model.RouteTemplateBeanDefinition": + return new RouteTemplateBeanDefinitionDeserializer(); case "org.apache.camel.dsl.yaml.deserializers.NamedBeanDefinition": return new NamedBeanDeserializer(); case "org.apache.camel.dsl.yaml.deserializers.OutputAwareFromDefinition": diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteTemplateBeanDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteTemplateBeanDefinitionDeserializer.java new file mode 100644 index 0000000..b3ec26b --- /dev/null +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/RouteTemplateBeanDefinitionDeserializer.java @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.dsl.yaml.deserializers; + +import java.util.stream.Collectors; + +import org.apache.camel.dsl.yaml.common.YamlDeserializerBase; +import org.apache.camel.dsl.yaml.common.YamlDeserializerResolver; +import org.apache.camel.model.PropertyDefinition; +import org.apache.camel.model.RouteTemplateBeanDefinition; +import org.apache.camel.spi.annotations.YamlProperty; +import org.apache.camel.spi.annotations.YamlType; +import org.snakeyaml.engine.v2.nodes.Node; + +@YamlType( + inline = true, + types = org.apache.camel.model.RouteTemplateBeanDefinition.class, + order = YamlDeserializerResolver.ORDER_DEFAULT, + nodes = "template-bean", + properties = { + @YamlProperty(name = "bean-type", type = "string"), + @YamlProperty(name = "name", type = "string", required = true), + @YamlProperty(name = "property", type = "array:org.apache.camel.model.PropertyDefinition"), + @YamlProperty(name = "properties", type = "object"), + @YamlProperty(name = "script", type = "object:org.apache.camel.model.RouteTemplateScriptDefinition"), + @YamlProperty(name = "type", type = "string", required = true) + }) +public class RouteTemplateBeanDefinitionDeserializer extends YamlDeserializerBase<RouteTemplateBeanDefinition> { + public RouteTemplateBeanDefinitionDeserializer() { + super(RouteTemplateBeanDefinition.class); + } + + @Override + protected RouteTemplateBeanDefinition newInstance() { + return new RouteTemplateBeanDefinition(); + } + + @Override + protected RouteTemplateBeanDefinition newInstance(String value) { + return new RouteTemplateBeanDefinition(value); + } + + @Override + protected boolean setProperty( + RouteTemplateBeanDefinition target, String propertyKey, + String propertyName, Node node) { + switch (propertyKey) { + case "bean-type": { + String val = asText(node); + target.setBeanType(val); + break; + } + case "name": { + String val = asText(node); + target.setName(val); + break; + } + case "property": { + java.util.List<org.apache.camel.model.PropertyDefinition> val + = asFlatList(node, org.apache.camel.model.PropertyDefinition.class); + target.setProperties(val); + break; + } + case "properties": { + target.setProperties( + asMap(node).entrySet().stream() + .map(e -> new PropertyDefinition(e.getKey(), (String) e.getValue())) + .collect(Collectors.toList())); + break; + } + case "script": { + org.apache.camel.model.RouteTemplateScriptDefinition val + = asType(node, org.apache.camel.model.RouteTemplateScriptDefinition.class); + target.setScript(val); + break; + } + case "type": { + String val = asText(node); + target.setType(val); + break; + } + default: { + return false; + } + } + return true; + } +} 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 39388e3..77628a7 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 @@ -2071,6 +2071,9 @@ "name" : { "type" : "string" }, + "properties" : { + "type" : "object" + }, "property" : { "type" : "array", "items" : { 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 f4bfbb4..6d6b223 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 @@ -19,6 +19,7 @@ package org.apache.camel.dsl.yaml import org.apache.camel.component.mock.MockEndpoint import org.apache.camel.dsl.yaml.common.YamlDeserializationMode import org.apache.camel.dsl.yaml.support.YamlTestSupport +import org.apache.camel.dsl.yaml.support.model.MySetBody import org.apache.camel.dsl.yaml.support.model.MyUppercaseProcessor import org.apache.camel.processor.aggregate.UseLatestAggregationStrategy import org.apache.camel.spi.Resource @@ -283,6 +284,77 @@ class KameletTest extends YamlTestSupport { MockEndpoint.assertIsSatisfied(context) } + def "kamelet (definition with local bean and properties)"() { + setup: + loadRoutes """ + - template: + id: "myTemplate" + beans: + - name: "myProcessor" + type: "#class:${MySetBody.class.name}" + properties: + payload: "test-payload" + from: + uri: "kamelet:source" + steps: + - process: + ref: "{{myProcessor}}" + - from: + uri: "direct:start" + steps: + - to: "kamelet:myTemplate" + - to: "mock:result" + """ + + withMock('mock:result') { + expectedMessageCount 1 + expectedBodiesReceived 'test-payload' + } + when: + withTemplate { + to('direct:start').withBody('hello').send() + } + + then: + MockEndpoint.assertIsSatisfied(context) + } + + def "kamelet (definition with local bean and property)"() { + setup: + loadRoutes """ + - template: + id: "myTemplate" + beans: + - name: "myProcessor" + type: "#class:${MySetBody.class.name}" + property: + - key: "payload" + value: "test-payload" + from: + uri: "kamelet:source" + steps: + - process: + ref: "{{myProcessor}}" + - from: + uri: "direct:start" + steps: + - to: "kamelet:myTemplate" + - to: "mock:result" + """ + + withMock('mock:result') { + expectedMessageCount 1 + expectedBodiesReceived 'test-payload' + } + when: + withTemplate { + to('direct:start').withBody('hello').send() + } + + then: + MockEndpoint.assertIsSatisfied(context) + } + def "kamelet (definition with default parameters)"() { setup: loadRoutes """ 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 74f030a..a09f3d1 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 @@ -18,6 +18,7 @@ package org.apache.camel.dsl.yaml import org.apache.camel.component.mock.MockEndpoint import org.apache.camel.dsl.yaml.support.YamlTestSupport +import org.apache.camel.dsl.yaml.support.model.MySetBody import org.apache.camel.dsl.yaml.support.model.MyUppercaseProcessor import org.apache.camel.model.LogDefinition import org.apache.camel.model.RouteTemplateDefinition @@ -151,6 +152,95 @@ class RouteTemplateTest extends YamlTestSupport { ] } + def "create template with bean and properties"() { + setup: + loadRoutes """ + - template: + id: "myTemplate" + beans: + - name: "myProcessor" + type: "#class:${MySetBody.class.name}" + properties: + payload: "test-payload" + 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 'test-payload' + } + 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) + } + + def "create template with bean and property"() { + setup: + loadRoutes """ + - template: + id: "myTemplate" + beans: + - name: "myProcessor" + type: "#class:${MySetBody.class.name}" + property: + - key: "payload" + value: "test-payload" + 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 'test-payload' + } + 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) + } + def "create template with properties"() { when: loadRoutes """