From e9f969009cfecd5ed210516d46bb7f13eca2ffd7 Mon Sep 17 00:00:00 2001
From: brinn <brinn>
Date: Sun, 14 Nov 2010 16:30:08 +0000
Subject: [PATCH] fix: unit test RsyncCopierTest change: simplify reading of
 process output in ProcessExecutionHelper

SVN: 18671
---
 .../process/ProcessExecutionHelper.java       | 95 +++++++++----------
 1 file changed, 43 insertions(+), 52 deletions(-)

diff --git a/common/source/java/ch/systemsx/cisd/common/process/ProcessExecutionHelper.java b/common/source/java/ch/systemsx/cisd/common/process/ProcessExecutionHelper.java
index 1b30a325777..adcd0ed3246 100644
--- a/common/source/java/ch/systemsx/cisd/common/process/ProcessExecutionHelper.java
+++ b/common/source/java/ch/systemsx/cisd/common/process/ProcessExecutionHelper.java
@@ -64,18 +64,18 @@ public final class ProcessExecutionHelper
         ALWAYS;
     }
 
+    /**
+     * Record to store process and its output.
+     */
     private final class ProcessRecord
     {
         private final Process process;
 
-        private final BufferedReader processOutputReader;
-
         private final List<String> processOutput;
 
         ProcessRecord(final Process process)
         {
             this.process = process;
-            this.processOutputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
             this.processOutput = Collections.synchronizedList(new ArrayList<String>());
         }
 
@@ -88,11 +88,6 @@ public final class ProcessExecutionHelper
         {
             return processOutput;
         }
-
-        BufferedReader getProcessOutputReader()
-        {
-            return processOutputReader;
-        }
     }
 
     /**
@@ -303,39 +298,6 @@ public final class ProcessExecutionHelper
         return StringUtils.join(commandLine, ' ');
     }
 
-    /**
-     * Returns the <code>stdout</code> and <code>stderr</code> of the <var>process</var> in
-     * <var>processRecord.getProcessOutput()</var>.
-     */
-    private final static void readProcessOutputLines(final ProcessRecord processRecord,
-            final Logger machineLog, final boolean discard)
-    {
-        assert processRecord != null;
-        assert machineLog != null;
-
-        final BufferedReader reader = processRecord.getProcessOutputReader();
-        final List<String> processOutput = processRecord.getProcessOutput();
-        try
-        {
-            while (reader.ready())
-            {
-                final String line = reader.readLine();
-                if (line == null)
-                {
-                    break;
-                }
-                if (discard == false)
-                {
-                    processOutput.add(line);
-                }
-            }
-        } catch (final IOException e)
-        {
-            machineLog.warn(String.format("IOException when reading stdout/stderr, msg='%s'.",
-                    e.getMessage()));
-        }
-    }
-
     //
     // Implementation
     //
@@ -369,6 +331,38 @@ public final class ProcessExecutionHelper
             return processBuilder.start();
         }
 
+        /**
+         * Returns the <code>stdout</code> and <code>stderr</code> of the <var>process</var> in
+         * <var>processRecord.getProcessOutput()</var>.
+         */
+        private final void readProcessOutputLines(final List<String> processOutput,
+                final BufferedReader reader, final boolean discard)
+        {
+            assert processOutput != null;
+            assert reader != null;
+            assert machineLog != null;
+
+            try
+            {
+                while (reader.ready())
+                {
+                    final String line = reader.readLine();
+                    if (line == null)
+                    {
+                        break;
+                    }
+                    if (discard == false)
+                    {
+                        processOutput.add(line);
+                    }
+                }
+            } catch (final IOException e)
+            {
+                machineLog.warn(String.format("IOException when reading stdout/stderr, msg='%s'.",
+                        e.getMessage()));
+            }
+        }
+
         //
         // NamedCallable
         //
@@ -382,26 +376,26 @@ public final class ProcessExecutionHelper
                 {
                     ProcessRecord processRecord = new ProcessRecord(process);
                     processWrapper.set(processRecord);
+                    final List<String> processOutput = processRecord.getProcessOutput();
+                    final BufferedReader reader =
+                            new BufferedReader(new InputStreamReader(process.getInputStream()));
                     final boolean discardOutput =
                             (outputReadingStrategy == OutputReadingStrategy.NEVER);
                     int exitValue = ProcessResult.NO_EXIT_VALUE;
                     while (exitValue == ProcessResult.NO_EXIT_VALUE)
                     {
-                        readProcessOutputLines(processRecord, machineLog, discardOutput);
+                        readProcessOutputLines(processOutput, reader, discardOutput);
                         exitValue = getExitValue(process);
                         if (exitValue == ProcessResult.NO_EXIT_VALUE)
                         {
                             ConcurrencyUtilities.sleep(PAUSE_MILLIS);
                         }
                     }
-                    processRecord = processWrapper.getAndSet(null);
-                    if (processRecord == null)
-                    {
-                        return null;
-                    }
-                    readProcessOutputLines(processRecord, machineLog, discardOutput);
+                    processWrapper.set(null);
+                    readProcessOutputLines(processOutput, reader, discardOutput);
                     return new ProcessResult(commandLine, processNumber, ExecutionStatus.COMPLETE,
-                            "", exitValue, processRecord.getProcessOutput(), operationLog, machineLog);
+                            "", exitValue, processRecord.getProcessOutput(), operationLog,
+                            machineLog);
                 } finally
                 {
                     IOUtils.closeQuietly(process.getErrorStream());
@@ -449,9 +443,6 @@ public final class ProcessExecutionHelper
             if (processRecord != null)
             {
                 final Process process = processRecord.getProcess();
-                final boolean discardOutput =
-                        (outputReadingStrategy == OutputReadingStrategy.NEVER);
-                readProcessOutputLines(processRecord, machineLog, discardOutput);
                 process.destroy(); // Note: this also closes the I/O streams.
                 if (machineLog.isInfoEnabled())
                 {
-- 
GitLab