FELIX-1855 - exec command eats first keystroke of subsequent commands


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@833839 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ExecuteAction.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ExecuteAction.java
index c4089b0..3cd0d60 100644
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ExecuteAction.java
+++ b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/ExecuteAction.java
@@ -37,11 +37,11 @@
     protected Object doExecute() throws Exception {
         ProcessBuilder builder = new ProcessBuilder(args);
 
-        log.info("Executing: {}", builder.command());
+        PumpStreamHandler handler = new PumpStreamHandler(System.in, System.out, System.err);
 
+        log.info("Executing: {}", builder.command());
         Process p = builder.start();
 
-        PumpStreamHandler handler = new PumpStreamHandler(System.in, System.out, System.err);
         handler.attach(p);
         handler.start();
 
@@ -54,7 +54,7 @@
 
         handler.stop();
 
-        return status;
+        return null;
     }
 
 }
diff --git a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/StreamPumper.java b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/StreamPumper.java
index 1cb35b7..9d15286 100644
--- a/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/StreamPumper.java
+++ b/karaf/shell/commands/src/main/java/org/apache/felix/karaf/shell/commands/utils/StreamPumper.java
@@ -105,13 +105,20 @@
 
         int length;
         try {
-            while ((length = in.read(buf)) > 0 && !finish) {
-                out.write(buf, 0, length);
-                if (autoflush) {
-                    out.flush();
+            do {
+                while (in.available() > 0 && !finish) {
+                    length = in.read(buf);
+                    if (length < 1 ) {
+                        break;
+                    }
+                    out.write(buf, 0, length);
+                    if (autoflush) {
+                        out.flush();
+                    }
                 }
-            }
-            out.flush();
+                out.flush();
+                Thread.sleep(200);  // Pause to avoid tight loop if external proc is slow
+            } while (!finish && closeWhenExhausted);
         }
         catch (Exception e) {
             synchronized (this) {