package org.royaldev.royalbot.plugins;
import org.royaldev.royalbot.configuration.YamlConfiguration;
import org.royaldev.royalbot.plugins.exceptions.InvalidPluginException;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
/**
* Package-local {@link java.net.URLClassLoader} that loads plugins.
*/
class PluginClassLoader extends URLClassLoader {
public PluginClassLoader(URL[] urls) {
super(urls);
}
public PluginDescription loadAndScanJar(File jarFile) throws Exception {
super.addURL(jarFile.toURI().toURL());
JarFile jar = new JarFile(jarFile);
ZipEntry pluginYml = jar.getEntry("plugin.yml");
if (pluginYml == null)
throw new InvalidPluginException("Plugin has no plugin.yml! (" + jarFile.getName() + ")");
final YamlConfiguration yc = YamlConfiguration.loadConfiguration(jar.getInputStream(pluginYml));
if (!yc.contains("name"))
throw new InvalidPluginException("plugin.yml has no name! (" + jarFile.getName() + ")");
if (!yc.contains("main")) throw new InvalidPluginException(yc.getString("name") + " has no main class.");
Enumeration<? extends JarEntry> enumeration = jar.entries();
while (enumeration.hasMoreElements()) {
ZipEntry zipEntry = enumeration.nextElement();
if (zipEntry.getName().endsWith(".class")) {
String className = zipEntry.getName();
className = className.replace(".class", "").replace("/", ".");
if (className.startsWith("org.royaldev.royalbot")) continue; // no hijacks, please
loadClass(className);
}
}
return new PluginDescription(yc);
}
}