Add plugin loading.

This commit is contained in:
md_5 2013-01-10 20:41:05 +11:00
parent 9196f8f61e
commit 5402bd2cb1
4 changed files with 69 additions and 21 deletions

View File

@ -5,12 +5,21 @@ import com.google.common.base.Preconditions;
import java.util.Collection; import java.util.Collection;
import java.util.logging.Logger; import java.util.logging.Logger;
import lombok.Getter; import lombok.Getter;
import org.yaml.snakeyaml.Yaml;
public abstract class ProxyServer public abstract class ProxyServer
{ {
@Getter @Getter
private static ProxyServer instance; private static ProxyServer instance;
private ThreadLocal<Yaml> yaml = new ThreadLocal<Yaml>()
{
@Override
protected Yaml initialValue()
{
return new Yaml();
}
};
/** /**
* Sets the proxy instance. This method may only be called once per an * Sets the proxy instance. This method may only be called once per an
@ -25,6 +34,16 @@ public abstract class ProxyServer
ProxyServer.instance = instance; ProxyServer.instance = instance;
} }
/**
* Gets a reusable, thread safe {@link Yaml} instance.
*
* @return an {@link Yaml} instance
*/
public Yaml getYaml()
{
return yaml.get();
}
/** /**
* Gets the name of the currently running proxy software. * Gets the name of the currently running proxy software.
* *
@ -39,14 +58,6 @@ public abstract class ProxyServer
*/ */
public abstract String getVersion(); public abstract String getVersion();
/**
* The current number of players connected to this proxy. This total should
* include virtual players that may be connected from other servers.
*
* @return current player count
*/
public abstract int playerCount();
/** /**
* Gets the main logger which can be used as a suitable replacement for * Gets the main logger which can be used as a suitable replacement for
* {@link System#out} and {@link System#err}. * {@link System#out} and {@link System#err}.

View File

@ -1,7 +1,6 @@
package net.md_5.bungee.api.plugin; package net.md_5.bungee.api.plugin;
import java.util.logging.Logger; import lombok.Getter;
import net.md_5.bungee.api.ProxyServer;
/** /**
* Represents any Plugin that may be loaded at runtime to enhance existing * Represents any Plugin that may be loaded at runtime to enhance existing
@ -10,12 +9,8 @@ import net.md_5.bungee.api.ProxyServer;
public class Plugin public class Plugin
{ {
/** @Getter
* Called when this plugin is loaded. private PluginDescription description;
*/
public void onLoad()
{
}
/** /**
* Called when this plugin is enabled. * Called when this plugin is enabled.
@ -30,4 +25,14 @@ public class Plugin
public void onDisable() public void onDisable()
{ {
} }
/**
* Called by the loader to initialize the fields in this plugin.
*
* @param description the description that describes this plugin
*/
final void init(PluginDescription description)
{
this.description = description;
}
} }

View File

@ -10,5 +10,4 @@ public class PluginDescription
private final String main; private final String main;
private final String version; private final String version;
private final String author; private final String author;
private final String id;
} }

View File

@ -4,9 +4,16 @@ import com.google.common.base.Preconditions;
import com.google.common.eventbus.EventBus; import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import java.io.File; import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.Level;
import net.md_5.bungee.api.ProxyServer;
/** /**
* Class to manage bridging between plugin duties and implementation duties, for * Class to manage bridging between plugin duties and implementation duties, for
@ -40,15 +47,35 @@ public class PluginManager
} }
/** /**
* Load a plugin from the specified file. This file must be in jar or zip * Load a plugin from the specified file. This file must be in jar format.
* format.
* *
* @param file the file to load from * @param file the file to load from
* @throws Exception Any exceptions encountered when loading a plugin from
* this file.
*/ */
public void load(File file) public void load(File file) throws Exception
{ {
Preconditions.checkNotNull(file, "file"); Preconditions.checkNotNull(file, "file");
Preconditions.checkArgument(file.isFile(), "Must load from file"); Preconditions.checkArgument(file.isFile(), "Must load from file");
try (JarFile jar = new JarFile(file))
{
JarEntry pdf = jar.getJarEntry("plugin.yml");
try (InputStream in = jar.getInputStream(pdf))
{
PluginDescription desc = ProxyServer.getInstance().getYaml().loadAs(in, PluginDescription.class);
URLClassLoader loader = new URLClassLoader(new URL[]
{
file.toURI().toURL()
});
Class<?> main = loader.loadClass(desc.getMain());
Plugin plugin = (Plugin) main.getDeclaredConstructor().newInstance();
plugin.init(desc);
plugins.put(pdf.getName(), plugin);
plugin.onEnable();
}
}
} }
/** /**
@ -64,8 +91,14 @@ public class PluginManager
for (File file : folder.listFiles()) for (File file : folder.listFiles())
{ {
if (file.getName().endsWith(".jar")) if (file.getName().endsWith(".jar"))
{
try
{ {
load(file); load(file);
} catch (Exception ex)
{
ProxyServer.getInstance().getLogger().log(Level.WARNING, "Could not load plugin from file " + file, ex);
}
} }
} }
} }