diff options
Diffstat (limited to 'src/main/java/org')
4 files changed, 66 insertions, 1 deletions
diff --git a/src/main/java/org/bukkit/plugin/PluginManager.java b/src/main/java/org/bukkit/plugin/PluginManager.java index a2d35e39..b42da9eb 100644 --- a/src/main/java/org/bukkit/plugin/PluginManager.java +++ b/src/main/java/org/bukkit/plugin/PluginManager.java @@ -31,6 +31,13 @@ public interface PluginManager { public Plugin getPlugin(String name); /** + * Gets a list of all currently loaded plugins + * + * @return Array of Plugins + */ + public Plugin[] getPlugins(); + + /** * Checks if the given plugin is enabled or not * * Please note that the name of the plugin is case-sensitive. diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java index d9f25afa..15e25a6a 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -136,6 +136,10 @@ public final class SimplePluginManager implements PluginManager { return lookupNames.get(name); } + public Plugin[] getPlugins() { + return plugins.toArray(new Plugin[0]); + } + /** * Checks if the given plugin is enabled or not * diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java index 879f8ce3..c0cef03a 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; + } +} |