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 c822a66a9b [Fix_#3451] Fixing start event state filtering (#3542)
c822a66a9b is described below

commit c822a66a9bae463f46e5f44968e98dbaaa0d90fa
Author: Francisco Javier Tirado Sarti 
<[email protected]>
AuthorDate: Tue Jun 4 12:51:55 2024 +0200

    [Fix_#3451] Fixing start event state filtering (#3542)
    
    * [Fix_#3451] Fixing start event state filtering
    
    * [Fix_#3451] Add IT test
---
 .../workflow/parser/handlers/EventHandler.java     |  3 +-
 .../workflow/parser/handlers/StateHandler.java     | 12 +++++--
 .../src/main/resources/application.properties      |  6 ++++
 .../src/main/resources/greetCustomer.sw.json       | 41 ++++++++++++++++++++++
 .../kie/kogito/quarkus/workflows/EventFlowIT.java  | 22 ++++++++++++
 5 files changed, 80 insertions(+), 4 deletions(-)

diff --git 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/EventHandler.java
 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/EventHandler.java
index 9ccecb22a7..6c95879a01 100644
--- 
a/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/EventHandler.java
+++ 
b/kogito-serverless-workflow/kogito-serverless-workflow-builder/src/main/java/org/kie/kogito/serverless/workflow/parser/handlers/EventHandler.java
@@ -30,7 +30,6 @@ import org.jbpm.ruleflow.core.factory.StartNodeFactory;
 import org.jbpm.workflow.core.node.Join;
 import org.jbpm.workflow.core.node.Split;
 import org.kie.kogito.serverless.workflow.parser.ParserContext;
-import org.kie.kogito.serverless.workflow.parser.ServerlessWorkflowParser;
 
 import io.serverlessworkflow.api.Workflow;
 import io.serverlessworkflow.api.events.OnEvents;
@@ -65,7 +64,7 @@ public class EventHandler extends 
CompositeContextNodeHandler<EventState> {
 
     private MakeNodeResult processOnEvent(RuleFlowNodeContainerFactory<?, ?> 
factory, OnEvents onEvent) {
         MakeNodeResult result = joinNodes(factory,
-                onEvent.getEventRefs(), (fact, onEventRef) -> 
filterAndMergeNode(fact, onEvent.getEventDataFilter(), isStartState ? 
ServerlessWorkflowParser.DEFAULT_WORKFLOW_VAR : getVarName(),
+                onEvent.getEventRefs(), (fact, onEventRef) -> 
filterAndMergeNode(fact, onEvent.getEventDataFilter(), getVarName(),
                         (f, inputVar, outputVar) -> buildEventNode(f, 
onEventRef, inputVar, outputVar)));
         CompositeContextNodeFactory<?> embeddedSubProcess = 
handleActions(makeCompositeNode(factory), onEvent.getActions());
         connect(result.getOutgoingNode(), embeddedSubProcess);
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 63610ad6b7..5c9caf6f45 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
@@ -50,6 +50,7 @@ import org.kie.kogito.internal.utils.KogitoTags;
 import org.kie.kogito.serverless.workflow.SWFConstants;
 import org.kie.kogito.serverless.workflow.parser.ParserContext;
 import org.kie.kogito.serverless.workflow.parser.ServerlessWorkflowParser;
+import org.kie.kogito.serverless.workflow.parser.VariableInfo;
 import org.kie.kogito.serverless.workflow.suppliers.CollectorActionSupplier;
 import org.kie.kogito.serverless.workflow.suppliers.CompensationActionSupplier;
 import 
org.kie.kogito.serverless.workflow.suppliers.ErrorExpressionActionSupplier;
@@ -424,7 +425,8 @@ public abstract class StateHandler<S extends State> {
             toExpr = eventFilter.getToStateData();
             useData = eventFilter.isUseData();
         }
-        return filterAndMergeNode(embeddedSubProcess, varName, null, dataExpr, 
toExpr, useData, true, nodeSupplier);
+        return filterAndMergeNode(embeddedSubProcess, isStartState ? new 
VariableInfo(DEFAULT_WORKFLOW_VAR, varName) : new VariableInfo(varName, 
varName), null, dataExpr, toExpr, useData, true,
+                nodeSupplier);
     }
 
     protected boolean isTempVariable(String varName) {
@@ -434,7 +436,13 @@ public abstract class StateHandler<S extends State> {
     protected final MakeNodeResult 
filterAndMergeNode(RuleFlowNodeContainerFactory<?, ?> embeddedSubProcess, 
String actionVarName, String fromStateExpr, String resultExpr, String 
toStateExpr,
             boolean useData,
             boolean shouldMerge, FilterableNodeSupplier nodeSupplier) {
+        return filterAndMergeNode(embeddedSubProcess, new 
VariableInfo(actionVarName, actionVarName), fromStateExpr, resultExpr, 
toStateExpr, useData, shouldMerge, nodeSupplier);
+    }
 
+    protected final MakeNodeResult 
filterAndMergeNode(RuleFlowNodeContainerFactory<?, ?> embeddedSubProcess, 
VariableInfo variableInfo, String fromStateExpr, String resultExpr, String 
toStateExpr,
+            boolean useData,
+            boolean shouldMerge, FilterableNodeSupplier nodeSupplier) {
+        String actionVarName = variableInfo.getOutputVar();
         if (isTempVariable(actionVarName)) {
             embeddedSubProcess.variable(actionVarName, new 
ObjectDataType(JsonNode.class.getCanonicalName()), 
Map.of(KogitoTags.VARIABLE_TAGS, KogitoTags.INTERNAL_TAG));
         }
@@ -451,7 +459,7 @@ public abstract class StateHandler<S extends State> {
 
         if (useData && resultExpr != null) {
             currentNode = connect(currentNode, 
embeddedSubProcess.actionNode(parserContext.newId()).action(ExpressionActionSupplier.of(workflow,
 resultExpr)
-                    .withVarNames(actionVarName, actionVarName).build()));
+                    .withVarNames(variableInfo.getInputVar(), 
actionVarName).build()));
         }
 
         if (useData) {
diff --git 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties
 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties
index bff2cf96b0..8b83e2da2f 100644
--- 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties
+++ 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/application.properties
@@ -64,6 +64,12 @@ mp.messaging.incoming.never.path=/never
 mp.messaging.incoming.eventTimeout1.connector=quarkus-http
 mp.messaging.incoming.eventTimeout1.path=/eventTimeout1
 
+mp.messaging.incoming.eventTimeout1.connector=quarkus-http
+mp.messaging.incoming.eventTimeout1.path=/eventTimeout1
+
+mp.messaging.incoming.customer-arrival-type.connector=quarkus-http
+mp.messaging.incoming.customer-arrival-type.path=/eventWithToStateFilter
+
 mp.messaging.incoming.eventTimeout2.connector=quarkus-http
 mp.messaging.incoming.eventTimeout2.path=/eventTimeout2
 
diff --git 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/greetCustomer.sw.json
 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/greetCustomer.sw.json
new file mode 100644
index 0000000000..a3f5f1492b
--- /dev/null
+++ 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/main/resources/greetCustomer.sw.json
@@ -0,0 +1,41 @@
+{
+"id": "GreetCustomer",
+"name": "Greet Customers when they arrive",
+"version": "1.0",
+"specVersion": "0.8",
+"start": "WaitForCustomerToArrive",
+"states":[
+{
+"name": "WaitForCustomerToArrive",
+"type": "event",
+"onEvents": [{
+"eventRefs": ["CustomerArrivesEvent"],
+"eventDataFilter": {
+"data": "${ .customer }",
+"toStateData": "${ .customerInfo }"
+},
+"actions":[
+{
+"functionRef": {
+"refName": "greetingFunction",
+"arguments": {
+"message": "${ .customerInfo.name } "
+}
+}
+}
+]
+}],
+"end": true
+}
+],
+"events": [{
+"name": "CustomerArrivesEvent",
+"type": "customer-arrival-type",
+"source": "customer-arrival-event-source"
+}],
+"functions": [{
+"name": "greetingFunction",
+ "type": "custom",
+  "operation": "sysout"
+}]
+}
\ No newline at end of file
diff --git 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/EventFlowIT.java
 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/EventFlowIT.java
index 91ede4a21f..bd96c50117 100644
--- 
a/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/EventFlowIT.java
+++ 
b/quarkus/extensions/kogito-quarkus-serverless-workflow-extension/kogito-quarkus-serverless-workflow-integration-test/src/test/java/org/kie/kogito/quarkus/workflows/EventFlowIT.java
@@ -19,9 +19,13 @@
 package org.kie.kogito.quarkus.workflows;
 
 import java.io.IOException;
+import java.net.URI;
 import java.time.Duration;
+import java.time.OffsetDateTime;
+import java.util.Collections;
 import java.util.Map;
 import java.util.Optional;
+import java.util.UUID;
 
 import org.awaitility.core.ConditionTimeoutException;
 import org.junit.jupiter.api.BeforeAll;
@@ -32,6 +36,7 @@ import 
org.kie.kogito.workflows.services.JavaSerializationMarshaller;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import io.cloudevents.core.builder.CloudEventBuilder;
 import io.cloudevents.jackson.JsonFormat;
 import io.quarkus.test.junit.QuarkusIntegrationTest;
 import io.restassured.RestAssured;
@@ -56,6 +61,23 @@ class EventFlowIT {
         defaultMarshaller = new ByteArrayCloudEventMarshaller(mapper);
     }
 
+    @Test
+    void testStartingEventWithToStateFilter() {
+        given()
+                .contentType(ContentType.JSON)
+                .when()
+                .body(CloudEventBuilder.v1()
+                        .withId(UUID.randomUUID().toString())
+                        
.withSource(URI.create("customer-arrival-event-source"))
+                        .withType("customer-arrival-type")
+                        .withTime(OffsetDateTime.now())
+                        
.withData(defaultMarshaller.cloudEventDataFactory().apply(Collections.singletonMap("customer",
 Map.of("name", "pepe")))).build())
+                .post("/eventWithToStateFilter")
+                .then()
+                .statusCode(202);
+
+    }
+
     @Test
     void testNotStartingEvent() throws IOException {
         doIt("nonStartEvent", Optional.of("manolo"), "move");


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

Reply via email to