- OutputProcessor class is a stub class that will be used for processing the 
output of a remote command
    - the main method of this class is processOutput()
            - in this method, we retrieve the bufferes needed for output and 
error processing (from the host shell)
                    (using locks for local, and none for remote, as dictated by 
the upstream)
            - call processing for each buffer (output and error) using 
processBuffer method
                    - the processing of each buffer is basically done in the 
same way & the difference stands:
                            - in the way we determine the end of the line
                            - in the processing of a single line
                    - in order to provide a fully customizable approach for 
processing the output
                            each of the methods that differ are left as abstract
            - each line(output or error) is printed in the console and stored 
in the underlying ProcessStreamBuffer

Signed-off-by: Ioana Grigoropol <[email protected]>
---
 .../org.yocto.remote.utils/META-INF/MANIFEST.MF    |    2 +
 .../org/yocto/remote/utils/OutputProcessor.java    |  112 ++++++++++++++++++++
 .../src/org/yocto/remote/utils/RemoteHelper.java   |    2 +
 3 files changed, 116 insertions(+)
 create mode 100644 
plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/OutputProcessor.java

diff --git a/plugins/org.yocto.remote.utils/META-INF/MANIFEST.MF 
b/plugins/org.yocto.remote.utils/META-INF/MANIFEST.MF
index e31d557..408e33a 100644
--- a/plugins/org.yocto.remote.utils/META-INF/MANIFEST.MF
+++ b/plugins/org.yocto.remote.utils/META-INF/MANIFEST.MF
@@ -11,6 +11,8 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Import-Package: org.eclipse.rse.core,
  org.eclipse.rse.core.model,
  org.eclipse.rse.core.subsystems,
+ org.eclipse.rse.internal.services.local.shells,
+ org.eclipse.rse.internal.services.shells,
  org.eclipse.rse.internal.terminals.ui,
  org.eclipse.rse.internal.terminals.ui.views,
  org.eclipse.rse.services,
diff --git 
a/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/OutputProcessor.java
 
b/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/OutputProcessor.java
new file mode 100644
index 0000000..401a782
--- /dev/null
+++ 
b/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/OutputProcessor.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Intel Corporation.
+ * 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:
+ * Ioana Grigoropol(Intel) - initial API and implementation
+ 
*******************************************************************************/
+package org.yocto.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.remote.utils/src/org/yocto/remote/utils/RemoteHelper.java 
b/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/RemoteHelper.java
index a1e9a08..4d4f047 100644
--- 
a/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/RemoteHelper.java
+++ 
b/plugins/org.yocto.remote.utils/src/org/yocto/remote/utils/RemoteHelper.java
@@ -49,6 +49,8 @@ import 
org.eclipse.rse.subsystems.terminals.core.ITerminalServiceSubSystem;
 public class RemoteHelper {
        private final static String EXIT_CMD = "exit"; //$NON-NLS-1$
        private final static String CMD_DELIMITER = ";"; //$NON-NLS-1$
+       public static final String TERMINATOR = 
"234o987dsfkcqiuwey18837032843259d";//$NON-NLS-1$
+       public static final int TOTALWORKLOAD = 100;
 
        public static IHost getRemoteConnectionByName(String remoteConnection) {
                if (remoteConnection == null)
-- 
1.7.9.5

_______________________________________________
yocto mailing list
[email protected]
https://lists.yoctoproject.org/listinfo/yocto

Reply via email to