From eae8c76d31d3b5b36c2a79de31070b1e02cad711 Mon Sep 17 00:00:00 2001 From: Francisco Javier Tirado Sarti <65240126+fjtirado@users.noreply.github.com> Date: Tue, 18 Mar 2025 13:48:14 +0100 Subject: [PATCH] [Fix apache/incubator-kie-issues#1857] Adding triggerCount (#2204) * [Fix apache/incubator-kie-issues#1857] Adding triggerCount * [Fix apache/incubator-kie-issues#1857] Adding isRetrigger * [Fix apache/incubator-kie-issues#1857] Clearing error * [Fix apache/incubator-kie-issues#1857] Adding IT test for retrigger --- .../src/main/resources/basic.schema.graphqls | 8 +++ .../kie/kogito/index/model/NodeInstance.java | 20 +++++++ .../index/model/ProcessInstanceError.java | 9 ++++ .../org/kie/kogito/index/test/TestUtils.java | 1 + .../query/AbstractProcessInstanceQueryIT.java | 12 +++++ .../ProcessInstanceErrorDataEventMerger.java | 16 ++++-- .../ProcessInstanceNodeDataEventMerger.java | 3 ++ .../ProcessInstanceStateDataEventMerger.java | 2 + .../protostream/NodeInstanceMarshaller.java | 5 ++ .../index/jpa/model/NodeInstanceEntity.java | 19 +++++++ .../jpa/model/ProcessInstanceErrorEntity.java | 31 ++++++----- .../storage/ProcessInstanceEntityStorage.java | 7 +++ .../AbstractProcessInstanceStorageIT.java | 4 +- .../data-index/ansi/V1.45.1.1__retrigger.sql | 22 ++++++++ .../mongodb/model/ProcessInstanceEntity.java | 54 ++++++++++++++----- .../model/ProcessInstanceEntityMapper.java | 6 +++ .../postgresql/V1.45.1.1__retrigger.sql | 21 ++++++++ .../resources/META-INF/kogito-index.proto | 2 + .../api/KogitoAddonRuntimeClientImpl.java | 12 ++--- .../api/KogitoAddonRuntimeClientImplTest.java | 2 +- 20 files changed, 218 insertions(+), 38 deletions(-) create mode 100644 data-index/data-index-storage/data-index-storage-jpa/src/main/resources/kie-flyway/db/data-index/ansi/V1.45.1.1__retrigger.sql create mode 100644 data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/kie-flyway/db/data-index/postgresql/V1.45.1.1__retrigger.sql diff --git a/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls b/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls index e3a2086b2c..7e568a493c 100644 --- a/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls +++ b/data-index/data-index-graphql/src/main/resources/basic.schema.graphqls @@ -106,6 +106,7 @@ type ProcessInstance { type ProcessInstanceError { nodeDefinitionId: String! + nodeInstanceId: String message: String } @@ -142,6 +143,8 @@ type NodeInstance { definitionId: String! nodeId: String! slaDueDate: DateTime + retrigger: Boolean + errorMessage: String } enum MilestoneStatus { @@ -207,6 +210,9 @@ input ProcessInstanceErrorArgument { } input NodeInstanceArgument { + and: [NodeInstanceArgument!] + or: [NodeInstanceArgument!] + not: NodeInstanceArgument id: IdArgument name: StringArgument definitionId: StringArgument @@ -214,6 +220,8 @@ input NodeInstanceArgument { type: StringArgument enter: DateArgument exit: DateArgument + errorMessage: StringArgument + retrigger: BooleanArgument } input MilestoneStatusArgument { diff --git a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/NodeInstance.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/NodeInstance.java index ab9df6cadd..96586f7038 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/NodeInstance.java +++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/NodeInstance.java @@ -40,6 +40,26 @@ public class NodeInstance { private ZonedDateTime slaDueDate; + private Boolean retrigger; + + private String errorMessage; + + public Boolean isRetrigger() { + return retrigger; + } + + public void setRetrigger(Boolean retrigger) { + this.retrigger = retrigger; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + @JsonProperty("nodeDefinitionId") private String definitionId; diff --git a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstanceError.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstanceError.java index 0023df32ed..7cdc5b7ec6 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstanceError.java +++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstanceError.java @@ -25,6 +25,7 @@ public class ProcessInstanceError { private String nodeDefinitionId; + private String nodeInstanceId; @JsonProperty("errorMessage") private String message; @@ -77,4 +78,12 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(nodeDefinitionId, message); } + + public String getNodeInstanceId() { + return nodeInstanceId; + } + + public void setNodeInstanceId(String nodeInstanceId) { + this.nodeInstanceId = nodeInstanceId; + } } diff --git a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/TestUtils.java b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/TestUtils.java index 954bbf4a24..ffbb87fc61 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/TestUtils.java +++ b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/TestUtils.java @@ -111,6 +111,7 @@ public static ProcessInstanceNodeDataEvent createProcessInstanceNodeDataEvent(St .nodeType(nodeType) .eventDate(new Date()) .eventType(eventType) + .setRetrigger(false) .build(); ProcessInstanceNodeDataEvent event = new ProcessInstanceNodeDataEvent(); diff --git a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessInstanceQueryIT.java b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessInstanceQueryIT.java index e92b8aeed0..cdb5c329ac 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessInstanceQueryIT.java +++ b/data-index/data-index-storage/data-index-storage-api/src/test/java/org/kie/kogito/index/test/query/AbstractProcessInstanceQueryIT.java @@ -49,4 +49,16 @@ void testProcessInstanceQuery() { processInstanceId); } + @Test + void testProcessRetriggerQuery() { + String processId = "no_retrigger"; + String processInstanceId = UUID.randomUUID().toString(); + String subProcessId = processId + "_sub"; + String subProcessInstanceId = UUID.randomUUID().toString(); + ProcessInstanceStorage storage = getStorage(); + storage.indexState(TestUtils.createProcessInstanceEvent(processInstanceId, processId, subProcessId, subProcessInstanceId, COMPLETED.ordinal())); + storage.indexNode(TestUtils.createProcessInstanceNodeDataEvent(processInstanceId, processId, "1", "1", "Javierito", "type", 1)); + storage.indexError(TestUtils.createProcessInstanceErrorDataEvent(processInstanceId, processId, "1", "kkdevaca", "1", "1")); + queryAndAssert(assertWithId(), storage, singletonList(equalTo("nodes.retrigger", false)), null, null, null, processInstanceId); + } } diff --git a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceErrorDataEventMerger.java b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceErrorDataEventMerger.java index 3408a7247d..021c9ebe51 100644 --- a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceErrorDataEventMerger.java +++ b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceErrorDataEventMerger.java @@ -20,6 +20,7 @@ import org.kie.kogito.event.process.ProcessInstanceDataEvent; import org.kie.kogito.event.process.ProcessInstanceErrorDataEvent; +import org.kie.kogito.event.process.ProcessInstanceErrorEventBody; import org.kie.kogito.index.CommonUtils; import org.kie.kogito.index.model.ProcessInstance; import org.kie.kogito.index.model.ProcessInstanceError; @@ -30,14 +31,19 @@ public class ProcessInstanceErrorDataEventMerger extends ProcessInstanceEventMerger { @Override - public ProcessInstance merge(ProcessInstance pi, ProcessInstanceDataEvent data) { - ProcessInstanceErrorDataEvent event = (ProcessInstanceErrorDataEvent) data; - pi = getOrNew(pi, data, event.getData().getEventDate()); + public ProcessInstance merge(ProcessInstance pi, ProcessInstanceDataEvent dataEvent) { + ProcessInstanceErrorDataEvent event = (ProcessInstanceErrorDataEvent) dataEvent; + ProcessInstanceErrorEventBody data = event.getData(); + pi = getOrNew(pi, dataEvent, data.getEventDate()); ProcessInstanceError error = new ProcessInstanceError(); - error.setMessage(event.getData().getErrorMessage()); - error.setNodeDefinitionId(event.getData().getNodeDefinitionId()); + error.setMessage(data.getErrorMessage()); + error.setNodeDefinitionId(data.getNodeDefinitionId()); + error.setNodeInstanceId(data.getNodeInstanceId()); pi.setError(error); pi.setState(CommonUtils.ERROR_STATE); + if (pi.getNodes() != null) { + pi.getNodes().stream().filter(n -> n.getId().equals(error.getNodeInstanceId())).findAny().ifPresent(n -> n.setErrorMessage(data.getErrorMessage())); + } return pi; } diff --git a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceNodeDataEventMerger.java b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceNodeDataEventMerger.java index bb7c39a5bc..5ac329df79 100644 --- a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceNodeDataEventMerger.java +++ b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceNodeDataEventMerger.java @@ -64,6 +64,9 @@ public ProcessInstance merge(ProcessInstance pi, ProcessInstanceDataEvent dat nodeInstance.setName(body.getNodeName()); nodeInstance.setType(body.getNodeType()); nodeInstance.setSlaDueDate(toZonedDateTime(body.getSlaDueDate())); + if (body.isRetrigger() != null) { + nodeInstance.setRetrigger(body.isRetrigger()); + } ZonedDateTime eventDate = toZonedDateTime(body.getEventDate()); switch (body.getEventType()) { case EVENT_TYPE_ENTER: diff --git a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceStateDataEventMerger.java b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceStateDataEventMerger.java index a7be6d0ea3..61196cd15d 100644 --- a/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceStateDataEventMerger.java +++ b/data-index/data-index-storage/data-index-storage-common/src/main/java/org/kie/kogito/index/storage/merger/ProcessInstanceStateDataEventMerger.java @@ -56,6 +56,8 @@ public ProcessInstance merge(ProcessInstance pi, ProcessInstanceDataEvent dat pi.setCreatedBy(event.getData().getEventUser()); } else if (event.getData().getEventType() == ProcessInstanceStateEventBody.EVENT_TYPE_STARTED) { pi.setEnd(toZonedDateTime(event.getData().getEventDate())); + } else if (event.getData().getEventType() == ProcessInstanceStateEventBody.EVENT_TYPE_RETRIGGERED) { + pi.setError(null); } pi.setBusinessKey(event.getData().getBusinessKey()); pi.setAddons(isNullOrEmpty(event.getKogitoAddons()) ? null : Set.of(event.getKogitoAddons().split(","))); diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeInstanceMarshaller.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeInstanceMarshaller.java index dd4b5f557c..fc60ad7ab6 100644 --- a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeInstanceMarshaller.java +++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/NodeInstanceMarshaller.java @@ -43,6 +43,9 @@ public NodeInstance readFrom(ProtoStreamReader reader) throws IOException { node.setDefinitionId(reader.readString("definitionId")); node.setNodeId(reader.readString("nodeId")); node.setSlaDueDate(dateToZonedDateTime(reader.readDate("slaDueDate"))); + node.setRetrigger(reader.readBoolean("retrigger")); + node.setErrorMessage(reader.readString("errorMessage")); + return node; } @@ -56,6 +59,8 @@ public void writeTo(ProtoStreamWriter writer, NodeInstance node) throws IOExcept writer.writeString("definitionId", node.getDefinitionId()); writer.writeString("nodeId", node.getNodeId()); writer.writeDate("slaDueDate", zonedDateTimeToDate(node.getSlaDueDate())); + writer.writeBoolean("retrigger", node.isRetrigger()); + writer.writeString("errorMessage", node.getErrorMessage()); } @Override diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeInstanceEntity.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeInstanceEntity.java index 51c5bef912..ef3babab5e 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeInstanceEntity.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/NodeInstanceEntity.java @@ -45,11 +45,30 @@ public class NodeInstanceEntity extends AbstractEntity { private ZonedDateTime exit; private ZonedDateTime slaDueDate; private String definitionId; + private Boolean retrigger; + private String errorMessage; + @ManyToOne(cascade = CascadeType.ALL, optional = false) @OnDelete(action = OnDeleteAction.CASCADE) @JoinColumn(name = "processInstanceId", foreignKey = @ForeignKey(name = "fk_nodes_process")) private ProcessInstanceEntity processInstance; + public Boolean isRetrigger() { + return retrigger; + } + + public void setRetrigger(Boolean isRetrigger) { + this.retrigger = isRetrigger; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + @Override public String getId() { return id; diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceErrorEntity.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceErrorEntity.java index b3902299ac..04b8f6775e 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceErrorEntity.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceErrorEntity.java @@ -26,6 +26,7 @@ public class ProcessInstanceErrorEntity { private String nodeDefinitionId; + private String nodeInstanceId; private String message; public String getNodeDefinitionId() { @@ -44,22 +45,28 @@ public void setMessage(String message) { this.message = message; } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - ProcessInstanceErrorEntity that = (ProcessInstanceErrorEntity) o; - return Objects.equals(nodeDefinitionId, that.nodeDefinitionId) && - Objects.equals(message, that.message); + public void setNodeInstanceId(String nodeInstanceId) { + this.nodeInstanceId = nodeInstanceId; + } + + public String getNodeInstanceId() { + return nodeInstanceId; } @Override public int hashCode() { - return Objects.hash(nodeDefinitionId, message); + return Objects.hash(message, nodeDefinitionId, nodeInstanceId); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!(obj instanceof ProcessInstanceErrorEntity)) + return false; + ProcessInstanceErrorEntity other = (ProcessInstanceErrorEntity) obj; + return Objects.equals(message, other.message) && Objects.equals(nodeDefinitionId, other.nodeDefinitionId) + && Objects.equals(nodeInstanceId, other.nodeInstanceId); } } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessInstanceEntityStorage.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessInstanceEntityStorage.java index b6ab5aa3e7..d3ce2b35dd 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessInstanceEntityStorage.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/storage/ProcessInstanceEntityStorage.java @@ -147,7 +147,9 @@ private void indexError(ProcessInstanceEntity pi, ProcessInstanceErrorEventBody } errorEntity.setMessage(error.getErrorMessage()); errorEntity.setNodeDefinitionId(error.getNodeDefinitionId()); + errorEntity.setNodeInstanceId(error.getNodeInstanceId()); pi.setState(CommonUtils.ERROR_STATE); + pi.getNodes().stream().filter(n -> n.getId().equals(error.getNodeInstanceId())).findAny().ifPresent(n -> n.setErrorMessage(error.getErrorMessage())); } private void indexNode(ProcessInstanceEntity pi, ProcessInstanceNodeEventBody data) { @@ -186,6 +188,9 @@ private NodeInstanceEntity updateNode(NodeInstanceEntity nodeInstance, ProcessIn nodeInstance.setName(body.getNodeName()); nodeInstance.setType(body.getNodeType()); nodeInstance.setSlaDueDate(toZonedDateTime(body.getSlaDueDate())); + if (body.isRetrigger() != null) { + nodeInstance.setRetrigger(body.isRetrigger()); + } ZonedDateTime eventDate = toZonedDateTime(body.getEventDate()); switch (body.getEventType()) { case EVENT_TYPE_ENTER: @@ -220,6 +225,8 @@ private void indexState(ProcessInstanceEntity pi, ProcessInstanceStateEventBody pi.setCreatedBy(data.getEventUser()); } else if (data.getEventType() == ProcessInstanceStateEventBody.EVENT_TYPE_ENDED) { pi.setEnd(toZonedDateTime(data.getEventDate())); + } else if (data.getEventType() == ProcessInstanceStateEventBody.EVENT_TYPE_RETRIGGERED) { + pi.setError(null); } pi.setBusinessKey(data.getBusinessKey()); pi.setUpdatedBy(data.getEventUser()); diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractProcessInstanceStorageIT.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractProcessInstanceStorageIT.java index f8f8c6674e..9b7d736b0c 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractProcessInstanceStorageIT.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/test/java/org/kie/kogito/index/jpa/storage/AbstractProcessInstanceStorageIT.java @@ -109,7 +109,7 @@ public void testProcessInstanceNodeEvent() { .hasSize(1); Assertions.assertThat(processInstance.getNodes().get(0)) - .hasNoNullFieldsOrPropertiesExcept("exit", "slaDueDate") + .hasNoNullFieldsOrPropertiesExcept("exit", "slaDueDate", "errorMessage", "retrigger") .hasFieldOrPropertyWithValue("name", "nodeName") .hasFieldOrPropertyWithValue("type", "BoundaryEventNode") .hasFieldOrPropertyWithValue("definitionId", nodeDefinitionId) @@ -125,7 +125,7 @@ public void testProcessInstanceNodeEvent() { .hasSize(1); Assertions.assertThat(processInstance.getNodes().get(0)) - .hasNoNullFieldsOrPropertiesExcept("slaDueDate") + .hasNoNullFieldsOrPropertiesExcept("slaDueDate", "errorMessage", "retrigger") .hasFieldOrPropertyWithValue("name", "nodeName") .hasFieldOrPropertyWithValue("type", "BoundaryEventNode") .hasFieldOrPropertyWithValue("definitionId", nodeDefinitionId) diff --git a/data-index/data-index-storage/data-index-storage-jpa/src/main/resources/kie-flyway/db/data-index/ansi/V1.45.1.1__retrigger.sql b/data-index/data-index-storage/data-index-storage-jpa/src/main/resources/kie-flyway/db/data-index/ansi/V1.45.1.1__retrigger.sql new file mode 100644 index 0000000000..29ed23b063 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-jpa/src/main/resources/kie-flyway/db/data-index/ansi/V1.45.1.1__retrigger.sql @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +ALTER TABLE nodes ADD COLUMN retrigger boolean default false; +ALTER TABLE nodes ADD COLUMN error_message varchar(4000); +ALTER TABLE processes ADD COLUMN node_instance_id varchar(255); diff --git a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntity.java b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntity.java index 5a66e6f298..ece0f99c9c 100644 --- a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntity.java +++ b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntity.java @@ -283,6 +283,10 @@ public static class NodeInstanceEntity { Long slaDueDate; + private Boolean isRetrigger; + + private String errorMessage; + public String getId() { return id; } @@ -363,6 +367,22 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(id); } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public void setRetrigger(Boolean retrigger) { + this.isRetrigger = retrigger; + } + + public Boolean isRetrigger() { + return isRetrigger; + } } public static class ProcessInstanceErrorEntity { @@ -371,6 +391,8 @@ public static class ProcessInstanceErrorEntity { String message; + private String nodeInstanceId; + public String getNodeDefinitionId() { return nodeDefinitionId; } @@ -387,22 +409,30 @@ public void setMessage(String message) { this.message = message; } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - ProcessInstanceErrorEntity that = (ProcessInstanceErrorEntity) o; - return Objects.equals(nodeDefinitionId, that.nodeDefinitionId) && - Objects.equals(message, that.message); + public String getNodeInstanceId() { + return nodeInstanceId; + } + + public void setNodeInstanceId(String nodeInstanceId) { + this.nodeInstanceId = nodeInstanceId; } @Override public int hashCode() { - return Objects.hash(nodeDefinitionId, message); + return Objects.hash(message, nodeDefinitionId, nodeInstanceId); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ProcessInstanceErrorEntity other = (ProcessInstanceErrorEntity) obj; + return Objects.equals(message, other.message) && Objects.equals(nodeDefinitionId, other.nodeDefinitionId) + && Objects.equals(nodeInstanceId, other.nodeInstanceId); } } diff --git a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntityMapper.java b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntityMapper.java index 18e674d57e..cee3e65e81 100644 --- a/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntityMapper.java +++ b/data-index/data-index-storage/data-index-storage-mongodb/src/main/java/org/kie/kogito/index/mongodb/model/ProcessInstanceEntityMapper.java @@ -149,6 +149,8 @@ NodeInstance toNodeInstance(ProcessInstanceEntity.NodeInstanceEntity entity) { instance.setExit(instantToZonedDateTime(entity.getExit())); instance.setDefinitionId(entity.getDefinitionId()); instance.setSlaDueDate(instantToZonedDateTime(entity.getSlaDueDate())); + instance.setRetrigger(entity.isRetrigger()); + instance.setErrorMessage(entity.getErrorMessage()); return instance; } @@ -166,6 +168,8 @@ ProcessInstanceEntity.NodeInstanceEntity fromNodeInstance(NodeInstance instance) entity.setExit(zonedDateTimeToInstant(instance.getExit())); entity.setDefinitionId(instance.getDefinitionId()); entity.setSlaDueDate(zonedDateTimeToInstant(instance.getSlaDueDate())); + entity.setRetrigger(instance.isRetrigger()); + entity.setErrorMessage(instance.getErrorMessage()); return entity; } @@ -176,6 +180,7 @@ ProcessInstanceError toProcessInstanceError(ProcessInstanceEntity.ProcessInstanc ProcessInstanceError error = new ProcessInstanceError(); error.setNodeDefinitionId(entity.getNodeDefinitionId()); + error.setNodeInstanceId(entity.getNodeInstanceId()); error.setMessage(entity.getMessage()); return error; } @@ -187,6 +192,7 @@ ProcessInstanceEntity.ProcessInstanceErrorEntity fromProcessInstanceError(Proces ProcessInstanceEntity.ProcessInstanceErrorEntity entity = new ProcessInstanceEntity.ProcessInstanceErrorEntity(); entity.setNodeDefinitionId(error.getNodeDefinitionId()); + entity.setNodeInstanceId(error.getNodeInstanceId()); entity.setMessage(error.getMessage()); return entity; } diff --git a/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/kie-flyway/db/data-index/postgresql/V1.45.1.1__retrigger.sql b/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/kie-flyway/db/data-index/postgresql/V1.45.1.1__retrigger.sql new file mode 100644 index 0000000000..9862033364 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/kie-flyway/db/data-index/postgresql/V1.45.1.1__retrigger.sql @@ -0,0 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +ALTER TABLE nodes ADD COLUMN retrigger boolean default false, ADD COLUMN error_message VARCHAR(65535); +ALTER TABLE processes ADD COLUMN node_instance_id VARCHAR(255); diff --git a/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto b/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto index 3460ff5a26..c8d85199dc 100644 --- a/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto +++ b/data-index/data-index-storage/data-index-storage-protobuf/src/main/resources/META-INF/kogito-index.proto @@ -179,6 +179,8 @@ message NodeInstance { /* @Field(store = Store.YES) */ optional string nodeId = 7; optional int64 slaDueDate = 8; + optional bool retrigger = 9; + optional string errorMessage= 10; } /* @Indexed */ diff --git a/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/main/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImpl.java b/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/main/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImpl.java index f850436590..e4d43503de 100644 --- a/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/main/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImpl.java +++ b/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/main/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImpl.java @@ -94,7 +94,7 @@ public CompletableFuture abortProcessInstance(String serviceURL, Process pInstance.abort(); if (pInstance.status() == org.kie.kogito.process.ProcessInstance.STATE_ERROR) { - throw new ProcessInstanceExecutionException(pInstance.id(), pInstance.error().get().failedNodeId(), pInstance.error().get().errorMessage()); + throw ProcessInstanceExecutionException.fromError(pInstance); } else { return String.format(SUCCESSFULLY_OPERATION_MESSAGE, "ABORT ProcessInstance with id: " + processInstance.getId()); } @@ -107,7 +107,7 @@ public CompletableFuture retryProcessInstance(String serviceURL, Process pInstance.error().get().retrigger(); if (pInstance.status() == org.kie.kogito.process.ProcessInstance.STATE_ERROR) { - throw new ProcessInstanceExecutionException(pInstance.id(), pInstance.error().get().failedNodeId(), pInstance.error().get().errorMessage()); + throw ProcessInstanceExecutionException.fromError(pInstance); } else { return String.format(SUCCESSFULLY_OPERATION_MESSAGE, "RETRY ProcessInstance in error with id: " + processInstance.getId()); } @@ -120,7 +120,7 @@ public CompletableFuture skipProcessInstance(String serviceURL, ProcessI pInstance.error().get().skip(); if (pInstance.status() == org.kie.kogito.process.ProcessInstance.STATE_ERROR) { - throw new ProcessInstanceExecutionException(pInstance.id(), pInstance.error().get().failedNodeId(), pInstance.error().get().errorMessage()); + throw ProcessInstanceExecutionException.fromError(pInstance); } else { return String.format(SUCCESSFULLY_OPERATION_MESSAGE, "SKIP ProcessInstance in error with id: " + processInstance.getId()); } @@ -200,7 +200,7 @@ public CompletableFuture triggerNodeInstance(String serviceURL, ProcessI pInstance.triggerNode(nodeDefinitionId); if (pInstance.status() == org.kie.kogito.process.ProcessInstance.STATE_ERROR) { - throw new ProcessInstanceExecutionException(pInstance.id(), pInstance.error().get().failedNodeId(), pInstance.error().get().errorMessage()); + throw ProcessInstanceExecutionException.fromError(pInstance); } else { return String.format(SUCCESSFULLY_OPERATION_MESSAGE, "TRIGGER Node " + nodeDefinitionId + "from ProcessInstance with id: " + processInstance.getId()); @@ -214,7 +214,7 @@ public CompletableFuture retriggerNodeInstance(String serviceURL, Proces pInstance.retriggerNodeInstance(nodeInstanceId); if (pInstance.status() == org.kie.kogito.process.ProcessInstance.STATE_ERROR) { - throw new ProcessInstanceExecutionException(pInstance.id(), pInstance.error().get().failedNodeId(), pInstance.error().get().errorMessage()); + throw ProcessInstanceExecutionException.fromError(pInstance); } else { return String.format(SUCCESSFULLY_OPERATION_MESSAGE, "RETRIGGER Node instance " + nodeInstanceId + "from ProcessInstance with id: " + processInstance.getId()); @@ -228,7 +228,7 @@ public CompletableFuture cancelNodeInstance(String serviceURL, ProcessIn pInstance.cancelNodeInstance(nodeInstanceId); if (pInstance.status() == org.kie.kogito.process.ProcessInstance.STATE_ERROR) { - throw new ProcessInstanceExecutionException(pInstance.id(), pInstance.error().get().failedNodeId(), pInstance.error().get().errorMessage()); + throw ProcessInstanceExecutionException.fromError(pInstance); } else { return String.format(SUCCESSFULLY_OPERATION_MESSAGE, "CANCEL Node instance " + nodeInstanceId + "from ProcessInstance with id: " + processInstance.getId()); diff --git a/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/test/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImplTest.java b/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/test/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImplTest.java index 43f9846bd9..5e7dbc9cdd 100644 --- a/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/test/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImplTest.java +++ b/data-index/kogito-addons-quarkus-data-index-persistence/kogito-addons-quarkus-data-index-persistence-common/runtime/src/test/java/org/kie/kogito/index/addon/api/KogitoAddonRuntimeClientImplTest.java @@ -212,7 +212,7 @@ void testAbortProcessInstanceError() { mockProcessInstanceStatusError().abort(); assertThrows(ProcessInstanceExecutionException.class, () -> client.abortProcessInstance(SERVICE_URL, pI)); - verify(processInstance, times(2)).error(); + verify(processInstance, times(1)).error(); verify(processInstance, times(1)).abort(); }