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

fjtiradosarti pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new 535df4babd [Fix #3877] Only propagate function not found when 
evaluating JQ expr (#3878)
535df4babd is described below

commit 535df4babdbf9ad39b52db92dff21bfb515ed078
Author: Francisco Javier Tirado Sarti 
<[email protected]>
AuthorDate: Tue Apr 1 17:29:04 2025 +0200

    [Fix #3877] Only propagate function not found when evaluating JQ expr 
(#3878)
---
 .../java/org/kie/kogito/expr/jq/JqExpression.java  | 41 +++++++++++++---------
 .../workflow/ServerlessWorkflowParsingTest.java    |  2 +-
 .../test/resources/exec/jqDelExpression.sw.json    | 17 +++++++++
 3 files changed, 43 insertions(+), 17 deletions(-)

diff --git 
a/kogito-serverless-workflow/kogito-jq-expression/src/main/java/org/kie/kogito/expr/jq/JqExpression.java
 
b/kogito-serverless-workflow/kogito-jq-expression/src/main/java/org/kie/kogito/expr/jq/JqExpression.java
index 8039176cfe..d901d4cb39 100644
--- 
a/kogito-serverless-workflow/kogito-jq-expression/src/main/java/org/kie/kogito/expr/jq/JqExpression.java
+++ 
b/kogito-serverless-workflow/kogito-jq-expression/src/main/java/org/kie/kogito/expr/jq/JqExpression.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Supplier;
+import java.util.regex.Pattern;
 
 import org.kie.kogito.internal.process.runtime.KogitoProcessContext;
 import org.kie.kogito.jackson.utils.FunctionJsonNode;
@@ -229,25 +230,33 @@ public class JqExpression implements Expression {
         return validationError == null;
     }
 
+    private static Pattern FUNCTION_DOES_NOT_EXIST = Pattern.compile("Function 
(.*) does not exist");
+
     private void checkFunctionCall(net.thisptr.jackson.jq.Expression toCheck) 
throws JsonQueryException {
-        if (toCheck instanceof FunctionCall) {
-            toCheck.apply(scope.get(), 
ObjectMapperFactory.get().createObjectNode(), out -> {
-            });
-        } else if (toCheck instanceof BinaryOperatorExpression) {
-            if (rhsField != null) {
-                try {
-                    checkFunctionCall((net.thisptr.jackson.jq.Expression) 
rhsField.get(toCheck));
-                } catch (ReflectiveOperationException e) {
-                    logger.warn("Ignoring unexpected error {} while accesing 
field {} for class{} and expression {}", e.getMessage(), rhsField.getName(), 
toCheck.getClass(), expr);
+        try {
+            if (toCheck instanceof FunctionCall) {
+                toCheck.apply(scope.get(), 
ObjectMapperFactory.get().createObjectNode(), out -> {
+                });
+            } else if (toCheck instanceof BinaryOperatorExpression) {
+                if (rhsField != null) {
+                    try {
+                        checkFunctionCall((net.thisptr.jackson.jq.Expression) 
rhsField.get(toCheck));
+                    } catch (ReflectiveOperationException e) {
+                        logger.warn("Ignoring unexpected error {} while 
accesing field {} for class{} and expression {}", e.getMessage(), 
rhsField.getName(), toCheck.getClass(), expr);
+                    }
                 }
+            } else if (toCheck != null) {
+                for (Field f : getAllExprFields(toCheck))
+                    try {
+                        checkFunctionCall((net.thisptr.jackson.jq.Expression) 
f.get(toCheck));
+                    } catch (ReflectiveOperationException e) {
+                        logger.warn("Ignoring unexpected error {} while 
accesing field {} for class{} and expression {}", e.getMessage(), f.getName(), 
toCheck.getClass(), expr);
+                    }
+            }
+        } catch (JsonQueryException ex) {
+            if (FUNCTION_DOES_NOT_EXIST.matcher(ex.getMessage()).matches()) {
+                throw ex;
             }
-        } else if (toCheck != null) {
-            for (Field f : getAllExprFields(toCheck))
-                try {
-                    checkFunctionCall((net.thisptr.jackson.jq.Expression) 
f.get(toCheck));
-                } catch (ReflectiveOperationException e) {
-                    logger.warn("Ignoring unexpected error {} while accesing 
field {} for class{} and expression {}", e.getMessage(), f.getName(), 
toCheck.getClass(), expr);
-                }
         }
     }
 
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/test/java/org/kie/kogito/serverless/workflow/ServerlessWorkflowParsingTest.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/test/java/org/kie/kogito/serverless/workflow/ServerlessWorkflowParsingTest.java
index 6041dbbdf9..98bcaf3f00 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/test/java/org/kie/kogito/serverless/workflow/ServerlessWorkflowParsingTest.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/test/java/org/kie/kogito/serverless/workflow/ServerlessWorkflowParsingTest.java
@@ -608,7 +608,7 @@ public class ServerlessWorkflowParsingTest extends 
AbstractServerlessWorkflowPar
 
     @ParameterizedTest
     @ValueSource(strings = { "/examples/applicantworkflow.sw.json", 
"/exec/error.sw.json", "/exec/callback.sw.json", "/exec/compensation.sw.json", 
"/exec/compensation.end.sw.json",
-            "/exec/foreach.sw.json" })
+            "/exec/foreach.sw.json", "/exec/jqDelExpression.sw.json" })
     public void testSpecExamplesParsing(String workflowLocation) throws 
Exception {
         Workflow workflow = 
Workflow.fromSource(WorkflowTestUtils.readWorkflowFile(workflowLocation));
 
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/test/resources/exec/jqDelExpression.sw.json
 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/test/resources/exec/jqDelExpression.sw.json
new file mode 100644
index 0000000000..c3227377b0
--- /dev/null
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/test/resources/exec/jqDelExpression.sw.json
@@ -0,0 +1,17 @@
+{
+  "id": "jqDelExpression",
+  "name": "jqDelExpression",
+  "start": "testJqExpression",
+  "states": [
+    {
+      "name": "testJqExpression",
+      "type": "inject",
+      "data": {},
+      "stateDataFilter": {
+        "input": "${ del( .InfractionsWithInstants[] | .BaseDepassement, 
.ActivitesIncriminees, .DebutIdentification, .FinIdentification ) }",
+        "output": "{ Infractions: .InfractionsWithInstants }"
+      },
+      "end": true
+    }
+  ]
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to