This is an automated email from the ASF dual-hosted git repository.
pefernan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-kogito-apps.git
The following commit(s) were added to refs/heads/main by this push:
new f464a323a [incubator-kie-issues#1975] Provide mechanism to fetch the
list of timers associated to a Process Instance. (#2225)
f464a323a is described below
commit f464a323a04019fba47fef3e3f0a207c689cf020
Author: Pere Fernández <[email protected]>
AuthorDate: Tue May 27 09:27:40 2025 +0200
[incubator-kie-issues#1975] Provide mechanism to fetch the list of timers
associated to a Process Instance. (#2225)
* [incubator-kie-issues#1975] Provide mechanism to fetch the list of timers
associated to a Process Instance.
* - Added state check to prevent issues getting timers on processes not
active
* - git cleanup
---
.../kie/kogito/index/api/KogitoRuntimeClient.java | 8 +-
.../graphql/AbstractGraphQLSchemaManager.java | 37 +++++----
.../src/main/resources/basic.schema.graphqls | 9 +++
.../index/service/api/KogitoRuntimeClientImpl.java | 13 +++-
.../service/graphql/GraphQLSchemaManagerImpl.java | 1 +
.../java/org/kie/kogito/index/model/Timer.java | 91 ++++++++++++++++++++++
.../addon/api/KogitoAddonRuntimeClientImpl.java | 26 ++++---
.../graphql/GraphQLAddonSchemaManagerImpl.java | 1 +
8 files changed, 153 insertions(+), 33 deletions(-)
diff --git
a/data-index/data-index-common/src/main/java/org/kie/kogito/index/api/KogitoRuntimeClient.java
b/data-index/data-index-common/src/main/java/org/kie/kogito/index/api/KogitoRuntimeClient.java
index 307cbece8..f36312099 100644
---
a/data-index/data-index-common/src/main/java/org/kie/kogito/index/api/KogitoRuntimeClient.java
+++
b/data-index/data-index-common/src/main/java/org/kie/kogito/index/api/KogitoRuntimeClient.java
@@ -22,11 +22,7 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
-import org.kie.kogito.index.model.Job;
-import org.kie.kogito.index.model.Node;
-import org.kie.kogito.index.model.ProcessDefinition;
-import org.kie.kogito.index.model.ProcessInstance;
-import org.kie.kogito.index.model.UserTaskInstance;
+import org.kie.kogito.index.model.*;
import com.fasterxml.jackson.databind.JsonNode;
@@ -81,4 +77,6 @@ public interface KogitoRuntimeClient {
CompletableFuture<String> deleteUserTaskInstanceAttachment(String
serviceURL, UserTaskInstance userTaskInstance, String user,
List<String> groups, String attachmentId);
+
+ CompletableFuture<List<Timer>> getProcessInstanceTimers(String serviceUrl,
ProcessInstance processInstance);
}
diff --git
a/data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/AbstractGraphQLSchemaManager.java
b/data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/AbstractGraphQLSchemaManager.java
index 31f5b65f1..b852b322e 100644
---
a/data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/AbstractGraphQLSchemaManager.java
+++
b/data-index/data-index-graphql/src/main/java/org/kie/kogito/index/graphql/AbstractGraphQLSchemaManager.java
@@ -18,12 +18,7 @@
*/
package org.kie.kogito.index.graphql;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.ServiceLoader;
+import java.util.*;
import java.util.ServiceLoader.Provider;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
@@ -34,13 +29,8 @@ import org.kie.kogito.index.api.KogitoRuntimeClient;
import org.kie.kogito.index.graphql.query.GraphQLQueryOrderByParser;
import org.kie.kogito.index.graphql.query.GraphQLQueryParser;
import org.kie.kogito.index.graphql.query.GraphQLQueryParserRegistry;
-import org.kie.kogito.index.model.Job;
-import org.kie.kogito.index.model.Node;
-import org.kie.kogito.index.model.NodeInstance;
-import org.kie.kogito.index.model.ProcessDefinition;
-import org.kie.kogito.index.model.ProcessDefinitionKey;
-import org.kie.kogito.index.model.ProcessInstance;
-import org.kie.kogito.index.model.UserTaskInstance;
+import org.kie.kogito.index.model.*;
+import org.kie.kogito.index.model.Timer;
import org.kie.kogito.index.service.DataIndexServiceException;
import org.kie.kogito.index.storage.DataIndexStorageService;
import org.kie.kogito.internal.process.runtime.KogitoProcessInstance;
@@ -50,6 +40,7 @@ import org.kie.kogito.persistence.api.query.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import graphql.execution.DataFetcherResult;
import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
import graphql.schema.GraphQLArgument;
@@ -246,8 +237,12 @@ public abstract class AbstractGraphQLSchemaManager
implements GraphQLSchemaManag
return
executeAdvancedQueryForCache(cacheService.getProcessDefinitionStorage(), env);
}
- protected Collection<ProcessInstance>
getProcessInstancesValues(DataFetchingEnvironment env) {
- return
executeAdvancedQueryForCache(cacheService.getProcessInstanceStorage(), env);
+ protected DataFetcherResult<?>
getProcessInstancesValues(DataFetchingEnvironment env) {
+ Collection<ProcessInstance> processInstances =
executeAdvancedQueryForCache(cacheService.getProcessInstanceStorage(), env);
+ return DataFetcherResult.newResult()
+ .data(processInstances)
+ .localContext(processInstances)
+ .build();
}
protected long countProcessInstances(DataFetchingEnvironment env) {
@@ -327,6 +322,18 @@ public abstract class AbstractGraphQLSchemaManager
implements GraphQLSchemaManag
}
}
+ public CompletableFuture<List<Timer>>
getProcessInstanceTimers(DataFetchingEnvironment env) {
+ ProcessInstance processInstance = env.getSource();
+
+ // Skipping Getting the timers from the runtime if process instance
isn't in Active state
+ if (processInstance.getState() !=
org.kie.kogito.process.ProcessInstance.STATE_ACTIVE) {
+ return CompletableFuture.completedFuture(Collections.emptyList());
+ }
+
+ String serviceUrl = getServiceUrl(processInstance.getEndpoint(),
processInstance.getProcessId());
+ return dataIndexApiExecutor.getProcessInstanceTimers(serviceUrl,
processInstance);
+ }
+
public CompletableFuture<List<Node>>
getProcessInstanceNodes(DataFetchingEnvironment env) {
ProcessInstance pi = env.getSource();
ProcessDefinition pd =
cacheService.getProcessDefinitionStorage().get(new
ProcessDefinitionKey(pi.getProcessId(), pi.getVersion()));
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 e00350e20..8f16ddab5 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
@@ -71,6 +71,14 @@ input ProcessDefinitionArgument {
type: StringArgument
}
+type TimerInstance {
+ timerId: String!
+ processId: String!
+ processInstanceId: String!
+ nodeInstanceId: String
+ description: String
+}
+
type ProcessInstance {
id: String!
processId: String!
@@ -103,6 +111,7 @@ type ProcessInstance {
updatedBy: String
executionSummary: [String]
slaDueDate: DateTime
+ timers: [TimerInstance]
cloudEventId: String
cloudEventSource: String
}
diff --git
a/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/api/KogitoRuntimeClientImpl.java
b/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/api/KogitoRuntimeClientImpl.java
index 2caec98b7..85b5b3805 100644
---
a/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/api/KogitoRuntimeClientImpl.java
+++
b/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/api/KogitoRuntimeClientImpl.java
@@ -26,10 +26,7 @@ import org.kie.kogito.index.CommonUtils;
import org.kie.kogito.index.api.ExecuteArgs;
import org.kie.kogito.index.api.KogitoRuntimeClient;
import org.kie.kogito.index.api.KogitoRuntimeCommonClient;
-import org.kie.kogito.index.model.Node;
-import org.kie.kogito.index.model.ProcessDefinition;
-import org.kie.kogito.index.model.ProcessInstance;
-import org.kie.kogito.index.model.UserTaskInstance;
+import org.kie.kogito.index.model.*;
import org.kie.kogito.index.service.DataIndexServiceException;
import org.kie.kogito.usertask.model.CommentInfo;
import org.slf4j.Logger;
@@ -59,6 +56,8 @@ class KogitoRuntimeClientImpl extends
KogitoRuntimeCommonClient implements Kogit
public static final String GET_PROCESS_INSTANCE_DIAGRAM_PATH =
"/svg/processes/%s/instances/%s";
public static final String GET_PROCESS_INSTANCE_SOURCE_PATH =
"/management/processes/%s/source";
public static final String GET_PROCESS_INSTANCE_NODE_DEFINITIONS_PATH =
"/management/processes/%s/nodes";
+ public static final String GET_PROCESS_INSTANCE_TIMERS_PATH =
"/management/processes/%s/instances/%s/timers";
+
public static final String UPDATE_VARIABLES_PROCESS_INSTANCE_PATH =
"/%s/%s";
public static final String TRIGGER_NODE_INSTANCE_PATH =
"/management/processes/%s/instances/%s/nodes/%s"; //node def
public static final String RETRIGGER_NODE_INSTANCE_PATH =
"/management/processes/%s/instances/%s/nodeInstances/%s"; // nodeInstance Id
@@ -119,6 +118,12 @@ class KogitoRuntimeClientImpl extends
KogitoRuntimeCommonClient implements Kogit
return sendGetClientRequest(getWebClient(serviceURL), requestURI, "Get
Process Instance diagram with id: " + processInstance.getId(), null);
}
+ @Override
+ public CompletableFuture<List<Timer>> getProcessInstanceTimers(String
serviceURL, ProcessInstance processInstance) {
+ String requestURI = format(GET_PROCESS_INSTANCE_TIMERS_PATH,
processInstance.getProcessId(), processInstance.getId());
+ return sendGetClientRequest(getWebClient(serviceURL), requestURI, "Get
Process Instance Timers: " + processInstance.getId(), List.class);
+ }
+
@Override
public CompletableFuture<String>
getProcessDefinitionSourceFileContent(String serviceURL, String processId) {
String requestURI = format(GET_PROCESS_INSTANCE_SOURCE_PATH,
processId);
diff --git
a/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/graphql/GraphQLSchemaManagerImpl.java
b/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/graphql/GraphQLSchemaManagerImpl.java
index 4da59f5a0..ca624dbaa 100644
---
a/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/graphql/GraphQLSchemaManagerImpl.java
+++
b/data-index/data-index-service/data-index-service-common/src/main/java/org/kie/kogito/index/service/graphql/GraphQLSchemaManagerImpl.java
@@ -118,6 +118,7 @@ public class GraphQLSchemaManagerImpl extends
AbstractGraphQLSchemaManager {
builder.dataFetcher("parentProcessInstance",
this::getParentProcessInstanceValue);
builder.dataFetcher("childProcessInstances",
this::getChildProcessInstancesValues);
builder.dataFetcher("serviceUrl",
this::getProcessInstanceServiceUrl);
+ builder.dataFetcher("timers",
this::getProcessInstanceTimers);
builder.dataFetcher("diagram",
this::getProcessInstanceDiagram);
builder.dataFetcher("source",
this::getProcessInstanceSource);
builder.dataFetcher("nodeDefinitions",
this::getProcessInstanceNodes);
diff --git
a/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/Timer.java
b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/Timer.java
new file mode 100644
index 000000000..4add5daef
--- /dev/null
+++
b/data-index/data-index-storage/data-index-storage-api/src/main/java/org/kie/kogito/index/model/Timer.java
@@ -0,0 +1,91 @@
+/*
+ * 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.index.model;
+
+import org.kie.kogito.jobs.TimerDescription;
+
+public class Timer {
+
+ private String processId;
+ private String processInstanceId;
+ private String nodeInstanceId;
+ private String timerId;
+ private String description;
+
+ public String getProcessId() {
+ return processId;
+ }
+
+ public void setProcessId(String processId) {
+ this.processId = processId;
+ }
+
+ public String getProcessInstanceId() {
+ return processInstanceId;
+ }
+
+ public void setProcessInstanceId(String processInstanceId) {
+ this.processInstanceId = processInstanceId;
+ }
+
+ public String getNodeInstanceId() {
+ return nodeInstanceId;
+ }
+
+ public void setNodeInstanceId(String nodeInstanceId) {
+ this.nodeInstanceId = nodeInstanceId;
+ }
+
+ public String getTimerId() {
+ return timerId;
+ }
+
+ public void setTimerId(String timerId) {
+ this.timerId = timerId;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ @Override
+ public String toString() {
+ return "Timer{" +
+ "processId='" + processId + '\'' +
+ ", processInstanceId='" + processInstanceId + '\'' +
+ ", nodeInstanceId='" + nodeInstanceId + '\'' +
+ ", timerId='" + timerId + '\'' +
+ ", description='" + description + '\'' +
+ '}';
+ }
+
+ public static Timer from(TimerDescription timerDescription) {
+ Timer timer = new Timer();
+ timer.setProcessId(timerDescription.getProcessId());
+ timer.setProcessInstanceId(timerDescription.getProcessInstanceId());
+ timer.setNodeInstanceId(timerDescription.getNodeInstanceId());
+ timer.setTimerId(timerDescription.getTimerId());
+ timer.setDescription(timerDescription.getDescription());
+ return timer;
+ }
+}
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 e4d43503d..b9ea89d24 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
@@ -20,9 +20,7 @@ package org.kie.kogito.index.addon.api;
import java.io.IOException;
import java.io.UncheckedIOException;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -33,10 +31,8 @@ import org.kie.kogito.Model;
import org.kie.kogito.index.api.ExecuteArgs;
import org.kie.kogito.index.api.KogitoRuntimeClient;
import org.kie.kogito.index.api.KogitoRuntimeCommonClient;
-import org.kie.kogito.index.model.Node;
-import org.kie.kogito.index.model.ProcessDefinition;
-import org.kie.kogito.index.model.ProcessInstance;
-import org.kie.kogito.index.model.UserTaskInstance;
+import org.kie.kogito.index.model.*;
+import org.kie.kogito.index.model.Timer;
import org.kie.kogito.index.service.DataIndexServiceException;
import org.kie.kogito.internal.process.runtime.KogitoWorkflowProcess;
import org.kie.kogito.jackson.utils.JsonObjectUtils;
@@ -190,6 +186,19 @@ public class KogitoAddonRuntimeClientImpl extends
KogitoRuntimeCommonClient impl
}
}
+ @Override
+ public CompletableFuture<List<Timer>> getProcessInstanceTimers(String
serviceUrl, ProcessInstance processInstance) {
+ return
CompletableFuture.completedFuture(executeOnProcessInstance(processInstance.getProcessId(),
processInstance.getId(), pInstance -> {
+ try {
+ return pInstance.timers().stream()
+ .map(Timer::from)
+ .toList();
+ } catch (Exception ex) {
+ throw new DataIndexServiceException("Failure getting timers
for process instance " + pInstance.id(), ex);
+ }
+ }));
+ }
+
private static Map<String, String>
mapMetadata(org.kie.api.definition.process.Node n) {
return n.getMetaData().entrySet().stream().filter(e -> e.getValue() !=
null).collect(toMap(Map.Entry::getKey, e -> e.getValue().toString()));
}
@@ -277,8 +286,7 @@ public class KogitoAddonRuntimeClientImpl extends
KogitoRuntimeCommonClient impl
return throwUnsupportedException();
}
- private String executeOnProcessInstance(String processId, String
processInstanceId, Function<org.kie.kogito.process.ProcessInstance<?>, String>
supplier) {
-
+ private <T> T executeOnProcessInstance(String processId, String
processInstanceId, Function<org.kie.kogito.process.ProcessInstance<?>, T>
supplier) {
Process<?> process = processes != null ?
processes.processById(processId) : null;
if (process == null) {
diff --git
a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/runtime/src/main/java/org/kie/kogito/index/addon/graphql/GraphQLAddonSchemaManagerImpl.java
b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/runtime/src/main/java/org/kie/kogito/index/addon/graphql/GraphQLAddonSchemaManagerImpl.java
index d12b09b7c..7c15e7539 100644
---
a/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/runtime/src/main/java/org/kie/kogito/index/addon/graphql/GraphQLAddonSchemaManagerImpl.java
+++
b/data-index/kogito-addons-quarkus-data-index/kogito-addons-quarkus-data-index-common/runtime/src/main/java/org/kie/kogito/index/addon/graphql/GraphQLAddonSchemaManagerImpl.java
@@ -70,6 +70,7 @@ public class GraphQLAddonSchemaManagerImpl extends
AbstractGraphQLSchemaManager
builder.dataFetcher("parentProcessInstance",
this::getParentProcessInstanceValue);
builder.dataFetcher("childProcessInstances",
this::getChildProcessInstancesValues);
builder.dataFetcher("serviceUrl",
this::getProcessInstanceServiceUrl);
+ builder.dataFetcher("timers",
this::getProcessInstanceTimers);
builder.dataFetcher("diagram",
this::getProcessInstanceDiagram);
builder.dataFetcher("source",
this::getProcessInstanceSource);
builder.dataFetcher("nodeDefinitions",
this::getProcessInstanceNodes);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]