Author: nextgens Date: 2008-03-11 14:07:50 +0000 (Tue, 11 Mar 2008) New Revision: 18452
Added: tags/Thaw/0.8.4/ tags/Thaw/0.8.4/src/thaw/core/Main.java tags/Thaw/0.8.4/src/thaw/core/PluginManager.java Removed: tags/Thaw/0.8.4/src/thaw/core/Main.java tags/Thaw/0.8.4/src/thaw/core/PluginManager.java Log: Release Thaw 0.8.4 Copied: tags/Thaw/0.8.4 (from rev 18449, trunk/apps/Thaw) Deleted: tags/Thaw/0.8.4/src/thaw/core/Main.java =================================================================== --- trunk/apps/Thaw/src/thaw/core/Main.java 2008-03-11 03:58:25 UTC (rev 18449) +++ tags/Thaw/0.8.4/src/thaw/core/Main.java 2008-03-11 14:07:50 UTC (rev 18452) @@ -1,209 +0,0 @@ -package thaw.core; - -import java.util.Locale; - -import javax.swing.UIManager; -import java.util.Vector; -import java.util.Iterator; - -import java.util.zip.ZipFile; -import java.util.zip.ZipEntry; -import java.io.File; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.FileOutputStream; - - - -/** - * Main class. Only used to display some informations and init the core. - * - * @author <a href="mailto:jflesch at gmail.com">Jerome Flesch</a> - */ -public class Main { - - public final static int - _major = 0, - _minor = 8, - _update = 3; - public final static String - _svnBuildNumber = "@custom@"; - - public final static String - VERSION = Main._major + "." + Main._minor + "." + Main._update + " r"+Main._svnBuildNumber; - - - /** - * Look & feel use by GUI front end - */ - private static String lookAndFeel = null; - - - /** - * Locale (null = default) - */ - private static String locale = null; - - - private Main() { - - } - - - /** - * Used to start the program - * - * @param args "-?", "-help", "--help", "/?", "/help", "-lf lookandfeel" - */ - public static void main(final String[] args) { - Core core; - - Main.extractDeps(); - - Main.parseCommandLine(args); - - if(Main.locale != null) - I18n.setLocale(new Locale(Main.locale)); - - core = new Core(); - - /* we specify to the core what lnf to use */ - core.setLookAndFeel(Main.lookAndFeel); - - /* and we force it to refresh change it right now */ - if (Main.lookAndFeel != null) - core.setTheme(Main.lookAndFeel); - - core.initAll(); - } - - - - - /** - * This method parses the command line arguments - * - * @param args the arguments - */ - private static void parseCommandLine(final String[] args) { - - int count = 0; - - try { - while (args.length > count) { - if ("-?".equals( args[count] ) || "-help".equals( args[count] ) - || "--help".equals( args[count] ) - || "/?".equals( args[count] ) - || "/help".equals( args[count] )) { - Main.showHelp(); - count++; - } else if ("-lf".equals( args[count] )) { - Main.lookAndFeel = args[count + 1]; - count = count + 2; - } else if ("-lc".equals( args[count] )) { - Main.locale = args[count + 1]; - count = count + 2; - } else { - Main.showHelp(); - } - } - } catch (final ArrayIndexOutOfBoundsException exception) { - Main.showHelp(); - } - - } - - /** - * This method shows a help message on the standard output and exits the - * program. - */ - private static void showHelp() { - - System.out.println("java -jar thaw.jar [-lf lookAndFeel]\n"); - System.out.println("-lf Sets the 'Look and Feel' will use."); - System.out.println(" (overriden by the skins preferences)\n"); - System.out.println(" These ones are currently available:"); - Vector feels = thaw.plugins.ThemeSelector.getPossibleThemes(); - - for (Iterator it = feels.iterator() ; it.hasNext(); ) { - String str = (String)it.next(); - - System.out.println(" " + str); - } - System.out.println("\n And this one is used by default:"); - System.out.println(" " + UIManager.getSystemLookAndFeelClassName() + "\n"); - - System.out.println("\n-lc Sets the locale to use: 'en' for english,"); - System.out.println(" 'fr' for french, etc."); - System.out.println(" see http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt"); - System.out.println(" for the complete list"); - - System.exit(0); - } - - - /** - * need a non-static context - */ - public void extractFileFromJar(String src, String dst) { - try { - String realHome = this.getClass().getProtectionDomain(). - getCodeSource().getLocation().toString(); - - String home = java.net.URLDecoder.decode(realHome.substring(5), "UTF-8"); - - Logger.info(this, "Extracting : "+realHome+" ; "+src+" ; "+dst); - - ZipFile jar = new ZipFile(home); - ZipEntry entry = jar.getEntry(src); - - File jarFile = new File(dst); - - - InputStream in = new BufferedInputStream(jar.getInputStream(entry)); - OutputStream out = new BufferedOutputStream(new FileOutputStream(jarFile)); - - byte[] buffer = new byte[2048]; - - int nBytes; - - while( (nBytes = in.read(buffer)) > 0) { - out.write(buffer, 0, nBytes); - } - - out.flush(); - out.close(); - in.close(); - - return; - } catch(java.io.IOException e) { - Logger.warning(this, "Can't extract '"+src+"' because : "+e.toString()); - if (e.getCause() != null) - Logger.warning(this, "Cause : "+e.getCause().toString()); - e.printStackTrace(); - } - - Logger.warning(this, "Will try to continue anyway"); - //System.exit(1); - } - - - public final static String[] DEPS = new String[] { - "jmdns.jar", - "hsqldb.jar", - "BouncyCastle.jar" - }; - - public static void extractDeps() { - Main main = new Main(); - - /* we erase each time the files to be sure that they are always up to date */ - for (int i = 0 ; i < DEPS.length ; i++) { - main.extractFileFromJar("lib/"+DEPS[i], DEPS[i]); - } - } - -} - Copied: tags/Thaw/0.8.4/src/thaw/core/Main.java (from rev 18451, trunk/apps/Thaw/src/thaw/core/Main.java) =================================================================== --- tags/Thaw/0.8.4/src/thaw/core/Main.java (rev 0) +++ tags/Thaw/0.8.4/src/thaw/core/Main.java 2008-03-11 14:07:50 UTC (rev 18452) @@ -0,0 +1,209 @@ +package thaw.core; + +import java.util.Locale; + +import javax.swing.UIManager; +import java.util.Vector; +import java.util.Iterator; + +import java.util.zip.ZipFile; +import java.util.zip.ZipEntry; +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.FileOutputStream; + + + +/** + * Main class. Only used to display some informations and init the core. + * + * @author <a href="mailto:jflesch at gmail.com">Jerome Flesch</a> + */ +public class Main { + + public final static int + _major = 0, + _minor = 8, + _update = 4; + public final static String + _svnBuildNumber = "@custom@"; + + public final static String + VERSION = Main._major + "." + Main._minor + "." + Main._update + " r"+Main._svnBuildNumber; + + + /** + * Look & feel use by GUI front end + */ + private static String lookAndFeel = null; + + + /** + * Locale (null = default) + */ + private static String locale = null; + + + private Main() { + + } + + + /** + * Used to start the program + * + * @param args "-?", "-help", "--help", "/?", "/help", "-lf lookandfeel" + */ + public static void main(final String[] args) { + Core core; + + Main.extractDeps(); + + Main.parseCommandLine(args); + + if(Main.locale != null) + I18n.setLocale(new Locale(Main.locale)); + + core = new Core(); + + /* we specify to the core what lnf to use */ + core.setLookAndFeel(Main.lookAndFeel); + + /* and we force it to refresh change it right now */ + if (Main.lookAndFeel != null) + core.setTheme(Main.lookAndFeel); + + core.initAll(); + } + + + + + /** + * This method parses the command line arguments + * + * @param args the arguments + */ + private static void parseCommandLine(final String[] args) { + + int count = 0; + + try { + while (args.length > count) { + if ("-?".equals( args[count] ) || "-help".equals( args[count] ) + || "--help".equals( args[count] ) + || "/?".equals( args[count] ) + || "/help".equals( args[count] )) { + Main.showHelp(); + count++; + } else if ("-lf".equals( args[count] )) { + Main.lookAndFeel = args[count + 1]; + count = count + 2; + } else if ("-lc".equals( args[count] )) { + Main.locale = args[count + 1]; + count = count + 2; + } else { + Main.showHelp(); + } + } + } catch (final ArrayIndexOutOfBoundsException exception) { + Main.showHelp(); + } + + } + + /** + * This method shows a help message on the standard output and exits the + * program. + */ + private static void showHelp() { + + System.out.println("java -jar thaw.jar [-lf lookAndFeel]\n"); + System.out.println("-lf Sets the 'Look and Feel' will use."); + System.out.println(" (overriden by the skins preferences)\n"); + System.out.println(" These ones are currently available:"); + Vector feels = thaw.plugins.ThemeSelector.getPossibleThemes(); + + for (Iterator it = feels.iterator() ; it.hasNext(); ) { + String str = (String)it.next(); + + System.out.println(" " + str); + } + System.out.println("\n And this one is used by default:"); + System.out.println(" " + UIManager.getSystemLookAndFeelClassName() + "\n"); + + System.out.println("\n-lc Sets the locale to use: 'en' for english,"); + System.out.println(" 'fr' for french, etc."); + System.out.println(" see http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt"); + System.out.println(" for the complete list"); + + System.exit(0); + } + + + /** + * need a non-static context + */ + public void extractFileFromJar(String src, String dst) { + try { + String realHome = this.getClass().getProtectionDomain(). + getCodeSource().getLocation().toString(); + + String home = java.net.URLDecoder.decode(realHome.substring(5), "UTF-8"); + + Logger.info(this, "Extracting : "+realHome+" ; "+src+" ; "+dst); + + ZipFile jar = new ZipFile(home); + ZipEntry entry = jar.getEntry(src); + + File jarFile = new File(dst); + + + InputStream in = new BufferedInputStream(jar.getInputStream(entry)); + OutputStream out = new BufferedOutputStream(new FileOutputStream(jarFile)); + + byte[] buffer = new byte[2048]; + + int nBytes; + + while( (nBytes = in.read(buffer)) > 0) { + out.write(buffer, 0, nBytes); + } + + out.flush(); + out.close(); + in.close(); + + return; + } catch(java.io.IOException e) { + Logger.warning(this, "Can't extract '"+src+"' because : "+e.toString()); + if (e.getCause() != null) + Logger.warning(this, "Cause : "+e.getCause().toString()); + e.printStackTrace(); + } + + Logger.warning(this, "Will try to continue anyway"); + //System.exit(1); + } + + + public final static String[] DEPS = new String[] { + "jmdns.jar", + "hsqldb.jar", + "BouncyCastle.jar" + }; + + public static void extractDeps() { + Main main = new Main(); + + /* we erase each time the files to be sure that they are always up to date */ + for (int i = 0 ; i < DEPS.length ; i++) { + main.extractFileFromJar("lib/"+DEPS[i], DEPS[i]); + } + } + +} + Deleted: tags/Thaw/0.8.4/src/thaw/core/PluginManager.java =================================================================== --- trunk/apps/Thaw/src/thaw/core/PluginManager.java 2008-03-11 03:58:25 UTC (rev 18449) +++ tags/Thaw/0.8.4/src/thaw/core/PluginManager.java 2008-03-11 14:07:50 UTC (rev 18452) @@ -1,275 +0,0 @@ -package thaw.core; - -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Vector; - -/** - * Manages plugins :) - */ -public class PluginManager { - private final static String[] defaultPlugins = { - "thaw.plugins.QueueWatcher", - "thaw.plugins.FetchPlugin", - "thaw.plugins.InsertPlugin", - "thaw.plugins.StatusBar", - "thaw.plugins.ThemeSelector", - "thaw.plugins.Hsqldb", - "thaw.plugins.IndexBrowser", - "thaw.plugins.IndexExporter", - "thaw.plugins.MiniFrost", - "thaw.plugins.TransferLogs" - }; - - private final static String[] knownPlugins = { - "thaw.plugins.PeerMonitor", - "thaw.plugins.QueueWatcher", - "thaw.plugins.FetchPlugin", - "thaw.plugins.InsertPlugin", - "thaw.plugins.StatusBar", - "thaw.plugins.TrayIcon", - "thaw.plugins.ThemeSelector", - "thaw.plugins.Hsqldb", - "thaw.plugins.Signatures", - "thaw.plugins.WebOfTrust", - "thaw.plugins.WebOfTrustViewer", - "thaw.plugins.IndexBrowser", - "thaw.plugins.IndexExporter", - //"thaw.plugins.IndexTreeRebuilder", - "thaw.plugins.MiniFrost", - //"thaw.plugins.Restarter", - "thaw.plugins.TransferLogs", - "thaw.plugins.NodeConfigurator", - "thaw.plugins.MDns", - //"thaw.plugins.IndexWebGrapher", - "thaw.plugins.SqlConsole", - "thaw.plugins.LogConsole" - }; - - private Core core = null; - - // LinkedHashMap because I want to keep a predictible plugin order. - private LinkedHashMap plugins = null; // String (pluginName) -> Plugin - - public final static Object pluginLock = new Object(); - - /** - * Need a ref to the core to pass it to the plugins (and to access config) - */ - public PluginManager(final Core core) { - this.core = core; - plugins = new LinkedHashMap(); - } - - - /** - * Returns the whole loaded plugin list. - */ - public LinkedHashMap getPlugins() { - return plugins; - } - - - public static String[] getKnownPlugins() { - return knownPlugins; - } - - - /** - * Load plugin from config or from default list. - * Reload if already loaded. - */ - public boolean loadAndRunPlugins() { - synchronized(pluginLock) { - plugins = new LinkedHashMap(); - - Vector pluginNames; - - if(core.getConfig().getPluginNames().size() == 0) { - Logger.notice(this, "Loading default plugin list"); - /* Then we load the config with the default plugins */ - for(int i = 0 ; i < PluginManager.defaultPlugins.length ; i++) { - core.getConfig().addPlugin(PluginManager.defaultPlugins[i]); - } - } - - /* we duplicate the vector to avoid collisions */ - /* (remember : plugins can load other plugins */ - pluginNames = new Vector(core.getConfig().getPluginNames()); - - final Iterator pluginIt = pluginNames.iterator(); - - final int progressJump = (100-40) / pluginNames.size(); - - if (core.getSplashScreen() != null) - core.getSplashScreen().setProgression(40); - - while(pluginIt.hasNext()) { - final String pluginName = (String)pluginIt.next(); - - if (core.getSplashScreen() != null) - core.getSplashScreen().setProgressionAndStatus(core.getSplashScreen().getProgression()+progressJump, - "Loading plugin '"+pluginName.replaceFirst("thaw.plugins.", "")+"' ..."); - - if (loadPlugin(pluginName) == null) { - Logger.notice(this, "Plugin alread loaded"); - } else { - runPlugin(pluginName); - } - } - } - - return true; - } - - - /** - * Stop all plugins. - */ - public boolean stopPlugins() { - synchronized(pluginLock) { - Iterator pluginIt; - - if (plugins == null) { - Logger.error(this, "No plugin to stop ?!"); - return false; - } - - - pluginIt = plugins.values().iterator(); - - while(pluginIt.hasNext()) { - final Plugin plugin = (Plugin)pluginIt.next(); - - try { - Logger.info(this, "Stopping plugin '"+plugin.getClass().getName()+"'"); - - if (plugin != null) - plugin.stop(); - else - Logger.error(this, "Plugin == null !?"); - } catch(final Exception e) { - Logger.error(this, "Unable to stop the plugin "+ - "'"+plugin.getClass().getName()+"'"+ - ", because: "+e.toString()); - e.printStackTrace(); - } - } - - return true; - } - } - - /** - * Load a given plugin (without adding it to the config or running it). - */ - public Plugin loadPlugin(final String className) { - synchronized(pluginLock) { - Plugin plugin = null; - - Logger.info(this, "Loading plugin: '"+className+"'"); - - try { - if ( plugins.get(className) != null) { - Logger.debug(this, "loadPlugin(): Plugin '"+className+"' already loaded"); - return null; - } - - //Logger.info(this, "Loading plugin '"+className+"'"); - - plugin = (Plugin)Class.forName(className).newInstance(); - - plugins.put(className, plugin); - - } catch(final Exception e) { - Logger.error(this, "loadPlugin('"+className+"'): Exception: "+e); - e.printStackTrace(); - return null; - } - - return plugin; - } - } - - - /** - * Run a given plugin. - */ - public boolean runPlugin(final String className) { - synchronized(pluginLock) { - Logger.info(this, "Starting plugin: '"+className+"'"); - - try { - Plugin plugin = (Plugin)plugins.get(className); - - javax.swing.ImageIcon icon; - - if (core.getSplashScreen() != null) { - if ((icon = plugin.getIcon()) != null) - core.getSplashScreen().addIcon(icon); - else - core.getSplashScreen().addIcon(thaw.gui.IconBox.add); - } - - plugin.run(core); - - } catch(final Exception e) { - Logger.error(this, "runPlugin('"+className+"'): Exception: "+e); - e.printStackTrace(); - return false; - } - - return true; - } - } - - - /** - * Stop a given plugin. - */ - public boolean stopPlugin(final String className) { - synchronized(pluginLock) { - Logger.info(this, "Stopping plugin: '"+className+"'"); - - try { - ((Plugin)plugins.get(className)).stop(); - - } catch(final Exception e) { - Logger.error(this, "stopPlugin('"+className+"'): Exception: "+e); - e.printStackTrace(); - return false; - } - - return true; - } - } - - - /** - * Unload a given plugin (without adding it to the config or running it). - */ - public boolean unloadPlugin(final String className) { - synchronized(pluginLock) { - try { - if(plugins.get(className) == null) { - Logger.notice(this, "unloadPlugin(): Plugin '"+className+"' already unloaded"); - return false; - } - - plugins.remove(className); - core.getConfig().removePlugin(className); - - } catch(final Exception e) { - Logger.error(this, "unloadPlugin('"+className+"'): Exception: "+e); - e.printStackTrace(); - return false; - } - - return true; - } - } - - public Plugin getPlugin(final String className) { - return (Plugin)plugins.get(className); - } -} Copied: tags/Thaw/0.8.4/src/thaw/core/PluginManager.java (from rev 18450, trunk/apps/Thaw/src/thaw/core/PluginManager.java) =================================================================== --- tags/Thaw/0.8.4/src/thaw/core/PluginManager.java (rev 0) +++ tags/Thaw/0.8.4/src/thaw/core/PluginManager.java 2008-03-11 14:07:50 UTC (rev 18452) @@ -0,0 +1,274 @@ +package thaw.core; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Vector; + +/** + * Manages plugins :) + */ +public class PluginManager { + private final static String[] defaultPlugins = { + "thaw.plugins.QueueWatcher", + "thaw.plugins.FetchPlugin", + "thaw.plugins.InsertPlugin", + "thaw.plugins.StatusBar", + "thaw.plugins.ThemeSelector", + "thaw.plugins.Hsqldb", + "thaw.plugins.IndexBrowser", + "thaw.plugins.IndexExporter", + "thaw.plugins.TransferLogs" + }; + + private final static String[] knownPlugins = { + "thaw.plugins.PeerMonitor", + "thaw.plugins.QueueWatcher", + "thaw.plugins.FetchPlugin", + "thaw.plugins.InsertPlugin", + "thaw.plugins.StatusBar", + "thaw.plugins.TrayIcon", + "thaw.plugins.ThemeSelector", + "thaw.plugins.Hsqldb", + "thaw.plugins.Signatures", + "thaw.plugins.WebOfTrust", + "thaw.plugins.WebOfTrustViewer", + "thaw.plugins.IndexBrowser", + "thaw.plugins.IndexExporter", + //"thaw.plugins.IndexTreeRebuilder", + "thaw.plugins.MiniFrost", + //"thaw.plugins.Restarter", + "thaw.plugins.TransferLogs", + "thaw.plugins.NodeConfigurator", + "thaw.plugins.MDns", + //"thaw.plugins.IndexWebGrapher", + "thaw.plugins.SqlConsole", + "thaw.plugins.LogConsole" + }; + + private Core core = null; + + // LinkedHashMap because I want to keep a predictible plugin order. + private LinkedHashMap plugins = null; // String (pluginName) -> Plugin + + public final static Object pluginLock = new Object(); + + /** + * Need a ref to the core to pass it to the plugins (and to access config) + */ + public PluginManager(final Core core) { + this.core = core; + plugins = new LinkedHashMap(); + } + + + /** + * Returns the whole loaded plugin list. + */ + public LinkedHashMap getPlugins() { + return plugins; + } + + + public static String[] getKnownPlugins() { + return knownPlugins; + } + + + /** + * Load plugin from config or from default list. + * Reload if already loaded. + */ + public boolean loadAndRunPlugins() { + synchronized(pluginLock) { + plugins = new LinkedHashMap(); + + Vector pluginNames; + + if(core.getConfig().getPluginNames().size() == 0) { + Logger.notice(this, "Loading default plugin list"); + /* Then we load the config with the default plugins */ + for(int i = 0 ; i < PluginManager.defaultPlugins.length ; i++) { + core.getConfig().addPlugin(PluginManager.defaultPlugins[i]); + } + } + + /* we duplicate the vector to avoid collisions */ + /* (remember : plugins can load other plugins */ + pluginNames = new Vector(core.getConfig().getPluginNames()); + + final Iterator pluginIt = pluginNames.iterator(); + + final int progressJump = (100-40) / pluginNames.size(); + + if (core.getSplashScreen() != null) + core.getSplashScreen().setProgression(40); + + while(pluginIt.hasNext()) { + final String pluginName = (String)pluginIt.next(); + + if (core.getSplashScreen() != null) + core.getSplashScreen().setProgressionAndStatus(core.getSplashScreen().getProgression()+progressJump, + "Loading plugin '"+pluginName.replaceFirst("thaw.plugins.", "")+"' ..."); + + if (loadPlugin(pluginName) == null) { + Logger.notice(this, "Plugin alread loaded"); + } else { + runPlugin(pluginName); + } + } + } + + return true; + } + + + /** + * Stop all plugins. + */ + public boolean stopPlugins() { + synchronized(pluginLock) { + Iterator pluginIt; + + if (plugins == null) { + Logger.error(this, "No plugin to stop ?!"); + return false; + } + + + pluginIt = plugins.values().iterator(); + + while(pluginIt.hasNext()) { + final Plugin plugin = (Plugin)pluginIt.next(); + + try { + Logger.info(this, "Stopping plugin '"+plugin.getClass().getName()+"'"); + + if (plugin != null) + plugin.stop(); + else + Logger.error(this, "Plugin == null !?"); + } catch(final Exception e) { + Logger.error(this, "Unable to stop the plugin "+ + "'"+plugin.getClass().getName()+"'"+ + ", because: "+e.toString()); + e.printStackTrace(); + } + } + + return true; + } + } + + /** + * Load a given plugin (without adding it to the config or running it). + */ + public Plugin loadPlugin(final String className) { + synchronized(pluginLock) { + Plugin plugin = null; + + Logger.info(this, "Loading plugin: '"+className+"'"); + + try { + if ( plugins.get(className) != null) { + Logger.debug(this, "loadPlugin(): Plugin '"+className+"' already loaded"); + return null; + } + + //Logger.info(this, "Loading plugin '"+className+"'"); + + plugin = (Plugin)Class.forName(className).newInstance(); + + plugins.put(className, plugin); + + } catch(final Exception e) { + Logger.error(this, "loadPlugin('"+className+"'): Exception: "+e); + e.printStackTrace(); + return null; + } + + return plugin; + } + } + + + /** + * Run a given plugin. + */ + public boolean runPlugin(final String className) { + synchronized(pluginLock) { + Logger.info(this, "Starting plugin: '"+className+"'"); + + try { + Plugin plugin = (Plugin)plugins.get(className); + + javax.swing.ImageIcon icon; + + if (core.getSplashScreen() != null) { + if ((icon = plugin.getIcon()) != null) + core.getSplashScreen().addIcon(icon); + else + core.getSplashScreen().addIcon(thaw.gui.IconBox.add); + } + + plugin.run(core); + + } catch(final Exception e) { + Logger.error(this, "runPlugin('"+className+"'): Exception: "+e); + e.printStackTrace(); + return false; + } + + return true; + } + } + + + /** + * Stop a given plugin. + */ + public boolean stopPlugin(final String className) { + synchronized(pluginLock) { + Logger.info(this, "Stopping plugin: '"+className+"'"); + + try { + ((Plugin)plugins.get(className)).stop(); + + } catch(final Exception e) { + Logger.error(this, "stopPlugin('"+className+"'): Exception: "+e); + e.printStackTrace(); + return false; + } + + return true; + } + } + + + /** + * Unload a given plugin (without adding it to the config or running it). + */ + public boolean unloadPlugin(final String className) { + synchronized(pluginLock) { + try { + if(plugins.get(className) == null) { + Logger.notice(this, "unloadPlugin(): Plugin '"+className+"' already unloaded"); + return false; + } + + plugins.remove(className); + core.getConfig().removePlugin(className); + + } catch(final Exception e) { + Logger.error(this, "unloadPlugin('"+className+"'): Exception: "+e); + e.printStackTrace(); + return false; + } + + return true; + } + } + + public Plugin getPlugin(final String className) { + return (Plugin)plugins.get(className); + } +}