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}"