aboutsummaryrefslogtreecommitdiffstats
path: root/pf4j/src/main/java
diff options
context:
space:
mode:
authorAjith Kumar <ajithalbus@gmail.com>2020-10-20 14:36:15 +0530
committerGitHub <noreply@github.com>2020-10-20 12:06:15 +0300
commitc2d9998350b3a15ff7678c9053bca434463cf915 (patch)
tree13fe764a13aaaf8d78fb7f037157687e7df6d8d1 /pf4j/src/main/java
parent0d586c805ee882a2a80244ee83b941528a38e268 (diff)
downloadpf4j-c2d9998350b3a15ff7678c9053bca434463cf915.tar.gz
pf4j-c2d9998350b3a15ff7678c9053bca434463cf915.zip
Bucketed caching in SingletonExtensionFactory (#402)
Diffstat (limited to 'pf4j/src/main/java')
-rw-r--r--pf4j/src/main/java/org/pf4j/SingletonExtensionFactory.java20
1 files changed, 15 insertions, 5 deletions
diff --git a/pf4j/src/main/java/org/pf4j/SingletonExtensionFactory.java b/pf4j/src/main/java/org/pf4j/SingletonExtensionFactory.java
index 725b9a7..ff94652 100644
--- a/pf4j/src/main/java/org/pf4j/SingletonExtensionFactory.java
+++ b/pf4j/src/main/java/org/pf4j/SingletonExtensionFactory.java
@@ -19,36 +19,46 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.WeakHashMap;
/**
* An {@link ExtensionFactory} that always returns a specific instance.
* Optional, you can specify the extension classes for which you want singletons.
*
* @author Decebal Suiu
+ * @author Ajith Kumar
*/
public class SingletonExtensionFactory extends DefaultExtensionFactory {
private final List<String> extensionClassNames;
- private Map<String, Object> cache;
+ private Map<ClassLoader, Map<String, Object>> cache;
public SingletonExtensionFactory(String... extensionClassNames) {
this.extensionClassNames = Arrays.asList(extensionClassNames);
- cache = new HashMap<>(); // simple cache implementation
+ cache = new WeakHashMap<>(); // simple cache implementation
}
@Override
@SuppressWarnings("unchecked")
public <T> T create(Class<T> extensionClass) {
String extensionClassName = extensionClass.getName();
- if (cache.containsKey(extensionClassName)) {
- return (T) cache.get(extensionClassName);
+ ClassLoader extensionClassLoader = extensionClass.getClassLoader();
+
+ if (!cache.containsKey(extensionClassLoader)) {
+ cache.put(extensionClassLoader, new HashMap<>());
+ }
+
+ Map<String, Object> classLoaderBucket = cache.get(extensionClassLoader);
+
+ if (classLoaderBucket.containsKey(extensionClassName)) {
+ return (T) classLoaderBucket.get(extensionClassName);
}
T extension = super.create(extensionClass);
if (extensionClassNames.isEmpty() || extensionClassNames.contains(extensionClassName)) {
- cache.put(extensionClassName, extension);
+ classLoaderBucket.put(extensionClassName, extension);
}
return extension;