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

egonzalez 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 d60fce10f3 [incubator-kie-issues#1996] 
CodegenNodeInstanceFactoryRegistry is created more than once if the environment 
is specified (#3946)
d60fce10f3 is described below

commit d60fce10f366f81b8344479b3ea7634bfe51b590
Author: Pere Fernández <[email protected]>
AuthorDate: Mon Jun 9 09:42:31 2025 +0200

    [incubator-kie-issues#1996] CodegenNodeInstanceFactoryRegistry is created 
more than once if the environment is specified (#3946)
---
 .../process/instance/DummyKnowledgeRuntime.java    |  3 ++-
 .../instance/impl/NodeInstanceFactoryRegistry.java | 31 +++++++++++++++-------
 2 files changed, 23 insertions(+), 11 deletions(-)

diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/DummyKnowledgeRuntime.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/DummyKnowledgeRuntime.java
index 6f1bbb35ab..ee457ac418 100644
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/DummyKnowledgeRuntime.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/DummyKnowledgeRuntime.java
@@ -63,6 +63,7 @@ import org.kie.kogito.jobs.JobsService;
 import org.kie.kogito.process.ProcessConfig;
 
 import static 
org.jbpm.process.core.constants.CalendarConstants.BUSINESS_CALENDAR_ENVIRONMENT_KEY;
+import static 
org.jbpm.workflow.instance.impl.NodeInstanceFactoryRegistry.NODE_INSTANCE_FACTORY_REGISTRY_KEY;
 
 /**
  * A severely limited implementation of the WorkingMemory interface.
@@ -81,7 +82,7 @@ class DummyKnowledgeRuntime implements 
InternalKnowledgeRuntime, KogitoProcessRu
         if (Objects.nonNull(calendar)) {
             environment.set(BUSINESS_CALENDAR_ENVIRONMENT_KEY, calendar);
         }
-        environment.set("NodeInstanceFactoryRegistry", new 
CodegenNodeInstanceFactoryRegistry());
+        environment.set(NODE_INSTANCE_FACTORY_REGISTRY_KEY, 
CodegenNodeInstanceFactoryRegistry.class.getName());
     }
 
     @Override
diff --git 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceFactoryRegistry.java
 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceFactoryRegistry.java
index 72b48b9c05..42d385f94b 100755
--- 
a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceFactoryRegistry.java
+++ 
b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/NodeInstanceFactoryRegistry.java
@@ -18,10 +18,7 @@
  */
 package org.jbpm.workflow.instance.impl;
 
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.ServiceLoader;
+import java.util.*;
 
 import org.jbpm.util.JbpmClassLoaderUtil;
 import org.kie.api.definition.process.Node;
@@ -30,18 +27,32 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class NodeInstanceFactoryRegistry {
+    public static final String NODE_INSTANCE_FACTORY_REGISTRY_KEY = 
"NodeInstanceFactoryRegistry";
+
     private static final Logger LOGGER = 
LoggerFactory.getLogger(NodeInstanceFactoryRegistry.class);
     private static final NodeInstanceFactoryRegistry INSTANCE = new 
NodeInstanceFactoryRegistry();
 
-    private Map<Class<? extends Node>, NodeInstanceFactory> registry;
+    private static final Map<String, NodeInstanceFactoryRegistry> 
LOADED_NODE_INSTANCE_FACTORY_REGISTRIES = new HashMap<>();
+
+    private final Map<Class<? extends Node>, NodeInstanceFactory> registry;
 
     public static NodeInstanceFactoryRegistry getInstance(Environment 
environment) {
-        // allow custom NodeInstanceFactoryRegistry to be given as part of the 
environment - e.g simulation
-        if (environment != null && 
environment.get("NodeInstanceFactoryRegistry") != null) {
-            return (NodeInstanceFactoryRegistry) 
environment.get("NodeInstanceFactoryRegistry");
-        }
+        return getFactoryRegistryFromEnvironment(environment).orElse(INSTANCE);
+    }
 
-        return INSTANCE;
+    private static Optional<NodeInstanceFactoryRegistry> 
getFactoryRegistryFromEnvironment(Environment environment) {
+        if (environment != null && 
environment.get(NODE_INSTANCE_FACTORY_REGISTRY_KEY) != null) {
+            String factoryRegistryClassName = (String) 
environment.get(NODE_INSTANCE_FACTORY_REGISTRY_KEY);
+            return 
Optional.of(LOADED_NODE_INSTANCE_FACTORY_REGISTRIES.computeIfAbsent(factoryRegistryClassName,
+                    className -> {
+                        try {
+                            return (NodeInstanceFactoryRegistry) 
Class.forName(className, true, 
JbpmClassLoaderUtil.findClassLoader()).getConstructor().newInstance();
+                        } catch (Exception e) {
+                            throw new RuntimeException("Could not create an 
instance of NodeInstanceFactoryRegistry with java type '" + className + "'", e);
+                        }
+                    }));
+        }
+        return Optional.empty();
     }
 
     protected NodeInstanceFactoryRegistry() {


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

Reply via email to