This is an automated email from the ASF dual-hosted git repository.

fjtiradosarti pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new 2ff45a4313 [Fix #3628] Avoiding concurrency issues with Instance and 
ServiceLoader (#3632)
2ff45a4313 is described below

commit 2ff45a4313861ea48ed2aee937036266604a5247
Author: Francisco Javier Tirado Sarti 
<[email protected]>
AuthorDate: Thu Aug 22 18:39:58 2024 +0200

    [Fix #3628] Avoiding concurrency issues with Instance and ServiceLoader 
(#3632)
---
 .../process/dynamic/ProcessInstanceDynamicCallHelper.java  |  6 +++---
 .../kie/kogito/process/expr/ExpressionHandlerFactory.java  |  9 ++++++---
 .../dynamic/ProcessInstanceDynamicCallsResource.java       | 14 ++++++++++----
 3 files changed, 19 insertions(+), 10 deletions(-)

diff --git 
a/addons/common/process-dynamic/src/main/java/org/kie/kogito/process/dynamic/ProcessInstanceDynamicCallHelper.java
 
b/addons/common/process-dynamic/src/main/java/org/kie/kogito/process/dynamic/ProcessInstanceDynamicCallHelper.java
index f4315135fb..7c52c174aa 100644
--- 
a/addons/common/process-dynamic/src/main/java/org/kie/kogito/process/dynamic/ProcessInstanceDynamicCallHelper.java
+++ 
b/addons/common/process-dynamic/src/main/java/org/kie/kogito/process/dynamic/ProcessInstanceDynamicCallHelper.java
@@ -18,9 +18,9 @@
  */
 package org.kie.kogito.process.dynamic;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.stream.Stream;
 
 import org.drools.core.common.InternalKnowledgeRuntime;
 import org.jbpm.process.instance.InternalProcessRuntime;
@@ -41,8 +41,8 @@ public class ProcessInstanceDynamicCallHelper {
     private ProcessInstanceDynamicCallHelper() {
     }
 
-    public static void executeRestCall(RestWorkItemHandler handler, 
Stream<Process<?>> processes, String processId, String processInstanceId, 
RestCallInfo input) {
-        Process<?> processDef = processes.filter(p -> 
p.id().equals(processId)).findAny().orElseThrow(() -> new 
IllegalArgumentException("Cannot find process " + processId));
+    public static void executeRestCall(RestWorkItemHandler handler, 
Collection<Process<?>> processes, String processId, String processInstanceId, 
RestCallInfo input) {
+        Process<?> processDef = processes.stream().filter(p -> 
p.id().equals(processId)).findAny().orElseThrow(() -> new 
IllegalArgumentException("Cannot find process " + processId));
         WorkflowProcessInstance pi = (WorkflowProcessInstance) 
findProcessInstance(processDef, processInstanceId);
         WorkflowProcessImpl process = (WorkflowProcessImpl) pi.getProcess();
         if (!process.isDynamic()) {
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/expr/ExpressionHandlerFactory.java
 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/expr/ExpressionHandlerFactory.java
index af66edf6e9..3becf03a8a 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/expr/ExpressionHandlerFactory.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/expr/ExpressionHandlerFactory.java
@@ -18,15 +18,18 @@
  */
 package org.kie.kogito.process.expr;
 
+import java.util.Collection;
 import java.util.Optional;
 import java.util.ServiceLoader;
+import java.util.stream.Collectors;
 
 public class ExpressionHandlerFactory {
 
     private ExpressionHandlerFactory() {
     }
 
-    private static final ServiceLoader<ExpressionHandler> serviceLoader = 
ServiceLoader.load(ExpressionHandler.class);
+    private static final Collection<ExpressionHandler> expressionHandlers = 
ServiceLoader.load(ExpressionHandler.class).stream()
+            
.map(ServiceLoader.Provider::get).collect(Collectors.toUnmodifiableList());
 
     public static Expression get(String lang, String expr) {
         return getExpressionHandler(lang).orElseThrow(
@@ -34,10 +37,10 @@ public class ExpressionHandlerFactory {
     }
 
     public static boolean isSupported(String lang) {
-        return serviceLoader.stream().anyMatch(p -> 
p.get().lang().equals(lang));
+        return 
expressionHandlers.stream().map(ExpressionHandler::lang).anyMatch(lang::equals);
     }
 
     private static Optional<ExpressionHandler> getExpressionHandler(String 
lang) {
-        return serviceLoader.stream().filter(p -> 
p.get().lang().equals(lang)).findFirst().map(p -> p.get());
+        return expressionHandlers.stream().filter(p -> 
p.lang().equals(lang)).findFirst();
     }
 }
diff --git 
a/quarkus/addons/dynamic/runtime/src/main/java/org/kie/kogito/process/dynamic/ProcessInstanceDynamicCallsResource.java
 
b/quarkus/addons/dynamic/runtime/src/main/java/org/kie/kogito/process/dynamic/ProcessInstanceDynamicCallsResource.java
index 6729a5c1ac..7ff60f5248 100644
--- 
a/quarkus/addons/dynamic/runtime/src/main/java/org/kie/kogito/process/dynamic/ProcessInstanceDynamicCallsResource.java
+++ 
b/quarkus/addons/dynamic/runtime/src/main/java/org/kie/kogito/process/dynamic/ProcessInstanceDynamicCallsResource.java
@@ -18,6 +18,9 @@
  */
 package org.kie.kogito.process.dynamic;
 
+import java.util.Collection;
+import java.util.stream.Collectors;
+
 import org.kie.kogito.process.Process;
 import org.kogito.workitem.rest.RestWorkItemHandler;
 
@@ -39,13 +42,17 @@ import jakarta.ws.rs.core.Response;
 @Path("/_dynamic")
 public class ProcessInstanceDynamicCallsResource {
 
-    @Inject
-    Instance<Process<?>> processes;
     @Inject
     Vertx vertx;
     @Inject
     WebClientOptions sslOptions;
     private RestWorkItemHandler handler;
+    private Collection<Process<?>> processes;
+
+    @Inject
+    ProcessInstanceDynamicCallsResource(Instance<Process<?>> processes) {
+        this.processes = 
processes.stream().collect(Collectors.toUnmodifiableList());
+    }
 
     @PostConstruct
     void init() {
@@ -57,8 +64,7 @@ public class ProcessInstanceDynamicCallsResource {
     @Consumes(MediaType.APPLICATION_JSON)
     @Path("/{processId}/{processInstanceId}/rest")
     public Response executeRestCall(@PathParam("processId") String processId, 
@PathParam("processInstanceId") String processInstanceId, RestCallInfo input) {
-        ProcessInstanceDynamicCallHelper.executeRestCall(handler, 
processes.stream(), processId, processInstanceId, input);
+        ProcessInstanceDynamicCallHelper.executeRestCall(handler, processes, 
processId, processInstanceId, input);
         return Response.status(200).build();
     }
-
 }


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

Reply via email to