This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch saga in repository https://gitbox.apache.org/repos/asf/camel.git
commit 713c74c60aaa435daa3591129df4d315bba8a2bf Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Thu Jan 18 10:43:59 2024 +0100 CAMEL-20339: camel-yaml-dsl - Fix Saga EIP with options not working. --- .../camel/model/PropertyExpressionDefinition.java | 17 ++++- .../dsl/yaml/deserializers/ModelDeserializers.java | 12 +++- .../dsl/yaml/deserializers/CustomResolver.java | 3 +- .../PropertyExpressionDefinitionDeserializer.java | 78 ++++++++++++++++++++++ .../generated/resources/schema/camelYamlDsl.json | 12 +--- .../org/apache/camel/dsl/yaml/SagaTest.groovy | 59 ++++------------ 6 files changed, 121 insertions(+), 60 deletions(-) diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/PropertyExpressionDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/PropertyExpressionDefinition.java index b660d6f1834..ee19fa35529 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/PropertyExpressionDefinition.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/PropertyExpressionDefinition.java @@ -34,11 +34,12 @@ import org.apache.camel.spi.Metadata; @Metadata(label = "configuration") @XmlRootElement(name = "propertyExpression") @XmlAccessorType(XmlAccessType.FIELD) -public class PropertyExpressionDefinition { +public class PropertyExpressionDefinition implements HasExpressionType { @XmlAttribute(required = true) private String key; @XmlElementRef + @Metadata(required = true) private ExpressionDefinition expression; public PropertyExpressionDefinition() { @@ -46,7 +47,9 @@ public class PropertyExpressionDefinition { public PropertyExpressionDefinition(String key, Expression expression) { this.key = key; - this.expression = new ExpressionDefinition(expression); + if (expression != null) { + setExpression(ExpressionNodeHelper.toExpressionDefinition(expression)); + } } /** @@ -70,4 +73,14 @@ public class PropertyExpressionDefinition { public void setExpression(ExpressionDefinition expression) { this.expression = expression; } + + @Override + public ExpressionDefinition getExpressionType() { + return getExpression(); + } + + @Override + public void setExpressionType(ExpressionDefinition expressionType) { + setExpression(expressionType); + } } 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 a14e2849863..a5b552a0785 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 @@ -11696,6 +11696,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport { description = "A key value pair where the value is an expression.", deprecated = false, properties = { + @YamlProperty(name = "__extends", type = "object:org.apache.camel.model.language.ExpressionDefinition", oneOf = "expression"), @YamlProperty(name = "expression", type = "object:org.apache.camel.model.language.ExpressionDefinition", description = "Property values as an expression", displayName = "Expression", oneOf = "expression"), @YamlProperty(name = "key", type = "string", required = true, description = "Property key", displayName = "Key") } @@ -11726,7 +11727,16 @@ public final class ModelDeserializers extends YamlDeserializerSupport { break; } default: { - return false; + ExpressionDefinition ed = target.getExpressionType(); + if (ed != null) { + throw new org.apache.camel.dsl.yaml.common.exception.DuplicateFieldException(node, propertyName, "as an expression"); + } + ed = ExpressionDeserializers.constructExpressionType(propertyKey, node); + if (ed != null) { + target.setExpressionType(ed); + } else { + return false; + } } } return true; 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 66659f8a71e..6b519256325 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 @@ -75,8 +75,9 @@ public class CustomResolver implements YamlDeserializerResolver { // // Expression // - case "expression": case "org.apache.camel.model.PropertyExpressionDefinition": + return new PropertyExpressionDefinitionDeserializer(); + case "expression": case "org.apache.camel.model.language.ExpressionDefinition": return new ExpressionDeserializers.ExpressionDefinitionDeserializers(); case "org.apache.camel.model.ExpressionSubElementDefinition": diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/PropertyExpressionDefinitionDeserializer.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/PropertyExpressionDefinitionDeserializer.java new file mode 100644 index 00000000000..0c3657ee40d --- /dev/null +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/PropertyExpressionDefinitionDeserializer.java @@ -0,0 +1,78 @@ +/* + * 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 org.apache.camel.dsl.yaml.common.YamlDeserializerBase; +import org.apache.camel.model.PropertyExpressionDefinition; +import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.spi.annotations.YamlProperty; +import org.apache.camel.spi.annotations.YamlType; +import org.snakeyaml.engine.v2.nodes.Node; + +import static org.apache.camel.dsl.yaml.deserializers.ExpressionDeserializers.constructExpressionType; + +@YamlType( + nodes = "propertyExpression", + types = org.apache.camel.model.PropertyExpressionDefinition.class, + order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1, + displayName = "Property Expression", + description = "A key value pair where the value is an expression", + deprecated = false, + properties = { + @YamlProperty(name = "key", type = "string", required = true, description = "The name of the property", + displayName = "Key"), + @YamlProperty(name = "expression", required = true, + type = "object:org.apache.camel.model.language.ExpressionDefinition", + description = "The property value as an expression", + displayName = "Expression", oneOf = "expression") + }) +public class PropertyExpressionDefinitionDeserializer extends YamlDeserializerBase<PropertyExpressionDefinition> { + + public PropertyExpressionDefinitionDeserializer() { + super(PropertyExpressionDefinition.class); + } + + @Override + protected PropertyExpressionDefinition newInstance() { + return new PropertyExpressionDefinition(); + } + + @Override + protected boolean setProperty( + PropertyExpressionDefinition target, String propertyKey, + String propertyName, Node node) { + propertyKey = org.apache.camel.util.StringHelper.dashToCamelCase(propertyKey); + switch (propertyKey) { + case "key": { + String val = asText(node); + target.setKey(val); + break; + } + default: { + ExpressionDefinition exp = constructExpressionType(propertyKey, node); + if (exp != null) { + target.setExpression(exp); + break; + } + // unknown + return false; + } + } + return true; + } + +} diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json index df5d2b48600..0250697eb3b 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json @@ -3827,7 +3827,7 @@ }, "org.apache.camel.model.PropertyExpressionDefinition" : { "title" : "Property Expression", - "description" : "A key value pair where the value is an expression.", + "description" : "A key value pair where the value is an expression", "type" : "object", "additionalProperties" : false, "anyOf" : [ { @@ -3837,23 +3837,17 @@ "properties" : { "expression" : { "title" : "Expression", - "description" : "Property values as an expression", + "description" : "The property value as an expression", "$ref" : "#/items/definitions/org.apache.camel.model.language.ExpressionDefinition" } } - }, { - "not" : { - "anyOf" : [ { - "required" : [ "expression" ] - } ] - } } ] } ], "properties" : { "key" : { "type" : "string", "title" : "Key", - "description" : "Property key" + "description" : "The name of the property" }, "expression" : { } }, 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 80a66d32320..84f3ca3d585 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 @@ -20,6 +20,8 @@ import org.apache.camel.dsl.yaml.support.YamlTestSupport import org.apache.camel.model.SagaActionUriDefinition import org.apache.camel.model.SagaDefinition import org.apache.camel.model.ToDefinition +import org.apache.camel.model.language.JqExpression +import org.apache.camel.model.language.SimpleExpression import org.apache.camel.spi.Resource import org.apache.camel.support.PluginHelper @@ -47,53 +49,16 @@ class SagaTest extends YamlTestSupport { with(outputs[1], ToDefinition) { endpointUri == 'direct:something' } + options.size() == 2 + options[0].key == "o1" + options[0].expression instanceof JqExpression + options[0].expression.expression == '.foo' + options[1].key == "o2" + options[1].expression instanceof SimpleExpression + options[1].expression.expression == '${body}' } where: resource << [ - asResource('full', ''' - - from: - uri: "direct:start" - steps: - - saga: - propagation: "MANDATORY" - completionMode: "MANUAL" - compensation: - uri: "direct:compensation" - completion: - uri: "direct:completion" - steps: - - to: "direct:something" - option: - - key: o1 - simple: "${body}" - - key: o2 - expression: - simple: "${body}" - - to: "mock:result" - '''), - asResource('full-parameters', ''' - - from: - uri: "direct:start" - steps: - - saga: - propagation: "MANDATORY" - completionMode: "MANUAL" - compensation: - uri: "direct" - parameters: - name: compensation - completion: - uri: "direct:completion" - steps: - - to: "direct:something" - option: - - key: o1 - simple: "${body}" - - key: o2 - expression: - simple: "${body}" - - to: "mock:result" - '''), asResource('full-parameters-id', ''' - from: uri: "direct:start" @@ -111,7 +76,7 @@ class SagaTest extends YamlTestSupport { - to: "direct:something" option: - key: o1 - simple: "${body}" + jq: ".foo" - key: o2 expression: simple: @@ -136,7 +101,7 @@ class SagaTest extends YamlTestSupport { - to: "direct:something" option: - key: o1 - simple: "${body}" + jq: ".foo" - key: o2 expression: simple: "${body}" @@ -155,7 +120,7 @@ class SagaTest extends YamlTestSupport { - to: "direct:something" option: - key: o1 - simple: "${body}" + jq: ".foo" - key: o2 expression: simple: "${body}"