(no commit message)
[utils] / support / general / src / main / java / org / wamblee / io / SimpleProcess.java
index 3e0e7f853eade21fb9fa57b45c7bbfd1c3893f3d..399d0030a9a86aec0311490a70d756ca7956f5c2 100644 (file)
@@ -1,12 +1,12 @@
 /*
- * Copyright 2007 the original author or authors.
- *
+ * Copyright 2005-2010 the original author or authors.
+ * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- *
+ * 
  *      http://www.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  */
 package org.wamblee.io;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.PrintStream;
 import java.io.StringWriter;
 import java.io.Writer;
-
+import java.util.Arrays;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
- * DOCUMENT ME!
- *
+ * 
  * @author $author$
  * @version $Revision$
  */
 public class SimpleProcess {
-    /**
-     * DOCUMENT ME!
-     */
-    private static final Log LOG = LogFactory.getLog(SimpleProcess.class);
+    private static final Logger LOG = Logger.getLogger(SimpleProcess.class
+        .getName());
 
-    /**
-     * DOCUMENT ME!
-     */
     private File directory;
 
-    /**
-     * DOCUMENT ME!
-     */
     private String[] cmd;
 
-    /**
-     * DOCUMENT ME!
-     */
     private String stdout;
 
-    /**
-     * DOCUMENT ME!
-     */
     private String stderr;
 
-/**
+    /**
      * Creates a new SimpleProcess object.
-     *
-     * @param aDirectory DOCUMENT ME!
-     * @param aCmd DOCUMENT ME!
+     * 
      */
     public SimpleProcess(File aDirectory, String[] aCmd) {
-        directory     = aDirectory;
-        cmd           = aCmd;
+        directory = aDirectory;
+        cmd = Arrays.copyOf(aCmd, aCmd.length);
     }
 
     /**
-     * DOCUMENT ME!
-     *
+     * 
      * @return the stdout
      */
     public String getStdout() {
@@ -82,8 +61,7 @@ public class SimpleProcess {
     }
 
     /**
-     * DOCUMENT ME!
-     *
+     * 
      * @return the stderr
      */
     public String getStderr() {
@@ -92,50 +70,44 @@ public class SimpleProcess {
 
     /**
      * Runs the process and blocks until it is done.
-     *
+     * 
      * @return Exit status of the process.
-     *
-     * @throws IOException In case of problems.
+     * 
+     * @throws IOException
+     *             In case of problems.
      */
     public int run() throws IOException {
         return runImpl();
     }
 
-    /**
-     * DOCUMENT ME!
-     *
-     * @return DOCUMENT ME!
-     *
-     * @throws IOException DOCUMENT ME!
-     */
     private int runImpl() throws IOException {
         try {
-            String fullcmd = "";
+            StringBuffer fullcmd = new StringBuffer();
 
             for (String part : cmd) {
-                fullcmd += (" " + part);
+                fullcmd.append(" " + part);
             }
 
-            LOG.debug("Executing '" + fullcmd + "' in directory '" + directory
-                "'");
+            LOG.fine("Executing '" + fullcmd + "' in directory '" + directory +
+                "'");
 
-            java.lang.Process proc = Runtime.getRuntime()
-                .exec(cmd, null, directory);
+            java.lang.Process proc = Runtime.getRuntime().exec(cmd, null,
+                directory);
 
             // Read standard output and error in separate threads to avoid
             // deadlock.
-            StringWriter myStdout     = new StringWriter();
-            StringWriter myStderr     = new StringWriter();
-            Thread       stdoutReader = readAndLogStream("STDOUT>  ",
-                    proc.getInputStream(), myStdout);
-            Thread       stderrReader = readAndLogStream("STDERR>  ",
-                    proc.getErrorStream(), myStderr);
+            StringWriter myStdout = new StringWriter();
+            StringWriter myStderr = new StringWriter();
+            Thread stdoutReader = readAndLogStream("STDOUT>  ", proc
+                .getInputStream(), myStdout);
+            Thread stderrReader = readAndLogStream("STDERR>  ", proc
+                .getErrorStream(), myStderr);
 
             try {
                 proc.waitFor();
             } catch (InterruptedException e) {
                 IOException exception = new IOException(
-                        "Process was terminated: " + this);
+                    "Process was terminated: " + this);
                 exception.initCause(e);
                 throw exception;
             }
@@ -143,94 +115,80 @@ public class SimpleProcess {
             waitForReader(stdoutReader);
             waitForReader(stderrReader);
 
-            stdout     = myStdout.toString();
-            stderr     = myStderr.toString();
+            stdout = myStdout.toString();
+            stderr = myStderr.toString();
 
             if (proc.exitValue() != 0) {
-                LOG.warn("Exit value was non-zero: " + this);
+                LOG.warning("Exit value was non-zero: " + this);
             } else {
-                LOG.debug("Process finished");
+                LOG.fine("Process finished");
             }
 
             return proc.exitValue();
         } catch (IOException e) {
-            IOException exception = new IOException("Error executing process: "
-                    + this);
+            IOException exception = new IOException(
+                "Error executing process: " + this);
             exception.initCause(e);
             throw exception;
         }
     }
 
-    /**
-     * DOCUMENT ME!
-     *
-     * @param aReaderThread DOCUMENT ME!
-     */
     private void waitForReader(Thread aReaderThread) {
         try {
             aReaderThread.join();
         } catch (InterruptedException e) {
-            LOG.warn(this
-                + ": error waiting for output stream reader of process to finish");
+            LOG
+                .log(
+                    Level.WARNING,
+                    this +
+                        ": error waiting for output stream reader of process to finish",
+                    e);
         }
     }
 
-    /**
-     * DOCUMENT ME!
-     *
-     * @param aPrefix DOCUMENT ME!
-     * @param aStream DOCUMENT ME!
-     * @param aOutput DOCUMENT ME!
-     *
-     * @return DOCUMENT ME!
-     */
     private Thread readAndLogStream(final String aPrefix,
         final InputStream aStream, final Writer aOutput) {
         Thread inputReader = new Thread() {
-                @Override
-                public void run() {
-                    BufferedReader br = null;
+            @Override
+            public void run() {
+                BufferedReader br = null;
 
-                    try {
-                        br = new BufferedReader(new InputStreamReader(aStream));
+                try {
+                    br = new BufferedReader(new InputStreamReader(aStream));
 
-                        String str;
+                    String str;
 
-                        while ((str = br.readLine()) != null) {
-                            LOG.debug(aPrefix + str);
-                            aOutput.write(str);
-                        }
-                    } catch (IOException e) {
-                        LOG.warn(SimpleProcess.this
-                            + ": error reading input stream", e);
-                    } finally {
-                        if (br != null) {
-                            try {
-                                br.close();
-                            } catch (IOException e) {
-                                LOG.warn("Error closing stream " + aPrefix);
-                            }
+                    while ((str = br.readLine()) != null) {
+                        LOG.fine(aPrefix + str);
+                        aOutput.write(str);
+                    }
+                } catch (IOException e) {
+                    LOG.log(Level.FINE, SimpleProcess.this +
+                        ": error reading input stream", e);
+                } finally {
+                    if (br != null) {
+                        try {
+                            br.close();
+                        } catch (IOException e) {
+                            LOG.log(Level.WARNING, "Error closing stream " +
+                                aPrefix, e);
                         }
                     }
                 }
-            };
+            }
+        };
 
         inputReader.start();
 
         return inputReader;
     }
 
-    /**
-     * DOCUMENT ME!
-     *
-     * @return DOCUMENT ME!
-     */
     @Override
     public String toString() {
-        String fullcmd = "";
+        StringBuffer fullcmd = new StringBuffer();
 
         for (String part : cmd) {
-            fullcmd += (part + " ");
+            fullcmd.append(part + " ");
         }
 
         return "process(dir = '" + directory + "', cmd = '" + fullcmd + "')";