package com.hackerdude.apps.sqlide.plugins.definitions; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import com.hackerdude.apps.sqlide.pluginapi.BrowserExtensionPluginIF; import com.hackerdude.apps.sqlide.pluginapi.IDENodeContextPluginIF; import com.hackerdude.apps.sqlide.pluginapi.IDENonVisualPluginIF; import com.hackerdude.apps.sqlide.pluginapi.IDEPluginIF; import com.hackerdude.apps.sqlide.pluginapi.IDEVisualPluginIF; /** * Plug-in Registry. * * <P>The plug-in registry is responsible for keeping a list of PluginDefinition * objects, and persisting it to a registry storage mechanism. */ public class PluginRegistry { private HashMap pluginsByName; private ArrayList plugins; private ArrayList visualPlugins; public static final String REGISTRY_NAME = "plugins.registry.properties"; private static PluginRegistry instance = new PluginRegistry(); private PluginRegistry() { pluginsByName = new HashMap(); plugins = new ArrayList(); visualPlugins = new ArrayList(); try { readRegistry(); } catch (IOException exc) { System.out.println("Could not read registry!"); } } public static PluginRegistry getInstance() { return (instance); } public void readRegistry() throws java.io.IOException { InputStream registryIS = com.hackerdude.apps.sqlide.SqlIdeApplication.class.getResourceAsStream(REGISTRY_NAME); if (registryIS == null) throw new IllegalStateException("SQL-IDE is not installed correctly. Plugin registry not found."); ArrayList lines = new ArrayList(); BufferedReader br = new BufferedReader(new InputStreamReader(registryIS)); String newLine = null; newLine = br.readLine(); while (newLine != null) { if (!newLine.startsWith("#")) { lines.add(newLine); } newLine = br.readLine(); } String[] pluginClassNames = new String[lines.size()]; pluginClassNames = (String[]) lines.toArray(pluginClassNames); for (int i = 0; i < pluginClassNames.length; i++) { try { PluginDefinition def = new PluginDefinition(); // def.politeName = pluginNames[i]; String className = pluginClassNames[i]; IDEPluginIF plugin = (IDEPluginIF) Class.forName(className).newInstance(); if (plugin instanceof IDEVisualPluginIF) { visualPlugins.add(plugin); } def.pluginInstance = plugin; String politeName = plugin.getPluginName(); def.panelKey = plugin.getPluginName().charAt(0); def.panelMnemonic = plugin.getPluginName().charAt(0); pluginsByName.put(politeName, def); plugins.add(def); } catch (Exception exc) { System.out.println("Plugin class " + pluginClassNames[i] + " cannot be instantiated"); exc.printStackTrace(); } } Collections.sort(plugins); } /** * This returns an array string with instances of all the visual plugins * to get their metadata. * <P>Note: These are not running plugins, nor are they intended to be. */ public IDEVisualPluginIF[] getAllVisualPlugins() { IDEVisualPluginIF[] thePlugins = new IDEVisualPluginIF[visualPlugins.size()]; thePlugins = (IDEVisualPluginIF[]) visualPlugins.toArray(thePlugins); return thePlugins; } /** * This returns an array with all the recommended shorts. */ public char[] getAllRecommendedShorts() { char[] theShorts = new char[visualPlugins.size()]; Iterator iter = visualPlugins.iterator(); int i = 0; while (iter.hasNext()) { theShorts[i] = ( (PluginDefinition) iter.next()).panelMnemonic; i++; } return theShorts; } /** * This returns an array with all the recommended keys. */ public char[] getAllRecommendedKeys() { char[] theKeys = new char[plugins.size()]; Iterator iter = visualPlugins.iterator(); int i = 0; while (iter.hasNext()) { theKeys[i] = ( (PluginDefinition) iter.next()).panelKey; i++; } return theKeys; } public int getPanelIndex(String politeName) { PluginDefinition def = (PluginDefinition) pluginsByName.get(politeName); if (def == null) { return -1; } return (plugins.indexOf(def)); } public PluginDefinition[] getAllPluginDefinitions() { PluginDefinition[] definitions = new PluginDefinition[plugins.size()]; definitions = (PluginDefinition[]) plugins.toArray(definitions); return definitions; } public PluginDefinition[] getAllNodeContextPluginDefinitions() { ArrayList result = new ArrayList(); Iterator iter = plugins.iterator(); while (iter.hasNext()) { PluginDefinition def = (PluginDefinition) iter.next(); if (def.pluginInstance instanceof IDENodeContextPluginIF) { result.add(def); } } PluginDefinition[] definitions = new PluginDefinition[result.size()]; definitions = (PluginDefinition[]) result.toArray(definitions); return definitions; } public PluginDefinition[] getAllBrowserExtensionPluginDefinitions() { ArrayList result = new ArrayList(); Iterator iter = plugins.iterator(); while (iter.hasNext()) { PluginDefinition def = (PluginDefinition) iter.next(); if (def.pluginInstance instanceof BrowserExtensionPluginIF) { result.add(def); } } PluginDefinition[] definitions = new PluginDefinition[result.size()]; definitions = (PluginDefinition[]) result.toArray(definitions); return definitions; } public PluginDefinition[] getAllVisualPluginDefinitions() { ArrayList result = new ArrayList(); Iterator iter = plugins.iterator(); while (iter.hasNext()) { PluginDefinition def = (PluginDefinition) iter.next(); if (def.pluginInstance instanceof IDEVisualPluginIF) { result.add(def); } } PluginDefinition[] definitions = new PluginDefinition[result.size()]; definitions = (PluginDefinition[]) result.toArray(definitions); return definitions; } public PluginDefinition[] getAllNonVisualPluginDefinitions() { ArrayList result = new ArrayList(); Iterator iter = plugins.iterator(); while (iter.hasNext()) { PluginDefinition def = (PluginDefinition) iter.next(); if (def.pluginInstance instanceof IDENonVisualPluginIF) { result.add(def); } } PluginDefinition[] definitions = new PluginDefinition[result.size()]; definitions = (PluginDefinition[]) result.toArray(definitions); return definitions; } public PluginDefinition getPlugin(String name) { return (PluginDefinition) pluginsByName.get(name); } public PluginDefinition getPluginByClassName(String className) { PluginDefinition result = null; Iterator iter = plugins.iterator(); while (iter.hasNext()) { Object item = iter.next(); PluginDefinition plugin = (PluginDefinition) item; if (plugin.pluginInstance.getClass().getName().equals(className)) { result = plugin; break; } } return result; } /** * Returns the number of panels */ public int getPanelCount() { return (plugins.size()); } }