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
The following commit(s) were added to refs/heads/master by this push: new 008d4d3 Yaml DSL: fix backward compatibility issues (CAMEL-16489, CAMEL-16490) 008d4d3 is described below commit 008d4d3189de51bc6e93333c2c51e6be0ba364b1 Author: Luca Burgazzoli <lburgazz...@gmail.com> AuthorDate: Mon Apr 12 18:34:24 2021 +0200 Yaml DSL: fix backward compatibility issues (CAMEL-16489, CAMEL-16490) --- .../common/YamlDeserializerEndpointAwareBase.java | 70 ++++++++++++ .../dsl/yaml/deserializers/ModelDeserializers.java | 119 ++++++++----------- .../deserializers/ModelDeserializersResolver.java | 1 + .../dsl/yaml/GenerateYamlDeserializersMojo.java | 63 +++++++---- .../maven/dsl/yaml/GenerateYamlSupportMojo.java | 2 + .../maven/dsl/yaml/support/TypeSpecHolder.java | 10 +- .../src/generated/resources/camel-yaml-dsl.json | 3 + .../org/apache/camel/dsl/yaml/SagaTest.groovy | 46 ++++++++ .../org/apache/camel/dsl/yaml/ToDynamicTest.groovy | 126 +++++++++++++++++++++ .../groovy/org/apache/camel/dsl/yaml/ToTest.groovy | 11 +- 10 files changed, 360 insertions(+), 91 deletions(-) diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerEndpointAwareBase.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerEndpointAwareBase.java new file mode 100644 index 0000000..c5ce979 --- /dev/null +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializerEndpointAwareBase.java @@ -0,0 +1,70 @@ +/* + * 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.common; + +import java.util.Locale; +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.util.StringHelper; +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.ScalarNode; + +public abstract class YamlDeserializerEndpointAwareBase<T> extends YamlDeserializerBase<T> { + + public YamlDeserializerEndpointAwareBase(Class<T> type) { + super(type); + } + + /** + * Set properties from a YAML node to the given target. + * + * @param node the node + * @param target the target object + */ + protected void setProperties(T target, MappingNode node) { + YamlDeserializationContext dc = getDeserializationContext(node); + + Map<String, Object> parameters = null; + + for (NodeTuple tuple : node.getValue()) { + final ScalarNode key = (ScalarNode) tuple.getKeyNode(); + final String propertyName = StringHelper.camelCaseToDash(key.getValue()).toLowerCase(Locale.US); + final Node val = tuple.getValueNode(); + + setDeserializationContext(val, dc); + + switch (propertyName) { + case "parameters": + parameters = asScalarMap(tuple.getValueNode()); + break; + default: + if (!setProperty(target, propertyName, key.getValue(), val)) { + handleUnknownProperty(target, propertyName, key.getValue(), val); + } + } + } + + if (parameters != null) { + setEndpointUri(dc.getCamelContext(), target, parameters); + } + } + + protected abstract void setEndpointUri(CamelContext context, T target, Map<String, Object> parameters); +} 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 4826e21..b21ffb1 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 @@ -1,12 +1,14 @@ // Generated by camel-yaml-dsl-maven-plugin - do NOT edit this file! package org.apache.camel.dsl.yaml.deserializers; +import java.lang.Object; import java.lang.Override; import java.lang.String; -import org.apache.camel.dsl.yaml.common.YamlDeserializationContext; +import java.util.Map; +import org.apache.camel.CamelContext; import org.apache.camel.dsl.yaml.common.YamlDeserializerBase; +import org.apache.camel.dsl.yaml.common.YamlDeserializerEndpointAwareBase; import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport; -import org.apache.camel.dsl.yaml.common.YamlSupport; import org.apache.camel.model.AggregateDefinition; import org.apache.camel.model.BeanDefinition; import org.apache.camel.model.CatchDefinition; @@ -5881,7 +5883,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport { @YamlProperty(name = "parameters", type = "object") } ) - public static class InOnlyDefinitionDeserializer extends YamlDeserializerBase<InOnlyDefinition> { + public static class InOnlyDefinitionDeserializer extends YamlDeserializerEndpointAwareBase<InOnlyDefinition> { public InOnlyDefinitionDeserializer() { super(InOnlyDefinition.class); } @@ -5897,6 +5899,12 @@ public final class ModelDeserializers extends YamlDeserializerSupport { } @Override + protected void setEndpointUri(CamelContext camelContext, InOnlyDefinition target, + Map<String, Object> parameters) { + target.setUri(org.apache.camel.dsl.yaml.common.YamlSupport.createEndpointUri(camelContext, target.getUri(), parameters)); + } + + @Override protected boolean setProperty(InOnlyDefinition target, String propertyKey, String propertyName, Node node) { switch(propertyKey) { @@ -5910,16 +5918,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport { target.setUri(val); break; } - case "parameters": { - if (target.getUri() == null) { - throw new IllegalStateException("url must be set before setting parameters"); - } - java.util.Map<String, Object> parameters = asScalarMap(asMappingNode(node)); - YamlDeserializationContext dc = getDeserializationContext(node); - String uri = YamlSupport.createEndpointUri(dc.getCamelContext(), target.getUri(), parameters); - target.setUri(uri); - break; - } default: { String uri = EndpointProducerDeserializersResolver.resolveEndpointUri(propertyKey, node); if (uri == null) { @@ -5946,7 +5944,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport { @YamlProperty(name = "parameters", type = "object") } ) - public static class InOutDefinitionDeserializer extends YamlDeserializerBase<InOutDefinition> { + public static class InOutDefinitionDeserializer extends YamlDeserializerEndpointAwareBase<InOutDefinition> { public InOutDefinitionDeserializer() { super(InOutDefinition.class); } @@ -5962,6 +5960,12 @@ public final class ModelDeserializers extends YamlDeserializerSupport { } @Override + protected void setEndpointUri(CamelContext camelContext, InOutDefinition target, + Map<String, Object> parameters) { + target.setUri(org.apache.camel.dsl.yaml.common.YamlSupport.createEndpointUri(camelContext, target.getUri(), parameters)); + } + + @Override protected boolean setProperty(InOutDefinition target, String propertyKey, String propertyName, Node node) { switch(propertyKey) { @@ -5975,16 +5979,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport { target.setUri(val); break; } - case "parameters": { - if (target.getUri() == null) { - throw new IllegalStateException("url must be set before setting parameters"); - } - java.util.Map<String, Object> parameters = asScalarMap(asMappingNode(node)); - YamlDeserializationContext dc = getDeserializationContext(node); - String uri = YamlSupport.createEndpointUri(dc.getCamelContext(), target.getUri(), parameters); - target.setUri(uri); - break; - } default: { String uri = EndpointProducerDeserializersResolver.resolveEndpointUri(propertyKey, node); if (uri == null) { @@ -11826,7 +11820,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport { @YamlProperty(name = "parameters", type = "object") } ) - public static class SagaActionUriDefinitionDeserializer extends YamlDeserializerBase<SagaActionUriDefinition> { + public static class SagaActionUriDefinitionDeserializer extends YamlDeserializerEndpointAwareBase<SagaActionUriDefinition> { public SagaActionUriDefinitionDeserializer() { super(SagaActionUriDefinition.class); } @@ -11842,6 +11836,12 @@ public final class ModelDeserializers extends YamlDeserializerSupport { } @Override + protected void setEndpointUri(CamelContext camelContext, SagaActionUriDefinition target, + Map<String, Object> parameters) { + target.setUri(org.apache.camel.dsl.yaml.common.YamlSupport.createEndpointUri(camelContext, target.getUri(), parameters)); + } + + @Override protected boolean setProperty(SagaActionUriDefinition target, String propertyKey, String propertyName, Node node) { switch(propertyKey) { @@ -11855,16 +11855,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport { target.setUri(val); break; } - case "parameters": { - if (target.getUri() == null) { - throw new IllegalStateException("url must be set before setting parameters"); - } - java.util.Map<String, Object> parameters = asScalarMap(asMappingNode(node)); - YamlDeserializationContext dc = getDeserializationContext(node); - String uri = YamlSupport.createEndpointUri(dc.getCamelContext(), target.getUri(), parameters); - target.setUri(uri); - break; - } default: { String uri = EndpointProducerDeserializersResolver.resolveEndpointUri(propertyKey, node); if (uri == null) { @@ -14156,7 +14146,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport { @YamlProperty(name = "parameters", type = "object") } ) - public static class ToDefinitionDeserializer extends YamlDeserializerBase<ToDefinition> { + public static class ToDefinitionDeserializer extends YamlDeserializerEndpointAwareBase<ToDefinition> { public ToDefinitionDeserializer() { super(ToDefinition.class); } @@ -14172,6 +14162,12 @@ public final class ModelDeserializers extends YamlDeserializerSupport { } @Override + protected void setEndpointUri(CamelContext camelContext, ToDefinition target, + Map<String, Object> parameters) { + target.setUri(org.apache.camel.dsl.yaml.common.YamlSupport.createEndpointUri(camelContext, target.getUri(), parameters)); + } + + @Override protected boolean setProperty(ToDefinition target, String propertyKey, String propertyName, Node node) { switch(propertyKey) { @@ -14190,16 +14186,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport { target.setUri(val); break; } - case "parameters": { - if (target.getUri() == null) { - throw new IllegalStateException("url must be set before setting parameters"); - } - java.util.Map<String, Object> parameters = asScalarMap(asMappingNode(node)); - YamlDeserializationContext dc = getDeserializationContext(node); - String uri = YamlSupport.createEndpointUri(dc.getCamelContext(), target.getUri(), parameters); - target.setUri(uri); - break; - } default: { String uri = EndpointProducerDeserializersResolver.resolveEndpointUri(propertyKey, node); if (uri == null) { @@ -14219,7 +14205,10 @@ public final class ModelDeserializers extends YamlDeserializerSupport { inline = true, types = org.apache.camel.model.ToDynamicDefinition.class, order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1, - nodes = "to-d", + nodes = { + "to-d", + "tod" + }, properties = { @YamlProperty(name = "allow-optimised-components", type = "boolean"), @YamlProperty(name = "auto-start-components", type = "boolean"), @@ -14231,7 +14220,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport { @YamlProperty(name = "parameters", type = "object") } ) - public static class ToDynamicDefinitionDeserializer extends YamlDeserializerBase<ToDynamicDefinition> { + public static class ToDynamicDefinitionDeserializer extends YamlDeserializerEndpointAwareBase<ToDynamicDefinition> { public ToDynamicDefinitionDeserializer() { super(ToDynamicDefinition.class); } @@ -14247,6 +14236,12 @@ public final class ModelDeserializers extends YamlDeserializerSupport { } @Override + protected void setEndpointUri(CamelContext camelContext, ToDynamicDefinition target, + Map<String, Object> parameters) { + target.setUri(org.apache.camel.dsl.yaml.common.YamlSupport.createEndpointUri(camelContext, target.getUri(), parameters)); + } + + @Override protected boolean setProperty(ToDynamicDefinition target, String propertyKey, String propertyName, Node node) { switch(propertyKey) { @@ -14285,16 +14280,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport { target.setUri(val); break; } - case "parameters": { - if (target.getUri() == null) { - throw new IllegalStateException("url must be set before setting parameters"); - } - java.util.Map<String, Object> parameters = asScalarMap(asMappingNode(node)); - YamlDeserializationContext dc = getDeserializationContext(node); - String uri = YamlSupport.createEndpointUri(dc.getCamelContext(), target.getUri(), parameters); - target.setUri(uri); - break; - } default: { String uri = EndpointProducerDeserializersResolver.resolveEndpointUri(propertyKey, node); if (uri == null) { @@ -15875,7 +15860,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport { @YamlProperty(name = "parameters", type = "object") } ) - public static class WireTapDefinitionDeserializer extends YamlDeserializerBase<WireTapDefinition> { + public static class WireTapDefinitionDeserializer extends YamlDeserializerEndpointAwareBase<WireTapDefinition> { public WireTapDefinitionDeserializer() { super(WireTapDefinition.class); } @@ -15886,6 +15871,12 @@ public final class ModelDeserializers extends YamlDeserializerSupport { } @Override + protected void setEndpointUri(CamelContext camelContext, WireTapDefinition target, + Map<String, Object> parameters) { + target.setUri(org.apache.camel.dsl.yaml.common.YamlSupport.createEndpointUri(camelContext, target.getUri(), parameters)); + } + + @Override protected boolean setProperty(WireTapDefinition target, String propertyKey, String propertyName, Node node) { switch(propertyKey) { @@ -15959,16 +15950,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport { target.setUri(val); break; } - case "parameters": { - if (target.getUri() == null) { - throw new IllegalStateException("url must be set before setting parameters"); - } - java.util.Map<String, Object> parameters = asScalarMap(asMappingNode(node)); - YamlDeserializationContext dc = getDeserializationContext(node); - String uri = YamlSupport.createEndpointUri(dc.getCamelContext(), target.getUri(), parameters); - target.setUri(uri); - break; - } default: { String uri = EndpointProducerDeserializersResolver.resolveEndpointUri(propertyKey, node); if (uri == null) { 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 34de60b..0a1741b 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 @@ -373,6 +373,7 @@ public final class ModelDeserializersResolver implements YamlDeserializerResolve case "to": return new ModelDeserializers.ToDefinitionDeserializer(); case "org.apache.camel.model.ToDefinition": return new ModelDeserializers.ToDefinitionDeserializer(); case "to-d": return new ModelDeserializers.ToDynamicDefinitionDeserializer(); + case "tod": return new ModelDeserializers.ToDynamicDefinitionDeserializer(); case "org.apache.camel.model.ToDynamicDefinition": return new ModelDeserializers.ToDynamicDefinitionDeserializer(); case "tokenize": return new ModelDeserializers.TokenizerExpressionDeserializer(); case "org.apache.camel.model.language.TokenizerExpression": return new ModelDeserializers.TokenizerExpressionDeserializer(); diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java index bad935b..a88d4dd 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlDeserializersMojo.java @@ -40,6 +40,7 @@ import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.ParameterizedTypeName; import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; +import org.apache.camel.CamelContext; import org.apache.camel.catalog.CamelCatalog; import org.apache.camel.catalog.DefaultCamelCatalog; import org.apache.camel.maven.dsl.yaml.support.ToolingSupport; @@ -299,12 +300,14 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo { deserializers.addType(holder.type); if (holder.attributes.containsKey("node")) { - constructors.addStatement( - "case $S: return new ModelDeserializers.$L()", holder.attributes.get("node"), holder.type.name); + holder.attributes.get("node").forEach(node -> + constructors.addStatement( + "case $S: return new ModelDeserializers.$L()", node, holder.type.name)); } if (holder.attributes.containsKey("type")) { - constructors.addStatement( - "case $S: return new ModelDeserializers.$L()", holder.attributes.get("type"), holder.type.name); + holder.attributes.get("type").forEach(type -> + constructors.addStatement( + "case $S: return new ModelDeserializers.$L()", type, holder.type.name)); } } ); @@ -412,13 +415,20 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo { private TypeSpecHolder generateParser(ClassInfo info) { final ClassName targetType = ClassName.get(info.name().prefix().toString(), info.name().withoutPackagePrefix()); final TypeSpec.Builder builder = TypeSpec.classBuilder(info.simpleName() + "Deserializer"); - final Map<String, String> attributes = new HashMap<>(); + final Map<String, Set<String>> attributes = new HashMap<>(); final List<AnnotationSpec> properties = new ArrayList<>(); final AnnotationSpec.Builder yamlTypeAnnotation = AnnotationSpec.builder(CN_YAML_TYPE); builder.addModifiers(Modifier.PUBLIC, Modifier.STATIC); - builder.superclass(ParameterizedTypeName.get(CN_DESERIALIZER_BASE, targetType)); - attributes.put("type", info.name().toString()); + + + if (extendsType(info, SEND_DEFINITION_CLASS) || extendsType(info, TO_DYNAMIC_DEFINITION_CLASS)) { + builder.superclass(ParameterizedTypeName.get(CN_ENDPOINT_AWARE_DESERIALIZER_BASE, targetType)); + } else { + builder.superclass(ParameterizedTypeName.get(CN_DESERIALIZER_BASE, targetType)); + } + + TypeSpecHolder.put(attributes, "type", info.name().toString()); //TODO: add an option on Camel's definitions to distinguish between IN/OUT types if (info.name().toString().equals("org.apache.camel.model.OnExceptionDefinition")) { @@ -501,17 +511,6 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo { } if (extendsType(info, SEND_DEFINITION_CLASS) || extendsType(info, TO_DYNAMIC_DEFINITION_CLASS)) { - setProperty.beginControlFlow("case $S:", "parameters"); - setProperty.beginControlFlow("if (target.getUri() == null)"); - setProperty.addStatement("throw new IllegalStateException(\"url must be set before setting parameters\")"); - setProperty.endControlFlow(); - setProperty.addStatement("java.util.Map<String, Object> parameters = asScalarMap(asMappingNode(node))"); - setProperty.addStatement("$T dc = getDeserializationContext(node)", CN_DESERIALIZATION_CONTEXT); - setProperty.addStatement("String uri = $T.createEndpointUri(dc.getCamelContext(), target.getUri(), parameters)", CN_YAML_SUPPORT); - setProperty.addStatement("target.setUri(uri)"); - setProperty.addStatement("break"); - setProperty.endControlFlow(); - setProperty.beginControlFlow("default:"); setProperty.addStatement("String uri = EndpointProducerDeserializersResolver.resolveEndpointUri(propertyKey, node)"); setProperty.beginControlFlow("if (uri == null)"); @@ -528,6 +527,23 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo { "parameters", "object") ); + + builder.addMethod(MethodSpec.methodBuilder("setEndpointUri") + .addAnnotation(AnnotationSpec.builder(Override.class).build()) + .addModifiers(Modifier.PROTECTED) + .addParameter(CamelContext.class, "camelContext") + .addParameter(targetType, "target") + .addParameter( + ParameterizedTypeName.get( + ClassName.get(Map.class), + ClassName.get(String.class), + ClassName.get(Object.class)), + "parameters") + .addCode( + CodeBlock.builder() + .addStatement("target.setUri(org.apache.camel.dsl.yaml.common.YamlSupport.createEndpointUri(camelContext, target.getUri(), parameters))") + .build()) + .build()); } else if (implementType(info, HAS_EXPRESSION_TYPE_CLASS)) { setProperty.beginControlFlow("default:"); setProperty.addStatement("$T ed = target.getExpressionType()", CN_EXPRESSION_DEFINITION); @@ -585,9 +601,18 @@ public class GenerateYamlDeserializersMojo extends GenerateYamlSupportMojo { .map(StringHelper::camelCaseToDash) .ifPresent(v -> { yamlTypeAnnotation.addMember("nodes", "$S", v); - attributes.put("node", v); + TypeSpecHolder.put(attributes, "node", v); }); + // + // Workaround for: + // https://issues.apache.org/jira/browse/CAMEL-16490 + // + if (info.name().equals(TO_DYNAMIC_DEFINITION_CLASS)) { + yamlTypeAnnotation.addMember("nodes", "$S", "tod"); + TypeSpecHolder.put(attributes, "node", "tod"); + } + for (AnnotationSpec spec: properties) { yamlTypeAnnotation.addMember("properties", "$L", spec); } diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlSupportMojo.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlSupportMojo.java index 3be1a50..8e284b8 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlSupportMojo.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/GenerateYamlSupportMojo.java @@ -114,6 +114,8 @@ public abstract class GenerateYamlSupportMojo extends AbstractMojo { = ClassName.get("org.apache.camel.dsl.yaml.common", "YamlDeserializerSupport"); public static final ClassName CN_DESERIALIZER_BASE = ClassName.get("org.apache.camel.dsl.yaml.common", "YamlDeserializerBase"); + public static final ClassName CN_ENDPOINT_AWARE_DESERIALIZER_BASE + = ClassName.get("org.apache.camel.dsl.yaml.common", "YamlDeserializerEndpointAwareBase"); public static final ClassName CN_DESERIALIZATION_CONTEXT = ClassName.get("org.apache.camel.dsl.yaml.common", "YamlDeserializationContext"); public static final ClassName CN_YAML_SUPPORT diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/support/TypeSpecHolder.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/support/TypeSpecHolder.java index be78859..6f5ff76 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/support/TypeSpecHolder.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-maven-plugin/src/main/java/org/apache/camel/maven/dsl/yaml/support/TypeSpecHolder.java @@ -19,18 +19,24 @@ package org.apache.camel.maven.dsl.yaml.support; import java.util.HashMap; import java.util.Map; import java.util.Objects; +import java.util.Set; +import java.util.TreeSet; import com.squareup.javapoet.TypeSpec; public class TypeSpecHolder { public final TypeSpec type; - public final Map<String, String> attributes; + public final Map<String, Set<String>> attributes; - public TypeSpecHolder(TypeSpec type, Map<String, String> attributes) { + public TypeSpecHolder(TypeSpec type, Map<String, Set<String>> attributes) { Objects.requireNonNull(type, "type"); Objects.requireNonNull(attributes, "attributes"); this.type = type; this.attributes = new HashMap<>(attributes); } + + public static void put(Map<String, Set<String>> attributes, String key, String value) { + attributes.computeIfAbsent(key, k -> new TreeSet<>()).add(value); + } } 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 821b910..31b288c 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 @@ -170,6 +170,9 @@ "to-d" : { "$ref" : "#/items/definitions/org.apache.camel.model.ToDynamicDefinition" }, + "tod" : { + "$ref" : "#/items/definitions/org.apache.camel.model.ToDynamicDefinition" + }, "transacted" : { "$ref" : "#/items/definitions/org.apache.camel.model.TransactedDefinition" }, diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/SagaTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/SagaTest.groovy index 8ead82b..74c1ba2 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/SagaTest.groovy +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/SagaTest.groovy @@ -81,6 +81,52 @@ class SagaTest extends YamlTestSupport { simple: "${body}" - to: "mock:result" '''), + asResource('full-parameters', ''' + - from: + uri: "direct:start" + steps: + - saga: + propagation: "MANDATORY" + completion-mode: "MANUAL" + compensation: + uri: "direct" + parameters: + name: compensation + completion: + uri: "direct:completion" + steps: + - to: "direct:something" + option: + - option-name: o1 + simple: "${body}" + - option-name: o2 + expression: + simple: "${body}" + - to: "mock:result" + '''), + asResource('full-parameters-out-of-order)', ''' + - from: + uri: "direct:start" + steps: + - saga: + propagation: "MANDATORY" + completion-mode: "MANUAL" + compensation: + parameters: + name: compensation + uri: "direct" + completion: + uri: "direct:completion" + steps: + - to: "direct:something" + option: + - option-name: o1 + simple: "${body}" + - option-name: o2 + expression: + simple: "${body}" + - to: "mock:result" + '''), asResource('short', ''' - from: uri: "direct:start" diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ToDynamicTest.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ToDynamicTest.groovy new file mode 100644 index 0000000..253b1c1 --- /dev/null +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/ToDynamicTest.groovy @@ -0,0 +1,126 @@ +/* + * 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.ToDynamicDefinition +import org.apache.camel.spi.Resource + +class ToDynamicTest extends YamlTestSupport { + + def "to-d definition (#resource.location)"(Resource resource) { + when: + context.routesLoader.loadRoutes(resource) + then: + with(context.routeDefinitions[0].outputs[0], ToDynamicDefinition) { + uri == 'direct:start' + } + where: + resource << [ + asResource('inline', ''' + - from: + uri: "direct:start" + steps: + - to-d: "direct:start" + '''), + asResource('uri', ''' + - from: + uri: "direct:start" + steps: + - to-d: + uri: "direct:start" + '''), + asResource('properties', ''' + - from: + uri: "direct:start" + steps: + - to-d: + uri: "direct" + parameters: + name: "start" + '''), + asResource('endpoint', ''' + - from: + uri: "direct:start" + steps: + - to-d: + direct: + name: "start" + '''), + asResource('properties-out-of-order', ''' + - from: + uri: "direct:start" + steps: + - to-d: + parameters: + name: "start" + uri: "direct" + '''), + ] + } + + def "to definition (#resource.location)"(Resource resource) { + when: + context.routesLoader.loadRoutes(resource) + then: + with(context.routeDefinitions[0].outputs[0], ToDynamicDefinition) { + uri == 'direct:start' + } + where: + resource << [ + asResource('inline', ''' + - from: + uri: "direct:start" + steps: + - tod: "direct:start" + '''), + asResource('uri', ''' + - from: + uri: "direct:start" + steps: + - tod: + uri: "direct:start" + '''), + asResource('properties', ''' + - from: + uri: "direct:start" + steps: + - tod: + uri: "direct" + parameters: + name: "start" + '''), + asResource('endpoint', ''' + - from: + uri: "direct:start" + steps: + - tod: + direct: + name: "start" + '''), + asResource('properties-out-of-order', ''' + - from: + uri: "direct:start" + steps: + - tod: + parameters: + name: "start" + uri: "direct" + '''), + ] + } +} 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 index 564a261..229d78e 100644 --- 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 @@ -67,7 +67,16 @@ class ToTest extends YamlTestSupport { steps: - direct: name: "start" - ''') + '''), + asResource('properties-out-of-order', ''' + - from: + uri: "direct:start" + steps: + - to: + parameters: + name: "start" + uri: "direct" + '''), ] } }