- refactored the processing of commands output in order to offer a more extensible and abstract output processor that can be easily customized as needed for different purposes - the newly introduced OutputProcessor will offer: - a method for processing the buffer it receives(either error or output) - abstract methods for processing an output or error lines - abstract methods for deciding when an line(output or error) has ended by searching for a specific character
Signed-off-by: Ioana Grigoropol <ioanax.grigoro...@intel.com> --- .../bc/remote/utils/CommandOutputProcessor.java | 33 +++++++ .../org/yocto/bc/remote/utils/CommandRunnable.java | 7 +- .../org/yocto/bc/remote/utils/OutputProcessor.java | 102 ++++++++++++++++++++ .../org/yocto/bc/remote/utils/RemoteHelper.java | 77 +-------------- .../org/yocto/bc/remote/utils/RemoteMachine.java | 7 +- .../bc/remote/utils/YoctoRunnableWithProgress.java | 2 +- 6 files changed, 140 insertions(+), 88 deletions(-) create mode 100644 plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/CommandOutputProcessor.java create mode 100644 plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/OutputProcessor.java diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/CommandOutputProcessor.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/CommandOutputProcessor.java new file mode 100644 index 0000000..4da33a4 --- /dev/null +++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/CommandOutputProcessor.java @@ -0,0 +1,33 @@ +package org.yocto.bc.remote.utils; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.rse.services.shells.IHostShell; + +public class CommandOutputProcessor extends OutputProcessor { + + public CommandOutputProcessor(IProgressMonitor monitor, + IHostShell hostShell, CommandResponseHandler cmdHandler, String task) { + super(monitor, hostShell, cmdHandler, task); + } + + @Override + protected boolean isErrChStop(char ch) { + return (ch == '\n'); + } + + @Override + protected boolean isOutChStop(char ch) { + return (ch == '\n'); + } + + @Override + protected void processOutputBufferLine(char ch, String str) { + processBuffer.addOutputLine(str); + } + + @Override + protected void processErrorBufferLine(char ch, String str) { + processBuffer.addErrorLine(str); + } + +} diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/CommandRunnable.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/CommandRunnable.java index 7406f50..f1ab9b1 100644 --- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/CommandRunnable.java +++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/CommandRunnable.java @@ -1,13 +1,8 @@ package org.yocto.bc.remote.utils; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.util.concurrent.locks.Lock; - import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.rse.core.model.IHost; -import org.eclipse.rse.services.shells.HostShellProcessAdapter; import org.eclipse.rse.services.shells.IHostShell; public class CommandRunnable implements Runnable{ @@ -28,7 +23,7 @@ public class CommandRunnable implements Runnable{ public void run() { try { hostShell = RemoteHelper.runCommandRemote(connection, cmd, monitor); - cmd.setProcessBuffer(RemoteHelper.processOutput(monitor, hostShell, cmdHandler, new char[]{'\n'})); + cmd.setProcessBuffer(RemoteHelper.processOutput(monitor, hostShell, cmdHandler)); } catch (CoreException e) { e.printStackTrace(); } catch (Exception e) { diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/OutputProcessor.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/OutputProcessor.java new file mode 100644 index 0000000..6d109e5 --- /dev/null +++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/OutputProcessor.java @@ -0,0 +1,102 @@ +package org.yocto.bc.remote.utils; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.concurrent.locks.Lock; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.rse.internal.services.local.shells.LocalHostShell; +import org.eclipse.rse.internal.services.shells.TerminalServiceHostShell; +import org.eclipse.rse.services.shells.HostShellProcessAdapter; +import org.eclipse.rse.services.shells.IHostShell; + +public abstract class OutputProcessor{ + private static final int ERROR_BUFFER = 1; + private static final int OUTPUT_BUFFER = 2; + protected String task; + protected ProcessStreamBuffer processBuffer; + protected IHostShell hostShell; + protected CommandResponseHandler cmdHandler; + protected IProgressMonitor monitor; + + public OutputProcessor(IProgressMonitor monitor, IHostShell hostShell, CommandResponseHandler cmdHandler, String task){ + this.monitor = monitor; + this.hostShell = hostShell; + this.processBuffer = new ProcessStreamBuffer(hostShell instanceof TerminalServiceHostShell); + this.cmdHandler = cmdHandler; + this.task = task; + } + public ProcessStreamBuffer processOutput() throws Exception{ + if (hostShell == null) + throw new Exception("An error has occured while trying to run remote command!"); + monitor.beginTask(this.task, RemoteHelper.TOTALWORKLOAD); + Lock lock = null; + if (hostShell instanceof LocalHostShell) { + lock = ((LocalHostShell)hostShell).getLock(); + lock.lock(); + } + BufferedReader inbr = null; + BufferedReader errbr = null; + + if (hostShell instanceof LocalHostShell) { + inbr = ((LocalHostShell)hostShell).getReader(false); + errbr = ((LocalHostShell)hostShell).getReader(true); + } else { + Process p = new HostShellProcessAdapter(hostShell); + inbr = new BufferedReader(new InputStreamReader(p.getInputStream())); + errbr = new BufferedReader(new InputStreamReader(p.getErrorStream())); + } + boolean cancel = false; + while (!cancel) { + if(monitor.isCanceled()) { + cancel = true; + if (lock != null) + lock.unlock(); + throw new InterruptedException("User Cancelled"); + } + processBuffer(errbr, ERROR_BUFFER); + processBuffer(inbr, OUTPUT_BUFFER); + cancel = true; + } + if (lock != null) + lock.unlock(); + return processBuffer; + } + protected abstract boolean isErrChStop(char ch); + protected abstract boolean isOutChStop(char ch); + protected boolean isChStop(char ch, int type){ + if (type == ERROR_BUFFER) + return isErrChStop(ch); + else if(type == OUTPUT_BUFFER) + return isOutChStop(ch); + return false; + } + protected abstract void processOutputBufferLine(char ch, String str); + protected abstract void processErrorBufferLine(char ch, String str); + protected void processBufferLine(String str, char ch, int type){ + if (type == ERROR_BUFFER) + processErrorBufferLine(ch, str); + else if(type == OUTPUT_BUFFER) + processOutputBufferLine(ch, str); + } + protected void processBuffer(BufferedReader br, int type) throws IOException{ + StringBuffer buffer = new StringBuffer(); + int c; + if (br != null) + while ((c = br.read()) != -1) { + char ch = (char) c; + buffer.append(ch); + if (isChStop(ch, type)){ + String str = buffer.toString(); + processBufferLine(str, ch, type); + System.out.println(str); + if (str.trim().equals(RemoteHelper.TERMINATOR)) { + break; + } + cmdHandler.response(str, false); + buffer.delete(0, buffer.length()); + } + } + } +} \ No newline at end of file diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java index 5b82e13..17d612b 100644 --- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java +++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteHelper.java @@ -10,16 +10,12 @@ ********************************************************************************/ package org.yocto.bc.remote.utils; -import java.io.BufferedReader; import java.io.File; import java.io.InputStream; -import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.locks.Lock; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -35,13 +31,10 @@ import org.eclipse.rse.core.RSECorePlugin; import org.eclipse.rse.core.model.IHost; import org.eclipse.rse.core.model.ISystemRegistry; import org.eclipse.rse.core.subsystems.ISubSystem; -import org.eclipse.rse.internal.services.local.shells.LocalHostShell; -import org.eclipse.rse.internal.services.shells.TerminalServiceHostShell; import org.eclipse.rse.services.IService; import org.eclipse.rse.services.clientserver.messages.SystemMessageException; import org.eclipse.rse.services.files.IFileService; import org.eclipse.rse.services.files.IHostFile; -import org.eclipse.rse.services.shells.HostShellProcessAdapter; import org.eclipse.rse.services.shells.IHostShell; import org.eclipse.rse.services.shells.IShellService; import org.eclipse.rse.subsystems.files.core.model.RemoteFileUtility; @@ -81,74 +74,8 @@ public class RemoteHelper { return getRemoteMachine(connection).getHostShell(); } - public static ProcessStreamBuffer processOutput(IProgressMonitor monitor, IHostShell hostShell, CommandResponseHandler cmdHandler, char[] ending) throws Exception { - if (hostShell == null) - throw new Exception("An error has occured while trying to run remote command!"); - - Lock lock = null; - if (hostShell instanceof LocalHostShell) { - lock = ((LocalHostShell)hostShell).getLock(); - lock.lock(); - } - ProcessStreamBuffer processBuffer = new ProcessStreamBuffer(hostShell instanceof TerminalServiceHostShell); - - BufferedReader inbr = null; - BufferedReader errbr = null; - - if (hostShell instanceof LocalHostShell) { - inbr = ((LocalHostShell)hostShell).getReader(false); - errbr = ((LocalHostShell)hostShell).getReader(true); - } else { - Process p = new HostShellProcessAdapter(hostShell); - inbr = new BufferedReader(new InputStreamReader(p.getInputStream())); - errbr = new BufferedReader(new InputStreamReader(p.getErrorStream())); - } - - boolean cancel = false; - while (!cancel) { - if(monitor.isCanceled()) { - cancel = true; - if (lock != null) - lock.unlock(); - throw new InterruptedException("User Cancelled"); - } - StringBuffer buffer = new StringBuffer(); - int c; - if (errbr != null) - while ((c = errbr.read()) != -1) { - char ch = (char) c; - buffer.append(ch); - if (Arrays.asList(ending).contains(ch)){ - String str = buffer.toString(); - processBuffer.addErrorLine(str); - System.out.println(str); - if (str.trim().equals(RemoteHelper.TERMINATOR)) { - break; - } - cmdHandler.response(str, true); - buffer.delete(0, buffer.length()); - } - } - if (inbr != null) - while ((c = inbr.read()) != -1) { - char ch = (char) c; - buffer.append(ch); - if (ch == '\n'){ - String str = buffer.toString(); - processBuffer.addOutputLine(str); - System.out.println(str); - if (str.trim().equals(RemoteHelper.TERMINATOR)) { - break; - } - cmdHandler.response(str, false); - buffer.delete(0, buffer.length()); - } - } - cancel = true; - } - if (lock != null) - lock.unlock(); - return processBuffer; + public static ProcessStreamBuffer processOutput(IProgressMonitor monitor, IHostShell hostShell, CommandResponseHandler cmdHandler) throws Exception { + return new CommandOutputProcessor(monitor, hostShell, cmdHandler, "").processOutput(); } public static IHost getRemoteConnectionByName(String remoteConnection) { diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteMachine.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteMachine.java index 14501e4..0b9ca3b 100644 --- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteMachine.java +++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/RemoteMachine.java @@ -1,12 +1,9 @@ package org.yocto.bc.remote.utils; -import java.io.BufferedReader; -import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.locks.Lock; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -19,7 +16,6 @@ import org.eclipse.rse.core.subsystems.ISubSystem; import org.eclipse.rse.internal.services.local.shells.LocalShellService; import org.eclipse.rse.services.clientserver.messages.SystemMessageException; import org.eclipse.rse.services.files.IFileService; -import org.eclipse.rse.services.shells.HostShellProcessAdapter; import org.eclipse.rse.services.shells.IHostShell; import org.eclipse.rse.services.shells.IShellService; import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem; @@ -35,7 +31,6 @@ public class RemoteMachine { private CommandResponseHandler cmdHandler; private IHostShell hostShell; private IShellService shellService; - private ProcessStreamBuffer processBuffer; private IHost connection; private ISubSystem fileSubSystem; @@ -79,7 +74,7 @@ public class RemoteMachine { try { SubProgressMonitor subMonitor = new SubProgressMonitor(monitor, 3); IHostShell hostShell = shellService.runCommand("", "env" + " ; echo " + RemoteHelper.TERMINATOR + "; exit;", new String[]{}, subMonitor); - buffer = RemoteHelper.processOutput(subMonitor, hostShell, cmdHandler, new char[]{'\n'}); + buffer = RemoteHelper.processOutput(subMonitor, hostShell, cmdHandler); for(int i = 0; i < buffer.getOutputLines().size(); i++) { String out = buffer.getOutputLines().get(i); String[] tokens = out.split("="); diff --git a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoRunnableWithProgress.java b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoRunnableWithProgress.java index e748be7..7eb7172 100644 --- a/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoRunnableWithProgress.java +++ b/plugins/org.yocto.bc.ui/src/org/yocto/bc/remote/utils/YoctoRunnableWithProgress.java @@ -98,7 +98,7 @@ public class YoctoRunnableWithProgress implements IRunnableWithProgress { public void run() { try { hostShell = RemoteHelper.runCommandRemote(this.connection, command, monitor); - command.setProcessBuffer(RemoteHelper.processOutput(monitor, hostShell, cmdHandler, new char[]{'\n', '\r'})); + command.setProcessBuffer(RemoteHelper.processOutput(monitor, hostShell, cmdHandler)); } catch (CoreException e) { e.printStackTrace(); } catch (Exception e) { -- 1.7.9.5 _______________________________________________ yocto mailing list yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/yocto