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]