package com.hackerdude.apps.sqlide.plugins.isql; import java.awt.event.ActionEvent; import java.io.InputStream; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; import com.hackerdude.apps.sqlide.ProgramIcons; import com.hackerdude.apps.sqlide.SqlIdeApplication; import com.hackerdude.apps.sqlide.dataaccess.DatabaseProcess; import com.hackerdude.apps.sqlide.pluginapi.IDENodeContextPluginIF; import com.hackerdude.apps.sqlide.pluginapi.IDEVisualPluginIF; import com.hackerdude.apps.sqlide.pluginapi.NodeIDEBase; import com.hackerdude.apps.sqlide.plugins.browser.browsejdbc.ItemCatalogNode; import com.hackerdude.apps.sqlide.plugins.browser.browsejdbc.ItemTableColumnNode; import com.hackerdude.apps.sqlide.plugins.browser.browsejdbc.ItemTableNode; /** * This non-visual node context plugin feeds to the interactive SQL commands * depending on the type of object that is selected. * * * @author David Martinez * @version 1.0 */ public class ContextCommandRunner implements IDENodeContextPluginIF { Properties tableContextCommands = new Properties(); Properties columnContextCommands = new Properties(); Map iconNames = new HashMap(); public final static String ITEM_TABLE_PREFIX="ItemTableNode"; public final static String ITEM_COLUMN_PREFIX = "ItemTableColumnNode"; public final static String ICON_SUFFIX = ".icon"; public final static Action[] NOT_SAME_PROCESS = new Action[1]; public ContextCommandRunner() { NOT_SAME_PROCESS[0] = new AbstractAction("Active iSQL is not for this connection", ProgramIcons.getInstance().getStopIcon()) { public void actionPerformed(ActionEvent evt) {} }; } class ActionCatalogChanger extends AbstractAction { String catalogName; PluginInteractiveSQL interactiveSQL; public ActionCatalogChanger(PluginInteractiveSQL interactiveSQL, String label, String catalogName, Icon icon) { super(label, icon); this.catalogName = catalogName; this.interactiveSQL = interactiveSQL; } public void actionPerformed(ActionEvent ae) { interactiveSQL.selectCatalog(catalogName); } } public static Action createCustomCommandTyper(String name, String statement, PluginInteractiveSQL interactiveSQL) { Icon icon = ProgramIcons.getInstance().getUsersIcon(); return new ActionCommandTyper(name, statement, icon, interactiveSQL); } public static class ActionCommandTyper extends AbstractAction { PluginInteractiveSQL interactiveSQL; String sqlStatement; public ActionCommandTyper(String statement, Icon icon, PluginInteractiveSQL interactiveSQL) { super(statement, icon); this.sqlStatement = statement; this.interactiveSQL = interactiveSQL; } public ActionCommandTyper(String name, String statement, Icon icon, PluginInteractiveSQL interactiveSQL) { super(name, icon); this.sqlStatement = statement; this.interactiveSQL = interactiveSQL; } public void actionPerformed(ActionEvent ae) { String statement = ae.getActionCommand(); interactiveSQL.setQueryText(sqlStatement); interactiveSQL.grabFocus(); } } public Action[] getActionsFor(NodeIDEBase[] nodes) { IDEVisualPluginIF activePlugin = SqlIdeApplication.getInstance().getRightPanel(); if ( activePlugin == null ) return NULL_ACTIONS; if ( ! (activePlugin instanceof PluginInteractiveSQL) ) { return null; } PluginInteractiveSQL isqlPlugin = (PluginInteractiveSQL)activePlugin; DatabaseProcess databaseProcess = activePlugin.getDatabaseProcess(); if ( nodes.length != 1 ) return NULL_ACTIONS; NodeIDEBase node = nodes[0]; ArrayList al = new ArrayList(); String tableName = determineTableName(node); String columnName = null; if ( ! ( node.getDatabaseProcess().equals(databaseProcess) ) ) { return NOT_SAME_PROCESS; } if ( node instanceof ItemCatalogNode ) { ActionCatalogChanger changer = new ActionCatalogChanger(isqlPlugin, "Change to "+node.toString(), node.toString(), ProgramIcons.getInstance().getDatabaseIcon()); al.add(changer); } if ( node instanceof ItemTableNode ) { addTableContextCommandActions(al, tableName, isqlPlugin ); } if ( node instanceof ItemTableColumnNode ) { ItemTableColumnNode columnItem = (ItemTableColumnNode)node; columnName = columnItem.getColumnName(); addColumnContextCommandActions(al, tableName, columnName, isqlPlugin); } Action[] actions = new Action[al.size()]; actions = (Action[])al.toArray(actions); return actions; } public void initPlugin() { try { readContextCommands(); } catch (Exception ex) { ex.printStackTrace(); } } public String getPluginName() { return "Context ISQL commands"; } public String getPluginVersion() { return ""; } public void freePlugin() { } public String getPluginShortName() { return "commandrunner"; } public Icon getPluginIcon() { return ProgramIcons.getInstance().getServerIcon(); } private void readContextCommands() throws Exception { InputStream is = ContextCommandRunner.class.getResourceAsStream("context.commands.properties"); Properties props = new Properties(); props.load(is); Enumeration keysEnum = props.keys(); while ( keysEnum.hasMoreElements() ) { String key = (String)keysEnum.nextElement(); String value = props.getProperty(key); if ( key.endsWith(ICON_SUFFIX) ) { Icon iconValue = ProgramIcons.getInstance().findIcon(value); iconNames.put(key, iconValue); } else { if ( key.startsWith(ITEM_TABLE_PREFIX) ) { tableContextCommands.put(key, value); } else if ( key.startsWith(ITEM_COLUMN_PREFIX) ) { columnContextCommands.put(key, value); } else { System.out.println("Warning: Key "+key+" not for column or table nodes"); } } } } public void addColumnContextCommandActions(ArrayList destination, String tableName, String columnName, PluginInteractiveSQL interactiveSQL) { String[] PARAMS = { tableName, columnName }; Set set = columnContextCommands.keySet(); List aList = new ArrayList(set); Collections.sort(aList); String[] queryNames = new String[aList.size()]; queryNames = (String[])aList.toArray(queryNames); for ( int i=0; i<queryNames.length; i++ ) { String queryName = queryNames[i]; String queryPattern = columnContextCommands.getProperty(queryName); Icon icon = (Icon)iconNames.get(queryName+ICON_SUFFIX); String query = MessageFormat.format(queryPattern, (Object[])PARAMS); Action newAction = new ActionCommandTyper(query, icon, interactiveSQL); destination.add(newAction); } } public void addTableContextCommandActions(ArrayList destination, String tableName, PluginInteractiveSQL interactiveSQL) { String[] PARAMS = { tableName }; Set set = tableContextCommands.keySet(); List aList = new ArrayList(set); Collections.sort(aList); String[] queryNames = new String[aList.size()]; queryNames = (String[])aList.toArray(queryNames); for ( int i=0; i<queryNames.length; i++ ) { String queryName = queryNames[i]; String queryPattern = tableContextCommands.getProperty(queryName); Icon icon = (Icon)iconNames.get(queryName+ICON_SUFFIX); String query = MessageFormat.format(queryPattern, (Object[])PARAMS); Action newAction = new ActionCommandTyper(query, icon, interactiveSQL); destination.add(newAction); } } public String determineTableName(NodeIDEBase node) { String result; String table = ""; String catalog = ""; if ( node instanceof ItemTableNode ) { ItemTableNode tableItem = (ItemTableNode)node; table = tableItem.toString(); catalog = tableItem.getCatalogName(); } else if ( node instanceof ItemTableColumnNode ) { ItemTableColumnNode columnItem = (ItemTableColumnNode)node; table = columnItem.getTableName(); catalog = columnItem.getCatalogName(); } // If we support dot notation and there is a catalog, use the fully qualified name boolean isCatalogEmpty = catalog==null || catalog.equals(""); if ( node.getDatabaseProcess().getHostConfiguration().getGeneral().getSupportsDotNotation() && ! isCatalogEmpty ) { result = catalog+"."+table; } else { result = table; } // If it has spaces in the name, add quotes. if ( result.indexOf(" ") > -1 ) result = "\""+result+"\""; return result; } }