diff --git a/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-embedded/pom.xml b/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-embedded/pom.xml index 72383b29ad..d244649644 100644 --- a/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-embedded/pom.xml +++ b/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-embedded/pom.xml @@ -100,18 +100,39 @@ + + maven-resources-plugin + + + generate-resources + + copy-resources + + + ${project.basedir}/src/main/resources/shared + + + ${common.test.resources.dir} + + **/*.bpmn + **/*.sw.json + + + + + + + + + maven-clean-plugin + + + + ${project.basedir}/src/main/resources/shared + + + + - - - src/main/resources - - - ${common.test.resources.dir} - - **/*.bpmn - **/*.sw.json - - - diff --git a/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-knative-eventing/pom.xml b/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-knative-eventing/pom.xml index 309ff02dcb..e105b0f06a 100644 --- a/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-knative-eventing/pom.xml +++ b/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-knative-eventing/pom.xml @@ -88,18 +88,39 @@ + + maven-resources-plugin + + + generate-resources + + copy-resources + + + ${project.basedir}/src/main/resources/shared + + + ${common.test.resources.dir} + + **/*.bpmn + **/*.sw.json + + + + + + + + + maven-clean-plugin + + + + ${project.basedir}/src/main/resources/shared + + + + - - - src/main/resources - - - ${common.test.resources.dir} - - **/*.bpmn - **/*.sw.json - - - diff --git a/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-management/pom.xml b/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-management/pom.xml index ade7cbe17e..6cccd4aa7a 100644 --- a/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-management/pom.xml +++ b/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-management/pom.xml @@ -79,7 +79,6 @@ io.quarkus quarkus-maven-plugin - ${version.io.quarkus} true @@ -91,18 +90,39 @@ + + maven-resources-plugin + + + generate-resources + + copy-resources + + + ${project.basedir}/src/main/resources/shared + + + ${common.test.resources.dir} + + **/*.bpmn + **/*.sw.json + + + + + + + + + maven-clean-plugin + + + + ${project.basedir}/src/main/resources/shared + + + + - - - src/main/resources - - - ${common.test.resources.dir} - - **/*.bpmn - **/*.sw.json - - - diff --git a/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-messaging/pom.xml b/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-messaging/pom.xml index 3ccd6395dd..fba2a2c5f1 100644 --- a/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-messaging/pom.xml +++ b/apps-integration-tests/integration-tests-jobs-service/integration-tests-jobs-service-quarkus/integration-tests-jobs-service-quarkus-messaging/pom.xml @@ -94,24 +94,10 @@ - - - src/main/resources - - - ${common.test.resources.dir} - - **/*.bpmn - **/*.sw.json - - - - io.quarkus quarkus-maven-plugin - ${version.io.quarkus} true @@ -123,6 +109,39 @@ + + maven-resources-plugin + + + generate-resources + + copy-resources + + + ${project.basedir}/src/main/resources/shared + + + ${common.test.resources.dir} + + **/*.bpmn + **/*.sw.json + + + + + + + + + maven-clean-plugin + + + + ${project.basedir}/src/main/resources/shared + + + + diff --git a/apps-integration-tests/integration-tests-trusty-service/integration-tests-trusty-service-springboot/pom.xml b/apps-integration-tests/integration-tests-trusty-service/integration-tests-trusty-service-springboot/pom.xml index fd37954413..8ccdf7d69c 100644 --- a/apps-integration-tests/integration-tests-trusty-service/integration-tests-trusty-service-springboot/pom.xml +++ b/apps-integration-tests/integration-tests-trusty-service/integration-tests-trusty-service-springboot/pom.xml @@ -33,7 +33,7 @@ org.kie.kogito/integration-tests-trusty-service-springboot:${project.version} **/KogitoApplication.java - 3.3.1 + 3.4.4 eclipse-temurin:17-jre 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 741c0d4e89..0317ec61c5 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 @@ -96,6 +96,7 @@ type ProcessInstance { identity: String createdBy: String updatedBy: String + slaDueDate: DateTime } type ProcessInstanceError { @@ -135,6 +136,7 @@ type NodeInstance { exit: DateTime definitionId: String! nodeId: String! + slaDueDate: DateTime } enum MilestoneStatus { 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 1e22527c59..ab9df6cadd 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 @@ -38,6 +38,8 @@ public class NodeInstance { @JsonProperty("leaveTime") private ZonedDateTime exit; + private ZonedDateTime slaDueDate; + @JsonProperty("nodeDefinitionId") private String definitionId; @@ -97,6 +99,14 @@ public void setName(String name) { this.name = name; } + public ZonedDateTime getSlaDueDate() { + return slaDueDate; + } + + public void setSlaDueDate(ZonedDateTime slaDueDate) { + this.slaDueDate = slaDueDate; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -125,6 +135,7 @@ public String toString() { ", type='" + type + '\'' + ", enter=" + enter + ", exit=" + exit + + ", slaDueDate=" + slaDueDate + ", definitionId='" + definitionId + '\'' + '}'; } diff --git a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstanceMeta.java b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstanceMeta.java index d211ea198d..09441ca019 100644 --- a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstanceMeta.java +++ b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/ProcessInstanceMeta.java @@ -49,6 +49,7 @@ public class ProcessInstanceMeta { @JsonProperty("updatedBy") private String updatedBy; private ZonedDateTime lastUpdate; + private ZonedDateTime slaDueDate; public String getId() { return id; @@ -186,6 +187,14 @@ public void setUpdatedBy(String updatedBy) { this.updatedBy = updatedBy; } + public ZonedDateTime getSlaDueDate() { + return slaDueDate; + } + + public void setSlaDueDate(ZonedDateTime slaDueDate) { + this.slaDueDate = slaDueDate; + } + @Override public String toString() { return "ProcessInstanceMeta{" + 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 d800dfd226..bb7c39a5bc 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 @@ -63,6 +63,7 @@ public ProcessInstance merge(ProcessInstance pi, ProcessInstanceDataEvent dat nodeInstance.setNodeId(body.getNodeDefinitionId()); nodeInstance.setName(body.getNodeName()); nodeInstance.setType(body.getNodeType()); + nodeInstance.setSlaDueDate(toZonedDateTime(body.getSlaDueDate())); 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 b49036fb0c..a7be6d0ea3 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 @@ -63,6 +63,7 @@ public ProcessInstance merge(ProcessInstance pi, ProcessInstanceDataEvent dat pi.setLastUpdate(toZonedDateTime(event.getTime())); pi.setDefinition(definitions(event)); pi.setUpdatedBy(event.getData().getEventUser()); + pi.setSlaDueDate(toZonedDateTime(event.getData().getSlaDueDate())); LOGGER.debug("Value after merging: {}", pi); return pi; } 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 194ad08caa..dd4b5f557c 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 @@ -42,6 +42,7 @@ public NodeInstance readFrom(ProtoStreamReader reader) throws IOException { node.setExit(dateToZonedDateTime(reader.readDate("exit"))); node.setDefinitionId(reader.readString("definitionId")); node.setNodeId(reader.readString("nodeId")); + node.setSlaDueDate(dateToZonedDateTime(reader.readDate("slaDueDate"))); return node; } @@ -54,6 +55,7 @@ public void writeTo(ProtoStreamWriter writer, NodeInstance node) throws IOExcept writer.writeDate("exit", zonedDateTimeToDate(node.getExit())); writer.writeString("definitionId", node.getDefinitionId()); writer.writeString("nodeId", node.getNodeId()); + writer.writeDate("slaDueDate", zonedDateTimeToDate(node.getSlaDueDate())); } @Override diff --git a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessInstanceMarshaller.java b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessInstanceMarshaller.java index ab391703aa..3e46ea2bf3 100644 --- a/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessInstanceMarshaller.java +++ b/data-index/data-index-storage/data-index-storage-infinispan/src/main/java/org/kie/kogito/index/infinispan/protostream/ProcessInstanceMarshaller.java @@ -55,6 +55,7 @@ public class ProcessInstanceMarshaller extends AbstractMarshaller implements Mes protected static final String MILESTONES = "milestones"; protected static final String CREATED_BY = "createdBy"; protected static final String UPDATED_BY = "updatedBy"; + protected static final String SLA_DUE_DATE = "slaDueDate"; public ProcessInstanceMarshaller(ObjectMapper mapper) { super(mapper); @@ -84,6 +85,7 @@ public ProcessInstance readFrom(ProtoStreamReader reader) throws IOException { pi.setVersion(reader.readString(VERSION)); pi.setCreatedBy(reader.readString(CREATED_BY)); pi.setUpdatedBy(reader.readString(UPDATED_BY)); + pi.setSlaDueDate(dateToZonedDateTime(reader.readDate(SLA_DUE_DATE))); return pi; } @@ -110,6 +112,7 @@ public void writeTo(ProtoStreamWriter writer, ProcessInstance pi) throws IOExcep writer.writeString(VERSION, pi.getVersion()); writer.writeString(CREATED_BY, pi.getCreatedBy()); writer.writeString(UPDATED_BY, pi.getCreatedBy()); + writer.writeDate(SLA_DUE_DATE, zonedDateTimeToDate(pi.getSlaDueDate())); } @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 347e6f9a7f..51c5bef912 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 @@ -43,6 +43,7 @@ public class NodeInstanceEntity extends AbstractEntity { private String type; private ZonedDateTime enter; private ZonedDateTime exit; + private ZonedDateTime slaDueDate; private String definitionId; @ManyToOne(cascade = CascadeType.ALL, optional = false) @OnDelete(action = OnDeleteAction.CASCADE) @@ -106,6 +107,14 @@ public void setExit(ZonedDateTime exit) { this.exit = exit; } + public ZonedDateTime getSlaDueDate() { + return slaDueDate; + } + + public void setSlaDueDate(ZonedDateTime slaDueDate) { + this.slaDueDate = slaDueDate; + } + public ProcessInstanceEntity getProcessInstance() { return processInstance; } diff --git a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceEntity.java b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceEntity.java index 7046de267b..a3a0b0ceb3 100644 --- a/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceEntity.java +++ b/data-index/data-index-storage/data-index-storage-jpa-common/src/main/java/org/kie/kogito/index/jpa/model/ProcessInstanceEntity.java @@ -68,6 +68,9 @@ public class ProcessInstanceEntity extends AbstractEntity { private String createdBy; private String updatedBy; + + private ZonedDateTime slaDueDate; + @Convert(converter = JsonBinaryConverter.class) @Column(columnDefinition = "jsonb") private ObjectNode variables; @@ -203,6 +206,14 @@ public void setUpdatedBy(String updatedBy) { this.updatedBy = updatedBy; } + public ZonedDateTime getSlaDueDate() { + return slaDueDate; + } + + public void setSlaDueDate(ZonedDateTime slaDueDate) { + this.slaDueDate = slaDueDate; + } + public ObjectNode getVariables() { return variables; } @@ -286,6 +297,7 @@ public String toString() { ", lastUpdate=" + lastUpdate + ", createdBy=" + createdBy + ", updatedBy=" + updatedBy + + ", slaDueDate=" + slaDueDate + ", variables=" + variables + ", nodes=" + nodes + ", milestones=" + milestones + 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 8796f3204a..68e5d24844 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 @@ -179,6 +179,7 @@ private NodeInstanceEntity updateNode(NodeInstanceEntity nodeInstance, ProcessIn nodeInstance.setNodeId(body.getNodeDefinitionId()); nodeInstance.setName(body.getNodeName()); nodeInstance.setType(body.getNodeType()); + nodeInstance.setSlaDueDate(toZonedDateTime(body.getSlaDueDate())); ZonedDateTime eventDate = toZonedDateTime(body.getEventDate()); switch (body.getEventType()) { case EVENT_TYPE_ENTER: @@ -219,6 +220,7 @@ private void indexState(ProcessInstanceEntity pi, ProcessInstanceStateEventBody pi.setLastUpdate(toZonedDateTime(data.getEventDate())); pi.setAddons(addons); pi.setEndpoint(endpoint); + pi.setSlaDueDate(toZonedDateTime(data.getSlaDueDate())); } private void indexVariable(ProcessInstanceEntity pi, ProcessInstanceVariableEventBody data) { 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 b60f7ed300..f8f8c6674e 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") + .hasNoNullFieldsOrPropertiesExcept("exit", "slaDueDate") .hasFieldOrPropertyWithValue("name", "nodeName") .hasFieldOrPropertyWithValue("type", "BoundaryEventNode") .hasFieldOrPropertyWithValue("definitionId", nodeDefinitionId) @@ -125,7 +125,7 @@ public void testProcessInstanceNodeEvent() { .hasSize(1); Assertions.assertThat(processInstance.getNodes().get(0)) - .hasNoNullFieldsOrProperties() + .hasNoNullFieldsOrPropertiesExcept("slaDueDate") .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.0.6__add_sla_due_date_columns.sql b/data-index/data-index-storage/data-index-storage-jpa/src/main/resources/kie-flyway/db/data-index/ansi/V1.45.0.6__add_sla_due_date_columns.sql new file mode 100644 index 0000000000..fdd7838f41 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-jpa/src/main/resources/kie-flyway/db/data-index/ansi/V1.45.0.6__add_sla_due_date_columns.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 processes ADD sla_due_date timestamp; +ALTER TABLE nodes ADD sla_due_date timestamp; \ No newline at end of file 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 28cef62442..5a66e6f298 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 @@ -70,6 +70,8 @@ public class ProcessInstanceEntity { String updatedBy; + Long slaDueDate; + public String getId() { return id; } @@ -238,6 +240,14 @@ public void setUpdatedBy(String updatedBy) { this.updatedBy = updatedBy; } + public Long getSlaDueDate() { + return slaDueDate; + } + + public void setSlaDueDate(Long slaDueDate) { + this.slaDueDate = slaDueDate; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -271,6 +281,8 @@ public static class NodeInstanceEntity { String definitionId; + Long slaDueDate; + public String getId() { return id; } @@ -327,6 +339,14 @@ public void setDefinitionId(String definitionId) { this.definitionId = definitionId; } + public Long getSlaDueDate() { + return slaDueDate; + } + + public void setSlaDueDate(Long slaDueDate) { + this.slaDueDate = slaDueDate; + } + @Override public boolean equals(Object o) { if (this == o) { 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 16e1f13d3c..18e674d57e 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 @@ -77,6 +77,7 @@ public ProcessInstanceEntity mapToEntity(String key, ProcessInstance instance) { entity.setVersion(instance.getVersion()); entity.setCreatedBy(instance.getCreatedBy()); entity.setUpdatedBy(instance.getUpdatedBy()); + entity.setSlaDueDate(zonedDateTimeToInstant(instance.getSlaDueDate())); return entity; } @@ -108,6 +109,7 @@ public ProcessInstance mapToModel(ProcessInstanceEntity entity) { instance.setVersion(entity.getVersion()); instance.setCreatedBy(entity.getCreatedBy()); instance.setUpdatedBy(entity.getCreatedBy()); + instance.setSlaDueDate(instantToZonedDateTime(entity.getSlaDueDate())); return instance; } @@ -146,6 +148,7 @@ NodeInstance toNodeInstance(ProcessInstanceEntity.NodeInstanceEntity entity) { instance.setEnter(instantToZonedDateTime(entity.getEnter())); instance.setExit(instantToZonedDateTime(entity.getExit())); instance.setDefinitionId(entity.getDefinitionId()); + instance.setSlaDueDate(instantToZonedDateTime(entity.getSlaDueDate())); return instance; } @@ -162,6 +165,7 @@ ProcessInstanceEntity.NodeInstanceEntity fromNodeInstance(NodeInstance instance) entity.setEnter(zonedDateTimeToInstant(instance.getEnter())); entity.setExit(zonedDateTimeToInstant(instance.getExit())); entity.setDefinitionId(instance.getDefinitionId()); + entity.setSlaDueDate(zonedDateTimeToInstant(instance.getSlaDueDate())); 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.0.6__add_sla_due_date_columns.sql b/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/kie-flyway/db/data-index/postgresql/V1.45.0.6__add_sla_due_date_columns.sql new file mode 100644 index 0000000000..58b83a3266 --- /dev/null +++ b/data-index/data-index-storage/data-index-storage-postgresql/src/main/resources/kie-flyway/db/data-index/postgresql/V1.45.0.6__add_sla_due_date_columns.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 IF exists processes ADD COLUMN IF NOT EXISTS sla_due_date timestamp; +ALTER TABLE IF exists nodes ADD COLUMN IF NOT EXISTS sla_due_date timestamp; \ No newline at end of file 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 5c23eecefa..ed6d7c09ee 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 @@ -153,6 +153,7 @@ message ProcessInstance { optional string createdBy = 20; /* @Field(store = Store.YES) */ optional string updatedBy = 21; + optional int64 slaDueDate = 22; } /* @Indexed */ @@ -177,6 +178,7 @@ message NodeInstance { optional string definitionId = 6; /* @Field(store = Store.YES) */ optional string nodeId = 7; + optional int64 slaDueDate = 8; } /* @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 697dcfd1e0..1f9b64d91d 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 @@ -130,7 +130,8 @@ public CompletableFuture getProcessInstanceDiagram(String serviceURL, Pr if (processSvgService == null) { return CompletableFuture.completedFuture(null); } else { - return CompletableFuture.supplyAsync(() -> processSvgService.getProcessInstanceSvg(processInstance.getProcessId(), processInstance.getId(), null).orElse(null), managedExecutor); + return CompletableFuture.supplyAsync(() -> processSvgService.getProcessInstanceSvg(processInstance.getProcessId(), processInstance.getId(), this.getAuthHeader()).orElse(null), + managedExecutor); } } diff --git a/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/JacksonConfiguration.java b/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/JacksonConfiguration.java index cfbbd024a5..f1603c1ef4 100644 --- a/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/JacksonConfiguration.java +++ b/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/JacksonConfiguration.java @@ -20,7 +20,7 @@ import org.kie.kogito.jobs.DurationExpirationTime; import org.kie.kogito.jobs.ExactExpirationTime; -import org.kie.kogito.jobs.ProcessInstanceJobDescription; +import org.kie.kogito.jobs.JobDescription; import org.kie.kogito.jobs.service.api.serlialization.SerializationUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,8 +46,8 @@ public ObjectMapperCustomizer customizer() { return objectMapper -> { LOGGER.debug("Jackson customization initialized."); SimpleModule kogitoCustomModule = new SimpleModule(); - kogitoCustomModule.addSerializer(ProcessInstanceJobDescription.class, new ProcessInstanceJobDescriptionSerializer()); - kogitoCustomModule.addDeserializer(ProcessInstanceJobDescription.class, new ProcessInstanceJobDescriptionDeserializer()); + kogitoCustomModule.addSerializer(JobDescription.class, new JobDescriptionSerializer()); + kogitoCustomModule.addDeserializer(JobDescription.class, new JobDescriptionDeserializer()); kogitoCustomModule.addSerializer(DurationExpirationTime.class, new DurationExpirationTimeSerializer()); kogitoCustomModule.addDeserializer(DurationExpirationTime.class, new DurationExpirationTimeDeserializer()); kogitoCustomModule.addSerializer(ExactExpirationTime.class, new ExactExpirationTimeSerializer()); diff --git a/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/JobDescriptionDeserializer.java b/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/JobDescriptionDeserializer.java new file mode 100644 index 0000000000..f0a72db2b4 --- /dev/null +++ b/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/JobDescriptionDeserializer.java @@ -0,0 +1,85 @@ +/* + * 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. + */ +package org.kie.kogito.jobs.service.json; + +import java.io.IOException; + +import org.kie.kogito.jobs.ExpirationTime; +import org.kie.kogito.jobs.JobDescription; +import org.kie.kogito.jobs.descriptors.ProcessInstanceJobDescription; +import org.kie.kogito.jobs.descriptors.ProcessInstanceJobDescriptionBuilder; +import org.kie.kogito.jobs.descriptors.UserTaskInstanceJobDescription; +import org.kie.kogito.jobs.descriptors.UserTaskInstanceJobDescriptionBuilder; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +import static java.util.Optional.ofNullable; + +public class JobDescriptionDeserializer extends StdDeserializer { + + private static final long serialVersionUID = -8307549297456060422L; + + public JobDescriptionDeserializer() { + super(ProcessInstanceJobDescription.class); + } + + @Override + public JobDescription deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JacksonException { + try { + JsonNode node = jp.getCodec().readTree(jp); + String jobDescriptionType = node.get("@type").asText(); + switch (jobDescriptionType) { + case "ProcessInstanceJobDescription": { + ProcessInstanceJobDescriptionBuilder builder = ProcessInstanceJobDescription.newProcessInstanceJobDescriptionBuilder(); + ofNullable(node.get("id")).ifPresent(e -> builder.id(e.textValue())); + ofNullable(node.get("priority")).ifPresent(e -> builder.priority(e.asInt())); + String expirationTimeType = node.get("expirationTime").get("@type").asText(); + builder.expirationTime((ExpirationTime) ctxt.readTreeAsValue(node.get("expirationTime"), Class.forName(expirationTimeType))); + + ofNullable(node.get("timerId")).ifPresent(e -> builder.timerId(e.textValue())); + ofNullable(node.get("processInstanceId")).ifPresent(e -> builder.processInstanceId(e.textValue())); + ofNullable(node.get("rootProcessInstanceId")).ifPresent(e -> builder.rootProcessInstanceId(e.textValue())); + ofNullable(node.get("processId")).ifPresent(e -> builder.processId(e.textValue())); + ofNullable(node.get("rootProcessId")).ifPresent(e -> builder.rootProcessId(e.textValue())); + ofNullable(node.get("nodeInstanceId")).ifPresent(e -> builder.nodeInstanceId(e.textValue())); + + return builder.build(); + } + case "UserTaskInstanceJobDescription": { + UserTaskInstanceJobDescriptionBuilder builder = UserTaskInstanceJobDescription.newUserTaskInstanceJobDescriptionBuilder(); + ofNullable(node.get("id")).ifPresent(e -> builder.id(e.textValue())); + ofNullable(node.get("priority")).ifPresent(e -> builder.priority(e.asInt())); + String expirationTimeType = node.get("expirationTime").get("@type").asText(); + builder.expirationTime((ExpirationTime) ctxt.readTreeAsValue(node.get("expirationTime"), Class.forName(expirationTimeType))); + + ofNullable(node.get("userTaskInstanceId")).ifPresent(e -> builder.userTaskInstanceId(e.textValue())); + return builder.build(); + } + } + } catch (ClassNotFoundException e1) { + throw new IllegalArgumentException("expiration time class not found", e1); + } + return null; + } + +} diff --git a/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/ProcessInstanceJobDescriptionSerializer.java b/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/JobDescriptionSerializer.java similarity index 50% rename from jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/ProcessInstanceJobDescriptionSerializer.java rename to jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/JobDescriptionSerializer.java index 379da2a0e5..22935e0e37 100644 --- a/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/ProcessInstanceJobDescriptionSerializer.java +++ b/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/JobDescriptionSerializer.java @@ -20,32 +20,40 @@ import java.io.IOException; -import org.kie.kogito.jobs.ProcessInstanceJobDescription; +import org.kie.kogito.jobs.JobDescription; +import org.kie.kogito.jobs.descriptors.ProcessInstanceJobDescription; +import org.kie.kogito.jobs.descriptors.UserTaskInstanceJobDescription; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; -public class ProcessInstanceJobDescriptionSerializer extends StdSerializer { +public class JobDescriptionSerializer extends StdSerializer { private static final long serialVersionUID = -8307549297456060422L; - public ProcessInstanceJobDescriptionSerializer() { - super(ProcessInstanceJobDescription.class); + public JobDescriptionSerializer() { + super(JobDescription.class); } @Override - public void serialize(ProcessInstanceJobDescription value, JsonGenerator jgen, SerializerProvider provider) throws IOException { + public void serialize(JobDescription value, JsonGenerator jgen, SerializerProvider provider) throws IOException { jgen.writeStartObject(); + jgen.writeStringField("@type", value.getClass().getSimpleName()); jgen.writeStringField("id", value.id()); - jgen.writeStringField("timerId", value.timerId()); - jgen.writeObjectField("expirationTime", value.expirationTime()); jgen.writeNumberField("priority", value.priority()); - jgen.writeStringField("processInstanceId", value.processInstanceId()); - jgen.writeStringField("rootProcessInstanceId", value.rootProcessInstanceId()); - jgen.writeStringField("processId", value.processId()); - jgen.writeStringField("rootProcessId", value.rootProcessId()); - jgen.writeStringField("nodeInstanceId", value.nodeInstanceId()); + jgen.writeObjectField("expirationTime", value.expirationTime()); + if (value instanceof ProcessInstanceJobDescription jobDescription) { + jgen.writeStringField("timerId", jobDescription.timerId()); + jgen.writeStringField("processInstanceId", jobDescription.processInstanceId()); + jgen.writeStringField("rootProcessInstanceId", jobDescription.rootProcessInstanceId()); + jgen.writeStringField("processId", jobDescription.processId()); + jgen.writeStringField("rootProcessId", jobDescription.rootProcessId()); + jgen.writeStringField("nodeInstanceId", jobDescription.nodeInstanceId()); + jgen.writeEndObject(); + } else if (value instanceof UserTaskInstanceJobDescription userTaskInstanceJobDescription) { + jgen.writeStringField("userTaskInstanceId", userTaskInstanceJobDescription.getUserTaskInstanceId()); + } jgen.writeEndObject(); } diff --git a/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/ProcessInstanceJobDescriptionDeserializer.java b/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/ProcessInstanceJobDescriptionDeserializer.java deleted file mode 100644 index 6ccfb99f47..0000000000 --- a/jobs-service/jobs-service-common/src/main/java/org/kie/kogito/jobs/service/json/ProcessInstanceJobDescriptionDeserializer.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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. - */ -package org.kie.kogito.jobs.service.json; - -import java.io.IOException; - -import org.kie.kogito.jobs.ExpirationTime; -import org.kie.kogito.jobs.ProcessInstanceJobDescription; -import org.kie.kogito.jobs.ProcessInstanceJobDescriptionBuilder; - -import com.fasterxml.jackson.core.JacksonException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.deser.std.StdDeserializer; - -import static java.util.Optional.ofNullable; - -public class ProcessInstanceJobDescriptionDeserializer extends StdDeserializer { - - private static final long serialVersionUID = -8307549297456060422L; - - public ProcessInstanceJobDescriptionDeserializer() { - super(ProcessInstanceJobDescription.class); - } - - @Override - public ProcessInstanceJobDescription deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JacksonException { - ProcessInstanceJobDescriptionBuilder builder = ProcessInstanceJobDescription.builder(); - - JsonNode node = jp.getCodec().readTree(jp); - ofNullable(node.get("id")).ifPresent(e -> builder.id(e.textValue())); - ofNullable(node.get("timerId")).ifPresent(e -> builder.timerId(e.textValue())); - ofNullable(node.get("priority")).ifPresent(e -> builder.priority(e.asInt())); - ofNullable(node.get("processInstanceId")).ifPresent(e -> builder.processInstanceId(e.textValue())); - ofNullable(node.get("rootProcessInstanceId")).ifPresent(e -> builder.rootProcessInstanceId(e.textValue())); - ofNullable(node.get("processId")).ifPresent(e -> builder.processId(e.textValue())); - ofNullable(node.get("rootProcessId")).ifPresent(e -> builder.rootProcessId(e.textValue())); - ofNullable(node.get("nodeInstanceId")).ifPresent(e -> builder.nodeInstanceId(e.textValue())); - - String type = node.get("expirationTime").get("@type").asText(); - try { - builder.expirationTime((ExpirationTime) ctxt.readTreeAsValue(node.get("expirationTime"), Class.forName(type))); - } catch (ClassNotFoundException | IOException e1) { - e1.printStackTrace(); - } - - return builder.build(); - } - -} diff --git a/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/EmbeddedJobExecutor.java b/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/EmbeddedJobExecutor.java index ead3bbf2a2..961e0485aa 100644 --- a/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/EmbeddedJobExecutor.java +++ b/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/EmbeddedJobExecutor.java @@ -19,9 +19,13 @@ package org.kie.kogito.jobs.embedded; import java.util.Optional; +import java.util.function.Supplier; import org.kie.kogito.Application; import org.kie.kogito.Model; +import org.kie.kogito.jobs.JobDescription; +import org.kie.kogito.jobs.descriptors.ProcessInstanceJobDescription; +import org.kie.kogito.jobs.descriptors.UserTaskInstanceJobDescription; import org.kie.kogito.jobs.service.api.Recipient; import org.kie.kogito.jobs.service.exception.JobExecutionException; import org.kie.kogito.jobs.service.executor.JobExecutor; @@ -31,40 +35,81 @@ import org.kie.kogito.process.Process; import org.kie.kogito.process.Processes; import org.kie.kogito.services.jobs.impl.TriggerJobCommand; +import org.kie.kogito.usertask.UserTaskInstance; +import org.kie.kogito.usertask.UserTasks; import io.smallrye.mutiny.Uni; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Alternative; +import jakarta.enterprise.inject.Instance; import jakarta.inject.Inject; +import static org.kie.kogito.services.uow.UnitOfWorkExecutor.executeInUnitOfWork; + @ApplicationScoped @Alternative public class EmbeddedJobExecutor implements JobExecutor { @Inject - Processes processes; + Instance processes; + + @Inject + Instance userTasks; @Inject Application application; @Override public Uni execute(JobDetails jobDetails) { - - String correlationId = jobDetails.getCorrelationId(); RecipientInstance recipientModel = (RecipientInstance) jobDetails.getRecipient(); InVMRecipient recipient = (InVMRecipient) recipientModel.getRecipient(); - String timerId = recipient.getPayload().getData().timerId(); - String processInstanceId = recipient.getPayload().getData().processInstanceId(); - Optional> process; - try { - process = processes.processByProcessInstanceId(processInstanceId); - } catch (Exception ex) { - return Uni.createFrom().failure( - new JobExecutionException(jobDetails.getId(), - "Unexpected error when executing Embedded request for job: " + jobDetails.getId() + ". " + ex.getMessage(), - ex)); + JobDescription jobDescription = recipient.getPayload().getData(); + if (jobDescription instanceof ProcessInstanceJobDescription processInstanceJobDescription && processes.isResolvable()) { + return processJobDescription(jobDetails, processInstanceJobDescription); + } else if (jobDescription instanceof UserTaskInstanceJobDescription userTaskInstanceJobDescription && userTasks.isResolvable()) { + return processJobDescription(jobDetails, userTaskInstanceJobDescription); } + + return Uni.createFrom().item( + JobExecutionResponse.builder() + .code("401") + .jobId(jobDetails.getId()) + .now() + .message("job cannot be processed") + .build()); + } + + private Uni processJobDescription(JobDetails jobDetails, UserTaskInstanceJobDescription userTaskInstanceJobDescription) { + Supplier execute = () -> executeInUnitOfWork(application.unitOfWorkManager(), () -> { + Optional userTaskInstance = userTasks.get().instances().findById(userTaskInstanceJobDescription.getUserTaskInstanceId()); + if (userTaskInstance.isEmpty()) { + return null; + } + UserTaskInstance instance = userTaskInstance.get(); + instance.trigger(userTaskInstanceJobDescription); + return null; + }); + + return Uni.createFrom().item(execute) + .onFailure() + .transform( + unexpected -> new JobExecutionException(jobDetails.getId(), "Unexpected error when executing Embedded request for job: " + jobDetails.getId() + ". " + unexpected.getMessage(), + unexpected)) + .onItem() + .transform(res -> JobExecutionResponse.builder() + .message("Embedded job executed") + .code(String.valueOf(200)) + .now() + .jobId(jobDetails.getId()) + .build()); + + } + + private Uni processJobDescription(JobDetails jobDetails, ProcessInstanceJobDescription processInstanceJobDescription) { + String timerId = processInstanceJobDescription.timerId(); + String processInstanceId = processInstanceJobDescription.processInstanceId(); + Optional> process = processes.get().processByProcessInstanceId(processInstanceId); if (process.isEmpty()) { return Uni.createFrom().item( JobExecutionResponse.builder() @@ -77,9 +122,13 @@ public Uni execute(JobDetails jobDetails) { Integer limit = jobDetails.getRetries(); - TriggerJobCommand command = new TriggerJobCommand(processInstanceId, correlationId, timerId, limit, process.get(), application.unitOfWorkManager()); + Supplier execute = () -> executeInUnitOfWork(application.unitOfWorkManager(), () -> { + TriggerJobCommand command = new TriggerJobCommand(processInstanceId, jobDetails.getCorrelationId(), timerId, limit, process.get(), application.unitOfWorkManager()); + return command.execute(); + }); - return Uni.createFrom().item(command::execute) + return Uni.createFrom() + .item(execute) .onFailure() .transform( unexpected -> new JobExecutionException(jobDetails.getId(), "Unexpected error when executing Embedded request for job: " + jobDetails.getId() + ". " + unexpected.getMessage(), diff --git a/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/EmbeddedJobsService.java b/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/EmbeddedJobsService.java index 95b9b0d92e..84754c6dc2 100644 --- a/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/EmbeddedJobsService.java +++ b/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/EmbeddedJobsService.java @@ -20,9 +20,8 @@ import java.util.concurrent.ExecutionException; +import org.kie.kogito.jobs.JobDescription; import org.kie.kogito.jobs.JobsService; -import org.kie.kogito.jobs.ProcessInstanceJobDescription; -import org.kie.kogito.jobs.ProcessJobDescription; import org.kie.kogito.jobs.api.JobCallbackResourceDef; import org.kie.kogito.jobs.service.adapter.JobDetailsAdapter; import org.kie.kogito.jobs.service.api.Job; @@ -54,13 +53,7 @@ public EmbeddedJobsService() { } @Override - public String scheduleProcessJob(ProcessJobDescription description) { - LOGGER.debug("ScheduleProcessJob: {} not supported", description); - return null; - } - - @Override - public String scheduleProcessInstanceJob(ProcessInstanceJobDescription description) { + public String scheduleJob(JobDescription description) { try { Job job = Job.builder() .id(description.id()) diff --git a/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/InVMPayloadData.java b/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/InVMPayloadData.java index cb49a135b6..3a9cdf9286 100644 --- a/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/InVMPayloadData.java +++ b/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/InVMPayloadData.java @@ -18,31 +18,31 @@ */ package org.kie.kogito.jobs.embedded; -import org.kie.kogito.jobs.ProcessInstanceJobDescription; +import org.kie.kogito.jobs.JobDescription; import org.kie.kogito.jobs.service.api.PayloadData; -public class InVMPayloadData extends PayloadData { +public class InVMPayloadData extends PayloadData { - private ProcessInstanceJobDescription jobDescription; + private JobDescription jobDescription; public InVMPayloadData() { // do nothing } - public void setJobDescription(ProcessInstanceJobDescription jobDescription) { + public void setJobDescription(JobDescription jobDescription) { this.jobDescription = jobDescription; } - public ProcessInstanceJobDescription getJobDescription() { + public JobDescription getJobDescription() { return jobDescription; } @Override - public ProcessInstanceJobDescription getData() { + public JobDescription getData() { return jobDescription; } - public InVMPayloadData(ProcessInstanceJobDescription data) { + public InVMPayloadData(JobDescription data) { this.jobDescription = data; } diff --git a/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/JobInVMEventPublisher.java b/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/JobInVMEventPublisher.java index dae4ac4ecf..78434dc841 100644 --- a/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/JobInVMEventPublisher.java +++ b/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/main/java/org/kie/kogito/jobs/embedded/JobInVMEventPublisher.java @@ -25,7 +25,8 @@ import org.eclipse.microprofile.config.inject.ConfigProperty; import org.kie.kogito.event.EventPublisher; import org.kie.kogito.event.job.JobInstanceDataEvent; -import org.kie.kogito.jobs.ProcessInstanceJobDescription; +import org.kie.kogito.jobs.JobDescription; +import org.kie.kogito.jobs.descriptors.ProcessInstanceJobDescription; import org.kie.kogito.jobs.service.adapter.ScheduledJobAdapter; import org.kie.kogito.jobs.service.api.Recipient; import org.kie.kogito.jobs.service.model.JobDetails; @@ -93,13 +94,15 @@ public void observe(@ObservesAsync EmbeddedJobServiceEvent serviceEvent) { try { ScheduledJob scheduledJob = ScheduledJobAdapter.of(jobDetails); Recipient recipient = jobDetails.getRecipient().getRecipient(); - ProcessInstanceJobDescription jobDescription = recipient.getPayload().getJobDescription(); - - scheduledJob.setProcessInstanceId(jobDescription.processInstanceId()); - scheduledJob.setProcessId(jobDescription.processId()); - scheduledJob.setRootProcessInstanceId(jobDescription.rootProcessInstanceId()); - scheduledJob.setRootProcessId(jobDescription.rootProcessId()); - scheduledJob.setNodeInstanceId(jobDescription.nodeInstanceId()); + JobDescription jobDescription = recipient.getPayload().getJobDescription(); + + if (jobDescription instanceof ProcessInstanceJobDescription processInstanceJobDescription) { + scheduledJob.setProcessInstanceId(processInstanceJobDescription.processInstanceId()); + scheduledJob.setProcessId(processInstanceJobDescription.processId()); + scheduledJob.setRootProcessInstanceId(processInstanceJobDescription.rootProcessInstanceId()); + scheduledJob.setRootProcessId(processInstanceJobDescription.rootProcessId()); + scheduledJob.setNodeInstanceId(processInstanceJobDescription.nodeInstanceId()); + } byte[] jsonContent = objectMapper.writeValueAsBytes(scheduledJob); JobInstanceDataEvent event = new JobInstanceDataEvent(JOB_EVENT_TYPE, diff --git a/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/test/java/org/kie/kogito/jobs/embedded/EmbeddedJobsServiceTest.java b/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/test/java/org/kie/kogito/jobs/embedded/EmbeddedJobsServiceTest.java index c854f86f7f..33e0c8be4b 100644 --- a/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/test/java/org/kie/kogito/jobs/embedded/EmbeddedJobsServiceTest.java +++ b/jobs-service/kogito-addons-jobs-service/kogito-addons-quarkus-jobs/src/test/java/org/kie/kogito/jobs/embedded/EmbeddedJobsServiceTest.java @@ -28,7 +28,7 @@ import org.kie.kogito.event.job.JobInstanceDataEvent; import org.kie.kogito.jobs.DurationExpirationTime; import org.kie.kogito.jobs.JobsService; -import org.kie.kogito.jobs.ProcessInstanceJobDescription; +import org.kie.kogito.jobs.descriptors.ProcessInstanceJobDescription; import io.quarkus.test.junit.QuarkusTest; @@ -58,7 +58,7 @@ public void testJobService() throws Exception { CountDownLatch latch = new CountDownLatch(8); publisher.setLatch(latch); - ProcessInstanceJobDescription description = ProcessInstanceJobDescription.builder() + ProcessInstanceJobDescription description = ProcessInstanceJobDescription.newProcessInstanceJobDescriptionBuilder() .generateId() .timerId("-1") .expirationTime(DurationExpirationTime.now()) @@ -68,9 +68,9 @@ public void testJobService() throws Exception { .rootProcessId(null) .nodeInstanceId(NODE_INSTANCE_ID) .build(); - jobService.scheduleProcessInstanceJob(description); + jobService.scheduleJob(description); - ProcessInstanceJobDescription descriptionWRootProcess = ProcessInstanceJobDescription.builder() + ProcessInstanceJobDescription descriptionWRootProcess = ProcessInstanceJobDescription.newProcessInstanceJobDescriptionBuilder() .generateId() .timerId("-1") .expirationTime(DurationExpirationTime.now()) @@ -80,7 +80,7 @@ public void testJobService() throws Exception { .rootProcessId(ROOT_PROCESS_ID) .nodeInstanceId(NODE_INSTANCE_ID) .build(); - jobService.scheduleProcessInstanceJob(descriptionWRootProcess); + jobService.scheduleJob(descriptionWRootProcess); latch.await();