### Eclipse Workspace Patch 1.0 #P sql12 Index: app/src/net/sourceforge/squirrel_sql/client/plugin/PluginManager.java =================================================================== RCS file: /cvsroot/squirrel-sql/sql12/app/src/net/sourceforge/squirrel_sql/client/plugin/PluginManager.java,v retrieving revision 1.27 diff -u -r1.27 PluginManager.java --- app/src/net/sourceforge/squirrel_sql/client/plugin/PluginManager.java 25 Dec 2008 19:09:32 -0000 1.27 +++ app/src/net/sourceforge/squirrel_sql/client/plugin/PluginManager.java 7 Mar 2009 15:21:25 -0000 @@ -21,6 +21,23 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + import net.sourceforge.squirrel_sql.client.IApplication; import net.sourceforge.squirrel_sql.client.gui.db.SQLAlias; import net.sourceforge.squirrel_sql.client.gui.db.aliasproperties.IAliasPropertiesPanelController; @@ -34,18 +51,14 @@ import net.sourceforge.squirrel_sql.client.util.ApplicationFiles; import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; import net.sourceforge.squirrel_sql.fw.id.IIdentifier; -import net.sourceforge.squirrel_sql.fw.util.*; +import net.sourceforge.squirrel_sql.fw.util.ClassLoaderListener; +import net.sourceforge.squirrel_sql.fw.util.MyURLClassLoader; +import net.sourceforge.squirrel_sql.fw.util.StringManager; +import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; +import net.sourceforge.squirrel_sql.fw.util.Utilities; import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.net.URL; -import java.util.*; - /** * Manages plugins for the application. * @@ -434,14 +447,15 @@ _pluginsClassLoader = new MyURLClassLoader(urls); _pluginsClassLoader.addClassLoaderListener(classLoaderListener); Class[] classes = _pluginsClassLoader.getAssignableClasses(IPlugin.class, s_log); - for (int i = 0; i < classes.length; ++i) + List> pluginClasses = collectPluginClasses(classes); + for (Class pluginClass : pluginClasses) { try { - loadPlugin(classes[i]); + loadPlugin(pluginClass); } catch (Throwable th) { - String msg = s_stringMgr.getString("PluginManager.error.loadpluginclass", classes[i].getName()); + String msg = s_stringMgr.getString("PluginManager.error.loadpluginclass", pluginClass.getName()); th.printStackTrace(); s_log.error(msg, th); _app.showErrorDialog(msg, th); @@ -461,6 +475,46 @@ }); } + /** + * Collects a list of plugin classes from the lib/ class loader and the development + * configuration file autoload-plugins.txt + * + * @param classes + * @return + */ + private List> collectPluginClasses(Class[] classes) { + List> pluginClasses = new ArrayList>(); + for (Class class1 : classes) { + if (IPlugin.class.isAssignableFrom(class1)) { + pluginClasses.add((Class) class1); + } + } + URL resource = getClass().getResource("/autoload-plugins.txt"); + if(resource!=null) { + try { + BufferedReader br = new BufferedReader(new InputStreamReader(resource.openStream())); + String line; + while( (line = br.readLine()) != null) { + try { + Class class1 = Class.forName(line.trim()); + if (IPlugin.class.isAssignableFrom(class1)) { + pluginClasses.add((Class) class1); + } + } catch (ClassNotFoundException e) { + s_log.error("Unable to find class: " + line.trim()); + } + } + br.close(); + } catch (IOException th) { + String msg = s_stringMgr.getString("PluginManager.error.autoload",th.getMessage()); + th.printStackTrace(); + s_log.error(msg, th); + _app.showErrorDialog(msg, th); + } + } + return pluginClasses; + } + private void checkPlugin(File pluginFile, Map pluginStatuses, List pluginUrls, boolean isMac) {