From c6508424f5efc9f9bb089c2fd0e1a140bf749ed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phan=20Kochen?= Date: Sun, 6 Feb 2011 21:53:00 +0100 Subject: [PATCH] Option to load plugins using the system loader. --- .../bukkit/plugin/SimplePluginManager.java | 20 ++++++++++-- .../plugin/java/JavaPluginDescription.java | 17 ++++++---- .../bukkit/plugin/java/JavaPluginLoader.java | 32 ++++++++++++++++++- 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java index 176f864a62..68c95088ed 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -33,8 +33,10 @@ public final class SimplePluginManager implements PluginManager { private final Server server; private final File pluginFolder; + private final List systemPlugins; private final CommandMap commandMap; private final List pluginLoaders = new ArrayList(); + private final JavaPluginLoader javaPluginLoader; private final Map pluginDescriptions = new HashMap(); private final Map plugins = new HashMap(); private final Map> listeners = new EnumMap>(Event.Type.class); @@ -50,12 +52,13 @@ public int compare(RegisteredListener i, RegisteredListener j) { } }; - public SimplePluginManager(Server server, File pluginFolder) { + public SimplePluginManager(Server server, File pluginFolder, List systemPlugins) { this.server = server; this.pluginFolder = pluginFolder; + this.systemPlugins = systemPlugins; this.commandMap = new SimpleCommandMap(server); - registerInterface(JavaPluginLoader.class); + javaPluginLoader = (JavaPluginLoader)registerInterface(JavaPluginLoader.class); } /** @@ -95,6 +98,19 @@ public void rebuildIndex() { for (PluginLoader loader : pluginLoaders) { updateIndexForInterface(loader); } + + for (File file : systemPlugins) { + try { + PluginDescription description = javaPluginLoader.readSystemPluginDescription(file); + String name = description.getName(); + if (pluginDescriptions.containsKey(name)) { + throw new InvalidDescriptionException("A plugin with this name already exists: " + name); + } + pluginDescriptions.put(name, description); + } catch (InvalidDescriptionException ex) { + log.log(Level.SEVERE, "Could not load " + file.getPath() + " in " + pluginFolder.getPath() + ": " + ex.getMessage(), ex); + } + } } /** diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginDescription.java b/src/main/java/org/bukkit/plugin/java/JavaPluginDescription.java index 712deaddf3..1cefbb3ee0 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPluginDescription.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPluginDescription.java @@ -17,11 +17,14 @@ public final class JavaPluginDescription extends YamlPluginDescription { private static final Logger log = Logger.getLogger(JavaPluginDescription.class.getName()); + private final boolean systemPlugin; private String main; private ClassLoader classLoader = null; - public JavaPluginDescription(final PluginLoader loader, final File file, final InputStream stream) throws InvalidDescriptionException { + public JavaPluginDescription(final PluginLoader loader, final File file, + final InputStream stream, final boolean systemPlugin) throws InvalidDescriptionException { super(loader, file, stream); + this.systemPlugin = systemPlugin; } /** @@ -43,11 +46,13 @@ protected ClassLoader getClassLoader() { final JavaPluginLoader pluginLoader = (JavaPluginLoader)getLoader(); final ClassLoader parentLoader = getClass().getClassLoader(); final ArrayList urls = new ArrayList(); - try { - urls.add(getFile().toURI().toURL()); - } - catch (MalformedURLException ex) { - log.log(Level.SEVERE, "Unable to turn JAR-path into URL", ex); + if (!systemPlugin) { + try { + urls.add(getFile().toURI().toURL()); + } + catch (MalformedURLException ex) { + log.log(Level.SEVERE, "Unable to turn JAR-path into URL", ex); + } } classLoader = new PluginClassLoader(pluginLoader, urls.toArray(new URL[0]), parentLoader); } diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java index b5ca1d9b46..a5ef3a523b 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java @@ -1,6 +1,7 @@ package org.bukkit.plugin.java; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -348,6 +349,9 @@ public void execute( Listener listener, Event event ) { throw new IllegalArgumentException( "Event " + type + " is not supported" ); } + /** + * {@inheritDoc} + */ public PluginDescription readDescription(File file) throws InvalidDescriptionException { JavaPluginDescription result = null; @@ -362,7 +366,7 @@ public PluginDescription readDescription(File file) throws InvalidDescriptionExc } InputStream stream = jar.getInputStream(entry); - result = new JavaPluginDescription(this, file, stream); + result = new JavaPluginDescription(this, file, stream, false); stream.close(); jar.close(); @@ -372,6 +376,32 @@ public PluginDescription readDescription(File file) throws InvalidDescriptionExc return result; } + /** + * Similar to readDescription, but for system plugins. + * + * This builds a PluginDescription for a system plugin. Because a system + * plugin does not have a containing JAR file, the file points directly + * to the YAML description file. + * + * @param file The YAML description file + * @return A filled PluginDescription object + * @throws InvalidDescriptionException Thrown when the metadata was not understood + */ + public PluginDescription readSystemPluginDescription(File file) throws InvalidDescriptionException { + if (!file.exists()) { + throw new InvalidDescriptionException(new FileNotFoundException(String.format("%s does not exist", file.getPath()))); + } + JavaPluginDescription result = null; + try { + InputStream stream = new FileInputStream(file); + result = new JavaPluginDescription(this, file, stream, true); + stream.close(); + } catch (IOException ex) { + throw new InvalidDescriptionException(ex); + } + return result; + } + public Plugin enablePlugin(PluginDescription abstractDescription) throws InvalidPluginException { JavaPluginDescription description = (JavaPluginDescription)abstractDescription; JavaPlugin plugin = null;