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

egonzalez 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 4572dc1fc8 incubator-kie-issues#845: Add checks 
`ProtobufProcessInstanceReader` to avoid setting incorrect empty values on 
(#3364)
4572dc1fc8 is described below

commit 4572dc1fc886a82aacf855e381ef3f0f1ed0e9ee
Author: Pere Fernández <[email protected]>
AuthorDate: Tue Jan 23 15:15:09 2024 +0100

    incubator-kie-issues#845: Add checks `ProtobufProcessInstanceReader` to 
avoid setting incorrect empty values on (#3364)
    
    * incubator-kie-issues#845:Add property checks 
`ProtobufProcessInstanceReader` to avoid setting incorrect empty values
    
    * - reformat
---
 .../impl/ProtobufProcessInstanceReader.java        |  64 +++++++++---
 .../process/ProcessInstanceMarshallTest.java       | 110 +++++++++++++++++++++
 2 files changed, 158 insertions(+), 16 deletions(-)

diff --git 
a/jbpm/process-serialization-protobuf/src/main/java/org/kie/kogito/serialization/process/impl/ProtobufProcessInstanceReader.java
 
b/jbpm/process-serialization-protobuf/src/main/java/org/kie/kogito/serialization/process/impl/ProtobufProcessInstanceReader.java
index a7581dc555..a182931c15 100644
--- 
a/jbpm/process-serialization-protobuf/src/main/java/org/kie/kogito/serialization/process/impl/ProtobufProcessInstanceReader.java
+++ 
b/jbpm/process-serialization-protobuf/src/main/java/org/kie/kogito/serialization/process/impl/ProtobufProcessInstanceReader.java
@@ -130,34 +130,66 @@ public class ProtobufProcessInstanceReader {
         processInstance.setProcessId(processInstanceProtobuf.getProcessId());
         processInstance.setState(processInstanceProtobuf.getState());
         
processInstance.setSignalCompletion(processInstanceProtobuf.getSignalCompletion());
-        processInstance.setStartDate(new 
Date(processInstanceProtobuf.getStartDate()));
 
-        
processInstance.setDescription(processInstanceProtobuf.getDescription());
-        
processInstance.setDeploymentId(processInstanceProtobuf.getDeploymentId());
+        if (processInstanceProtobuf.hasStartDate()) {
+            processInstance.setStartDate(new 
Date(processInstanceProtobuf.getStartDate()));
+        }
+
+        if (processInstanceProtobuf.hasDescription()) {
+            
processInstance.setDescription(processInstanceProtobuf.getDescription());
+        }
+
+        if (processInstanceProtobuf.hasDeploymentId()) {
+            
processInstance.setDeploymentId(processInstanceProtobuf.getDeploymentId());
+        }
 
         for (String completedNodeId : 
processInstanceProtobuf.getCompletedNodeIdsList()) {
             processInstance.addCompletedNodeId(completedNodeId);
         }
 
-        
processInstance.setCorrelationKey(processInstanceProtobuf.getBusinessKey());
+        if (processInstanceProtobuf.hasBusinessKey()) {
+            
processInstance.setCorrelationKey(processInstanceProtobuf.getBusinessKey());
+        }
+
+        if (processInstanceProtobuf.hasSla()) {
+            SLAContext slaContext = processInstanceProtobuf.getSla();
+            if (slaContext.getSlaDueDate() > 0) {
+                processInstance.internalSetSlaDueDate(new 
Date(slaContext.getSlaDueDate()));
+            }
+
+            if (slaContext.hasSlaTimerId()) {
+                
processInstance.internalSetSlaTimerId(slaContext.getSlaTimerId());
+            }
+            if (slaContext.hasSlaCompliance()) {
+                
processInstance.internalSetSlaCompliance(slaContext.getSlaCompliance());
+            }
+        }
 
-        SLAContext slaContext = processInstanceProtobuf.getSla();
-        if (slaContext.getSlaDueDate() > 0) {
-            processInstance.internalSetSlaDueDate(new 
Date(slaContext.getSlaDueDate()));
+        if (processInstanceProtobuf.hasCancelTimerId()) {
+            
processInstance.internalSetCancelTimerId(processInstanceProtobuf.getCancelTimerId());
         }
-        processInstance.internalSetSlaTimerId(slaContext.getSlaTimerId());
-        
processInstance.internalSetSlaCompliance(slaContext.getSlaCompliance());
 
-        
processInstance.internalSetCancelTimerId(processInstanceProtobuf.getCancelTimerId());
+        if (processInstanceProtobuf.hasParentProcessInstanceId()) {
+            
processInstance.setParentProcessInstanceId(processInstanceProtobuf.getParentProcessInstanceId());
+        }
+        if (processInstanceProtobuf.hasRootProcessInstanceId()) {
+            
processInstance.setRootProcessInstanceId(processInstanceProtobuf.getRootProcessInstanceId());
+        }
+        if (processInstanceProtobuf.hasRootProcessId()) {
+            
processInstance.setRootProcessId(processInstanceProtobuf.getRootProcessId());
+        }
 
-        
processInstance.setParentProcessInstanceId(processInstanceProtobuf.getParentProcessInstanceId());
-        
processInstance.setRootProcessInstanceId(processInstanceProtobuf.getRootProcessInstanceId());
-        
processInstance.setRootProcessId(processInstanceProtobuf.getRootProcessId());
+        if (processInstanceProtobuf.hasErrorNodeId()) {
+            
processInstance.internalSetErrorNodeId(processInstanceProtobuf.getErrorNodeId());
+        }
 
-        
processInstance.internalSetErrorNodeId(processInstanceProtobuf.getErrorNodeId());
-        
processInstance.internalSetErrorMessage(processInstanceProtobuf.getErrorMessage());
+        if (processInstanceProtobuf.hasErrorMessage()) {
+            
processInstance.internalSetErrorMessage(processInstanceProtobuf.getErrorMessage());
+        }
 
-        
processInstance.setReferenceId(processInstanceProtobuf.getReferenceId());
+        if (processInstanceProtobuf.hasReferenceId()) {
+            
processInstance.setReferenceId(processInstanceProtobuf.getReferenceId());
+        }
 
         if (processInstanceProtobuf.getSwimlaneContextCount() > 0) {
             SwimlaneContextInstance swimlaneContextInstance = 
(SwimlaneContextInstance) 
processInstance.getContextInstance(SwimlaneContext.SWIMLANE_SCOPE);
diff --git 
a/jbpm/process-serialization-protobuf/src/test/java/org/kie/kogito/serialization/process/ProcessInstanceMarshallTest.java
 
b/jbpm/process-serialization-protobuf/src/test/java/org/kie/kogito/serialization/process/ProcessInstanceMarshallTest.java
index 884187c641..a3af711198 100644
--- 
a/jbpm/process-serialization-protobuf/src/test/java/org/kie/kogito/serialization/process/ProcessInstanceMarshallTest.java
+++ 
b/jbpm/process-serialization-protobuf/src/test/java/org/kie/kogito/serialization/process/ProcessInstanceMarshallTest.java
@@ -38,11 +38,24 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.jbpm.process.core.context.variable.Variable;
+import org.jbpm.process.core.context.variable.VariableScope;
+import org.jbpm.process.instance.context.variable.VariableScopeInstance;
+import org.jbpm.ruleflow.instance.RuleFlowProcessInstance;
+import org.jbpm.workflow.core.Node;
+import org.jbpm.workflow.core.impl.ConnectionImpl;
+import org.jbpm.workflow.core.impl.WorkflowProcessImpl;
+import org.jbpm.workflow.core.node.EndNode;
+import org.jbpm.workflow.core.node.HumanTaskNode;
+import org.jbpm.workflow.core.node.StartNode;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.junit.jupiter.params.provider.NullSource;
+import org.kie.kogito.process.impl.AbstractProcess;
 import 
org.kie.kogito.serialization.process.impl.ProtobufMarshallerReaderContext;
+import org.kie.kogito.serialization.process.impl.ProtobufProcessInstanceReader;
+import org.kie.kogito.serialization.process.impl.ProtobufProcessInstanceWriter;
 import 
org.kie.kogito.serialization.process.impl.ProtobufProcessMarshallerWriteContext;
 import org.kie.kogito.serialization.process.impl.ProtobufVariableReader;
 import org.kie.kogito.serialization.process.impl.ProtobufVariableWriter;
@@ -52,8 +65,51 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 
 import static java.util.Collections.singletonMap;
 import static org.assertj.core.api.Assertions.assertThat;
+import static 
org.kie.kogito.internal.process.runtime.KogitoWorkflowProcess.RULEFLOW_TYPE;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public class ProcessInstanceMarshallTest {
+    private static final String PROCESS_DESCRIPTION = "The description";
+    private static final String PROCESS_INSTANCE_ID = "1";
+    private static final String ROOT_PROCESS_ID = "rootProcess";
+    private static final String ROOT_PROCESS_INSTANCE_ID = "0";
+    private static final String PARENT_PROCESS_ID = "2";
+
+    private static AbstractProcess<?> process;
+
+    private static WorkflowProcessImpl workflow;
+
+    @BeforeAll
+    public static void init() {
+        workflow = new WorkflowProcessImpl();
+
+        workflow.setId("processId");
+        workflow.setVersion("1.0");
+        workflow.setType(RULEFLOW_TYPE);
+
+        Node endNode = new EndNode();
+        endNode.setId(1);
+        endNode.setName("end node");
+
+        Node taskNode = new HumanTaskNode();
+        taskNode.setId(2);
+        taskNode.setName("human task");
+        new ConnectionImpl(taskNode, Node.CONNECTION_DEFAULT_TYPE, endNode, 
Node.CONNECTION_DEFAULT_TYPE);
+
+        Node startNode = new StartNode();
+        startNode.setId(0);
+        startNode.setName("start node");
+        new ConnectionImpl(startNode, Node.CONNECTION_DEFAULT_TYPE, taskNode, 
Node.CONNECTION_DEFAULT_TYPE);
+
+        workflow.addNode(startNode);
+        workflow.addNode(taskNode);
+        workflow.addNode(endNode);
+
+        process = mock(AbstractProcess.class);
+
+        when(process.get()).thenReturn(workflow);
+    }
 
     public static class MarshableObject implements Serializable {
 
@@ -85,6 +141,29 @@ public class ProcessInstanceMarshallTest {
         }
     }
 
+    private static Stream<Arguments> testProcessInstanceMarshalling() {
+        return Stream.of(Arguments.of(buildInstance(false)),
+                (Arguments.of(buildInstance(true))));
+    }
+
+    private static RuleFlowProcessInstance buildInstance(boolean orphan) {
+        RuleFlowProcessInstance instance = new RuleFlowProcessInstance();
+        instance.setId(PROCESS_INSTANCE_ID);
+        instance.setStartDate(new Date());
+        instance.setDescription(PROCESS_DESCRIPTION);
+
+        if (!orphan) {
+            instance.setRootProcessInstanceId(ROOT_PROCESS_INSTANCE_ID);
+            instance.setRootProcessId(ROOT_PROCESS_ID);
+            instance.setParentProcessInstanceId(PARENT_PROCESS_ID);
+        }
+
+        instance.setProcess(workflow);
+        instance.setContextInstance(VariableScope.VARIABLE_SCOPE, new 
VariableScopeInstance());
+
+        return instance;
+    }
+
     private static Stream<Arguments> testRoundTrip() throws Exception {
         return Stream.of(
                 Arguments.of(1),
@@ -109,6 +188,37 @@ public class ProcessInstanceMarshallTest {
         );
     }
 
+    @ParameterizedTest
+    @MethodSource
+    public void testProcessInstanceMarshalling(RuleFlowProcessInstance 
toMarshall) throws Exception {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        ProtobufProcessMarshallerWriteContext ctxOut = new 
ProtobufProcessMarshallerWriteContext(out);
+        ctxOut.set(MarshallerContextName.OBJECT_MARSHALLING_STRATEGIES, 
defaultStrategies());
+
+        ProtobufProcessInstanceWriter writer = new 
ProtobufProcessInstanceWriter(ctxOut);
+
+        writer.writeProcessInstance(toMarshall, out);
+
+        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+        ProtobufMarshallerReaderContext ctxIn = new 
ProtobufMarshallerReaderContext(in);
+        ctxIn.set(MarshallerContextName.OBJECT_MARSHALLING_STRATEGIES, 
defaultStrategies());
+        ctxIn.set(MarshallerContextName.MARSHALLER_PROCESS, process);
+        ProtobufProcessInstanceReader reader = new 
ProtobufProcessInstanceReader(ctxIn);
+        RuleFlowProcessInstance unmarshalled = reader.read(in);
+
+        assertThat(unmarshalled)
+                .hasFieldOrPropertyWithValue("id", toMarshall.getId())
+                .hasFieldOrPropertyWithValue("state", toMarshall.getState())
+                .hasFieldOrPropertyWithValue("startDate", 
toMarshall.getStartDate())
+                .hasFieldOrPropertyWithValue("processId", 
toMarshall.getProcessId())
+                .hasFieldOrPropertyWithValue("processVersion", 
toMarshall.getProcessVersion())
+                .hasFieldOrPropertyWithValue("description", 
toMarshall.getDescription())
+                .hasFieldOrPropertyWithValue("rootProcessInstanceId", 
toMarshall.getRootProcessInstanceId())
+                .hasFieldOrPropertyWithValue("rootProcessId", 
toMarshall.getRootProcessId())
+                .hasFieldOrPropertyWithValue("parentProcessInstanceId", 
toMarshall.getParentProcessInstanceId())
+                .hasFieldOrPropertyWithValue("process", 
toMarshall.getProcess());
+    }
+
     @ParameterizedTest
     @MethodSource
     @NullSource


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

Reply via email to