You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2024/01/18 09:44:12 UTC
(camel) 01/01: CAMEL-20339: camel-yaml-dsl - Fix Saga EIP with options not working.
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 <cl...@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}"