summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDinnerbone <dinnerbone@dinnerbone.com>2011-01-11 20:36:38 +0000
committerDinnerbone <dinnerbone@dinnerbone.com>2011-01-11 20:36:38 +0000
commitf87466c9747063ef3b6e0928d06c6f4f73999da1 (patch)
tree9767b34c2f8bdbcc4758a4d1235551502053348a /src
parentdc26bba4cfc9553d5b1674a928c1c8da7de8ad90 (diff)
downloadbukkit-f87466c9747063ef3b6e0928d06c6f4f73999da1.tar
bukkit-f87466c9747063ef3b6e0928d06c6f4f73999da1.tar.gz
bukkit-f87466c9747063ef3b6e0928d06c6f4f73999da1.tar.lz
bukkit-f87466c9747063ef3b6e0928d06c6f4f73999da1.tar.xz
bukkit-f87466c9747063ef3b6e0928d06c6f4f73999da1.zip
New ClassLoader to allow for inter-plugin communication
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java13
-rw-r--r--src/main/java/org/bukkit/plugin/java/PluginClassLoader.java43
2 files changed, 55 insertions, 1 deletions
diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
index 1a5b9210..5ec11716 100644
--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
+++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
@@ -8,6 +8,8 @@ import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.net.URLClassLoader;
+import java.util.HashMap;
+import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.regex.Pattern;
@@ -37,6 +39,7 @@ public final class JavaPluginLoader implements PluginLoader {
private final Pattern[] fileFilters = new Pattern[] {
Pattern.compile("\\.jar$"),
};
+ private final Map<String, Class<?>> classes = new HashMap<String, Class<?>>();
public JavaPluginLoader(Server instance) {
server = instance;
@@ -67,7 +70,7 @@ public final class JavaPluginLoader implements PluginLoader {
}
try {
- ClassLoader loader = URLClassLoader.newInstance(new URL[]{file.toURI().toURL()}, getClass().getClassLoader());
+ ClassLoader loader = new PluginClassLoader(this, new URL[]{file.toURI().toURL()}, getClass().getClassLoader());
Class<?> jarClass = Class.forName(description.getMain(), true, loader);
Class<? extends JavaPlugin> plugin = jarClass.asSubclass(JavaPlugin.class);
Constructor<? extends JavaPlugin> constructor = plugin.getConstructor(PluginLoader.class, Server.class, PluginDescriptionFile.class, File.class, ClassLoader.class);
@@ -84,6 +87,14 @@ public final class JavaPluginLoader implements PluginLoader {
return fileFilters;
}
+ public Class<?> getClassByName(final String name) {
+ return classes.get(name);
+ }
+
+ public void setClass(final String name, final Class<?> clazz) {
+ classes.put(name, clazz);
+ }
+
public void callEvent(RegisteredListener registration, Event event) {
Listener listener = registration.getListener();
diff --git a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
new file mode 100644
index 00000000..987d5e68
--- /dev/null
+++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
@@ -0,0 +1,43 @@
+
+package org.bukkit.plugin.java;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.AccessController;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A ClassLoader for plugins, to allow shared classes across multiple plugins
+ */
+public class PluginClassLoader extends URLClassLoader {
+ private final JavaPluginLoader loader;
+ private final Map<String, Class<?>> classes = new HashMap<String, Class<?>>();
+
+ public PluginClassLoader(final JavaPluginLoader loader, final URL[] urls, final ClassLoader parent) {
+ super(urls, parent);
+
+ this.loader = loader;
+ }
+
+ @Override
+ protected Class<?> findClass(String name) throws ClassNotFoundException {
+ Class<?> result = classes.get(name);
+
+ if (result == null) {
+ result = loader.getClassByName(name);
+
+ if (result == null) {
+ result = super.findClass(name);
+
+ if (result != null) {
+ loader.setClass(name, result);
+ }
+ }
+
+ classes.put(name, result);
+ }
+
+ return result;
+ }
+}