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]

Reply via email to