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

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


The following commit(s) were added to refs/heads/main by this push:
     new 430ea3788c [KIE-635] implement a cache for loaded services (#5557)
430ea3788c is described below

commit 430ea3788c561027cb0ff8b7022b5bad0cbb4f0b
Author: Mario Fusco <[email protected]>
AuthorDate: Thu Oct 19 08:32:06 2023 +0200

    [KIE-635] implement a cache for loaded services (#5557)
---
 .../impl/CompositeKnowledgeBuilderImpl.java        |  8 +--
 .../builder/impl/KnowledgeBuilderImpl.java         | 67 ++++++++++------------
 .../compiler/kie/builder/impl/KieServicesImpl.java | 34 +++++------
 .../org/drools/core/impl/KnowledgeBaseImpl.java    | 10 ++--
 .../session/StatelessKnowledgeSessionImpl.java     | 25 ++++----
 .../ruleunits/dsl/RuleUnitProviderForDSL.java      |  4 +-
 .../org/kie/api/internal/utils/KieService.java     | 30 +---------
 .../kie/api/internal/utils/KieServiceLoader.java   | 61 ++++++++++++++++++++
 8 files changed, 135 insertions(+), 104 deletions(-)

diff --git 
a/drools-compiler/src/main/java/org/drools/compiler/builder/impl/CompositeKnowledgeBuilderImpl.java
 
b/drools-compiler/src/main/java/org/drools/compiler/builder/impl/CompositeKnowledgeBuilderImpl.java
index 1d0f2bbacb..5c521da7bf 100644
--- 
a/drools-compiler/src/main/java/org/drools/compiler/builder/impl/CompositeKnowledgeBuilderImpl.java
+++ 
b/drools-compiler/src/main/java/org/drools/compiler/builder/impl/CompositeKnowledgeBuilderImpl.java
@@ -40,6 +40,8 @@ import java.util.stream.Collectors;
 
 public class CompositeKnowledgeBuilderImpl implements 
CompositeKnowledgeBuilder {
 
+    private static final KieAssemblers ASSEMBLERS = 
KieService.load(KieAssemblers.class);
+
     private final KnowledgeBuilderImpl kBuilder;
 
     private final Map<ResourceType, List<ResourceDescr>> resourcesByType = new 
HashMap<>();
@@ -176,13 +178,12 @@ public class CompositeKnowledgeBuilderImpl implements 
CompositeKnowledgeBuilder
     }
 
     private void buildAssemblerResourcesBeforeRules() {
-        KieAssemblers assemblers = KieService.load(KieAssemblers.class);
         try {
             for (Map.Entry<ResourceType, List<ResourceDescr>> 
resourceTypeListEntry : resourcesByType.entrySet()) {
                 ResourceType type = resourceTypeListEntry.getKey();
                 List<ResourceDescr> descrs = resourceTypeListEntry.getValue();
                 for (ResourceDescr descr : descrs) {
-                    assemblers.addResourceBeforeRules(this.kBuilder, 
descr.resource, type, descr.configuration);
+                    ASSEMBLERS.addResourceBeforeRules(this.kBuilder, 
descr.resource, type, descr.configuration);
                 }
             }
         } catch (RuntimeException e) {
@@ -197,11 +198,10 @@ public class CompositeKnowledgeBuilderImpl implements 
CompositeKnowledgeBuilder
     }
 
     private void buildAssemblerResourcesAfterRules() {
-        KieAssemblers assemblers = KieService.load(KieAssemblers.class);
         try {
             for (Map.Entry<ResourceType, List<ResourceDescr>> entry : 
resourcesByType.entrySet()) {
                 List<ResourceWithConfiguration> rds = 
entry.getValue().stream().map(CompositeKnowledgeBuilderImpl::descrToResourceWithConfiguration).collect(Collectors.toList());
-                assemblers.addResourcesAfterRules(kBuilder, rds, 
entry.getKey());
+                ASSEMBLERS.addResourcesAfterRules(kBuilder, rds, 
entry.getKey());
             }
         } catch (RuntimeException e) {
             throw e;
diff --git 
a/drools-compiler/src/main/java/org/drools/compiler/builder/impl/KnowledgeBuilderImpl.java
 
b/drools-compiler/src/main/java/org/drools/compiler/builder/impl/KnowledgeBuilderImpl.java
index 2820f54192..de0b6592eb 100644
--- 
a/drools-compiler/src/main/java/org/drools/compiler/builder/impl/KnowledgeBuilderImpl.java
+++ 
b/drools-compiler/src/main/java/org/drools/compiler/builder/impl/KnowledgeBuilderImpl.java
@@ -18,24 +18,12 @@
  */
 package org.drools.compiler.builder.impl;
 
-import static java.util.Arrays.asList;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.Reader;
-import java.lang.reflect.Type;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.concurrent.ForkJoinPool;
-import java.util.function.Supplier;
-
+import org.drools.base.base.ObjectType;
+import org.drools.base.definitions.InternalKnowledgePackage;
+import org.drools.base.definitions.rule.impl.RuleImpl;
+import org.drools.base.rule.Function;
+import org.drools.base.rule.ImportDeclaration;
+import org.drools.base.rule.TypeDeclaration;
 import org.drools.compiler.builder.InternalKnowledgeBuilder;
 import org.drools.compiler.builder.PackageRegistryManager;
 import org.drools.compiler.builder.impl.processors.CompilationPhase;
@@ -56,14 +44,8 @@ import org.drools.compiler.compiler.ProcessBuilderFactory;
 import org.drools.compiler.compiler.ResourceTypeDeclarationWarning;
 import org.drools.compiler.kie.builder.impl.BuildContext;
 import org.drools.compiler.lang.descr.CompositePackageDescr;
-import org.drools.base.base.ObjectType;
-import org.drools.base.definitions.InternalKnowledgePackage;
-import org.drools.base.definitions.rule.impl.RuleImpl;
 import org.drools.core.impl.InternalRuleBase;
 import org.drools.core.impl.RuleBaseFactory;
-import org.drools.base.rule.Function;
-import org.drools.base.rule.ImportDeclaration;
-import org.drools.base.rule.TypeDeclaration;
 import org.drools.drl.ast.descr.AttributeDescr;
 import org.drools.drl.ast.descr.ImportDescr;
 import org.drools.drl.ast.descr.PackageDescr;
@@ -81,6 +63,7 @@ import org.drools.kiesession.rulebase.KnowledgeBaseFactory;
 import org.drools.wiring.api.ComponentsFactory;
 import org.kie.api.KieBase;
 import org.kie.api.KieBaseConfiguration;
+import org.kie.api.KieServices;
 import org.kie.api.builder.ReleaseId;
 import org.kie.api.definition.KiePackage;
 import org.kie.api.definition.process.Process;
@@ -91,7 +74,6 @@ import org.kie.api.io.Resource;
 import org.kie.api.io.ResourceConfiguration;
 import org.kie.api.io.ResourceType;
 import org.kie.api.io.ResourceWithConfiguration;
-import org.kie.api.KieServices;
 import org.kie.internal.builder.CompositeKnowledgeBuilder;
 import org.kie.internal.builder.KnowledgeBuilderConfiguration;
 import org.kie.internal.builder.KnowledgeBuilderError;
@@ -107,9 +89,29 @@ import 
org.kie.internal.builder.conf.ParallelRulesBuildThresholdOption;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.Reader;
+import java.lang.reflect.Type;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ForkJoinPool;
+import java.util.function.Supplier;
+
+import static java.util.Arrays.asList;
+
 public class KnowledgeBuilderImpl implements InternalKnowledgeBuilder, 
TypeDeclarationContext, BuildResultCollector, GlobalVariableContext {
     protected static final transient Logger logger = 
LoggerFactory.getLogger(KnowledgeBuilderImpl.class);
 
+    private static final KieAssemblers ASSEMBLERS = 
KieService.load(KieAssemblers.class);
+
     private final PackageRegistryManagerImpl pkgRegistryManager;
 
     private final BuildResultCollectorImpl results;
@@ -393,22 +395,13 @@ public class KnowledgeBuilderImpl implements 
InternalKnowledgeBuilder, TypeDecla
     }
 
     @Deprecated
-    void addPackageForExternalType(Resource resource,
-                                   ResourceType type,
-                                   ResourceConfiguration configuration) throws 
Exception {
-        KieAssemblers assemblers = KieService.load(KieAssemblers.class);
-
-        assemblers.addResourceAfterRules(this,
-                               resource,
-                               type,
-                               configuration);
+    void addPackageForExternalType(Resource resource, ResourceType type, 
ResourceConfiguration configuration) throws Exception {
+        ASSEMBLERS.addResourceAfterRules(this, resource, type, configuration);
     }
 
     @Deprecated
     void addPackageForExternalType(ResourceType type, 
List<ResourceWithConfiguration> resources) throws Exception {
-        KieAssemblers assemblers = KieService.load(KieAssemblers.class);
-
-        assemblers.addResourcesAfterRules(this, resources, type);
+        ASSEMBLERS.addResourcesAfterRules(this, resources, type);
     }
 
     void addPackageFromXSD(Resource resource, ResourceConfiguration 
configuration) throws IOException {
diff --git 
a/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieServicesImpl.java
 
b/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieServicesImpl.java
index 0722212ab5..2b96464714 100644
--- 
a/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieServicesImpl.java
+++ 
b/drools-compiler/src/main/java/org/drools/compiler/kie/builder/impl/KieServicesImpl.java
@@ -18,13 +18,6 @@
  */
 package org.drools.compiler.kie.builder.impl;
 
-import java.io.File;
-import java.lang.ref.WeakReference;
-import java.util.Properties;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
 import org.drools.compiler.kie.builder.impl.event.KieServicesEventListerner;
 import org.drools.compiler.kproject.models.KieModuleModelImpl;
 import org.drools.core.BaseConfigurationFactories;
@@ -32,8 +25,8 @@ import org.drools.core.CompositeSessionConfiguration;
 import org.drools.core.SessionConfigurationFactories;
 import org.drools.core.concurrent.ExecutorProviderImpl;
 import org.drools.core.impl.EnvironmentFactory;
-import org.drools.kiesession.audit.KnowledgeRuntimeLoggerProviderImpl;
 import org.drools.io.ResourceFactoryServiceImpl;
+import org.drools.kiesession.audit.KnowledgeRuntimeLoggerProviderImpl;
 import org.drools.wiring.api.classloader.ProjectClassLoader;
 import org.kie.api.KieBaseConfiguration;
 import org.kie.api.builder.KieBuilder;
@@ -57,10 +50,18 @@ import org.kie.internal.conf.CompositeBaseConfiguration;
 import org.kie.internal.utils.ChainedProperties;
 import org.kie.util.maven.support.ReleaseIdImpl;
 
+import java.io.File;
+import java.lang.ref.WeakReference;
+import java.util.Properties;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
 import static 
org.drools.compiler.compiler.io.memory.MemoryFileSystem.readFromJar;
 import static org.drools.util.ClassUtils.findParentClassLoader;
 
 public class KieServicesImpl implements InternalKieServices {
+
     private volatile KieContainer classpathKContainer;
     private volatile String classpathKContainerId;
     
@@ -137,8 +138,7 @@ public class KieServicesImpl implements InternalKieServices 
{
     @Override
     public KieContainer newKieClasspathContainer(String containerId, 
ClassLoader classLoader, ReleaseId releaseId) {
        if (containerId == null) {
-            KieContainerImpl newContainer = new 
KieContainerImpl(UUID.randomUUID().toString(), new 
ClasspathKieProject(classLoader, listener, releaseId), null);
-           return newContainer;
+            return new KieContainerImpl(UUID.randomUUID().toString(), new 
ClasspathKieProject(classLoader, listener, releaseId), null);
        }
        if ( kContainers.get(containerId) == null ) {
             KieContainerImpl newContainer = new KieContainerImpl(containerId, 
new ClasspathKieProject(classLoader, listener, releaseId), null, releaseId);
@@ -204,9 +204,9 @@ public class KieServicesImpl implements InternalKieServices 
{
         }
 
        if (containerId == null) {
-           KieContainerImpl newContainer = new KieContainerImpl( 
UUID.randomUUID().toString(), kProject, getRepository(), releaseId );
-               return newContainer;
+            return new KieContainerImpl( UUID.randomUUID().toString(), 
kProject, getRepository(), releaseId );
        }
+
        if ( kContainers.get(containerId) == null ) {
             KieContainerImpl newContainer = new KieContainerImpl( containerId, 
kProject, getRepository(), releaseId );
             KieContainer check = kContainers.putIfAbsent(containerId, 
newContainer);
@@ -254,11 +254,14 @@ public class KieServicesImpl implements 
InternalKieServices {
     }
 
     public KieCommands getCommands() {
-        return KieService.load( KieCommands.class );
+        return KieCommandsHolder.KIE_COMMANDS;
+    }
+
+    private static class KieCommandsHolder {
+        private static final KieCommands KIE_COMMANDS = KieService.load( 
KieCommands.class );
     }
 
     public KieMarshallers getMarshallers() {
-        // instantiating directly, but we might want to use the service 
registry instead
         KieMarshallers kieMarshallers = KieService.load( KieMarshallers.class 
);
         if (kieMarshallers == null) {
             throw new RuntimeException("Marshaller not available, please add 
the module org.drools:drools-serialization-protobuf to your classpath.");
@@ -333,8 +336,7 @@ public class KieServicesImpl implements InternalKieServices 
{
     }
 
     private ClassLoader getClassLoader(ClassLoader classLoader) {
-        ClassLoader projClassLoader = classLoader instanceof 
ProjectClassLoader ? classLoader : 
ProjectClassLoader.getClassLoader(classLoader, getClass());
-        return projClassLoader;
+        return classLoader instanceof ProjectClassLoader ? classLoader : 
ProjectClassLoader.getClassLoader(classLoader, getClass());
     }
 
     public Environment newEnvironment() {
diff --git 
a/drools-core/src/main/java/org/drools/core/impl/KnowledgeBaseImpl.java 
b/drools-core/src/main/java/org/drools/core/impl/KnowledgeBaseImpl.java
index 064ad42c7d..dfd978c3f7 100644
--- a/drools-core/src/main/java/org/drools/core/impl/KnowledgeBaseImpl.java
+++ b/drools-core/src/main/java/org/drools/core/impl/KnowledgeBaseImpl.java
@@ -105,6 +105,8 @@ public class KnowledgeBaseImpl implements InternalRuleBase {
 
     protected static final Logger logger = 
LoggerFactory.getLogger(KnowledgeBaseImpl.class);
 
+    private static final KieWeavers WEAVERS = KieService.load( 
KieWeavers.class );
+
     private Set<EntryPointNode> addedEntryNodeCache;
     private Set<EntryPointNode> removedEntryNodeCache;
 
@@ -445,9 +447,8 @@ public class KnowledgeBaseImpl implements InternalRuleBase {
             }
 
             if ( ! newPkg.getResourceTypePackages().isEmpty() ) {
-                KieWeavers weavers = KieService.load( KieWeavers.class );
                 for ( ResourceTypePackage rtkKpg : 
newPkg.getResourceTypePackages().values() ) {
-                    weavers.weave( newPkg, rtkKpg );
+                    WEAVERS.weave( newPkg, rtkKpg );
                 }
             }
 
@@ -817,12 +818,11 @@ public class KnowledgeBaseImpl implements 
InternalRuleBase {
         }
 
         if ( ! newPkg.getResourceTypePackages().isEmpty() ) {
-            KieWeavers weavers = KieService.load(KieWeavers.class);
-            if (weavers == null) {
+            if (WEAVERS == null) {
                 throw new IllegalStateException("Unable to find KieWeavers 
implementation");
             }
             for ( ResourceTypePackage rtkKpg : 
newPkg.getResourceTypePackages().values() ) {
-                weavers.merge( pkg, rtkKpg );
+                WEAVERS.merge( pkg, rtkKpg );
             }
         }
     }
diff --git 
a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatelessKnowledgeSessionImpl.java
 
b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatelessKnowledgeSessionImpl.java
index 7ed4aaab00..48e593d65d 100644
--- 
a/drools-kiesession/src/main/java/org/drools/kiesession/session/StatelessKnowledgeSessionImpl.java
+++ 
b/drools-kiesession/src/main/java/org/drools/kiesession/session/StatelessKnowledgeSessionImpl.java
@@ -18,17 +18,6 @@
  */
 package org.drools.kiesession.session;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EventListener;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
-
 import org.drools.core.SessionConfiguration;
 import org.drools.core.base.MapGlobalResolver;
 import org.drools.core.common.InternalFactHandle;
@@ -58,6 +47,17 @@ import org.kie.api.runtime.rule.FactHandle;
 import org.kie.internal.command.RegistryContext;
 import org.kie.internal.runtime.StatefulKnowledgeSession;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EventListener;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
+
 public class StatelessKnowledgeSessionImpl extends AbstractRuntime implements 
StatelessKieSession {
 
     private InternalKnowledgeBase kBase;
@@ -217,8 +217,7 @@ public class StatelessKnowledgeSessionImpl extends 
AbstractRuntime implements St
     }
     
     @Override
-    public void registerChannel(String name,
-                                Channel channel) {
+    public void registerChannel(String name, Channel channel) {
         this.channels.put(name, channel);
     }
     
diff --git 
a/drools-ruleunits/drools-ruleunits-dsl/src/main/java/org/drools/ruleunits/dsl/RuleUnitProviderForDSL.java
 
b/drools-ruleunits/drools-ruleunits-dsl/src/main/java/org/drools/ruleunits/dsl/RuleUnitProviderForDSL.java
index f810c0e079..b7ee431609 100644
--- 
a/drools-ruleunits/drools-ruleunits-dsl/src/main/java/org/drools/ruleunits/dsl/RuleUnitProviderForDSL.java
+++ 
b/drools-ruleunits/drools-ruleunits-dsl/src/main/java/org/drools/ruleunits/dsl/RuleUnitProviderForDSL.java
@@ -18,8 +18,6 @@
  */
 package org.drools.ruleunits.dsl;
 
-import java.util.Map;
-
 import org.drools.core.common.ReteEvaluator;
 import org.drools.core.impl.InternalRuleBase;
 import org.drools.core.reteoo.ReteDumper;
@@ -37,6 +35,8 @@ import org.drools.ruleunits.impl.factory.AbstractRuleUnit;
 import org.drools.ruleunits.impl.sessions.RuleUnitExecutorImpl;
 import org.kie.api.runtime.rule.EntryPoint;
 
+import java.util.Map;
+
 public class RuleUnitProviderForDSL extends RuleUnitProviderImpl {
 
     private static final boolean DUMP_GENERATED_RETE = false;
diff --git a/kie-api/src/main/java/org/kie/api/internal/utils/KieService.java 
b/kie-api/src/main/java/org/kie/api/internal/utils/KieService.java
index a0bf1b2ad9..f8f78bdcb9 100644
--- a/kie-api/src/main/java/org/kie/api/internal/utils/KieService.java
+++ b/kie-api/src/main/java/org/kie/api/internal/utils/KieService.java
@@ -18,11 +18,9 @@
  */
 package org.kie.api.internal.utils;
 
-import java.util.ServiceLoader;
-
 public interface KieService extends Comparable<KieService> {
 
-    public static final String UNDEFINED = "undefined";
+    String UNDEFINED = "undefined";
 
     default int servicePriority() {
         return 0;
@@ -42,32 +40,10 @@ public interface KieService extends Comparable<KieService> {
     }
 
     static <T extends KieService> T load(Class<T> serviceClass) {
-        ServiceLoader<T> loader = ServiceLoader.load(serviceClass, 
serviceClass.getClassLoader());
-        T service = null;
-        for (T impl : loader) {
-            if (service == null || impl.compareTo(service) > 0) {
-                service = impl;
-            }
-        }
-        return service;
+        return KieServiceLoader.INSTANCE.lookup(serviceClass);
     }
 
     static <T extends KieService> T loadWithTag(Class<T> serviceClass, String 
tag) {
-        if (tag == null || tag.equals(UNDEFINED)) {
-            return load(serviceClass); // fall back to priority based loading
-        }
-
-        ServiceLoader<T> loader = ServiceLoader.load(serviceClass, 
serviceClass.getClassLoader());
-        T service = null;
-        for (T impl : loader) {
-            if (tag.equals(impl.serviceTag())) { // accept only services with 
the specified tag
-                if (service == null) {
-                    service = impl;
-                } else {
-                    throw new IllegalStateException("Found 2 services with the 
same tag \"" + tag + "\": " + service.getClass().getCanonicalName() + " and " + 
impl.getClass().getCanonicalName());
-                }
-            }
-        }
-        return service;
+        return KieServiceLoader.INSTANCE.lookup(serviceClass, tag);
     }
 }
diff --git 
a/kie-api/src/main/java/org/kie/api/internal/utils/KieServiceLoader.java 
b/kie-api/src/main/java/org/kie/api/internal/utils/KieServiceLoader.java
new file mode 100644
index 0000000000..eba502dc9a
--- /dev/null
+++ b/kie-api/src/main/java/org/kie/api/internal/utils/KieServiceLoader.java
@@ -0,0 +1,61 @@
+/**
+ * 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.api.internal.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.ServiceLoader;
+
+import static org.kie.api.internal.utils.KieService.UNDEFINED;
+
+public class KieServiceLoader {
+
+    static final KieServiceLoader INSTANCE = new KieServiceLoader();
+
+    private final Map<String, KieService> serviceCache = new HashMap<>();
+
+    private KieServiceLoader() {}
+
+    <T extends KieService> T lookup(Class<T> serviceClass) {
+        return lookup(serviceClass, UNDEFINED);
+    }
+
+    <T extends KieService> T lookup(Class<T> serviceClass, String tag) {
+        String serviceKey = serviceClass.getName() + ":" + tag;
+        if (serviceCache.containsKey(serviceKey)) {
+            return (T) serviceCache.get(serviceKey);
+        }
+        T loadedService = load(serviceClass, tag);
+        serviceCache.put(serviceKey, load(serviceClass, tag));
+        return loadedService;
+    }
+
+    <T extends KieService> T load(Class<T> serviceClass, String tag) {
+        ServiceLoader<T> loader = ServiceLoader.load(serviceClass, 
serviceClass.getClassLoader());
+        T service = null;
+        for (T impl : loader) {
+            if ( tag.equals(impl.serviceTag()) ) { // accept only services 
with the specified tag
+                if (service == null || impl.compareTo(service) > 0) {
+                    service = impl;
+                }
+            }
+        }
+        return service;
+    }
+}


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

Reply via email to