package com.ingotpowered; import com.ingotpowered.api.plugins.Plugin; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; import java.lang.reflect.Field; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.regex.Pattern; public class PluginLoader { public ArrayList<Plugin> plugins = new ArrayList<Plugin>(); public void load() { File pluginFolder = new File("plugins"); if (!pluginFolder.exists() || !pluginFolder.isDirectory()) { if (!pluginFolder.mkdir()) { System.out.println("[ SEVERE ] Could not create plugins folder!"); System.out.println("[ SEVERE ] Aborting plugin loading"); return; } } File[] jarFiles = pluginFolder.listFiles(); for (int i = 0; i < jarFiles.length; i++) { if (!jarFiles[i].getName().endsWith(".jar")) { continue; } try { ClassLoader loader = URLClassLoader.newInstance(new URL[] { jarFiles[i].toURI().toURL() }); BufferedReader br = new BufferedReader(new InputStreamReader(loader.getResourceAsStream("plugin.yml"))); String in; boolean hasStart = false; String mainClass = null; String pluginName = null; String pluginAuthor = null; String pluginDesc = null; while ((in = br.readLine()) != null) { if (!hasStart) { if (in.equals("ingot-config:")) { hasStart = true; } continue; } String[] params = in.trim().split(Pattern.quote(":")); if (params[0].equals("main")) { mainClass = params[1].trim(); } else if (params[0].equals("name")) { pluginName = params[1].trim(); } else if (params[0].equals("author")) { pluginAuthor = params[1].trim(); } else if (params[0].equals("description")) { pluginDesc = params[1].trim(); } } br.close(); if (mainClass == null) { System.out.println("Main class cannot be null!"); continue; } if (pluginName == null) { System.out.println("Plugin name cannot be null!"); continue; } if (pluginAuthor == null) { System.out.println("Plugin author cannot be null!"); continue; } if (pluginDesc == null) { System.out.println("Plugin description cannot be null!"); continue; } Plugin plugin = (Plugin) loader.loadClass(mainClass).newInstance(); setPluginField(plugin, "name", pluginName); setPluginField(plugin, "author", pluginAuthor); setPluginField(plugin, "description", pluginDesc); setPluginField(plugin, "jarFilePath", jarFiles[i].getAbsolutePath()); setPluginField(plugin, "pluginDirectory", new File(pluginFolder, pluginName)); plugins.add(plugin); } catch (Exception ex) { ex.printStackTrace(); } } for (Plugin p : plugins) { long start = System.currentTimeMillis(); try { p.onEnable(); } catch(Exception ex){ ex.printStackTrace(); try { p.handleException(ex); } catch(Exception ex2){ ex2.printStackTrace(); } } System.out.println("Enabled " + p.getName() + ", took " + (System.currentTimeMillis() - start) + " milliseconds."); } } public void unload() { System.out.println("========= Disabling all plugins ========="); for (Plugin p : plugins) { try { p.onDisable(); } catch(Exception ex){ ex.printStackTrace(); try{ p.handleException(ex); } catch(Exception ex2){ ex2.printStackTrace(); } } } System.out.println("=========================================="); } private void setPluginField(Plugin plugin, String variable, Object value) throws Exception { Field field = Plugin.class.getDeclaredField(variable); field.setAccessible(true); field.set(plugin, value); field.setAccessible(false); } }