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 4c1c56bea5 [Fix #3905] Event data should be string or object, not just 
string (#3906)
4c1c56bea5 is described below

commit 4c1c56bea575f58fa675406f1db2959bce5ed915
Author: Francisco Javier Tirado Sarti 
<[email protected]>
AuthorDate: Wed Apr 30 17:40:01 2025 +0200

    [Fix #3905] Event data should be string or object, not just string (#3906)
    
    Changes associated to the SDK Fix
---
 kogito-build/kogito-dependencies-bom/pom.xml       |  2 +-
 .../workflow/parser/handlers/StateHandler.java     |  2 +-
 .../workflow/parser/types/AsyncAPITypeHandler.java |  5 +----
 .../suppliers/ProduceEventActionSupplier.java      | 23 +++++++++++++------
 .../executor/WorkflowEventPublisherTest.java       |  2 +-
 .../serverless/workflow/fluent/ActionBuilder.java  |  6 ++++-
 .../workflow/actions/SWFProduceEventAction.java    | 26 +++++-----------------
 .../workitemparams/ExpressionWorkItemResolver.java | 23 +++----------------
 .../workflow/utils/ExpressionHandlerUtils.java     | 19 ++++++++++++++++
 9 files changed, 52 insertions(+), 56 deletions(-)

diff --git a/kogito-build/kogito-dependencies-bom/pom.xml 
b/kogito-build/kogito-dependencies-bom/pom.xml
index 2bc5d7f003..9aa0d4a392 100644
--- a/kogito-build/kogito-dependencies-bom/pom.xml
+++ b/kogito-build/kogito-dependencies-bom/pom.xml
@@ -86,7 +86,7 @@
     <version.org.flywaydb>10.17.3</version.org.flywaydb>
     <version.org.postgresql>42.7.4</version.org.postgresql>
     <version.com.h2>2.3.232</version.com.h2> <!-- Overriding version 2.3.230 
to fix https://github.com/h2database/h2database/issues/4079 -->
-    <version.io.serverlessworkflow>4.0.5.Final</version.io.serverlessworkflow>
+    <version.io.serverlessworkflow>4.1.0.Final</version.io.serverlessworkflow>
     <version.io.smallrye-open-api>3.10.0</version.io.smallrye-open-api>
     <version.org.awaitility>4.2.0</version.org.awaitility>
 
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 740deb8a75..77fa36cdc3 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
@@ -138,7 +138,7 @@ public abstract class StateHandler<S extends State> {
 
     protected final <T extends NodeFactory<?, ?> & SupportsAction<?, ?>> 
NodeFactory<?, ?> sendEventNode(T actionNode,
             EventDefinition eventDefinition,
-            String data,
+            JsonNode data,
             String defaultWorkflowVar) {
         return NodeFactoryUtils.sendEventNode(
                 actionNode.action(new ProduceEventActionSupplier(workflow, 
eventDefinition.getType(), defaultWorkflowVar, data)),
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/types/AsyncAPITypeHandler.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/types/AsyncAPITypeHandler.java
index 78f380c111..b149713d76 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/types/AsyncAPITypeHandler.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/types/AsyncAPITypeHandler.java
@@ -32,8 +32,6 @@ import org.kie.kogito.serverless.workflow.parser.VariableInfo;
 import org.kie.kogito.serverless.workflow.parser.handlers.NodeFactoryUtils;
 import org.kie.kogito.serverless.workflow.suppliers.ProduceEventActionSupplier;
 
-import com.fasterxml.jackson.databind.JsonNode;
-
 import io.serverlessworkflow.api.Workflow;
 import io.serverlessworkflow.api.functions.FunctionDefinition;
 import io.serverlessworkflow.api.functions.FunctionRef;
@@ -79,9 +77,8 @@ public class AsyncAPITypeHandler implements 
FunctionTypeHandler {
 
     private NodeFactory<?, ?> buildPublishNode(Workflow workflow, 
ParserContext context, RuleFlowNodeContainerFactory<?, ?> factory, 
FunctionDefinition functionDef, FunctionRef functionRef,
             VariableInfo varInfo, AsyncChannelInfo entry) {
-        JsonNode args = functionRef.getArguments();
         return NodeFactoryUtils.sendEventNode(
-                factory.actionNode(context.newId()).action(new 
ProduceEventActionSupplier(workflow, entry.getName(), varInfo.getInputVar(), 
args != null ? args.toString() : null)),
+                factory.actionNode(context.newId()).action(new 
ProduceEventActionSupplier(workflow, entry.getName(), varInfo.getInputVar(), 
functionRef.getArguments())),
                 functionDef.getName(),
                 entry.getName(), varInfo.getInputVar());
     }
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/suppliers/ProduceEventActionSupplier.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/suppliers/ProduceEventActionSupplier.java
index e53e57f69c..7739f056ff 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/suppliers/ProduceEventActionSupplier.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/suppliers/ProduceEventActionSupplier.java
@@ -18,6 +18,7 @@
  */
 package org.kie.kogito.serverless.workflow.suppliers;
 
+import java.io.UncheckedIOException;
 import java.util.function.Supplier;
 
 import org.jbpm.compiler.canonical.AbstractNodeVisitor;
@@ -27,11 +28,13 @@ import org.jbpm.compiler.canonical.TriggerMetaData;
 import org.jbpm.process.core.event.StaticMessageProducer;
 import org.kie.kogito.event.impl.MessageProducer;
 import org.kie.kogito.internal.process.runtime.KogitoNode;
+import org.kie.kogito.jackson.utils.JsonObjectUtils;
 import org.kie.kogito.serverless.workflow.actions.SWFProduceEventAction;
-import org.kie.kogito.serverless.workflow.utils.ExpressionHandlerUtils;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.MethodCallExpr;
 import com.github.javaparser.ast.expr.NullLiteralExpr;
 import com.github.javaparser.ast.expr.StringLiteralExpr;
 
@@ -44,16 +47,22 @@ public class ProduceEventActionSupplier extends 
SWFProduceEventAction implements
 
     private static final long serialVersionUID = 1L;
 
-    public ProduceEventActionSupplier(Workflow workflow, String trigger, 
String varName, String data) {
-        super(trigger, varName, new MessageProducerSupplier(trigger), 
workflow.getExpressionLang(), ExpressionHandlerUtils.replaceExpr(workflow, 
data));
+    public ProduceEventActionSupplier(Workflow workflow, String trigger, 
String varName, JsonNode data) {
+        super(trigger, varName, new MessageProducerSupplier(trigger), 
workflow.getExpressionLang(), data);
     }
 
     @Override
     public Expression get(KogitoNode node, ProcessMetaData metadata) {
-        return 
AbstractNodeVisitor.buildProducerAction(parseClassOrInterfaceType(SWFProduceEventAction.class.getCanonicalName()),
 TriggerMetaData.of(node, (String) node.getMetaData()
-                .get(MAPPING_VARIABLE_INPUT)), metadata)
-                .addArgument(new StringLiteralExpr(exprLang))
-                .addArgument(data != null ? new 
StringLiteralExpr().setString(data) : new NullLiteralExpr());
+        try {
+            return 
AbstractNodeVisitor.buildProducerAction(parseClassOrInterfaceType(SWFProduceEventAction.class.getCanonicalName()),
 TriggerMetaData.of(node, (String) node.getMetaData()
+                    .get(MAPPING_VARIABLE_INPUT)), metadata)
+                    .addArgument(new StringLiteralExpr(exprLang))
+                    .addArgument(data != null ? new 
MethodCallExpr(JsonObjectUtils.class.getCanonicalName() + 
".fromString").addArgument(
+                            JsonObjectUtils.toString(data))
+                            : new NullLiteralExpr());
+        } catch (JsonProcessingException e) {
+            throw new UncheckedIOException(e);
+        }
     }
 
     private static class MessageProducerSupplier implements 
Supplier<MessageProducer<JsonNode>> {
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-executor-kafka/src/test/java/org/kie/kogito/serverless/workflow/executor/WorkflowEventPublisherTest.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-kafka/src/test/java/org/kie/kogito/serverless/workflow/executor/WorkflowEventPublisherTest.java
index ed678de36f..6054032cf1 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-executor-kafka/src/test/java/org/kie/kogito/serverless/workflow/executor/WorkflowEventPublisherTest.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-executor-kafka/src/test/java/org/kie/kogito/serverless/workflow/executor/WorkflowEventPublisherTest.java
@@ -40,7 +40,7 @@ public class WorkflowEventPublisherTest {
     @Test
     void testPublisher() {
         JsonNode expected = jsonObject().put("name", "Javierito");
-        Workflow workflow = 
workflow("testPublishEvent").start(operation().action(trigger(eventDef("testPublish"),
 "{name: .name}"))).end().build();
+        Workflow workflow = 
workflow("testPublishEvent").start(operation().action(trigger(eventDef("testPublish"),
 jsonObject().put("name", ".name")))).end().build();
         try (StaticWorkflowApplication application = 
StaticWorkflowApplication.create()) {
             
assertThat(MockKafkaEventEmitterFactory.producer.history()).isEmpty();
             application.execute(workflow, expected);
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-fluent/src/main/java/org/kie/kogito/serverless/workflow/fluent/ActionBuilder.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-fluent/src/main/java/org/kie/kogito/serverless/workflow/fluent/ActionBuilder.java
index 90a69f04f4..ea20ba2e34 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-fluent/src/main/java/org/kie/kogito/serverless/workflow/fluent/ActionBuilder.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-fluent/src/main/java/org/kie/kogito/serverless/workflow/fluent/ActionBuilder.java
@@ -75,12 +75,16 @@ public class ActionBuilder {
         return call(functionName, JsonObjectUtils.fromValue(args));
     }
 
-    public static ActionBuilder trigger(EventDefBuilder builder, String data) {
+    public static ActionBuilder trigger(EventDefBuilder builder, JsonNode 
data) {
         ActionBuilder actionBuilder = new ActionBuilder(new 
Action().withEventRef(new 
EventRef().withData(data).withTriggerEventRef(builder.getName())));
         actionBuilder.eventDefinition = Optional.of(builder);
         return actionBuilder;
     }
 
+    public static ActionBuilder trigger(EventDefBuilder builder, String data) {
+        return trigger(builder, JsonObjectUtils.fromString(data));
+    }
+
     public static ActionBuilder call(FunctionBuilder functionBuilder, JsonNode 
args) {
         ActionBuilder actionBuilder = call(functionBuilder.getName(), args);
         actionBuilder.functionDefinition = Optional.of(functionBuilder);
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/actions/SWFProduceEventAction.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/actions/SWFProduceEventAction.java
index 7a60244595..c01033cf4c 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/actions/SWFProduceEventAction.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/actions/SWFProduceEventAction.java
@@ -23,21 +23,19 @@ import java.util.function.Supplier;
 import org.jbpm.process.instance.impl.actions.ProduceEventAction;
 import org.kie.kogito.event.impl.MessageProducer;
 import org.kie.kogito.internal.process.runtime.KogitoProcessContext;
+import org.kie.kogito.jackson.utils.JsonNodeVisitor;
 import org.kie.kogito.jackson.utils.JsonObjectUtils;
-import org.kie.kogito.jackson.utils.ObjectMapperFactory;
-import org.kie.kogito.process.expr.Expression;
-import org.kie.kogito.process.expr.ExpressionHandlerFactory;
+import org.kie.kogito.serverless.workflow.utils.ExpressionHandlerUtils;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 
 public class SWFProduceEventAction extends ProduceEventAction<JsonNode> {
     private static final long serialVersionUID = 1L;
 
     protected final String exprLang;
-    protected final String data;
+    protected final JsonNode data;
 
-    public SWFProduceEventAction(String triggerName, String varName, 
Supplier<MessageProducer<JsonNode>> supplier, String exprLang, String data) {
+    public SWFProduceEventAction(String triggerName, String varName, 
Supplier<MessageProducer<JsonNode>> supplier, String exprLang, JsonNode data) {
         super(triggerName, varName, supplier);
         this.exprLang = exprLang;
         this.data = data;
@@ -45,22 +43,8 @@ public class SWFProduceEventAction extends 
ProduceEventAction<JsonNode> {
 
     @Override
     protected JsonNode getObject(Object object, KogitoProcessContext context) {
-        Expression expr = null;
-        JsonNode value = null;
         if (data != null) {
-            expr = ExpressionHandlerFactory.get(exprLang, data);
-            if (!expr.isValid()) {
-                try {
-                    value = ObjectMapperFactory.get().readTree(data);
-                } catch (JsonProcessingException e) {
-                    throw new IllegalArgumentException("Data " + data + " is 
not valid json not valid expression");
-                }
-            }
-        }
-        if (value != null) {
-            return value;
-        } else if (expr != null) {
-            return expr.eval(object, JsonNode.class, context);
+            return JsonNodeVisitor.transformTextNode(data, node -> 
ExpressionHandlerUtils.transform(node, object, context, exprLang));
         } else {
             return JsonObjectUtils.fromValue(object);
         }
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/workitemparams/ExpressionWorkItemResolver.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/workitemparams/ExpressionWorkItemResolver.java
index 1a334f1ad8..d33f0baab6 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/workitemparams/ExpressionWorkItemResolver.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-runtime/src/main/java/org/kie/kogito/serverless/workflow/workitemparams/ExpressionWorkItemResolver.java
@@ -19,22 +19,16 @@
 package org.kie.kogito.serverless.workflow.workitemparams;
 
 import org.jbpm.util.ContextFactory;
-import org.kie.kogito.internal.process.runtime.KogitoProcessContext;
 import org.kie.kogito.internal.process.workitem.KogitoWorkItem;
 import org.kie.kogito.jackson.utils.JsonNodeVisitor;
 import org.kie.kogito.jackson.utils.JsonObjectUtils;
-import org.kie.kogito.process.expr.Expression;
-import org.kie.kogito.process.expr.ExpressionHandlerFactory;
 import org.kie.kogito.process.workitems.impl.WorkItemParamResolver;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.kie.kogito.serverless.workflow.utils.ExpressionHandlerUtils;
 
 import com.fasterxml.jackson.databind.JsonNode;
 
 public abstract class ExpressionWorkItemResolver<T> implements 
WorkItemParamResolver<T> {
 
-    private static final Logger logger = 
LoggerFactory.getLogger(ExpressionWorkItemResolver.class);
-
     protected final String language;
     protected final Object expression;
     private final String paramName;
@@ -46,19 +40,8 @@ public abstract class ExpressionWorkItemResolver<T> 
implements WorkItemParamReso
     }
 
     protected final JsonNode evalExpression(KogitoWorkItem workItem) {
-        return 
JsonNodeVisitor.transformTextNode(JsonObjectUtils.fromValue(expression), node 
-> transform(node, workItem.getParameter(paramName), 
ContextFactory.fromItem(workItem)));
+        return 
JsonNodeVisitor.transformTextNode(JsonObjectUtils.fromValue(expression),
+                node -> ExpressionHandlerUtils.transform(node, 
workItem.getParameter(paramName), ContextFactory.fromItem(workItem), language));
     }
 
-    private JsonNode transform(JsonNode node, Object inputModel, 
KogitoProcessContext context) {
-        Expression expr = ExpressionHandlerFactory.get(language, 
node.asText());
-        try {
-            if (logger.isTraceEnabled()) {
-                logger.trace("Expression: {}, valid: {}", expr.asString(), 
expr.isValid());
-            }
-            return expr.isValid() ? expr.eval(inputModel, JsonNode.class, 
context) : node;
-        } catch (Exception ex) {
-            logger.info("Error evaluating expression, returning original text 
{}", node);
-            return node;
-        }
-    }
 }
diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-utils/src/main/java/org/kie/kogito/serverless/workflow/utils/ExpressionHandlerUtils.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-utils/src/main/java/org/kie/kogito/serverless/workflow/utils/ExpressionHandlerUtils.java
index e727f96605..151b470cea 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-utils/src/main/java/org/kie/kogito/serverless/workflow/utils/ExpressionHandlerUtils.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-utils/src/main/java/org/kie/kogito/serverless/workflow/utils/ExpressionHandlerUtils.java
@@ -26,6 +26,10 @@ import java.util.function.Function;
 import org.jbpm.ruleflow.core.Metadata;
 import org.kie.kogito.internal.process.runtime.KogitoProcessContext;
 import org.kie.kogito.jackson.utils.MergeUtils;
+import org.kie.kogito.process.expr.Expression;
+import org.kie.kogito.process.expr.ExpressionHandlerFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.NullNode;
@@ -37,6 +41,8 @@ import 
io.serverlessworkflow.api.functions.FunctionDefinition.Type;
 
 public class ExpressionHandlerUtils {
 
+    private static final Logger logger = 
LoggerFactory.getLogger(ExpressionHandlerUtils.class);
+
     private ExpressionHandlerUtils() {
     }
 
@@ -66,6 +72,19 @@ public class ExpressionHandlerUtils {
         return k -> KogitoProcessContextResolver.get().readKey(context, k);
     }
 
+    public static JsonNode transform(JsonNode node, Object inputModel, 
KogitoProcessContext context, String language) {
+        Expression expr = ExpressionHandlerFactory.get(language, 
node.asText());
+        try {
+            if (logger.isTraceEnabled()) {
+                logger.trace("Expression: {}, valid: {}", expr.asString(), 
expr.isValid());
+            }
+            return expr.isValid() ? expr.eval(inputModel, JsonNode.class, 
context) : node;
+        } catch (Exception ex) {
+            logger.info("Error evaluating expression, returning original text 
{}", node);
+            return node;
+        }
+    }
+
     public static String trimExpr(String expr) {
         expr = expr.trim();
         if (expr.startsWith(EXPR_PREFIX)) {


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

Reply via email to