This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch 4.0.x
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/4.0.x by this push:
     new bc4666f  [OPENMEETINGS-1878] StreamWatcher is added back
bc4666f is described below

commit bc4666f01a24193306cf8c00f84b5ac339f5e900
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Wed Apr 25 10:28:05 2018 +0700

    [OPENMEETINGS-1878] StreamWatcher is added back
---
 .../openmeetings/util/process/ProcessHelper.java   | 54 ++++++++++++++++++++--
 1 file changed, 49 insertions(+), 5 deletions(-)

diff --git 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessHelper.java
 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessHelper.java
index ea406c3..cd3a3fb 100644
--- 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessHelper.java
+++ 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ProcessHelper.java
@@ -21,11 +21,14 @@ package org.apache.openmeetings.util.process;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.getExtProcessTtl;
 
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.commons.io.IOUtils;
 import org.apache.openmeetings.util.OpenmeetingsVariables;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -33,6 +36,40 @@ import org.slf4j.Logger;
 public class ProcessHelper {
        public static final Logger log = 
Red5LoggerFactory.getLogger(ProcessHelper.class, 
OpenmeetingsVariables.getWebAppRootKey());
 
+       // This is necessary to prevent 'buffer overflow'
+       // 
https://stackoverflow.com/questions/9885643/ffmpeg-executed-from-javas-processbuilder-does-not-return-under-windows-7
+       private static class StreamWatcher extends Thread {
+               public final StringBuilder output = new StringBuilder();
+               private final InputStream is;
+               private boolean run = true;
+
+               private StreamWatcher(final InputStream is) {
+                       this.is = is;
+               }
+
+               @Override
+               public void run() {
+                       try (BufferedReader br = new BufferedReader(new 
InputStreamReader(is, UTF_8));) {
+                               String line = br.readLine();
+                               while (run && line != null) {
+                                       output.append(line).append('\n');
+                                       line = br.readLine();
+                               }
+                       } catch (IOException ioexception) {
+                               return;
+                       }
+               }
+
+               public void finish() {
+                       run = false;
+               }
+
+               @Override
+               public String toString() {
+                       return output.toString();
+               }
+       }
+
        private ProcessHelper() {}
 
        private static String getCommand(String[] argv) {
@@ -72,9 +109,10 @@ public class ProcessHelper {
                debugCommandStart(process, argv);
 
                Process proc = null;
+               StreamWatcher errorWatcher = null;
+               StreamWatcher inputWatcher = null;
                try {
-                       res.setCommand(getCommand(argv))
-                               .setOut("");
+                       res.setCommand(getCommand(argv)).setOut("");
 
                        // By using the process Builder we have access to 
modify the
                        // environment variables
@@ -83,6 +121,10 @@ public class ProcessHelper {
                        pb.environment().putAll(env);
 
                        proc = pb.start();
+                       errorWatcher = new StreamWatcher(proc.getErrorStream());
+                       inputWatcher = new StreamWatcher(proc.getInputStream());
+                       errorWatcher.start();
+                       inputWatcher.start();
 
                        // 20-minute timeout for command execution
                        // FFMPEG conversion of Recordings may take a real long 
time until
@@ -90,8 +132,8 @@ public class ProcessHelper {
                        proc.waitFor(getExtProcessTtl(), TimeUnit.MINUTES);
 
                        res.setExitCode(proc.exitValue())
-                               .setOut(IOUtils.toString(proc.getInputStream(), 
UTF_8))
-                               
.setError(IOUtils.toString(proc.getErrorStream(), UTF_8));
+                               .setOut(inputWatcher.toString())
+                               .setError(errorWatcher.toString());
                } catch (Throwable t) {
                        log.error("executeScript", t);
                        res.setExitCode(-1)
@@ -99,6 +141,8 @@ public class ProcessHelper {
                                .setException(t.toString());
                } finally {
                        if (proc != null) {
+                               errorWatcher.finish();
+                               inputWatcher.finish();
                                proc.destroy();
                        }
                }

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to