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 b896f93a62 [Fix apache/incubator-kie-issues#987] New onError event 
(#3428)
b896f93a62 is described below

commit b896f93a621a75cef3bbe9e2af0df227dd21f4b4
Author: Francisco Javier Tirado Sarti 
<[email protected]>
AuthorDate: Thu Mar 7 10:44:49 2024 +0100

    [Fix apache/incubator-kie-issues#987] New onError event (#3428)
    
    * [Fix apache/incubator-kie-issues#987] New onError event
    
    * [Fix apache/incubator-kie-issues#987] Adding unit test
    
    * [Fix apache/incubator-kie-issues#987] Refactor ProcessNodeEvent children
    
    Although not strictly needed by the PR, for future additions, a new
    class in the hierarchy that holds the NodeInstance reference has been
    included.
    fields has been made final to remark that event objects are inmutable
---
 .../process/event/KogitoProcessEventSupport.java   |   5 +-
 .../uow/events/UnitOfWorkProcessEventListener.java |   9 +-
 .../event/impl/ProcessInstanceEventBatch.java      | 127 +++++++++------------
 .../event/impl/ProcessInstanceEventBatchTest.java  |  56 +++++++++
 ...ventImpl.java => AbstractProcessNodeEvent.java} |  34 ++----
 .../{SignalEventImpl.java => ErrorEventImpl.java}  |  35 ++----
 .../event/KogitoProcessEventSupportImpl.java       |   6 +
 .../event/KogitoProcessNodeLeftEventImpl.java      |  13 +--
 .../event/KogitoProcessNodeTriggeredEventImpl.java |  12 +-
 .../process/instance/event/MessageEventImpl.java   |  17 +--
 .../process/instance/event/SignalEventImpl.java    |  17 +--
 .../instance/impl/WorkflowProcessInstanceImpl.java |   1 +
 12 files changed, 158 insertions(+), 174 deletions(-)

diff --git 
a/api/kogito-api/src/main/java/org/kie/kogito/internal/process/event/KogitoProcessEventSupport.java
 
b/api/kogito-api/src/main/java/org/kie/kogito/internal/process/event/KogitoProcessEventSupport.java
index d0a2bc155c..01fffac0f4 100644
--- 
a/api/kogito-api/src/main/java/org/kie/kogito/internal/process/event/KogitoProcessEventSupport.java
+++ 
b/api/kogito-api/src/main/java/org/kie/kogito/internal/process/event/KogitoProcessEventSupport.java
@@ -158,12 +158,11 @@ public interface KogitoProcessEventSupport {
             KieRuntime kruntime,
             Comment addedComment);
 
-    // 
-
     void reset();
 
     void addEventListener(KogitoProcessEventListener listener);
 
     void removeEventListener(KogitoProcessEventListener listener);
 
-}
\ No newline at end of file
+    void fireOnError(KogitoProcessInstance instance, KogitoNodeInstance 
nodeInstance, KieRuntime kruntime, Exception exception);
+}
diff --git 
a/api/kogito-api/src/main/java/org/kie/kogito/uow/events/UnitOfWorkProcessEventListener.java
 
b/api/kogito-api/src/main/java/org/kie/kogito/uow/events/UnitOfWorkProcessEventListener.java
index e2998dfc5a..0696688a8d 100644
--- 
a/api/kogito-api/src/main/java/org/kie/kogito/uow/events/UnitOfWorkProcessEventListener.java
+++ 
b/api/kogito-api/src/main/java/org/kie/kogito/uow/events/UnitOfWorkProcessEventListener.java
@@ -18,6 +18,7 @@
  */
 package org.kie.kogito.uow.events;
 
+import org.kie.api.event.process.ErrorEvent;
 import org.kie.api.event.process.MessageEvent;
 import org.kie.api.event.process.ProcessCompletedEvent;
 import org.kie.api.event.process.ProcessEvent;
@@ -59,12 +60,11 @@ public class UnitOfWorkProcessEventListener extends 
DefaultKogitoProcessEventLis
 
     @Override
     public void beforeProcessStarted(ProcessStartedEvent event) {
-
+        intercept(event);
     }
 
     @Override
     public void afterProcessStarted(ProcessStartedEvent event) {
-        intercept(event);
     }
 
     @Override
@@ -193,4 +193,9 @@ public class UnitOfWorkProcessEventListener extends 
DefaultKogitoProcessEventLis
         intercept(event);
     }
 
+    @Override
+    public void onError(ErrorEvent event) {
+        intercept(event);
+    }
+
 }
diff --git 
a/api/kogito-events-core/src/main/java/org/kie/kogito/event/impl/ProcessInstanceEventBatch.java
 
b/api/kogito-events-core/src/main/java/org/kie/kogito/event/impl/ProcessInstanceEventBatch.java
index 0802570959..9d55dff1b9 100644
--- 
a/api/kogito-events-core/src/main/java/org/kie/kogito/event/impl/ProcessInstanceEventBatch.java
+++ 
b/api/kogito-events-core/src/main/java/org/kie/kogito/event/impl/ProcessInstanceEventBatch.java
@@ -19,13 +19,15 @@
 package org.kie.kogito.event.impl;
 
 import java.time.Instant;
-import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
+import java.util.TreeSet;
 
+import org.kie.api.event.process.ErrorEvent;
 import org.kie.api.event.process.ProcessCompletedEvent;
 import org.kie.api.event.process.ProcessEvent;
 import org.kie.api.event.process.ProcessNodeEvent;
@@ -38,7 +40,6 @@ import org.kie.api.event.usertask.UserTaskAssignmentEvent;
 import org.kie.api.event.usertask.UserTaskAttachmentEvent;
 import org.kie.api.event.usertask.UserTaskCommentEvent;
 import org.kie.api.event.usertask.UserTaskDeadlineEvent;
-import org.kie.api.event.usertask.UserTaskEvent;
 import org.kie.api.event.usertask.UserTaskStateEvent;
 import org.kie.api.event.usertask.UserTaskVariableEvent;
 import org.kie.kogito.Addons;
@@ -70,7 +71,6 @@ import 
org.kie.kogito.event.usertask.UserTaskInstanceVariableDataEvent;
 import org.kie.kogito.event.usertask.UserTaskInstanceVariableEventBody;
 import org.kie.kogito.internal.process.event.KogitoProcessVariableChangedEvent;
 import org.kie.kogito.internal.process.runtime.KogitoNodeInstance;
-import org.kie.kogito.internal.process.runtime.KogitoProcessInstance;
 import org.kie.kogito.internal.process.runtime.KogitoWorkItem;
 import org.kie.kogito.internal.process.runtime.KogitoWorkItemNodeInstance;
 import org.kie.kogito.internal.process.runtime.KogitoWorkflowProcessInstance;
@@ -86,25 +86,19 @@ public class ProcessInstanceEventBatch implements 
EventBatch {
     public ProcessInstanceEventBatch(String service, Addons addons) {
         this.service = service;
         this.addons = addons != null ? addons : Addons.EMTPY;
-        this.processedEvents = new ArrayList<>();
-    }
-
-    @Override
-    public void append(Object rawEvent) {
-        if (rawEvent instanceof ProcessEvent) {
-            addDataEvent((ProcessEvent) rawEvent);
-        } else if (rawEvent instanceof UserTaskEvent) {
-            addDataEvent((UserTaskEvent) rawEvent);
-        }
+        this.processedEvents = new TreeSet<>(new Comparator<DataEvent<?>>() {
+            @Override
+            public int compare(DataEvent<?> event1, DataEvent<?> event2) {
+                return event2 instanceof ProcessInstanceStateDataEvent &&
+                        ((ProcessInstanceStateDataEvent) 
event2).getData().getEventType() == 
ProcessInstanceStateEventBody.EVENT_TYPE_ENDED
+                        || event1 instanceof ProcessInstanceStateDataEvent &&
+                                ((ProcessInstanceStateDataEvent) 
event1).getData().getEventType() == 
ProcessInstanceStateEventBody.EVENT_TYPE_STARTED ? -1 : 1;
+            }
+        });
     }
 
     @Override
-    public Collection<DataEvent<?>> events() {
-        return processedEvents;
-    }
-
-    private void addDataEvent(ProcessEvent event) {
-        // process events
+    public void append(Object event) {
         if (event instanceof ProcessStartedEvent) {
             handleProcessStateEvent((ProcessStartedEvent) event);
         } else if (event instanceof ProcessCompletedEvent) {
@@ -117,9 +111,28 @@ public class ProcessInstanceEventBatch implements 
EventBatch {
             handleProcesssNodeEvent((SLAViolatedEvent) event);
         } else if (event instanceof ProcessVariableChangedEvent) {
             handleProcessVariableEvent((ProcessVariableChangedEvent) event);
+        } else if (event instanceof ErrorEvent) {
+            handleErrorEvent((ErrorEvent) event);
+        } else if (event instanceof UserTaskStateEvent) {
+            handleUserTaskStateEvent((UserTaskStateEvent) event);
+        } else if (event instanceof UserTaskDeadlineEvent) {
+            handleUserTaskDeadlineEvent((UserTaskDeadlineEvent) event);
+        } else if (event instanceof UserTaskAssignmentEvent) {
+            handleUserTaskAssignmentEvent((UserTaskAssignmentEvent) event);
+        } else if (event instanceof UserTaskVariableEvent) {
+            handleUserTaskVariableEvent((UserTaskVariableEvent) event);
+        } else if (event instanceof UserTaskAttachmentEvent) {
+            handleUserTaskAttachmentEvent((UserTaskAttachmentEvent) event);
+        } else if (event instanceof UserTaskCommentEvent) {
+            handleUserTaskCommentEvent((UserTaskCommentEvent) event);
         }
     }
 
+    @Override
+    public Collection<DataEvent<?>> events() {
+        return processedEvents;
+    }
+
     private void handleProcessVariableEvent(ProcessVariableChangedEvent event) 
{
         if (event.getTags().contains(KogitoTags.INTERNAL_TAG)) {
             return;
@@ -245,52 +258,31 @@ public class ProcessInstanceEventBatch implements 
EventBatch {
         return piEvent;
     }
 
-    private void handleProcessStateEvent(ProcessCompletedEvent event) {
+    private void handleErrorEvent(ErrorEvent event) {
+        KogitoWorkflowProcessInstance pi = (KogitoWorkflowProcessInstance) 
event.getProcessInstance();
+        ProcessInstanceErrorEventBody errorBody = 
ProcessInstanceErrorEventBody.create()
+                .eventDate(new Date())
+                .eventUser(event.getEventIdentity())
+                .processInstanceId(pi.getId())
+                .processId(pi.getProcessId())
+                .processVersion(pi.getProcessVersion())
+                .nodeDefinitionId(pi.getNodeIdInError())
+                .nodeInstanceId(pi.getNodeInstanceIdInError())
+                .errorMessage(pi.getErrorMessage())
+                .build();
+        Map<String, Object> metadata = 
buildProcessMetadata((KogitoWorkflowProcessInstance) 
event.getProcessInstance());
+        ProcessInstanceErrorDataEvent piEvent =
+                new 
ProcessInstanceErrorDataEvent(buildSource(event.getProcessInstance().getProcessId()),
 addons.toString(), event.getEventIdentity(), metadata, errorBody);
+        piEvent.setKogitoBusinessKey(pi.getBusinessKey());
+        processedEvents.add(piEvent);
+    }
 
+    private void handleProcessStateEvent(ProcessCompletedEvent event) {
         processedEvents.add(toProcessInstanceStateEvent(event, 
ProcessInstanceStateEventBody.EVENT_TYPE_ENDED));
-
-        KogitoWorkflowProcessInstance pi = (KogitoWorkflowProcessInstance) 
event.getProcessInstance();
-        if (pi.getState() == KogitoProcessInstance.STATE_ERROR) {
-            ProcessInstanceErrorEventBody errorBody = 
ProcessInstanceErrorEventBody.create()
-                    .eventDate(new Date())
-                    .eventUser(event.getEventIdentity())
-                    .processInstanceId(pi.getId())
-                    .processId(pi.getProcessId())
-                    .processVersion(pi.getProcessVersion())
-                    .nodeDefinitionId(pi.getNodeIdInError())
-                    .nodeInstanceId(pi.getNodeInstanceIdInError())
-                    .errorMessage(pi.getErrorMessage())
-                    .build();
-            Map<String, Object> metadata = 
buildProcessMetadata((KogitoWorkflowProcessInstance) 
event.getProcessInstance());
-            ProcessInstanceErrorDataEvent piEvent =
-                    new 
ProcessInstanceErrorDataEvent(buildSource(event.getProcessInstance().getProcessId()),
 addons.toString(), event.getEventIdentity(), metadata, errorBody);
-            piEvent.setKogitoBusinessKey(pi.getBusinessKey());
-            processedEvents.add(piEvent);
-        }
     }
 
     private void handleProcessStateEvent(ProcessStartedEvent event) {
         processedEvents.add(toProcessInstanceStateEvent(event, 
ProcessInstanceStateEventBody.EVENT_TYPE_STARTED));
-
-        KogitoWorkflowProcessInstance pi = (KogitoWorkflowProcessInstance) 
event.getProcessInstance();
-        if (pi.getState() == KogitoProcessInstance.STATE_ERROR) {
-            ProcessInstanceErrorEventBody errorBody = 
ProcessInstanceErrorEventBody.create()
-                    .eventDate(new Date())
-                    .eventUser(event.getEventIdentity())
-                    .processInstanceId(pi.getId())
-                    .processId(pi.getProcessId())
-                    .processVersion(pi.getProcessVersion())
-                    .nodeDefinitionId(pi.getNodeIdInError())
-                    .nodeInstanceId(pi.getNodeInstanceIdInError())
-                    .errorMessage(pi.getErrorMessage())
-                    .build();
-            Map<String, Object> metadata = 
buildProcessMetadata((KogitoWorkflowProcessInstance) 
event.getProcessInstance());
-            ProcessInstanceErrorDataEvent piEvent =
-                    new 
ProcessInstanceErrorDataEvent(buildSource(event.getProcessInstance().getProcessId()),
 addons.toString(), event.getEventIdentity(), metadata, errorBody);
-            piEvent.setKogitoBusinessKey(pi.getBusinessKey());
-            processedEvents.add(piEvent);
-        }
-
     }
 
     private ProcessInstanceStateDataEvent 
toProcessInstanceStateEvent(ProcessEvent event, int eventType) {
@@ -339,23 +331,6 @@ public class ProcessInstanceEventBatch implements 
EventBatch {
         return metadata;
     }
 
-    private void addDataEvent(UserTaskEvent event) {
-        // this should go in another event types
-        if (event instanceof UserTaskStateEvent) {
-            handleUserTaskStateEvent((UserTaskStateEvent) event);
-        } else if (event instanceof UserTaskDeadlineEvent) {
-            handleUserTaskDeadlineEvent((UserTaskDeadlineEvent) event);
-        } else if (event instanceof UserTaskAssignmentEvent) {
-            handleUserTaskAssignmentEvent((UserTaskAssignmentEvent) event);
-        } else if (event instanceof UserTaskVariableEvent) {
-            handleUserTaskVariableEvent((UserTaskVariableEvent) event);
-        } else if (event instanceof UserTaskAttachmentEvent) {
-            handleUserTaskAttachmentEvent((UserTaskAttachmentEvent) event);
-        } else if (event instanceof UserTaskCommentEvent) {
-            handleUserTaskCommentEvent((UserTaskCommentEvent) event);
-        }
-    }
-
     private void handleUserTaskCommentEvent(UserTaskCommentEvent event) {
         Map<String, Object> metadata = 
buildUserTaskMetadata((HumanTaskWorkItem) event.getWorkItem());
         metadata.putAll(buildProcessMetadata((KogitoWorkflowProcessInstance) 
event.getProcessInstance()));
diff --git 
a/api/kogito-events-core/src/test/java/org/kie/kogito/event/impl/ProcessInstanceEventBatchTest.java
 
b/api/kogito-events-core/src/test/java/org/kie/kogito/event/impl/ProcessInstanceEventBatchTest.java
index 4b117d04a5..b4326cc228 100644
--- 
a/api/kogito-events-core/src/test/java/org/kie/kogito/event/impl/ProcessInstanceEventBatchTest.java
+++ 
b/api/kogito-events-core/src/test/java/org/kie/kogito/event/impl/ProcessInstanceEventBatchTest.java
@@ -19,6 +19,25 @@
 package org.kie.kogito.event.impl;
 
 import org.junit.jupiter.api.Test;
+import org.kie.api.event.process.ErrorEvent;
+import org.kie.api.event.process.ProcessCompletedEvent;
+import org.kie.api.event.process.ProcessEvent;
+import org.kie.api.event.process.ProcessNodeEvent;
+import org.kie.api.event.process.ProcessNodeLeftEvent;
+import org.kie.api.event.process.ProcessNodeTriggeredEvent;
+import org.kie.api.event.process.ProcessStartedEvent;
+import org.kie.api.event.process.ProcessVariableChangedEvent;
+import org.kie.api.runtime.process.NodeInstance;
+import org.kie.api.runtime.process.ProcessInstance;
+import org.kie.kogito.event.process.ProcessInstanceErrorDataEvent;
+import org.kie.kogito.event.process.ProcessInstanceNodeDataEvent;
+import org.kie.kogito.event.process.ProcessInstanceStateDataEvent;
+import org.kie.kogito.event.process.ProcessInstanceVariableDataEvent;
+import org.kie.kogito.internal.process.runtime.KogitoNode;
+import org.kie.kogito.internal.process.runtime.KogitoNodeInstance;
+import org.kie.kogito.internal.process.runtime.KogitoWorkflowProcess;
+import org.kie.kogito.internal.process.runtime.KogitoWorkflowProcessInstance;
+import org.mockito.Mockito;
 
 import static java.util.Collections.emptyMap;
 import static java.util.Collections.singletonMap;
@@ -49,4 +68,41 @@ public class ProcessInstanceEventBatchTest {
         
assertThat(batch.extractRuntimeSource(singletonMap(PROCESS_ID_META_DATA, 
"demo.orders"))).isEqualTo("http://localhost:8080/orders";);
     }
 
+    @Test
+    public void testEventSorting() {
+        ProcessInstanceEventBatch batch = new ProcessInstanceEventBatch("", 
null);
+        KogitoWorkflowProcess process = 
Mockito.mock(KogitoWorkflowProcess.class);
+        KogitoWorkflowProcessInstance processInstance = 
Mockito.mock(KogitoWorkflowProcessInstance.class);
+        KogitoNodeInstance nodeInstance = 
Mockito.mock(KogitoNodeInstance.class);
+        KogitoNode node = Mockito.mock(KogitoNode.class);
+        Mockito.when(processInstance.getProcess()).thenReturn(process);
+        Mockito.when(nodeInstance.getNode()).thenReturn(node);
+        batch.append(mockEvent(ProcessVariableChangedEvent.class, 
processInstance));
+        batch.append(mockEvent(ProcessNodeTriggeredEvent.class, 
processInstance, nodeInstance));
+        batch.append(mockEvent(ProcessNodeLeftEvent.class, processInstance, 
nodeInstance));
+        batch.append(mockEvent(ProcessStartedEvent.class, processInstance));
+        batch.append(mockEvent(ProcessNodeTriggeredEvent.class, 
processInstance, nodeInstance));
+        batch.append(mockEvent(ProcessNodeLeftEvent.class, processInstance, 
nodeInstance));
+        batch.append(mockEvent(ErrorEvent.class, processInstance, 
nodeInstance));
+        batch.append(mockEvent(ProcessCompletedEvent.class, processInstance));
+        batch.append(mockEvent(ProcessNodeTriggeredEvent.class, 
processInstance, nodeInstance));
+        batch.append(mockEvent(ProcessNodeLeftEvent.class, processInstance, 
nodeInstance));
+        
assertThat(batch.processedEvents).hasExactlyElementsOfTypes(ProcessInstanceStateDataEvent.class,
 ProcessInstanceVariableDataEvent.class, ProcessInstanceNodeDataEvent.class,
+                ProcessInstanceNodeDataEvent.class,
+                ProcessInstanceNodeDataEvent.class, 
ProcessInstanceNodeDataEvent.class, ProcessInstanceErrorDataEvent.class, 
ProcessInstanceNodeDataEvent.class, ProcessInstanceNodeDataEvent.class,
+                ProcessInstanceStateDataEvent.class);
+    }
+
+    private <T extends ProcessEvent> T mockEvent(Class<T> clazz, 
ProcessInstance processInstance) {
+        T event = Mockito.mock(clazz);
+        Mockito.when(event.getProcessInstance()).thenReturn(processInstance);
+        return event;
+    }
+
+    private <T extends ProcessNodeEvent> T mockEvent(Class<T> clazz, 
ProcessInstance processInstance, NodeInstance nodeInstance) {
+        T event = Mockito.mock(clazz);
+        Mockito.when(event.getProcessInstance()).thenReturn(processInstance);
+        Mockito.when(event.getNodeInstance()).thenReturn(nodeInstance);
+        return event;
+    }
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/SignalEventImpl.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/AbstractProcessNodeEvent.java
similarity index 57%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/SignalEventImpl.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/AbstractProcessNodeEvent.java
index ec2b01cae2..9ad5cc225e 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/SignalEventImpl.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/AbstractProcessNodeEvent.java
@@ -18,24 +18,23 @@
  */
 package org.jbpm.process.instance.event;
 
-import org.kie.api.event.process.SignalEvent;
+import org.kie.api.event.process.ProcessNodeEvent;
 import org.kie.api.runtime.KieRuntime;
 import org.kie.api.runtime.process.NodeInstance;
 import org.kie.api.runtime.process.ProcessInstance;
 
-public class SignalEventImpl extends ProcessEvent implements SignalEvent {
+public abstract class AbstractProcessNodeEvent extends ProcessEvent implements 
ProcessNodeEvent {
 
-    private static final long serialVersionUID = 1L;
-    private NodeInstance nodeInstance;
-    private String signalName;
-    private Object signalObject;
+    private final NodeInstance nodeInstance;
 
-    public SignalEventImpl(ProcessInstance instance, KieRuntime kruntime, 
NodeInstance nodeInstance,
-            String signalName, Object signalObject, String identity) {
+    protected AbstractProcessNodeEvent(NodeInstance nodeInstance, 
ProcessInstance instance, KieRuntime kruntime) {
+        super(instance, kruntime);
+        this.nodeInstance = nodeInstance;
+    }
+
+    protected AbstractProcessNodeEvent(NodeInstance nodeInstance, 
ProcessInstance instance, KieRuntime kruntime, String identity) {
         super(instance, kruntime, identity);
         this.nodeInstance = nodeInstance;
-        this.signalName = signalName;
-        this.signalObject = signalObject;
     }
 
     @Override
@@ -43,19 +42,4 @@ public class SignalEventImpl extends ProcessEvent implements 
SignalEvent {
         return nodeInstance;
     }
 
-    @Override
-    public String getSignalName() {
-        return signalName;
-    }
-
-    @Override
-    public Object getSignal() {
-        return signalObject;
-    }
-
-    @Override
-    public String toString() {
-        return "SignalEventImpl [nodeInstance=" + nodeInstance + ", 
signalName=" + signalName + ", signalObject=" +
-                signalObject + "]";
-    }
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/SignalEventImpl.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/ErrorEventImpl.java
similarity index 54%
copy from 
jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/SignalEventImpl.java
copy to 
jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/ErrorEventImpl.java
index ec2b01cae2..b6e3488c5e 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/SignalEventImpl.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/ErrorEventImpl.java
@@ -18,44 +18,29 @@
  */
 package org.jbpm.process.instance.event;
 
-import org.kie.api.event.process.SignalEvent;
+import org.kie.api.event.process.ErrorEvent;
 import org.kie.api.runtime.KieRuntime;
 import org.kie.api.runtime.process.NodeInstance;
 import org.kie.api.runtime.process.ProcessInstance;
 
-public class SignalEventImpl extends ProcessEvent implements SignalEvent {
+public class ErrorEventImpl extends AbstractProcessNodeEvent implements 
ErrorEvent {
 
     private static final long serialVersionUID = 1L;
-    private NodeInstance nodeInstance;
-    private String signalName;
-    private Object signalObject;
+    private final Exception exception;
 
-    public SignalEventImpl(ProcessInstance instance, KieRuntime kruntime, 
NodeInstance nodeInstance,
-            String signalName, Object signalObject, String identity) {
-        super(instance, kruntime, identity);
-        this.nodeInstance = nodeInstance;
-        this.signalName = signalName;
-        this.signalObject = signalObject;
+    public ErrorEventImpl(ProcessInstance instance, KieRuntime kruntime, 
NodeInstance nodeInstance,
+            Exception exception) {
+        super(nodeInstance, instance, kruntime);
+        this.exception = exception;
     }
 
     @Override
-    public NodeInstance getNodeInstance() {
-        return nodeInstance;
-    }
-
-    @Override
-    public String getSignalName() {
-        return signalName;
-    }
-
-    @Override
-    public Object getSignal() {
-        return signalObject;
+    public Exception getException() {
+        return exception;
     }
 
     @Override
     public String toString() {
-        return "SignalEventImpl [nodeInstance=" + nodeInstance + ", 
signalName=" + signalName + ", signalObject=" +
-                signalObject + "]";
+        return "ErrorEventImpl [nodeInstance=" + getNodeInstance() + ", 
exception=" + exception + "]";
     }
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/KogitoProcessEventSupportImpl.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/KogitoProcessEventSupportImpl.java
index 2a87fcd4c9..4bbd231485 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/KogitoProcessEventSupportImpl.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/KogitoProcessEventSupportImpl.java
@@ -367,4 +367,10 @@ public class KogitoProcessEventSupportImpl implements 
KogitoProcessEventSupport
         this.clear();
     }
 
+    @Override
+    public void fireOnError(KogitoProcessInstance instance, KogitoNodeInstance 
nodeInstance, KieRuntime kruntime, Exception exception) {
+        ErrorEventImpl event = new ErrorEventImpl(instance, kruntime, 
nodeInstance, exception);
+        notifyAllListeners(l -> l.onError(event));
+    }
+
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/KogitoProcessNodeLeftEventImpl.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/KogitoProcessNodeLeftEventImpl.java
index 9fa10db97e..be9a0262f5 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/KogitoProcessNodeLeftEventImpl.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/KogitoProcessNodeLeftEventImpl.java
@@ -23,24 +23,17 @@ import org.kie.api.runtime.KieRuntime;
 import org.kie.api.runtime.process.NodeInstance;
 import org.kie.kogito.internal.process.runtime.KogitoNodeInstance;
 
-public class KogitoProcessNodeLeftEventImpl extends ProcessEvent implements 
ProcessNodeLeftEvent {
+public class KogitoProcessNodeLeftEventImpl extends AbstractProcessNodeEvent 
implements ProcessNodeLeftEvent {
 
     private static final long serialVersionUID = 510l;
 
-    private NodeInstance nodeInstance;
-
     public KogitoProcessNodeLeftEventImpl(NodeInstance nodeInstance, 
KieRuntime kruntime, String identity) {
-        super(nodeInstance.getProcessInstance(), kruntime, identity);
-        this.nodeInstance = nodeInstance;
-    }
-
-    public NodeInstance getNodeInstance() {
-        return nodeInstance;
+        super(nodeInstance, nodeInstance.getProcessInstance(), kruntime, 
identity);
     }
 
     @Override
     public String toString() {
-        return "==>[ProcessNodeLeft(nodeId=" + nodeInstance.getNodeId() + "; 
id=" + ((KogitoNodeInstance) nodeInstance).getStringId()
+        return "==>[ProcessNodeLeft(nodeId=" + getNodeInstance().getNodeId() + 
"; id=" + ((KogitoNodeInstance) getNodeInstance()).getStringId()
                 + "; nodeName=" + getNodeInstance().getNodeName() + "; 
processName=" + getProcessInstance().getProcessName() + "; processId=" + 
getProcessInstance().getProcessId() + ")]";
     }
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/KogitoProcessNodeTriggeredEventImpl.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/KogitoProcessNodeTriggeredEventImpl.java
index 9882ac6f02..f47ae40765 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/KogitoProcessNodeTriggeredEventImpl.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/KogitoProcessNodeTriggeredEventImpl.java
@@ -23,24 +23,18 @@ import org.kie.api.runtime.KieRuntime;
 import org.kie.api.runtime.process.NodeInstance;
 import org.kie.kogito.internal.process.runtime.KogitoNodeInstance;
 
-public class KogitoProcessNodeTriggeredEventImpl extends ProcessEvent 
implements ProcessNodeTriggeredEvent {
+public class KogitoProcessNodeTriggeredEventImpl extends 
AbstractProcessNodeEvent implements ProcessNodeTriggeredEvent {
 
     private static final long serialVersionUID = 510l;
 
-    private NodeInstance nodeInstance;
-
     public KogitoProcessNodeTriggeredEventImpl(NodeInstance nodeInstance, 
KieRuntime kruntime, String identity) {
-        super(nodeInstance.getProcessInstance(), kruntime, identity);
-        this.nodeInstance = nodeInstance;
-    }
+        super(nodeInstance, nodeInstance.getProcessInstance(), kruntime, 
identity);
 
-    public NodeInstance getNodeInstance() {
-        return nodeInstance;
     }
 
     @Override
     public String toString() {
-        return "==>[ProcessNodeTriggered(nodeId=" + nodeInstance.getNodeId() + 
"; id=" + ((KogitoNodeInstance) nodeInstance).getStringId()
+        return "==>[ProcessNodeTriggered(nodeId=" + 
getNodeInstance().getNodeId() + "; id=" + ((KogitoNodeInstance) 
getNodeInstance()).getStringId()
                 + "; nodeName=" + getNodeInstance().getNodeName() + "; 
processName=" + getProcessInstance().getProcessName() + "; processId=" + 
getProcessInstance().getProcessId() + ")]";
     }
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/MessageEventImpl.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/MessageEventImpl.java
index 25882a3602..b74e1d6508 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/MessageEventImpl.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/MessageEventImpl.java
@@ -23,26 +23,19 @@ import org.kie.api.runtime.KieRuntime;
 import org.kie.api.runtime.process.NodeInstance;
 import org.kie.api.runtime.process.ProcessInstance;
 
-public class MessageEventImpl extends ProcessEvent implements MessageEvent {
+public class MessageEventImpl extends AbstractProcessNodeEvent implements 
MessageEvent {
 
     private static final long serialVersionUID = 1L;
-    private NodeInstance nodeInstance;
-    private String messageName;
-    private Object messageObject;
+    private final String messageName;
+    private final Object messageObject;
 
     public MessageEventImpl(ProcessInstance instance, KieRuntime kruntime, 
NodeInstance nodeInstance,
             String messageName, Object messageObject, String identity) {
-        super(instance, kruntime, identity);
-        this.nodeInstance = nodeInstance;
+        super(nodeInstance, instance, kruntime, identity);
         this.messageName = messageName;
         this.messageObject = messageObject;
     }
 
-    @Override
-    public NodeInstance getNodeInstance() {
-        return nodeInstance;
-    }
-
     @Override
     public String getMessageName() {
         return messageName;
@@ -55,7 +48,7 @@ public class MessageEventImpl extends ProcessEvent implements 
MessageEvent {
 
     @Override
     public String toString() {
-        return "MessageEventImpl [nodeInstance=" + nodeInstance + ", 
messageName=" + messageName + ", messageObject=" +
+        return "MessageEventImpl [nodeInstance=" + getNodeInstance() + ", 
messageName=" + messageName + ", messageObject=" +
                 messageObject + "]";
     }
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/SignalEventImpl.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/SignalEventImpl.java
index ec2b01cae2..55fb834c3d 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/SignalEventImpl.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/event/SignalEventImpl.java
@@ -23,26 +23,19 @@ import org.kie.api.runtime.KieRuntime;
 import org.kie.api.runtime.process.NodeInstance;
 import org.kie.api.runtime.process.ProcessInstance;
 
-public class SignalEventImpl extends ProcessEvent implements SignalEvent {
+public class SignalEventImpl extends AbstractProcessNodeEvent implements 
SignalEvent {
 
     private static final long serialVersionUID = 1L;
-    private NodeInstance nodeInstance;
-    private String signalName;
-    private Object signalObject;
+    private final String signalName;
+    private final Object signalObject;
 
     public SignalEventImpl(ProcessInstance instance, KieRuntime kruntime, 
NodeInstance nodeInstance,
             String signalName, Object signalObject, String identity) {
-        super(instance, kruntime, identity);
-        this.nodeInstance = nodeInstance;
+        super(nodeInstance, instance, kruntime, identity);
         this.signalName = signalName;
         this.signalObject = signalObject;
     }
 
-    @Override
-    public NodeInstance getNodeInstance() {
-        return nodeInstance;
-    }
-
     @Override
     public String getSignalName() {
         return signalName;
@@ -55,7 +48,7 @@ public class SignalEventImpl extends ProcessEvent implements 
SignalEvent {
 
     @Override
     public String toString() {
-        return "SignalEventImpl [nodeInstance=" + nodeInstance + ", 
signalName=" + signalName + ", signalObject=" +
+        return "SignalEventImpl [nodeInstance=" + getNodeInstance() + ", 
signalName=" + signalName + ", signalObject=" +
                 signalObject + "]";
     }
 }
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/WorkflowProcessInstanceImpl.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/WorkflowProcessInstanceImpl.java
index e13e3d5024..437b054eec 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/WorkflowProcessInstanceImpl.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/WorkflowProcessInstanceImpl.java
@@ -1149,6 +1149,7 @@ public abstract class WorkflowProcessInstanceImpl extends 
ProcessInstanceImpl im
         this.errorMessage = rootException.getClass().getCanonicalName() + " - 
" + rootException.getMessage();
         setState(STATE_ERROR);
         logger.error("Unexpected error while executing node {} in process 
instance {}", nodeInstanceInError.getNode().getName(), this.getStringId(), e);
+        ((InternalProcessRuntime) 
getKnowledgeRuntime().getProcessRuntime()).getProcessEventSupport().fireOnError(this,
 nodeInstanceInError, getKnowledgeRuntime(), e);
         // remove node instance that caused an error
         ((org.jbpm.workflow.instance.NodeInstanceContainer) 
nodeInstanceInError.getNodeInstanceContainer()).removeNodeInstance(nodeInstanceInError);
     }


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

Reply via email to