This is an automated email from the ASF dual-hosted git repository. lburgazzoli pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 588f0909d245a64d1c3a3b214a28d84559d46463 Author: Luca Burgazzoli <lburgazz...@gmail.com> AuthorDate: Thu Feb 25 15:11:16 2021 +0100 CAMEL-12545: create a yaml based route loader (add support for enhanced ToDefinition) --- .../camel-yaml-dsl-deserializers/pom.xml | 1 + .../dsl/yaml/deserializers/ModelDeserializers.java | 54 ------------ .../deserializers/ModelDeserializersResolver.java | 2 - .../dsl/yaml/deserializers/CustomResolver.java | 3 + .../deserializers/ToDefinitionDeserializer.java | 98 ++++++++++++++++++++++ .../src/generated/resources/camel-yaml-dsl.json | 10 +-- .../groovy/org/apache/camel/dsl/yaml/ToTest.groovy | 73 ++++++++++++++++ 7 files changed, 177 insertions(+), 64 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 6f55e32..9abcfd7 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/pom.xml @@ -125,6 +125,7 @@ <packageName>org.apache.camel.dsl.yaml.deserializers</packageName> <bannedDefinitions> <bannedDefinition>org.apache.camel.model.FromDefinition</bannedDefinition> + <bannedDefinition>org.apache.camel.model.ToDefinition</bannedDefinition> <bannedDefinition>org.apache.camel.model.language.ExpressionDefinition</bannedDefinition> <bannedDefinition>org.apache.camel.model.ExpressionSubElementDefinition</bannedDefinition> <bannedDefinition>org.apache.camel.model.PropertyDefinitions</bannedDefinition> 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 4b8acce..07a3a14 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 @@ -85,7 +85,6 @@ import org.apache.camel.model.ThreadPoolProfileDefinition; import org.apache.camel.model.ThreadsDefinition; import org.apache.camel.model.ThrottleDefinition; import org.apache.camel.model.ThrowExceptionDefinition; -import org.apache.camel.model.ToDefinition; import org.apache.camel.model.ToDynamicDefinition; import org.apache.camel.model.TransactedDefinition; import org.apache.camel.model.TransformDefinition; @@ -13986,59 +13985,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport { @YamlType( inline = true, - types = org.apache.camel.model.ToDefinition.class, - order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1, - nodes = "to", - properties = { - @YamlProperty(name = "inherit-error-handler", type = "boolean"), - @YamlProperty(name = "pattern", type = "string"), - @YamlProperty(name = "uri", type = "string", required = true) - } - ) - public static class ToDefinitionDeserializer extends YamlDeserializerBase<ToDefinition> { - public ToDefinitionDeserializer() { - super(ToDefinition.class); - } - - @Override - protected ToDefinition newInstance() { - return new ToDefinition(); - } - - @Override - protected ToDefinition newInstance(String value) { - return new ToDefinition(value); - } - - @Override - protected boolean setProperty(ToDefinition target, String propertyKey, String propertyName, - Node node) { - switch(propertyKey) { - case "inherit-error-handler": { - String val = asText(node); - target.setInheritErrorHandler(java.lang.Boolean.valueOf(val)); - break; - } - case "pattern": { - String val = asText(node); - target.setPattern(val); - break; - } - case "uri": { - String val = asText(node); - target.setUri(val); - break; - } - default: { - return false; - } - } - return true; - } - } - - @YamlType( - inline = true, types = org.apache.camel.model.ToDynamicDefinition.class, order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1, nodes = "to-d", 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 8d6755f..1ddeaa2 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 @@ -368,8 +368,6 @@ public final class ModelDeserializersResolver implements YamlDeserializerResolve case "org.apache.camel.model.ThrowExceptionDefinition": return new ModelDeserializers.ThrowExceptionDefinitionDeserializer(); case "tidy-markup": return new ModelDeserializers.TidyMarkupDataFormatDeserializer(); case "org.apache.camel.model.dataformat.TidyMarkupDataFormat": return new ModelDeserializers.TidyMarkupDataFormatDeserializer(); - case "to": return new ModelDeserializers.ToDefinitionDeserializer(); - case "org.apache.camel.model.ToDefinition": return new ModelDeserializers.ToDefinitionDeserializer(); case "to-d": return new ModelDeserializers.ToDynamicDefinitionDeserializer(); case "org.apache.camel.model.ToDynamicDefinition": return new ModelDeserializers.ToDynamicDefinitionDeserializer(); case "tokenize": return new ModelDeserializers.TokenizerExpressionDeserializer(); 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 92b9e98..20d77a0 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 @@ -62,6 +62,9 @@ public class CustomResolver implements YamlDeserializerResolver { return new SagaOptionDefinitionDeserializer(); case "org.apache.camel.model.ProcessorDefinition": return new ProcessorDefinitionDefinitionDeserializer(); + case "to": + case "org.apache.camel.model.ToDefinition": + return new ToDefinitionDeserializer(); default: return null; } diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/ToDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/ToDefinitionDeserializer.java new file mode 100644 index 0000000..c6cc362 --- /dev/null +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/ToDefinitionDeserializer.java @@ -0,0 +1,98 @@ +/* + * 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.Map; + +import org.apache.camel.dsl.yaml.common.YamlDeserializationContext; +import org.apache.camel.dsl.yaml.common.YamlDeserializerResolver; +import org.apache.camel.dsl.yaml.common.YamlSupport; +import org.apache.camel.model.ToDefinition; +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.api.ConstructNode; +import org.snakeyaml.engine.v2.nodes.MappingNode; +import org.snakeyaml.engine.v2.nodes.Node; +import org.snakeyaml.engine.v2.nodes.NodeTuple; +import org.snakeyaml.engine.v2.nodes.NodeType; + +import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asScalarMap; +import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.asText; +import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.getDeserializationContext; +import static org.apache.camel.dsl.yaml.common.YamlDeserializerSupport.setDeserializationContext; + +@YamlType( + inline = true, + types = ToDefinition.class, + order = YamlDeserializerResolver.ORDER_DEFAULT, + properties = { + @YamlProperty(name = "uri", type = "string", required = true), + @YamlProperty(name = "properties", type = "object") + }) +public class ToDefinitionDeserializer implements ConstructNode { + @Override + public Object construct(Node node) { + return constructFromDefinition(node); + } + + public static ToDefinition constructFromDefinition(Node node) { + if (node.getNodeType() == NodeType.SCALAR) { + return new ToDefinition(asText(node)); + } else if (node.getNodeType() == NodeType.MAPPING) { + final MappingNode mn = (MappingNode) node; + final YamlDeserializationContext dc = getDeserializationContext(node); + + String uri = null; + Map<String, Object> properties = null; + + for (NodeTuple tuple : mn.getValue()) { + final String key = asText(tuple.getKeyNode()); + final Node val = tuple.getValueNode(); + + setDeserializationContext(val, dc); + + switch (key) { + case "uri": + uri = asText(val); + break; + case "properties": + properties = asScalarMap(tuple.getValueNode()); + break; + default: + ConstructNode cn = EndpointProducerDeserializersResolver.resolveEndpointConstructor(key); + if (cn != null) { + if (uri != null || properties != null) { + throw new IllegalArgumentException( + "uri and properties are not supported when using Endpoint DSL "); + } + return (ToDefinition) cn.construct(val); + } else { + throw new IllegalArgumentException("Unsupported field: " + key); + } + } + + ObjectHelper.notNull("uri", "The uri must set"); + } + + return new ToDefinition( + YamlSupport.createEndpointUri(dc.getCamelContext(), uri, properties)); + } + + return null; + } +} 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 66aa9c6..4a59104 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 @@ -164,9 +164,6 @@ "throw-exception" : { "$ref" : "#/items/definitions/org.apache.camel.model.ThrowExceptionDefinition" }, - "to" : { - "$ref" : "#/items/definitions/org.apache.camel.model.ToDefinition" - }, "to-d" : { "$ref" : "#/items/definitions/org.apache.camel.model.ToDynamicDefinition" }, @@ -2373,11 +2370,8 @@ }, { "type" : "object", "properties" : { - "inherit-error-handler" : { - "type" : "boolean" - }, - "pattern" : { - "type" : "string" + "properties" : { + "type" : "object" }, "uri" : { "type" : "string" diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ToTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ToTest.groovy new file mode 100644 index 0000000..ac8857e --- /dev/null +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ToTest.groovy @@ -0,0 +1,73 @@ +/* + * 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 + +import org.apache.camel.dsl.yaml.support.YamlTestSupport +import org.apache.camel.model.ToDefinition +import org.apache.camel.spi.Resource + +class ToTest extends YamlTestSupport { + + def "to definition (#resource.location)"(Resource resource) { + when: + context.routesLoader.loadRoutes(resource) + then: + with(context.routeDefinitions[0].outputs[0], ToDefinition) { + endpointUri == 'direct:start' + } + where: + resource << [ + asResource('inline', ''' + - from: + uri: "direct:start" + steps: + - to: "direct:start" + '''), + asResource('uri', ''' + - from: + uri: "direct:start" + steps: + - to: + uri: "direct:start" + '''), + asResource('properties', ''' + - from: + uri: "direct:start" + steps: + - to: + uri: "direct" + properties: + name: "start" + '''), + asResource('endpoint', ''' + - from: + uri: "direct:start" + steps: + - to: + direct: + name: "start" + '''), + asResource('endpoint-dsl', ''' + - from: + uri: "direct:start" + steps: + - direct: + name: "start" + ''') + ] + } +}