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 10:01:14 UTC

(camel) branch main updated: CAMEL-20339: camel-yaml-dsl - Fix Saga EIP with options not working. (#12825)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new ee86742d8d7 CAMEL-20339: camel-yaml-dsl - Fix Saga EIP with options not working. (#12825)
ee86742d8d7 is described below

commit ee86742d8d7388e69e348dd36dc995fe2087c174
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Jan 18 11:01:08 2024 +0100

    CAMEL-20339: camel-yaml-dsl - Fix Saga EIP with options not working. (#12825)
    
    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     |  1 -
 .../generated/resources/schema/camelYamlDsl.json   | 86 ++++++++++++++++++++--
 .../org/apache/camel/dsl/yaml/SagaTest.groovy      | 59 +++------------
 5 files changed, 118 insertions(+), 57 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..c0ccc80eac7 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
@@ -76,7 +76,6 @@ public class CustomResolver implements YamlDeserializerResolver {
             // Expression
             //
             case "expression":
-            case "org.apache.camel.model.PropertyExpressionDefinition":
             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/src/generated/resources/schema/camelYamlDsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
index df5d2b48600..5ab84e6d6ef 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
@@ -3832,6 +3832,62 @@
         "additionalProperties" : false,
         "anyOf" : [ {
           "oneOf" : [ {
+            "$ref" : "#/items/definitions/org.apache.camel.model.language.ExpressionDefinition"
+          }, {
+            "not" : {
+              "anyOf" : [ {
+                "required" : [ "expression" ]
+              }, {
+                "required" : [ "constant" ]
+              }, {
+                "required" : [ "csimple" ]
+              }, {
+                "required" : [ "datasonnet" ]
+              }, {
+                "required" : [ "exchangeProperty" ]
+              }, {
+                "required" : [ "groovy" ]
+              }, {
+                "required" : [ "header" ]
+              }, {
+                "required" : [ "hl7terser" ]
+              }, {
+                "required" : [ "java" ]
+              }, {
+                "required" : [ "joor" ]
+              }, {
+                "required" : [ "jq" ]
+              }, {
+                "required" : [ "js" ]
+              }, {
+                "required" : [ "jsonpath" ]
+              }, {
+                "required" : [ "language" ]
+              }, {
+                "required" : [ "method" ]
+              }, {
+                "required" : [ "mvel" ]
+              }, {
+                "required" : [ "ognl" ]
+              }, {
+                "required" : [ "python" ]
+              }, {
+                "required" : [ "ref" ]
+              }, {
+                "required" : [ "simple" ]
+              }, {
+                "required" : [ "spel" ]
+              }, {
+                "required" : [ "tokenize" ]
+              }, {
+                "required" : [ "xpath" ]
+              }, {
+                "required" : [ "xquery" ]
+              }, {
+                "required" : [ "xtokenize" ]
+              } ]
+            }
+          }, {
             "type" : "object",
             "required" : [ "expression" ],
             "properties" : {
@@ -3841,12 +3897,6 @@
                 "$ref" : "#/items/definitions/org.apache.camel.model.language.ExpressionDefinition"
               }
             }
-          }, {
-            "not" : {
-              "anyOf" : [ {
-                "required" : [ "expression" ]
-              } ]
-            }
           } ]
         } ],
         "properties" : {
@@ -3855,6 +3905,30 @@
             "title" : "Key",
             "description" : "Property key"
           },
+          "constant" : { },
+          "csimple" : { },
+          "datasonnet" : { },
+          "exchangeProperty" : { },
+          "groovy" : { },
+          "header" : { },
+          "hl7terser" : { },
+          "java" : { },
+          "joor" : { },
+          "jq" : { },
+          "js" : { },
+          "jsonpath" : { },
+          "language" : { },
+          "method" : { },
+          "mvel" : { },
+          "ognl" : { },
+          "python" : { },
+          "ref" : { },
+          "simple" : { },
+          "spel" : { },
+          "tokenize" : { },
+          "xpath" : { },
+          "xquery" : { },
+          "xtokenize" : { },
           "expression" : { }
         },
         "required" : [ "key" ]
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}"