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 fed1bd142a [Fix #3475] Parsing the errorMessage metadata keys in end 
nodes (#3491)
fed1bd142a is described below

commit fed1bd142a466d6be4e75e3972729278f65cabcc
Author: Francisco Javier Tirado Sarti 
<[email protected]>
AuthorDate: Fri May 3 13:11:09 2024 +0200

    [Fix #3475] Parsing the errorMessage metadata keys in end nodes (#3491)
    
    * [Fix #3475] Parsing the errorMessage metadata keys in end nodes
    
    * [Fix #3475] Do not abort process instance
    
    * [Fix #3475] Adding IT test
---
 .../workflow/parser/handlers/StateHandler.java     | 15 ++++++-
 .../suppliers/ErrorExpressionActionSupplier.java   | 43 +++++++++++++++++++
 .../workflow/actions/ErrorExpressionAction.java    | 50 ++++++++++++++++++++++
 .../src/main/resources/errorWithMetadata.sw.json   | 18 ++++++++
 .../kie/kogito/quarkus/workflows/ErrorRestIT.java  | 21 +++++++++
 5 files changed, 146 insertions(+), 1 deletion(-)

diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/StateHandler.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/StateHandler.java
index 599ea4a3dd..3cec858b91 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/StateHandler.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/StateHandler.java
@@ -23,6 +23,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 import java.util.ListIterator;
+import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Optional;
 
@@ -51,6 +52,7 @@ import 
org.kie.kogito.serverless.workflow.parser.ParserContext;
 import org.kie.kogito.serverless.workflow.parser.ServerlessWorkflowParser;
 import org.kie.kogito.serverless.workflow.suppliers.CollectorActionSupplier;
 import org.kie.kogito.serverless.workflow.suppliers.CompensationActionSupplier;
+import 
org.kie.kogito.serverless.workflow.suppliers.ErrorExpressionActionSupplier;
 import org.kie.kogito.serverless.workflow.suppliers.ExpressionActionSupplier;
 import org.kie.kogito.serverless.workflow.suppliers.MergeActionSupplier;
 import org.kie.kogito.serverless.workflow.suppliers.ProduceEventActionSupplier;
@@ -517,15 +519,26 @@ public abstract class StateHandler<S extends State> {
         WorkflowElementIdentifier id = parserContext.newId();
         EndNodeFactory<?> nodeFactory = factory.endNode(id);
         NodeFactory<?, ?> startNode = nodeFactory;
+
         List<ProduceEvent> produceEvents = end.getProduceEvents();
         if (produceEvents != null && !produceEvents.isEmpty()) {
             startNode = handleProduceEvents(factory, nodeFactory, 
produceEvents);
         }
+
+        Map<String, String> metadata = state.getMetadata();
+        if (metadata != null) {
+            String errorMessage = metadata.get("errorMessage");
+            if (errorMessage != null && !errorMessage.isBlank()) {
+                NodeFactory<?, ?> errorMessageNode =
+                        factory.actionNode(parserContext.newId()).action(new 
ErrorExpressionActionSupplier(workflow.getExpressionLang(), errorMessage, 
SWFConstants.DEFAULT_WORKFLOW_VAR));
+                connect(errorMessageNode, startNode);
+                startNode = errorMessageNode;
+            }
+        }
         nodeFactory.terminate(end.isTerminate());
         return startNode;
     }
 
-    @SuppressWarnings("squid:S1452")
     private NodeFactory<?, ?> 
compensationEvent(RuleFlowNodeContainerFactory<?, ?> factory, NodeFactory<?, ?> 
sourceFactory) {
         WorkflowElementIdentifier eventId = parserContext.newId();
         NodeFactory<?, ?> compensationNode =
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/suppliers/ErrorExpressionActionSupplier.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/suppliers/ErrorExpressionActionSupplier.java
new file mode 100644
index 0000000000..4331ea320d
--- /dev/null
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/suppliers/ErrorExpressionActionSupplier.java
@@ -0,0 +1,43 @@
+/*
+ * 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.kie.kogito.serverless.workflow.suppliers;
+
+import org.jbpm.compiler.canonical.ExpressionSupplier;
+import org.jbpm.compiler.canonical.ProcessMetaData;
+import org.jbpm.compiler.canonical.descriptors.ExpressionUtils;
+import org.kie.kogito.internal.process.runtime.KogitoNode;
+import org.kie.kogito.serverless.workflow.actions.ErrorExpressionAction;
+
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.ObjectCreationExpr;
+
+public class ErrorExpressionActionSupplier extends ErrorExpressionAction 
implements ExpressionSupplier {
+
+    private ObjectCreationExpr expression;
+
+    public ErrorExpressionActionSupplier(String lang, String expr, String 
inputVar) {
+        super(lang, expr, inputVar);
+        this.expression = 
ExpressionUtils.getObjectCreationExpr(ErrorExpressionAction.class, lang, expr, 
inputVar);
+    }
+
+    @Override
+    public Expression get(KogitoNode node, ProcessMetaData metadata) {
+        return expression;
+    }
+}
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/actions/ErrorExpressionAction.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/actions/ErrorExpressionAction.java
new file mode 100644
index 0000000000..a4b1f1da11
--- /dev/null
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/actions/ErrorExpressionAction.java
@@ -0,0 +1,50 @@
+/*
+ * 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.kie.kogito.serverless.workflow.actions;
+
+import org.jbpm.process.instance.ProcessInstance;
+import org.jbpm.workflow.instance.NodeInstance;
+import org.kie.kogito.internal.process.runtime.KogitoProcessContext;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+public class ErrorExpressionAction extends BaseExpressionAction {
+
+    public ErrorExpressionAction(String lang, String expr, String inputVar) {
+        super(lang, expr, inputVar);
+    }
+
+    public void execute(KogitoProcessContext context) throws Exception {
+        if (expr.isValid()) {
+            JsonNode error = evaluate(context, JsonNode.class);
+            if (!error.isNull() && error.isTextual()) {
+                String errorStr = error.asText();
+                if (!errorStr.isBlank()) {
+                    setError(context, errorStr);
+                }
+            }
+        } else {
+            setError(context, expr.toString());
+        }
+    }
+
+    private void setError(KogitoProcessContext context, String error) {
+        ((ProcessInstance) 
context.getProcessInstance()).setErrorState((NodeInstance) 
context.getNodeInstance(), new IllegalArgumentException(error));
+    }
+}
diff --git 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/errorWithMetadata.sw.json
 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/errorWithMetadata.sw.json
new file mode 100644
index 0000000000..7a7a9551e9
--- /dev/null
+++ 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/errorWithMetadata.sw.json
@@ -0,0 +1,18 @@
+{
+  "id": "errorWithMetadata",
+  "version": "1.0",
+  "name": "Workflow Error example with metadata",
+  "description": "An example of how to abort a workflow with error given a 
condition",
+  "start": "checkEven",
+  "states": [
+    {
+      "name": "checkEven",
+      "type": "operation",
+      "actions": [],
+      "end" : true,
+      "metadata": {
+         "errorMessage": "if .number % 2 != 0 then \"Is Odd number!!!!\" else 
null end"
+       } 
+    }
+  ]
+}
diff --git 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ErrorRestIT.java
 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ErrorRestIT.java
index 07e2ad9a2c..84afb41192 100644
--- 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ErrorRestIT.java
+++ 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/ErrorRestIT.java
@@ -75,4 +75,25 @@ public class ErrorRestIT {
                 .body("workflowdata.numberType", is("even"))
                 .body("workflowdata.perfect", is(false));
     }
+
+    @Test
+    public void testErrorWithMetadata() {
+        given()
+                .contentType(ContentType.JSON)
+                .accept(ContentType.JSON)
+                .body("{\"number\" : 12342}")
+                .when()
+                .post("/errorWithMetadata")
+                .then()
+                .statusCode(201);
+
+        given()
+                .contentType(ContentType.JSON)
+                .accept(ContentType.JSON)
+                .body("{\"number\" : 12341}")
+                .when()
+                .post("/errorWithMetadata")
+                .then()
+                .statusCode(400);
+    }
 }


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

Reply via email to