Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.tcf.rse/src/org/eclipse/tcf/internal/rse/shells/TCFServiceCommandShell.java')
-rw-r--r--plugins/org.eclipse.tcf.rse/src/org/eclipse/tcf/internal/rse/shells/TCFServiceCommandShell.java206
1 files changed, 206 insertions, 0 deletions
diff --git a/plugins/org.eclipse.tcf.rse/src/org/eclipse/tcf/internal/rse/shells/TCFServiceCommandShell.java b/plugins/org.eclipse.tcf.rse/src/org/eclipse/tcf/internal/rse/shells/TCFServiceCommandShell.java
new file mode 100644
index 000000000..f7c55c77d
--- /dev/null
+++ b/plugins/org.eclipse.tcf.rse/src/org/eclipse/tcf/internal/rse/shells/TCFServiceCommandShell.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 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
+ *
+ * Initial Contributors:
+ * The following IBM employees contributed to the Remote System Explorer
+ * component that contains this file: David McKnight, Kushal Munir,
+ * Michael Berger, David Dykstal, Phil Coulthard, Don Yantzi, Eric Simpson,
+ * Emily Bruner, Mazen Faraj, Adrian Storisteanu, Li Ding, and Kent Hawley.
+ *
+ * Contributors:
+ * Martin Oberhuber (Wind River) - Adapted from LocalServiceCommandShell
+ * Martin Oberhuber (Wind River) - [225510][api] Fix OutputRefreshJob API leakage
+ * Anna Dushistova (MontaVista) - [259414][api] refactor the "SSH Shell" to use the generic Terminal->IHostShell converter
+ * Anna Dushistova (MontaVista) - [261478] Remove SshShellService, SshHostShell (or deprecate and schedule for removal in 3.2)
+ * David McKnight (IBM) - [272032][ssh][telnet][local] shell output not setting line numbers when available
+ * Liping Ke (Intel Corp.)- Adapted from org.eclipse.rse.internal.subsystems.shells.ssh.SshServiceCommandShell
+ * Liping Ke (Intel Corp.)- [246987] Implement TCF Shell/terminal services
+ *******************************************************************************/
+package org.eclipse.tm.internal.tcf.rse.shells;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.rse.core.subsystems.ISubSystem;
+import org.eclipse.rse.internal.services.shells.TerminalServiceHostShell;
+import org.eclipse.rse.services.shells.IHostOutput;
+import org.eclipse.rse.services.shells.IHostShell;
+import org.eclipse.rse.services.shells.IHostShellChangeEvent;
+import org.eclipse.rse.services.shells.ParsedOutput;
+import org.eclipse.rse.services.shells.Patterns;
+import org.eclipse.rse.subsystems.files.core.subsystems.IRemoteFileSubSystem;
+import org.eclipse.rse.subsystems.shells.core.model.ISystemOutputRemoteTypes;
+import org.eclipse.rse.subsystems.shells.core.model.RemoteError;
+import org.eclipse.rse.subsystems.shells.core.model.RemoteOutput;
+import org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteCmdSubSystem;
+import org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteOutput;
+import org.eclipse.rse.subsystems.shells.core.subsystems.servicesubsystem.ServiceCommandShell;
+
+@SuppressWarnings("restriction")
+public class TCFServiceCommandShell extends ServiceCommandShell {
+ private Patterns _patterns;
+ private String _workingDir;
+ private String _curCommand;
+ private IRemoteFileSubSystem _fs;
+
+ public TCFServiceCommandShell(IRemoteCmdSubSystem cmdSS,
+ IHostShell hostShell) {
+ super(cmdSS, hostShell);
+ _patterns = new Patterns();
+ _patterns.update("cmd"); //$NON-NLS-1$
+ ISubSystem[] sses = cmdSS.getHost().getSubSystems();
+ for (int i = 0; i < sses.length; i++)
+ {
+ if (sses[i] instanceof IRemoteFileSubSystem)
+ {
+ _fs = (IRemoteFileSubSystem)sses[i];
+ break;
+ }
+ }
+ }
+
+ public Object getContext()
+ {
+ String workingDir = _workingDir;
+ if (workingDir != null && workingDir.length() > 0)
+ {
+ try {
+ return _fs.getRemoteFileObject(workingDir, new NullProgressMonitor());
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ return null;
+
+ }
+
+ public String getContextString()
+ {
+ return _workingDir;
+ }
+
+ public void shellOutputChanged(IHostShellChangeEvent event)
+ {
+ IHostOutput[] lines = event.getLines();
+ boolean gotCommand = false;
+ ArrayList<RemoteOutput> outputs = new ArrayList<RemoteOutput>(lines.length);
+ for (int i = 0; i < lines.length; i++)
+ {
+ String line = lines[i].getString();
+ if (line.endsWith(getPromptCommand())) {
+ continue; //ignore our synthetic prompt command
+ }
+ ParsedOutput parsedMsg = null;
+ if (!gotCommand && line.equals(_curCommand)) {
+ gotCommand = true;
+ continue; //ignore remote command echo
+ } else
+ {
+ try
+ {
+ // Bug 160202: Remote shell dies.
+ if ((_curCommand == null) || (!_curCommand.trim().equals("ls"))) { //$NON-NLS-1$
+ parsedMsg = _patterns.matchLine(line);
+
+ // Bug 160202: Remote shell dies.
+ if (_curCommand != null) {
+ String temp = _curCommand.trim();
+ StringTokenizer tokenizer = new StringTokenizer(temp);
+
+ if (tokenizer.countTokens() == 2) {
+ String token1 = tokenizer.nextToken();
+ String token2 = tokenizer.nextToken();
+
+ if ((token1.equals("ls")) && (token2.indexOf('-') == 0) && (token2.indexOf('l') > 0)) { //$NON-NLS-1$
+ if (line.startsWith("total")) { //$NON-NLS-1$
+ parsedMsg = null;
+ }
+ }
+ }
+ }
+ }
+ }
+ catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+ RemoteOutput output = null;
+
+ String type = "stdout"; //$NON-NLS-1$
+
+ if (parsedMsg != null) {
+ type = parsedMsg.type;
+ }
+
+ if (event.isError()) {
+ output = new RemoteError(this, type);
+ }
+ else {
+ output = new RemoteOutput(this, type);
+ }
+
+ output.setText(line);
+ if (parsedMsg != null)
+ {
+ String file = parsedMsg.file;
+ if (type.equals(ISystemOutputRemoteTypes.TYPE_PROMPT))
+ {
+ _workingDir = file;
+ output.setAbsolutePath(_workingDir);
+ }
+ else if(_workingDir!=null)
+ {
+ IPath p = new Path(_workingDir).append(file);
+ output.setAbsolutePath(p.toString());
+ }
+ else
+ {
+ output.setAbsolutePath(file);
+ }
+ if (parsedMsg.line > 0){
+ output.setLine(parsedMsg.line);
+ }
+ }
+
+ addOutput(output);
+ outputs.add(output);
+ }
+
+ IRemoteOutput[] remoteOutputs = outputs.toArray(new IRemoteOutput[outputs.size()]);
+ notifyOutputChanged(remoteOutputs, false);
+ }
+
+ /**
+ * Return the prompt command, such that lines ending with the
+ * prompt command can be removed from output.
+ * Should be overridden in case the IHostShell used for this
+ * service is not an SshHostShell.
+ * @return String promptCommand
+ */
+ protected String getPromptCommand() {
+ IHostShell shell = getHostShell();
+ if (shell instanceof TerminalServiceHostShell) {
+ return ((TerminalServiceHostShell)shell).getPromptCommand();
+ }
+ //return something impossible such that nothing is ever matched
+ return "\uffff"; //$NON-NLS-1$
+ }
+
+ public void writeToShell(String cmd)
+ {
+ _curCommand = cmd;
+ _patterns.update(cmd);
+ super.writeToShell(cmd);
+
+ }
+
+}

Back to the top