diff options
Diffstat (limited to 'rse/plugins/org.eclipse.rse.useractions/src/org/eclipse/rse/internal/useractions/ui/uda/SystemUDActionSubsystem.java')
-rw-r--r-- | rse/plugins/org.eclipse.rse.useractions/src/org/eclipse/rse/internal/useractions/ui/uda/SystemUDActionSubsystem.java | 1159 |
1 files changed, 0 insertions, 1159 deletions
diff --git a/rse/plugins/org.eclipse.rse.useractions/src/org/eclipse/rse/internal/useractions/ui/uda/SystemUDActionSubsystem.java b/rse/plugins/org.eclipse.rse.useractions/src/org/eclipse/rse/internal/useractions/ui/uda/SystemUDActionSubsystem.java deleted file mode 100644 index 41dcf2a4c..000000000 --- a/rse/plugins/org.eclipse.rse.useractions/src/org/eclipse/rse/internal/useractions/ui/uda/SystemUDActionSubsystem.java +++ /dev/null @@ -1,1159 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2002, 2008 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - * Martin Oberhuber (Wind River) - [168975] Move RSE Events API to Core - * Martin Oberhuber (Wind River) - [186128] Move IProgressMonitor last in all API - * Martin Oberhuber (Wind River) - [186773] split ISystemRegistryUI from ISystemRegistry - * David McKnight (IBM) - [225506] [api][breaking] RSE UI leaks non-API types - * Kevin Doyle (IBM) - [241015] Add getActionSubstVarList(SystemUDActionElement) - * Kevin Doyle (IBM) - [241866] Refresh After doesn't work for User Actions - *******************************************************************************/ - -package org.eclipse.rse.internal.useractions.ui.uda; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.PrintWriter; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.StringTokenizer; -import java.util.Vector; - -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.rse.core.RSECorePlugin; -import org.eclipse.rse.core.events.ISystemResourceChangeEvents; -import org.eclipse.rse.core.events.ISystemResourceChangeListener; -import org.eclipse.rse.core.events.SystemResourceChangeEvent; -import org.eclipse.rse.core.model.ISystemProfile; -import org.eclipse.rse.core.model.ISystemRegistry; -import org.eclipse.rse.core.subsystems.ISubSystem; -import org.eclipse.rse.core.subsystems.ISubSystemConfiguration; -import org.eclipse.rse.internal.useractions.UserActionsIcon; -import org.eclipse.rse.internal.useractions.ui.ISystemSubstitutor; -import org.eclipse.rse.internal.useractions.ui.SystemCmdSubstVarList; -import org.eclipse.rse.services.clientserver.messages.SystemMessage; -import org.eclipse.rse.shells.ui.RemoteCommandHelpers; -import org.eclipse.rse.subsystems.files.core.model.RemoteFileUtility; -import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem; -import org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteCmdSubSystem; -import org.eclipse.rse.ui.ISystemMessages; -import org.eclipse.rse.ui.RSEUIPlugin; -import org.eclipse.rse.ui.SystemBasePlugin; -import org.eclipse.rse.ui.messages.SystemMessageDialog; -import org.eclipse.rse.ui.view.ISystemEditableRemoteObject; -import org.eclipse.rse.ui.view.ISystemRemoteElementAdapter; -import org.eclipse.rse.ui.view.SystemTableViewProvider; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.dialogs.ListSelectionDialog; -import org.eclipse.ui.model.AdaptableList; -import org.eclipse.ui.model.WorkbenchContentProvider; - -/** - * Provide the interface to customize and implement the user-defined actions support - * for the subsystems which implement it. Subsystems are expected to override - * these methods as required. - * <p> - * For some subsystem factories, actions and types can be partitioned/scoped by - * "domain". Eg, for iSeries actions are scoped by object and member, and each - * has unique lists of actions and types. - * This base class offers all the support for supporting domains, but it is triggered - * by the method supportsDomains() which is overridden by child classes appropriately. - * <p> - * Some subsystems will support named types by which actions can be scoped. This - * support is triggered by supportsTypes(), which returns true by default but can - * be overridden by childclasses. - */ -public abstract class SystemUDActionSubsystem implements ISystemSubstitutor { - public final static int DOMAIN_NONE = -1; - protected ISubSystem _subsystem; // May be null for an import action - protected ISubSystemConfiguration subsystemFactory; // for use in Team view where we show user actions per SSF. - protected SystemUDActionManager udActionManager; - protected SystemUDTypeManager udTypeManager; - protected SystemUDAResolvedTypes udaResolvedTypes; - protected SystemUDActionElement currentAction; // current action being processed - protected boolean testAction; // is current action the test action? - protected String osType = "default"; //$NON-NLS-1$ - - /** - * Constructor - */ - public SystemUDActionSubsystem() { - super(); - //this._subsystem = subsys; - } - - /** - * Overridable method for child classes to do migration of their actions. - * This is called on first load of a document, which has a release stamp other than - * the current release - * @return true if any migration was done - */ - protected abstract boolean doActionsMigration(ISystemProfile profile, String oldRelease); - - /** - * Overridable method for child classes to do migration of their types. - * This is called on first load of a document, which has a release stamp other than - * the current release - * @return true if any migration was done - */ - protected abstract boolean doTypesMigration(ISystemProfile profile, String oldRelease); - - /** - * Overridable method for child classes to supply the label to display in the - * "New" node for actions. Typically only overridden if domains are not supported, - * as otherwise the child nodes of "New" have the specific labels.<br> - * If not overridden, then "New" is used. - * @return translated label - */ - protected String getNewNodeActionLabel() { - return SystemUDAResources.ACTION_CASCADING_NEW_LABEL; - } - - /** - * Overridable method for child classes to supply the label to display in the - * "New" node for type. Typically only overridden if domains are not supported, - * as otherwise the child nodes of "New" have the specific labels.<br> - * If not overridden, then "New" is used. - * @return translated label - */ - protected String getNewNodeTypeLabel() { - return SystemUDAResources.ACTION_CASCADING_NEW_LABEL; - } - - /** - * Get the singleton manager of user-defined actions for this subsystem factory - */ - public SystemUDActionManager getUDActionManager() { - if (udActionManager == null) udActionManager = new SystemUDActionManager(this); - return udActionManager; - } - - /** - * Get the singleton manager of named file types for this subsystem factory - */ - public SystemUDTypeManager getUDTypeManager() { - if ((udTypeManager == null) && supportsTypes()) udTypeManager = new SystemUDTypeManager(this); - return udTypeManager; - } - - /** - * Return the list of substitution variables for the given domain type. - * Called from edit pane in work with dialog. - * This must be overridden! - */ - public abstract SystemCmdSubstVarList getActionSubstVarList(int actionDomainType); - - /** - * Return the list of substitution variables for the given UDA action. - */ - public SystemCmdSubstVarList getActionSubstVarList(SystemUDActionElement action) - { - int actionDomainType = action.getDomain(); - return getActionSubstVarList(actionDomainType); - } - - /** - * Retrieve current subsystem - */ - public ISubSystem getSubsystem() { - return _subsystem; - } - - /** - * Set current subsystem - */ - public void setSubsystem(ISubSystem ss) { - _subsystem = ss; - if (ss != null) setSubSystemFactory(ss.getSubSystemConfiguration()); - } - - /** - * Retrieve current subsystem factory. Useful when we don't have a subsystem - */ - public ISubSystemConfiguration getSubSystemFactory() { - return subsystemFactory; - } - - /** - * Set current subsystem factory. Useful when we don't have a subsystem - */ - public void setSubSystemFactory(ISubSystemConfiguration ssf) { - subsystemFactory = ssf; - } - - /** - * Return true if actions can be scoped by file types - * Default is true - */ - public boolean supportsTypes() { - return true; - } - - /** - * Return true if actions can be scoped by file types for the given domain. - * Default is supportsTypes() - */ - public boolean supportsTypes(int domain) { - return supportsTypes(); - } - - /** - * Return true if the action/type manager supports domains. - * Default is false - */ - public boolean supportsDomains() { - return false; - } - - /** - * In some cases, we supports domains in general, but only want to expose - * one of those domains to the user. For example, for file subsystems, - * we support folder and file domains, but for named types we really only - * support the file domain. - * <p> - * Default is -1 - */ - public int getSingleDomain(SystemUDBaseManager docManager) { - return -1; - } - - // ************************************************************** - // User Interface: Adding Menu Actions, etc. - // ************************************************************** - /** - * Return the action's edit pane. - * Subclasses should override if they want to return their own edit pane. - * @param ss - the subsystem if you have it. If you don't have it, pass null. - * @param ssFactory - the subsystem factory, if you don't have the subsystem. - * @param profile - the subsystem factory, if you don't have the subsystem. - * @param parent - the hosting dialog/property page - * @param tv - the tree view if the parent is a dialog. - * */ - public SystemUDActionEditPane getCustomUDActionEditPane(ISubSystem ss, ISubSystemConfiguration ssFactory, ISystemProfile profile, ISystemUDAEditPaneHoster parent, ISystemUDTreeView tv) { - return new SystemUDActionEditPane(this, parent, tv); - } - - /** - * Historical. - * Now replaced with {@link #getCustomUDActionEditPane(ISubSystem, ISubSystemConfiguration, ISystemProfile, ISystemUDAEditPaneHoster, ISystemUDTreeView)} - */ - protected final SystemUDActionEditPane getCustomUDActionEditPane(ISubSystem ss, ISystemUDAEditPaneHoster parent, ISystemUDTreeView tv) { - return getCustomUDActionEditPane(ss, null, null, parent, tv); - } - - /** - * Historical. - * Now replaced with {@link #getCustomUDActionEditPane(ISubSystem, ISubSystemConfiguration, ISystemProfile, ISystemUDAEditPaneHoster, ISystemUDTreeView)} - */ - protected final SystemUDActionEditPane getCustomUDActionEditPane(ISubSystemConfiguration ssFactory, ISystemProfile profile, ISystemUDAEditPaneHoster parent, ISystemUDTreeView tv) { - return getCustomUDActionEditPane(null, ssFactory, profile, parent, tv); - } - - /** - * Subclasses may override to provide a custom type edit pane subclass. - * Subclasses should override if they want to return their own types pane. - * @param parent - the hosting dialog/property page - * @param tv - the tree view if the parent is a dialog. - */ - public SystemUDTypeEditPane getCustomUDTypeEditPane(ISystemUDAEditPaneHoster parent, ISystemUDTreeView tv) { - return new SystemUDTypeEditPane(this, parent, tv); - } - - // ************************************************************** - // Accessing UDA/UDT's in memory/storage: - // ************************************************************** - /** - * Prime the user data with the default types. - */ - public abstract SystemUDTypeElement[] primeDefaultTypes(SystemUDTypeManager udtd); - - /** - * Prime the user data with the default actions. Subsystem and profile specific - */ - public abstract SystemUDActionElement[] primeDefaultActions(SystemUDActionManager udad, ISystemProfile profile); - - /** - * Given this IBM-supplied user action, restore it to its IBM-supplied state. - * @return true if all went well, false if it wasn't restore for some reason - */ - public boolean restoreDefaultAction(SystemUDActionElement element, int domain, String actionName) { - return false; - } - - /** - * Given this IBM-supplied named type, restore it to its IBM-supplied state - * @return true if all went well, false if it wasn't restore for some reason - */ - public boolean restoreDefaultType(SystemUDTypeElement element, int domain, String typeName) { - return false; - } - - // ************************************************************** - // Running commands: - // ************************************************************** - /** - * Return the command name that tells us this is an action for testing substitution variables. - * <p> - * Returns "ibm test action" - */ - public String getTestActionName() { - return "ibm test action"; //$NON-NLS-1$ - } - - /** - * Return the default name of the test file in test mode. - * The test file is generated at action run-time when the action name is {@link #getTestActionName()}. - * <p> - * Returns "TESTUSERACTION.TXT" - */ - public String getTestFileName() { - return "TESTUSERACTION.TXT"; //$NON-NLS-1$ - } - - /** - * Return the default path of the test file in test mode - * The test file is generated at action run-time when the action name is {@link #getTestActionName()}. - * <p> - * Returns "c:\\Test_RSE_User_Actions" - */ - public String getTestFilePath() { - return "c:\\Test_RSE_User_Actions"; //$NON-NLS-1$ - } - - /** - * Overriddable method for printing out information about the collected names - * for "invoke once" actions, when in test mode. - */ - protected void printTestActionInvokeOnceInformation(Shell shell, PrintWriter writer) { - } - - /** - * When the user selects one or more objects in the RSE, then right clicks - * and selects a user action, this method is called (by the SystemUDAsBaseAction - * class). - * <p> - * For each selected object, the action's command is resolved (variable substitution done) - * by calling doCommandSubstitution, and then run by calling runCommand(...). - * @param shell - the shell to use for display the prompt, if appropriate - * @param action - the user action to run - * @param selection - the currently selected objects - * @param viewer - the viewer we are running this from. Used to do the refresh if requested in this action. Can be null. - */ - public void run(Shell shell, SystemUDActionElement action, IStructuredSelection selection, ISystemResourceChangeListener viewer) { - //Assert.isLegal(shell != null, "shell argument is null"); //$NON-NLS-1$ - processingSelection(true); - Iterator elements = selection.iterator(); - this.currentAction = action; - IRemoteCmdSubSystem cmdSubSystem = null; - boolean runOnce = action.getCollect(); - boolean actionRunEvenOnce = false; - boolean cancelled = false; - /* - * DKM - I've taken the linebreak stripping out. Now we intend to support - * batches of commands. The interpreting of line breaks is now - * delegated to implementors of runCommand() - */ - String command = action.getCommand(); - // what is test action? For testing purposes, creating an action with this name means - // generating a local file to prove the variable substitution works... - testAction = action.getName().toLowerCase().startsWith(getTestActionName()); - File testFile = null; - PrintWriter testWriter = null; - if (testAction) { - this.currentAction = action; - try { - String testFileDir = action.getComment(); - if ((testFileDir == null) || (testFileDir.trim().length() == 0)) testFileDir = getTestFilePath(); - File testDir = new File(testFileDir); - if (!testDir.exists()) { - testDir.mkdir(); - } - String testFileName = command; - if ((testFileName == null) || (testFileName.trim().length() == 0)) testFileName = getTestFileName(); - testFile = new File(testDir, testFileName); - String message = "In test action mode. Output file is: {0}"; //$NON-NLS-1$ - message = MessageFormat.format(message, new Object[] { testFile.getAbsolutePath() }); - SystemBasePlugin.logInfo(message); - testWriter = new PrintWriter(new FileOutputStream(testFile)); - getActionSubstVarList(action.getDomain()).printDisplayStrings(testWriter); - } catch (Exception exc) { - if (testFile != null) { - String message = "Error creating test file {0} for user actions:"; //$NON-NLS-1$ - message = MessageFormat.format(message, new Object[] { testFile.getAbsolutePath() }); - SystemBasePlugin.logError(message, exc); - } - return; - } - } - // ------------------------------------------------------------ - // THIS ACTION IS TO BE RUN ONCE PER SELECTED OBJECT - // ------------------------------------------------------------ - try { - if (checkDirtyEditors(selection)) { - if (!runOnce) { - Object selectedObject = null; - while (!cancelled && elements.hasNext()) { - selectedObject = elements.next(); - //cmdSubSystemContext = selectedObject; - if (cmdSubSystem == null) { - cmdSubSystem = getCommandSubSystem(selectedObject); - } - if (testAction) { - SystemCmdSubstVarList supportedVariables = getActionSubstVarList(action.getDomain()); - String[] substitutedVariables = supportedVariables.doAllSubstitutions(selectedObject, this); - if (testWriter != null) { - testWriter.println("Selected Object: " + getRemoteAdapter(selectedObject).getAbsoluteName(selectedObject)); //$NON-NLS-1$ - for (int idx = 0; idx < substitutedVariables.length; idx++) { - testWriter.println("....." + substitutedVariables[idx]); //$NON-NLS-1$ - } - } - } else { - String cmd = doCommandSubstitutions(action, command, selectedObject); - // Prompt support - if (action.getPrompt()) { - // Prompt user and allow to edit the command. Honor their request to cancel - cmd = promptCommand(shell, cmd); - if (cmd == null) cancelled = true; - } - if (!cancelled) cancelled = !runCommand(shell, action, cmd, cmdSubSystem, selectedObject, (Viewer) viewer); - if (!cancelled && !actionRunEvenOnce) actionRunEvenOnce = true; - } // end else !testAction - } // end while loop - } // end if !runOnce - // ------------------------------------------------------------ - // THIS ACTION IS TO BE RUN ONCE ONLY, FOR ALL SELECTED OBJECTS - // ------------------------------------------------------------ - else { - StringBuffer collectedNames = new StringBuffer(); - Object firstSelectedObject = collectNames(shell, elements, collectedNames); - if (firstSelectedObject == null) // happens when something goes wrong. Msg already shown to user - return; - String nameVar = getAllNamesSubstitutionVariable(); - String cmd = command; - if (nameVar != null) { - if (testAction) cmd = nameVar; - int nameVarIdx = cmd.indexOf(nameVar); - if (nameVarIdx >= 0) { - cmd = cmd.substring(0, nameVarIdx) + collectedNames.toString() + cmd.substring(nameVarIdx + nameVar.length()); - } - } - if (testAction && testWriter != null) { - SystemCmdSubstVarList supportedVariables = getActionSubstVarList(action.getDomain()); - String[] substitutedVariables = supportedVariables.doAllSubstitutions(firstSelectedObject, this); - testWriter.println("First Selected Object: " + getRemoteAdapter(firstSelectedObject).getAbsoluteName(firstSelectedObject)); //$NON-NLS-1$ - if (nameVar != null) testWriter.println("....." + nameVar + " = " + cmd); //$NON-NLS-1$ //$NON-NLS-2$ - for (int idx = 0; idx < substitutedVariables.length; idx++) - testWriter.println("....." + substitutedVariables[idx]); //$NON-NLS-1$ - printTestActionInvokeOnceInformation(shell, testWriter); - } else { - cmd = doCommandSubstitutions(action, cmd, firstSelectedObject); - // Prompt support - if (action.getPrompt()) { - // Prompt user and allow to edit the command. Honor their request to cancel - cmd = promptCommand(shell, cmd); - if (cmd == null) cancelled = true; - } - if (!cancelled) { - cmdSubSystem = getCommandSubSystem(firstSelectedObject); - cancelled = !runCommand(shell, action, cmd, cmdSubSystem, firstSelectedObject, (Viewer) viewer); - } - if (!cancelled) actionRunEvenOnce = true; - } // end else !testAction - } // end else runOnce - // ANYTHING GO WRONG?? - } - } catch (Exception exc) { - SystemMessageDialog.displayExceptionMessage(shell, exc); - System.out.println("Error running user action " + command + ": " + exc.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ - return; - } - // ------------------------------------------------------------ - // REFRESH VIEW IF REQUESTED IN ACTION - // ------------------------------------------------------------ - if (actionRunEvenOnce && action.getRefresh()) { - ISystemRegistry sr = RSECorePlugin.getTheSystemRegistry(); - try { - Thread.sleep(500L); - } catch (Exception exc) { - } // defect 46380: give action's command time to run? I don't know, but this works! - if (viewer != null) { - sr.fireEvent(viewer, new SystemResourceChangeEvent(selection.toArray(), ISystemResourceChangeEvents.EVENT_REFRESH_REMOTE, null)); - } else { - sr.fireEvent(new SystemResourceChangeEvent(selection.toArray(), ISystemResourceChangeEvents.EVENT_REFRESH_REMOTE, null)); - } - // todo! verify we are sending the right event! ok, done... its the right one. - } - if (testWriter != null && testFile != null) { - testWriter.flush(); - testWriter.close(); - SystemMessage msg = RSEUIPlugin.getPluginMessage(ISystemMessages.MSG_GENERIC_I_HELP); - msg.makeSubstitution("Test file " + testFile.getName() + " generated successfully", "The file was generated in directory " + testFile.getParent()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - SystemMessageDialog dlg = new SystemMessageDialog(shell, msg); - dlg.openWithDetails(); - } - processingSelection(false); - } // end method - - /** - * After an action's command has been resolved (vars substituted) this method - * is called to actually do the remote command execution - * @param shell - the shell to use if need to prompt for password or show msg dialog - * @param action - the action being processed, in case attributes of it need to be queried - * @param cmdString - the resolved command - * @param cmdSubSystem - this connection's command subsystem, which will run the command - * @param context - any context information the subsystem's runCommand might need - * @return true if we should continue, false if something went wrong - */ - protected boolean runCommand(Shell shell, SystemUDActionElement action, String cmdString, IRemoteCmdSubSystem cmdSubSystem, Object context, Viewer viewer) { - boolean ok = false; - if (cmdSubSystem != null) { - ok = true; - try { - cmdSubSystem.runCommand(cmdString, context, new NullProgressMonitor()); - } catch (Exception e) { - SystemBasePlugin.logError("RunUserAction", e); //$NON-NLS-1$ - SystemMessageDialog.displayExceptionMessage(shell, e); - ok = false; - } - } // end if - return ok; - } // end method - - /** - * Called when user selects a user action to run, from the base user - * action class. Called by our run(...) method - */ - protected String doCommandSubstitutions(SystemUDActionElement action, String cmd, Object selectedObject) { - this.currentAction = action; - SystemCmdSubstVarList supportedVariables = getActionSubstVarList(action); - return supportedVariables.doSubstitutions(cmd, selectedObject, this); - } // end method - - /** - * When processing an action that has elected to be invoked only once, versus - * once per selected object, we call this method to collect the names of the - * selected objects into a single string buffer. - * <p> - * This can be overridden if need be. The default behaviour is to concatenate - * the quoted absolute name of each selected object. - * - * @return first selected object, or null if something went wrong (msg will have been issued) - */ - protected Object collectNames(Shell shell, Iterator elements, StringBuffer collectedNames) { - return collectNamesDefaultMethod(shell, elements, collectedNames); - } // end method - - /** - * Allows subclasses to call it even if their immediate parent overrides - */ - protected Object collectNamesDefaultMethod(Shell shell, Iterator elements, StringBuffer collectedNames) { - Object firstSelectedObject = null; - while (elements.hasNext()) { - Object selectedObject = elements.next(); - if (firstSelectedObject == null) - firstSelectedObject = selectedObject; - else - collectedNames.append(" "); //$NON-NLS-1$ - collectedNames.append(getNameDelimiter()); - collectedNames.append(getRemoteAdapter(selectedObject).getAbsoluteName(selectedObject)); - collectedNames.append(getNameDelimiter()); - } // end while loop - return firstSelectedObject; - } // end method - - /** - * When processing an action that has elected to be invoked only once, versus - * once per selected object, we call this method to get the "all names" - * substitution variable so that we can substitute it with the collection - * of names of all selected objects. - * <p> - * The default is "${resource_name}", but can be overridden. - */ - protected String getAllNamesSubstitutionVariable() { - return "${resource_name}"; //$NON-NLS-1$ - } - - /** - * When processing an action that has elected to be invoked only once, versus - * once per selected object, we call this method to get the delimiter - * character to surround each name in. - * <p> - * The default is a double quote, but can be overridden. For example, for iSeries - * native file systems, this is overridden with a single quote. - */ - protected char getNameDelimiter() { - return '\"'; - } - - /** - * Called when processing user action that has the "prompt" attribute set. - * By default, puts up dialog allowing user to see and edit the fully resolved command. - * @param shell - the shell to host the modal dialog - * @param command - the fully resolved (variables substituted) command - * @return the edited command string, or null if the user pressed cancel - */ - protected String promptCommand(Shell shell, String command) { - return promptCommandDefault(shell, command); - } - - /** - * This allows child classes to call this directly - */ - protected String promptCommandDefault(Shell shell, String command) { - SystemPromptUDADialog dialog = new SystemPromptUDADialog(shell, command); - dialog.open(); - if (!dialog.wasCancelled()) - return dialog.getCommand(); - else - return null; - } - - /** - * Get the command subsystem associated the given remote object - */ - protected static IRemoteCmdSubSystem getCommandSubSystem(Object selectedObject) { - return RemoteCommandHelpers.getCmdSubSystem(getRemoteAdapter(selectedObject).getSubSystem(selectedObject).getHost()); - } - - /** - * Get the first file subsystem associated the given remote object. - * May return null! - */ - protected static IRemoteFileSubSystem getFileSubSystem(Object selectedObject) { - IRemoteFileSubSystem[] rfsss = RemoteFileUtility.getFileSubSystems(getCommandSubSystem(selectedObject).getHost()); - if ((rfsss != null) && (rfsss.length > 0)) - return rfsss[0]; - else - return null; - } - - /** - * Returns the implementation of ISystemRemoteElement for the given - * object. Returns null if this object does not adaptable to this. - */ - protected static ISystemRemoteElementAdapter getRemoteAdapter(Object o) { - if (!(o instanceof IAdaptable)) - return (ISystemRemoteElementAdapter) Platform.getAdapterManager().getAdapter(o, ISystemRemoteElementAdapter.class); - else - return (ISystemRemoteElementAdapter) ((IAdaptable) o).getAdapter(ISystemRemoteElementAdapter.class); - } - - /** - * From the interface ISystemSubstitutor. - * <p> - * Return the string to substitute for the given substitution - * variable, given the current context object. This object will - * be passed whatever was passed into the doSubstitution method. - * <p>It is VERY IMPORTANT to return null if you can't do the - * substitution for some reason! This is a clue to the algorithm - * that no change was made and increases performance. - * <p> - * We try to handle common substitutions here in the base class, and - * pass on any other requests to the child classes via a call to - * internalGetSubstitutionValue(String var, Object context) - */ - public String getSubstitutionValue(String subvar, Object context) { - return getCommonSubstitutionValues(subvar, context); - } - - /** - * This abstraction allows child subclasses to override getSubstitutionValues, yet - * grandchild subclasses to still call this common class if needed. - */ - public String getCommonSubstitutionValues(String subvar, Object context) { - // ${action_name} = This user defined action name - if (subvar.equals("${action_name}")) //$NON-NLS-1$ - return currentAction.toString(); - // ${connection_name} = The connection in which this action is launched - if (subvar.equals("${connection_name}")) //$NON-NLS-1$ - return getCommandSubSystem(context).getHost().getAliasName(); - // ${user_id} = The user ID that was used to signon with - else if (subvar.equals("${user_id}")) //$NON-NLS-1$ - return getCommandSubSystem(context).getConnectorService().getUserId(); - // ${system_tempdir} = The fully qualified temp directory in remote system - else if (subvar.equals("${system_tempdir}")) //$NON-NLS-1$ - return getCommandSubSystem(context).getConnectorService().getTempDirectory(); - // ${system_homedir} = The fully qualified home directory in remote system, for current user - else if (subvar.equals("${system_homedir}")) //$NON-NLS-1$ - return getCommandSubSystem(context).getConnectorService().getHomeDirectory(); - // ${system_pathsep} = The path separator. ';' on Windows, ':' on Unix and Linux - else if (subvar.equals("${system_pathsep}")) //$NON-NLS-1$ - { - IRemoteFileSubSystem rfss = getFileSubSystem(context); - if (rfss != null) - return rfss.getParentRemoteFileSubSystemConfiguration().getPathSeparator(); - else - return "system_pathsep not available"; // hopefully will never happen //$NON-NLS-1$ - } - // ${system_filesep} = The file separator. '\\' on Windows, '/' on Unix and Linux - else if (subvar.equals("${system_filesep}")) //$NON-NLS-1$ - { - IRemoteFileSubSystem rfss = getFileSubSystem(context); - if (rfss != null) - return rfss.getParentRemoteFileSubSystemConfiguration().getSeparator(); - else - return "system_filesep not available"; // hopefully will never happen //$NON-NLS-1$ - } - // ${system_hostname} = The host name of the remote system - else if (subvar.equals("${system_hostname}")) //$NON-NLS-1$ - return getCommandSubSystem(context).getHost().getHostName(); - // ${local_hostname} = The host name of the local system - else if (subvar.equals("${local_hostname}")) //$NON-NLS-1$ - return RSECorePlugin.getLocalMachineName(); - // ${local_ip} = The ip address of the local system - else if (subvar.equals("${local_ip}")) //$NON-NLS-1$ - return RSECorePlugin.getLocalMachineIPAddress(); - // ---------------------------------------------------------------------- - // We leave it to each subsystem plugin to define the following, as they - // will each define their own mri for the display text. However, we can - // do the substitutions right here as it generic code... - // ---------------------------------------------------------------------- - // ${resource_name} = The name of the selected object - else if (subvar.equals("${resource_name}")) //$NON-NLS-1$ - return getRemoteAdapter(context).getName(context); - // ${resource_path} = The fully qualified name of the selected resource - else if (subvar.equals("${resource_path}")) //$NON-NLS-1$ - return getRemoteAdapter(context).getAbsoluteName(context); - else - return internalGetSubstitutionValue(currentAction, subvar, context); - } - - /** - * Overridable extension point for child class to do variable substitution for variables unique to them. - * - */ - public abstract String internalGetSubstitutionValue(SystemUDActionElement currentAction, String substitutionVariable, Object context); - - /** - * - */ - public boolean hasUnsupportedSubstitutionVars(Object action, int domain) { - return false; - } - - /** - * Check to see it any actions will apply to this selection. - * Stop checking as soon as 1 action is found. - * This method is an optimized, find-1-only, version of addUserActions() below. - * May be overriden for subsystem specific filtering of actions - * <b>CURRENTLY WE JUST RETURN TRUE</b> - */ - public boolean eligibleUserActionsForSelection(IStructuredSelection selection, ISystemProfile profile) { - return true; // todo. Maybe ... doesn't seem worth it! - } - - /** - * Populate context menu ("User Actions->" cascading action) with user - * actions that meet their type-scoping criteria for given selection. - * <p> - * If given a profile, the list is scoped to that, else it includes actions - * for all active profiles. - */ - public Action[] addUserActions(IMenuManager menu, IStructuredSelection selection, ISystemProfile profile, Shell shell) { - // access UDA tree for this subsystem - SystemUDActionManager actMgr = getUDActionManager(); - // Go through each profile for this subsystem's factory - ISystemProfile[] profiles = null; - if (profile == null) - profiles = getActiveSystemProfiles(); - else - profiles = new ISystemProfile[] { profile }; - int domain = -1; - if (supportsDomains()) { - domain = getDomainFromSelection(selection); - if (domain == -1) - return new Action[0]; - } - boolean multiSelection = (selection.size() != 1); - ArrayList actionList = new ArrayList(); - for (int idx = 0; idx < profiles.length; idx++) { - profile = profiles[idx]; - SystemUDActionElement[] actionElements = actMgr.getActions(null, profile, domain); - // Scan UDA's for matching types and add to menu. - // if any match, then create the initial UDA submenu cascade item - for (int i = 0; i < actionElements.length; i++) { - SystemUDActionElement actionElement = actionElements[i]; - if (!actionElement.getShow()) continue; - if (multiSelection && actionElement.getSingleSelection()) continue; - if (supportsDomains() && (domain != actionElement.getDomain())) continue; // newly added... we were getting file actions on folders - if (!supportsTypes() || meetsSelection(actionElement, selection, domain)) { - SystemUDAsBaseAction uda = new SystemUDAsBaseAction(actionElement, shell, this); - uda.setSelection(selection); - uda.setShell(shell); - uda.setEnabled(!getWorkingOfflineMode()); - actionList.add(uda); - if (null != menu) - { - menu.add(uda); - } - - } - } // end for-loop - } // end for all profiles loop - Action[] list = (Action[])actionList.toArray(new Action[]{}); - - return list; - - } - - /** - * We disable user defined actions if we are in work-offline mode. - * Currently, how we determine this is dependent on the subsystem factory. - */ - public boolean getWorkingOfflineMode() { - return false; - } - - /** - * Determine domain, given the selection. - * Eg subsystem that supports domains has to do this via overriding this method. - * If domains not supported, return -1. - */ - protected abstract int getDomainFromSelection(IStructuredSelection selection); - - /** - * Given an action, and the currently selected remote objects, and the domain of those, - * return true if ALL of the selected remote objects matches any of the type criteria - * for this action - */ - protected boolean meetsSelection(SystemUDActionElement action, IStructuredSelection selection, int domainType) { - String unresolvedActionTypes[] = action.getFileTypes(); - // fastpath for "ALL"! - if ((unresolvedActionTypes == null) || (unresolvedActionTypes.length == 0)) - return true; // what else to do? - else if (unresolvedActionTypes[0].equals("ALL")) //$NON-NLS-1$ - return true; - Object actionTypes[] = resolveTypes(unresolvedActionTypes, domainType); - Iterator elements = selection.iterator(); - Object element = null; - while (elements.hasNext()) { - element = elements.next(); - // OK if matches any one of the file types for an action - boolean foundMatch = false; - for (int j = 0; !foundMatch && (j < actionTypes.length); j++) { - // compare current unnamed type to current selected object - if (isMatch(actionTypes[j], element, domainType)) { - foundMatch = true; - break; - } - } // for j - if (!foundMatch) return false; - } - return true; - } - - /** - * Given a list of names that represent named types, - * resolve that into a concatenated list of all types for - * the given type names. - * <p> - * Basically, this concatenates all the subtypes together. - * However, it also weeds out any redundancies - */ - protected String[] resolveTypes(String[] p_types, int domainType) { - Vector types = new Vector(); - for (int i = 0; i < p_types.length; i++) { - String fileTypes = getFileTypesForTypeName(p_types[i], domainType); - if (fileTypes != null) { - StringTokenizer st = new StringTokenizer(fileTypes, getTypesDelimiter()); - int n = st.countTokens(); - for (int j = 0; j < n; j++) { - String token = st.nextToken().trim(); - if (types.indexOf(token) < 0) types.addElement(token); - } - } - } - String[] allTypes = new String[types.size()]; - for (int idx = 0; idx < allTypes.length; idx++) - allTypes[idx] = (String) types.elementAt(idx); - return allTypes; - } - - /** - * Given a named-type name and a domain, find that type element and - * return the types for that named type. - */ - private String getFileTypesForTypeName(String name, int domainType) { - if (udaResolvedTypes == null) udaResolvedTypes = getResolvedTypesHelper(); - return udaResolvedTypes.getFileTypesForTypeName(name, domainType, getUDTypeManager()); - } - - /** - * Compares a particular file type (not named, but actual scalar/generic type) - * to a specific user-selected remote object. - * Returns true if the object's information matches that of the given type - * <p> - * Must be overridden, but only called if supportsTypes() returns true. - * Else, just return true! - * @param actionType - an unnamed file type, as in "*.cpp" - * @param selectedObject - one of the currently selected remote objects - * @param domainType - integer representation of current domain - */ - protected abstract boolean isMatch(Object actionType, Object selectedObject, int domainType); - - /** - * Get the delimiter used to delimiter the types in a type string. - * Default is " " - */ - protected String getTypesDelimiter() { - return " "; //$NON-NLS-1$ - } - - /** - * - */ - public void resetResolvedTypes() { - udaResolvedTypes = null; - } - - /** - * - */ - public SystemUDAResolvedTypes getResolvedTypesHelper() { - return new SystemUDAResolvedTypes(); - } - - // --------------------------------------------------------------------------- - // NEW METHODS MOVED DOWN TO ABSTRACT-OUT/ENCAPSULATE THE NOTION OF DOMAINS... - // DONE BY PHIL IN RELEASE 2. - // PREVIOUSLY DOMAINS ONLY INTRODUCED IN THE ISERIES SUBCLASS FOR NATIVE FILES - // XML SYNTAX FOR A DOMAIN: - // <Domain Name="XlatedDomainName" Type="DomainName" - // --------------------------------------------------------------------------- - /** - * For efficiency reasons, internally we use an integer to represent a domain. - * However, that has to be mapped to a name which is actually what is stored as the - * "name" attribute for the xml domain node. - * This returns the maximum integer number supported by this action/type manager. - * Returns -1 by default. - * Needs to be overridden by children that support domains - */ - public int getMaximumDomain() { - return -1; - } - - /** - * For efficiency reasons, internally we use an integer to represent a domain. - * However, that has to be mapped to a name which is actually what is stored as the - * "type" attribute for the xml domain node. - * <p>XML ATTRIBUTE SYNTAX FOR A DOMAIN: - * <code> - * <Domain Name="XlatedDomainName" Type="DomainName"/> - * </code> - * This maps the given integer to its domain name. - * Returns null by default. - * Needs to be overridden by children that support domains - */ - public String mapDomainName(int domainInteger) { - if ((domainInteger >= 0) && (domainInteger <= getMaximumDomain())) - return getDomainNames()[domainInteger]; - else - return null; - } - - /** - * Map a given untranslated domain name to its integer value - */ - public int mapDomainName(String domainName) { - String[] domainNames = getDomainNames(); - int match = -1; - if ((domainNames != null) && (domainNames.length > 0)) { - for (int idx = 0; (match == -1) && (idx < domainNames.length); idx++) - if (domainNames[idx].equals(domainName)) match = idx; - } - return match; - } - - /** - * For efficiency reasons, internally we use an integer to represent a domain. - * However, that has to be mapped to a translated name occasionally for the UI, - * and indeed the translated name is stored in the XML in the "Name" attribute. - * <p>XML ATTRIBUTE SYNTAX FOR A DOMAIN: - * <code> - * <Domain Name="XlatedDomainName" Type="DomainName"/> - * </code> - * This maps the given integer to its translated domain name. - * Returns null by default. - * Needs to be overridden by children that support domains - */ - public String mapDomainXlatedName(int domainInteger) { - if ((domainInteger >= 0) && (domainInteger <= getMaximumDomain())) - return getXlatedDomainNames()[domainInteger]; - else - return null; - } - - /** - * Same as above but specifically for what is shown in the work with user actions dialog for the new element - */ - public String mapDomainXlatedNewName(int domainInteger) { - if ((domainInteger >= 0) && (domainInteger <= getMaximumDomain())) - return getXlatedDomainNewNames()[domainInteger]; - else - return null; - } - - /** - * Same as above but specifically for what is shown in the work with named types dialog for the new element - */ - public String mapDomainXlatedNewTypeName(int domainInteger) { - if ((domainInteger >= 0) && (domainInteger <= getMaximumDomain())) - return getXlatedDomainNewTypeNames()[domainInteger]; - else - return null; - } - - /** - * Get the list of untranslated domain names - */ - public String[] getDomainNames() { - return null; - } - - /** - * Get the list of translated domain names - */ - public String[] getXlatedDomainNames() { - return null; - } - - /** - * Get the list of translated domain names for use in the tree view, for the "New" nodes, - * in the Work With User Actions dialog. - */ - public String[] getXlatedDomainNewNames() { - return null; - } - - /** - * Get the list of translated domain names for use in the tree view, for the "New" nodes, - * in the Work With User Types dialog. - */ - public String[] getXlatedDomainNewTypeNames() { - return null; - } - - /** - * Get the domain icon to show in the tree views - */ - public Image getDomainImage(int domain) { - return null; - } - - /** - * Get the domain icon to show in the tree views, for the new item for this domain - */ - public Image getDomainNewImage(int domain) { - return UserActionsIcon.USERACTION_NEW.getImage(); - } - - /** - * Get the domain icon to show in the named type tree view, for the new item for this domain - */ - public Image getDomainNewTypeImage(int domain) { - return UserActionsIcon.USERTYPE_NEW.getImage(); - } - - /** - * Get the active system profiles - */ - protected ISystemProfile[] getActiveSystemProfiles() { - return RSECorePlugin.getTheSystemRegistry().getActiveSystemProfiles(); - } - - protected List getDirtyEditors(IStructuredSelection sel) { - List dirtyEditors = new ArrayList(); - List selection = sel.toList(); - for (int i = 0; i < selection.size(); i++) { - Object selected = selection.get(i); - if (selected instanceof IAdaptable) { - ISystemEditableRemoteObject editable = getEditableFor((IAdaptable) selected); - if (editable != null) { - try { - // is the file being edited? - if (editable.checkOpenInEditor() == 0) { - // reference the editing editor - editable.openEditor(); - // file is open in editor - prompt for save - if (editable.isDirty()) { - dirtyEditors.add(editable); - } - } - } catch (Exception e) { - } - } - } - } - return dirtyEditors; - } - - protected ISystemEditableRemoteObject getEditableFor(IAdaptable selected) { - ISystemRemoteElementAdapter adapter = (ISystemRemoteElementAdapter) selected.getAdapter(ISystemRemoteElementAdapter.class); - if (adapter.canEdit(selected)) { - ISystemEditableRemoteObject editable = adapter.getEditableRemoteObject(selected); - try { - editable.setLocalResourceProperties(); - } catch (Exception e) { - } - return editable; - } - return null; - } - - protected boolean checkDirtyEditors(IStructuredSelection selection) { - List dirtyEditors = getDirtyEditors(selection); - if (dirtyEditors.size() > 0) { - AdaptableList input = new AdaptableList(); - for (int i = 0; i < dirtyEditors.size(); i++) { - ISystemEditableRemoteObject rmtObj = (ISystemEditableRemoteObject) dirtyEditors.get(i); - input.add(rmtObj.getRemoteObject()); - } - WorkbenchContentProvider cprovider = new WorkbenchContentProvider(); - SystemTableViewProvider lprovider = new SystemTableViewProvider(); - // TODO: Cannot use WorkbenchMessages -- it's internal - ListSelectionDialog dlg = new ListSelectionDialog(SystemBasePlugin.getActiveWorkbenchShell(), input, cprovider, lprovider, SystemUDAResources.EditorManager_saveResourcesMessage); - dlg.setInitialSelections(input.getChildren()); - dlg.setTitle(SystemUDAResources.EditorManager_saveResourcesTitle); - int result = dlg.open(); - //Just return false to prevent the operation continuing - if (result == IDialogConstants.CANCEL_ID) return false; - Object[] filesToSave = dlg.getResult(); - for (int s = 0; s < filesToSave.length; s++) { - IAdaptable rmtObj = (IAdaptable) filesToSave[s]; - ISystemEditableRemoteObject editable = getEditableFor(rmtObj); - editable.doImmediateSaveAndUpload(); - } - } - return true; - } - - /** - * Method called at the start and end of running user actions - * This allows children a chance to perform some action before and after - * the actions are run by overriding this method. - * @param processingSelection true before proecssing, false after processing - */ - protected void processingSelection(boolean processingSelection) { - } - - public String getOSType() - { - return osType; - } -} |