From 441fbea44fbdf6763416fe15a664c0cbfb020ad1 Mon Sep 17 00:00:00 2001 From: David McKnight Date: Wed, 25 Oct 2006 16:09:19 +0000 Subject: [PATCH] fix for Bug 161773 - introducing IHostOutput --- .../dstore/shell/DStoreShellOutputReader.java | 15 ++++--- .../dstore/shells/DStoreHostOutput.java | 30 ++++++++++++++ .../local/shells/LocalShellOutputReader.java | 6 ++- .../ssh/shell/SshShellOutputReader.java | 6 ++- .../shells/AbstractHostShellOutputReader.java | 24 ++++-------- .../services/shells/HostShellChangeEvent.java | 6 +-- .../rse/services/shells/IHostOutput.java | 6 +++ .../shells/IHostShellChangeEvent.java | 2 +- .../shells/IHostShellOutputReader.java | 4 +- .../rse/services/shells/SimpleHostOutput.java | 20 ++++++++++ .../servicesubsystem/ServiceCommandShell.java | 39 +++++++++---------- .../model/DStoreServiceCommandShell.java | 8 ++-- .../local/model/LocalServiceCommandShell.java | 5 ++- .../shells/ssh/SshServiceCommandShell.java | 5 ++- 14 files changed, 117 insertions(+), 59 deletions(-) create mode 100644 rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/services/dstore/shells/DStoreHostOutput.java create mode 100644 rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/IHostOutput.java create mode 100644 rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/SimpleHostOutput.java diff --git a/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/internal/services/dstore/shell/DStoreShellOutputReader.java b/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/internal/services/dstore/shell/DStoreShellOutputReader.java index 6be2ccd1eca..fed7236a8c1 100644 --- a/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/internal/services/dstore/shell/DStoreShellOutputReader.java +++ b/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/internal/services/dstore/shell/DStoreShellOutputReader.java @@ -19,9 +19,12 @@ package org.eclipse.rse.internal.services.dstore.shell; import org.eclipse.dstore.core.model.DataElement; import org.eclipse.dstore.extra.internal.extra.DomainEvent; import org.eclipse.dstore.extra.internal.extra.IDomainListener; +import org.eclipse.rse.services.dstore.shells.DStoreHostOutput; import org.eclipse.rse.services.shells.AbstractHostShellOutputReader; +import org.eclipse.rse.services.shells.IHostOutput; import org.eclipse.rse.services.shells.IHostShell; import org.eclipse.rse.services.shells.IHostShellOutputReader; +import org.eclipse.rse.services.shells.SimpleHostOutput; public class DStoreShellOutputReader extends AbstractHostShellOutputReader implements IHostShellOutputReader, IDomainListener { @@ -45,7 +48,7 @@ public class DStoreShellOutputReader extends AbstractHostShellOutputReader imple return pwd; } - protected Object internalReadLine() + protected IHostOutput internalReadLine() { if (_status != null && _keepRunning) { @@ -54,18 +57,18 @@ public class DStoreShellOutputReader extends AbstractHostShellOutputReader imple while (newSize > _statusOffset) { DataElement line = _status.get(_statusOffset++); - + String type = line.getType(); boolean isError = type.equals("error") || type.equals("stderr"); if (_isErrorReader && isError) { - return line; + return new DStoreHostOutput(line); } else if (!_isErrorReader && !isError) { - return line; + return new DStoreHostOutput(line); } } @@ -85,14 +88,14 @@ public class DStoreShellOutputReader extends AbstractHostShellOutputReader imple if (!_isErrorReader) { DataElement dummyLine = _status.getDataStore().createObject(_status, "stdout", ""); - return dummyLine; + return new DStoreHostOutput(dummyLine); } else { return null; } } - return ""; + return new SimpleHostOutput(""); } public boolean listeningTo(DomainEvent e) diff --git a/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/services/dstore/shells/DStoreHostOutput.java b/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/services/dstore/shells/DStoreHostOutput.java new file mode 100644 index 00000000000..3a2855b4638 --- /dev/null +++ b/rse/plugins/org.eclipse.rse.services.dstore/src/org/eclipse/rse/services/dstore/shells/DStoreHostOutput.java @@ -0,0 +1,30 @@ +package org.eclipse.rse.services.dstore.shells; + +import org.eclipse.dstore.core.model.DataElement; +import org.eclipse.rse.services.shells.IHostOutput; + +public class DStoreHostOutput implements IHostOutput +{ + + private DataElement _element; + + public DStoreHostOutput(DataElement element) + { + _element = element; + } + + public String getString() + { + return _element.getName(); + } + + public DataElement getElement() + { + return _element; + } + + public String toString() + { + return getString(); + } +} diff --git a/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/shells/LocalShellOutputReader.java b/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/shells/LocalShellOutputReader.java index 0d6a46feec0..3c522af8df4 100644 --- a/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/shells/LocalShellOutputReader.java +++ b/rse/plugins/org.eclipse.rse.services.local/src/org/eclipse/rse/internal/services/local/shells/LocalShellOutputReader.java @@ -21,8 +21,10 @@ import java.io.IOException; import org.eclipse.rse.services.local.Activator; import org.eclipse.rse.services.shells.AbstractHostShellOutputReader; +import org.eclipse.rse.services.shells.IHostOutput; import org.eclipse.rse.services.shells.IHostShell; import org.eclipse.rse.services.shells.IHostShellOutputReader; +import org.eclipse.rse.services.shells.SimpleHostOutput; /** * Listener to shell output. As io streams through, refresh events are sent out @@ -133,7 +135,7 @@ public class LocalShellOutputReader extends AbstractHostShellOutputReader implem return theLine.toString(); } */ - protected Object internalReadLine() { + protected IHostOutput internalReadLine() { if (_reader == null) { //Our workaround sets the stderr reader to null, so we never give any stderr output. //TODO Check if ssh supports some method of having separate stdout and stderr streams @@ -232,7 +234,7 @@ public class LocalShellOutputReader extends AbstractHostShellOutputReader implem String debugLine = theDebugLine.toString(); debugLine.compareTo(""); //$NON-NLS-1$ } - return theLine.toString(); + return new SimpleHostOutput(theLine.toString()); } diff --git a/rse/plugins/org.eclipse.rse.services.ssh/src/org/eclipse/rse/services/ssh/shell/SshShellOutputReader.java b/rse/plugins/org.eclipse.rse.services.ssh/src/org/eclipse/rse/services/ssh/shell/SshShellOutputReader.java index 67596d8967e..795bd127aeb 100644 --- a/rse/plugins/org.eclipse.rse.services.ssh/src/org/eclipse/rse/services/ssh/shell/SshShellOutputReader.java +++ b/rse/plugins/org.eclipse.rse.services.ssh/src/org/eclipse/rse/services/ssh/shell/SshShellOutputReader.java @@ -21,8 +21,10 @@ import java.io.BufferedReader; import java.io.IOException; import org.eclipse.rse.services.shells.AbstractHostShellOutputReader; +import org.eclipse.rse.services.shells.IHostOutput; import org.eclipse.rse.services.shells.IHostShell; import org.eclipse.rse.services.shells.IHostShellOutputReader; +import org.eclipse.rse.services.shells.SimpleHostOutput; import org.eclipse.rse.services.ssh.Activator; /** @@ -49,7 +51,7 @@ public class SshShellOutputReader extends AbstractHostShellOutputReader getHostShell().isActive(); } - protected Object internalReadLine() { + protected IHostOutput internalReadLine() { if (fReader == null) { //Our workaround sets the stderr reader to null, so we never give any stderr output. //TODO Check if ssh supports some method of having separate stdout and stderr streams @@ -150,7 +152,7 @@ public class SshShellOutputReader extends AbstractHostShellOutputReader String debugLine = theDebugLine.toString(); debugLine.compareTo(""); //$NON-NLS-1$ } - return theLine.toString(); + return new SimpleHostOutput(theLine.toString()); } } diff --git a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/AbstractHostShellOutputReader.java b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/AbstractHostShellOutputReader.java index 73444137c5c..97fb596ecb9 100644 --- a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/AbstractHostShellOutputReader.java +++ b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/AbstractHostShellOutputReader.java @@ -67,19 +67,11 @@ public abstract class AbstractHostShellOutputReader extends Thread implements I public void handle() { - Object line = internalReadLine(); + IHostOutput line = internalReadLine(); if (line != null) { - if (line instanceof String) - { - //if (lineStr.length() > 0) - addLine(line); - } - else - { - addLine(line); - } + addLine(line); } else @@ -89,7 +81,7 @@ public abstract class AbstractHostShellOutputReader extends Thread implements I } - protected void addLine(Object line) + protected void addLine(IHostOutput line) { _linesOfOutput.add(line); int sizenow = _linesOfOutput.size(); @@ -108,19 +100,19 @@ public abstract class AbstractHostShellOutputReader extends Thread implements I } } - public Object readLine() + public IHostOutput readLine() { if (!isAlive()) { internalReadLine(); start(); } - return _linesOfOutput.get(_consumerOffset++); + return (IHostOutput)_linesOfOutput.get(_consumerOffset++); } - public Object readLine(int lineNumber) + public IHostOutput readLine(int lineNumber) { - return _linesOfOutput.get(lineNumber); + return (IHostOutput)_linesOfOutput.get(lineNumber); } @@ -191,6 +183,6 @@ public abstract class AbstractHostShellOutputReader extends Thread implements I } } - protected abstract Object internalReadLine(); + protected abstract IHostOutput internalReadLine(); } \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/HostShellChangeEvent.java b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/HostShellChangeEvent.java index 50b45036b5c..18775d953b3 100644 --- a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/HostShellChangeEvent.java +++ b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/HostShellChangeEvent.java @@ -41,9 +41,9 @@ public class HostShellChangeEvent implements IHostShellChangeEvent return _reader; } - public Object[] getLines() + public IHostOutput[] getLines() { - Object[] lines = new Object[_range]; + IHostOutput[] lines = new IHostOutput[_range]; int r = 0; int size = _offset + _range ; for (int i= _offset; i < size; i++) @@ -54,7 +54,7 @@ public class HostShellChangeEvent implements IHostShellChangeEvent return lines; } - public Object[] getLineObjects() + public IHostOutput[] getLineObjects() { return getLines(); } diff --git a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/IHostOutput.java b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/IHostOutput.java new file mode 100644 index 00000000000..fefff6207eb --- /dev/null +++ b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/IHostOutput.java @@ -0,0 +1,6 @@ +package org.eclipse.rse.services.shells; + +public interface IHostOutput +{ + public String getString(); +} diff --git a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/IHostShellChangeEvent.java b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/IHostShellChangeEvent.java index 156dbf56d70..68be8f284e7 100644 --- a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/IHostShellChangeEvent.java +++ b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/IHostShellChangeEvent.java @@ -20,6 +20,6 @@ public interface IHostShellChangeEvent { public IHostShell getHostShell(); public IHostShellOutputReader getReader(); - public Object[] getLines(); + public IHostOutput[] getLines(); public boolean isError(); } \ No newline at end of file diff --git a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/IHostShellOutputReader.java b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/IHostShellOutputReader.java index 0779add9a43..103c31ff28a 100644 --- a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/IHostShellOutputReader.java +++ b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/IHostShellOutputReader.java @@ -18,8 +18,8 @@ package org.eclipse.rse.services.shells; public interface IHostShellOutputReader extends IHostShellOutputNotifier { - public Object readLine(); - public Object readLine(int index); + public IHostOutput readLine(); + public IHostOutput readLine(int index); public void addOutputListener(IHostShellOutputListener listener); public boolean isErrorReader(); public void finish(); diff --git a/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/SimpleHostOutput.java b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/SimpleHostOutput.java new file mode 100644 index 00000000000..56df2589222 --- /dev/null +++ b/rse/plugins/org.eclipse.rse.services/src/org/eclipse/rse/services/shells/SimpleHostOutput.java @@ -0,0 +1,20 @@ +package org.eclipse.rse.services.shells; + +public class SimpleHostOutput implements IHostOutput +{ + private String _line; + public SimpleHostOutput(String line) + { + _line = line; + } + + public String getString() + { + return _line; + } + + public String toString() + { + return _line; + } +} diff --git a/rse/plugins/org.eclipse.rse.subsystems.shells.core/src/org/eclipse/rse/subsystems/shells/core/subsystems/servicesubsystem/ServiceCommandShell.java b/rse/plugins/org.eclipse.rse.subsystems.shells.core/src/org/eclipse/rse/subsystems/shells/core/subsystems/servicesubsystem/ServiceCommandShell.java index db26810207e..56f52795b37 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.shells.core/src/org/eclipse/rse/subsystems/shells/core/subsystems/servicesubsystem/ServiceCommandShell.java +++ b/rse/plugins/org.eclipse.rse.subsystems.shells.core/src/org/eclipse/rse/subsystems/shells/core/subsystems/servicesubsystem/ServiceCommandShell.java @@ -20,8 +20,10 @@ import org.eclipse.rse.internal.subsystems.shells.servicesubsystem.OutputRefresh import org.eclipse.rse.internal.subsystems.shells.subsystems.RemoteCommandShell; import org.eclipse.rse.internal.subsystems.shells.subsystems.RemoteError; import org.eclipse.rse.internal.subsystems.shells.subsystems.RemoteOutput; +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.SimpleHostOutput; import org.eclipse.rse.subsystems.shells.core.ShellStrings; import org.eclipse.rse.subsystems.shells.core.subsystems.ICandidateCommand; import org.eclipse.rse.subsystems.shells.core.subsystems.IRemoteCmdSubSystem; @@ -59,33 +61,30 @@ public class ServiceCommandShell extends RemoteCommandShell implements IServiceC public void shellOutputChanged(IHostShellChangeEvent event) { - Object[] lines = event.getLines(); + IHostOutput[] lines = event.getLines(); IRemoteOutput[] outputs = new IRemoteOutput[lines.length]; for (int i = 0; i < lines.length; i++) { RemoteOutput output = null; - Object lineObj = lines[i]; - if (lineObj instanceof String) + IHostOutput lineObj = lines[i]; + if (lineObj instanceof SimpleHostOutput) { - String line = (String)lineObj; - - if (line != null) + SimpleHostOutput line = (SimpleHostOutput)lineObj; + + String type = event.isError() ? "stderr" : "stdout"; + if (event.isError()) { - String type = event.isError() ? "stderr" : "stdout"; - if (event.isError()) - { - output = new RemoteError(this, type); - - } - else - { - output = new RemoteOutput(this, type); - } - output.setText(line); - - addOutput(output); - outputs[i] = output; + output = new RemoteError(this, type); } + else + { + output = new RemoteOutput(this, type); + } + String str = line.getString(); + output.setText(str); + + addOutput(output); + outputs[i] = output; } } if (_lastRefreshJob == null || _lastRefreshJob.isComplete()) diff --git a/rse/plugins/org.eclipse.rse.subsystems.shells.dstore/src/org/eclipse/rse/subsystems/shells/dstore/model/DStoreServiceCommandShell.java b/rse/plugins/org.eclipse.rse.subsystems.shells.dstore/src/org/eclipse/rse/subsystems/shells/dstore/model/DStoreServiceCommandShell.java index 773d79f7a7e..f4dbe768579 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.shells.dstore/src/org/eclipse/rse/subsystems/shells/dstore/model/DStoreServiceCommandShell.java +++ b/rse/plugins/org.eclipse.rse.subsystems.shells.dstore/src/org/eclipse/rse/subsystems/shells/dstore/model/DStoreServiceCommandShell.java @@ -21,7 +21,9 @@ import org.eclipse.rse.internal.services.dstore.shell.DStoreShellOutputReader; import org.eclipse.rse.internal.subsystems.shells.servicesubsystem.OutputRefreshJob; import org.eclipse.rse.internal.subsystems.shells.subsystems.RemoteError; import org.eclipse.rse.internal.subsystems.shells.subsystems.RemoteOutput; +import org.eclipse.rse.services.dstore.shells.DStoreHostOutput; import org.eclipse.rse.services.dstore.shells.DStoreHostShell; +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.subsystems.shells.core.subsystems.IRemoteCmdSubSystem; @@ -57,15 +59,15 @@ public class DStoreServiceCommandShell extends ServiceCommandShell public void shellOutputChanged(IHostShellChangeEvent event) { - Object[] lines = event.getLines(); + IHostOutput[] lines = event.getLines(); IRemoteOutput[] outputs = new IRemoteOutput[lines.length]; for (int i = 0; i < lines.length; i++) { RemoteOutput output = null; Object lineObj = lines[i]; - if (lineObj instanceof DataElement) + if (lineObj instanceof DStoreHostOutput) { - DataElement line = (DataElement)lineObj; + DataElement line = ((DStoreHostOutput)lineObj).getElement(); String type = line.getType(); String src = line.getSource(); if (event.isError()) diff --git a/rse/plugins/org.eclipse.rse.subsystems.shells.local/src/org/eclipse/rse/subsystems/shells/local/model/LocalServiceCommandShell.java b/rse/plugins/org.eclipse.rse.subsystems.shells.local/src/org/eclipse/rse/subsystems/shells/local/model/LocalServiceCommandShell.java index 8bbfb03bae8..bb4e495e7b0 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.shells.local/src/org/eclipse/rse/subsystems/shells/local/model/LocalServiceCommandShell.java +++ b/rse/plugins/org.eclipse.rse.subsystems.shells.local/src/org/eclipse/rse/subsystems/shells/local/model/LocalServiceCommandShell.java @@ -23,6 +23,7 @@ import org.eclipse.rse.core.subsystems.ISubSystem; import org.eclipse.rse.internal.subsystems.shells.servicesubsystem.OutputRefreshJob; import org.eclipse.rse.internal.subsystems.shells.subsystems.RemoteError; import org.eclipse.rse.internal.subsystems.shells.subsystems.RemoteOutput; +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; @@ -74,11 +75,11 @@ public class LocalServiceCommandShell extends ServiceCommandShell public void shellOutputChanged(IHostShellChangeEvent event) { - Object[] lines = event.getLines(); + IHostOutput[] lines = event.getLines(); IRemoteOutput[] outputs = new IRemoteOutput[lines.length]; for (int i = 0; i < lines.length; i++) { - String line = (String)lines[i]; + String line = lines[i].getString(); ParsedOutput parsedMsg = null; try diff --git a/rse/plugins/org.eclipse.rse.subsystems.shells.ssh/src/org/eclipse/rse/subsystems/shells/ssh/SshServiceCommandShell.java b/rse/plugins/org.eclipse.rse.subsystems.shells.ssh/src/org/eclipse/rse/subsystems/shells/ssh/SshServiceCommandShell.java index 3511fdb53bf..e2a8cf68c8b 100644 --- a/rse/plugins/org.eclipse.rse.subsystems.shells.ssh/src/org/eclipse/rse/subsystems/shells/ssh/SshServiceCommandShell.java +++ b/rse/plugins/org.eclipse.rse.subsystems.shells.ssh/src/org/eclipse/rse/subsystems/shells/ssh/SshServiceCommandShell.java @@ -25,6 +25,7 @@ import org.eclipse.rse.core.subsystems.ISubSystem; import org.eclipse.rse.internal.subsystems.shells.servicesubsystem.OutputRefreshJob; import org.eclipse.rse.internal.subsystems.shells.subsystems.RemoteError; import org.eclipse.rse.internal.subsystems.shells.subsystems.RemoteOutput; +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; @@ -77,12 +78,12 @@ public class SshServiceCommandShell extends ServiceCommandShell implements ISyst public void shellOutputChanged(IHostShellChangeEvent event) { - Object[] lines = event.getLines(); + IHostOutput[] lines = event.getLines(); boolean gotCommand = false; ArrayList outputs = new ArrayList(lines.length); for (int i = 0; i < lines.length; i++) { - String line = (String)lines[i]; + String line = lines[i].getString(); if (line.endsWith(getPromptCommand())) { continue; //ignore our synthetic prompt command }