Skip to content

Commit

Permalink
Shift plugin initialization; Addresses BUKKIT-1788
Browse files Browse the repository at this point in the history
  • Loading branch information
Wolvereness committed Jun 16, 2012
1 parent 218fa31 commit 27cb5e7
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 4 deletions.
7 changes: 6 additions & 1 deletion src/main/java/org/bukkit/plugin/java/JavaPlugin.java
Expand Up @@ -49,7 +49,12 @@ public abstract class JavaPlugin extends PluginBase {
private File configFile = null;
private PluginLogger logger = null;

public JavaPlugin() {}
public JavaPlugin() {
ClassLoader classLoader = this.getClass().getClassLoader();
if (classLoader instanceof PluginClassLoader) {
((PluginClassLoader) classLoader).initialize(this);
}
}

/**
* Returns the folder that the plugin data's files are located in. The
Expand Down
4 changes: 1 addition & 3 deletions src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
Expand Up @@ -134,7 +134,7 @@ public Plugin loadPlugin(File file) throws InvalidPluginException {
loader = loaders.get(description.getClassLoaderOf());
loader.addURL(urls[0]);
} else {
loader = new PluginClassLoader(this, urls, getClass().getClassLoader());
loader = new PluginClassLoader(this, urls, getClass().getClassLoader(), server, description, dataFolder, file);
}

Class<?> jarClass = Class.forName(description.getMain(), true, loader);
Expand All @@ -143,8 +143,6 @@ public Plugin loadPlugin(File file) throws InvalidPluginException {
Constructor<? extends JavaPlugin> constructor = plugin.getConstructor();

result = constructor.newInstance();

result.initialize(this, server, description, dataFolder, file, loader);
} catch (InvocationTargetException ex) {
throw new InvalidPluginException(ex.getCause());
} catch (Throwable ex) {
Expand Down
30 changes: 30 additions & 0 deletions src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
@@ -1,22 +1,43 @@
package org.bukkit.plugin.java;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.Validate;
import org.bukkit.Server;
import org.bukkit.plugin.PluginDescriptionFile;

/**
* 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<?>>();
private final PluginDescriptionFile description;
private final Server server;
private final File dataFolder;
private final File file;

/**
* Changed in favor of class loader that initializes plugins
*/
@Deprecated
public PluginClassLoader(final JavaPluginLoader loader, final URL[] urls, final ClassLoader parent) {
this(loader, urls, parent, null, null, null, null);
}

public PluginClassLoader(final JavaPluginLoader loader, final URL[] urls, final ClassLoader parent, final Server server, final PluginDescriptionFile description, final File dataFolder, final File file) {
super(urls, parent);

this.loader = loader;
this.server = server;
this.description = description;
this.dataFolder = dataFolder;
this.file = file;
}

@Override
Expand Down Expand Up @@ -54,4 +75,13 @@ protected Class<?> findClass(String name, boolean checkGlobal) throws ClassNotFo
public Set<String> getClasses() {
return classes.keySet();
}

void initialize(JavaPlugin javaPlugin) {
Validate.notNull(javaPlugin, "Initializing plugin cannot be null");
Validate.isTrue(javaPlugin.getClass().getClassLoader() == this, "Cannot initialize plugin outside of this class loader");

if (server != null && description != null && dataFolder != null && file != null) {
javaPlugin.initialize(loader, server, description, dataFolder, file, this);
}
}
}

0 comments on commit 27cb5e7

Please sign in to comment.