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:11 UTC

(camel) branch saga created (now 713c74c60aa)

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

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


      at 713c74c60aa CAMEL-20339: camel-yaml-dsl - Fix Saga EIP with options not working.

This branch includes the following new commits:

     new 713c74c60aa CAMEL-20339: camel-yaml-dsl - Fix Saga EIP with options not working.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(camel) 01/01: CAMEL-20339: camel-yaml-dsl - Fix Saga EIP with options not working.

Posted by da...@apache.org.
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}"