Package gnu.dtools.ritopt

Source Code of gnu.dtools.ritopt.SimpleProcess

package gnu.dtools.ritopt;

/**
* SimpleProcess.java
*
* Version:
*   $Id: SimpleProcess.java 2275 2007-08-20 22:28:09Z coezbek $
*/

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;

/**
* A SimpleProcess is used to execute a shell process, and redirect an
* input stream to the processes' standard input, as well as redirect
* the processes' standard output/error to an output stream. The processes
* is multithreaded to prevent deadlock.<p>
*
* The example below demonstrates the use of this class.
* <pre>
*  class ExecuteProcess {
*       public static void main( String args[] ) {
*           if ( args.length > 0 ) {
*               String processName = args[ 0 ];
*               try {
*                   SimpleProcess process
*                      = new SimpleProcess( Runtime.getRuntime.exec(
*                                                            processName ) );
*                                          );
*                   int exitStatus = process.waitFor();
*                   System.out.println( "The process ran successfully"
*                                       + " with an exit status of "
*                                       + exitStatus + "." );
*               }
*               catch ( Exception e ) {
*                   System.out.println( "The process was not successful. "
*                                       + " Reason: " + e.getMessage() );
*               }
*           }
*           else {
*               System.err.println( "Please specify a command" );
*           }
*       }
*  }
* </pre>
*
* <hr>
*
* <pre>
* Copyright (C) Damian Ryan Eads, 2001. All Rights Reserved.
*
* ritopt is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.

* ritopt is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ritopt; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
* </pre>
*
* @author Damian Eads
*/

public class SimpleProcess extends Process {

    /**
     * The target process.
     */

    private Process process;

    /**
     * The input stream that the processes' standard input will use.
     */

    private InputStream processInput;

    /**
     * The print stream to redirect to.
     */

    private PrintStream yourOutput;

    /**
     * The print stream to redirect to.
     */

    private PrintStream yourError;

    /**
     * The StreamPrinters.
     */

    private StreamPrinter in, out, error;

    /**
     * Constructs a SimpleProcess, redirecting System.in to the its standard
     * input, System.out to its standard output, and System.err to its standard
     * error.
     */

    public SimpleProcess( Process process ) throws IOException {
  this( process, System.in, System.out, System.err );
    }

    /**
     * Constructs a SimpleProcess, initializing it with the streams passed.
     *
     * @param process       The target process.
     * @param processInput  The stream that is redirected to the
     *                      processes' standard input.
     * @param processOutput The stream to redirect the processes's
     *                      standard output.
     * @param processError  The stream to redirect the processes's
     *                      standard input.
     */

    public SimpleProcess( Process process, InputStream processInput,
        PrintStream yourOutput, PrintStream yourError )
                         throws IOException {
  super();
  this.process = process;
  this.processInput = processInput;
  this.yourOutput = yourOutput;
  this.yourError = yourError;
    }

    /**
     * Returns the standard input of this process.
     *
     * @return The standard input of this process.
     */

    public OutputStream getOutputStream() {
  return process.getOutputStream();
    }

    /**
     * Returns the standard output of this process.
     *
     * @return The standard output of this process.
     */

    public InputStream getInputStream() {
  return process.getInputStream();
    }

    /**
     * Returns the standard error of this process.
     *
     * @return The standard error of this process.
     */

    public InputStream getErrorStream() {
  return process.getErrorStream();
    }

    /**
     * Begin redirecting the streams passed. This method should be invoked
     * immediately after execution of a simple process to prevent thread
     * deadlock.
     *
     * @return The exit status of the target process.
     */

    public int waitFor() throws InterruptedException {
  int retval = waitForImpl();
  if ( in != null ) {
      in.stop();
  }
  return retval;
    }

    /**
     * Contains the implementation of wait for.
     *
     * @return The exit status of the target process.
     */

    private int waitForImpl() throws InterruptedException {
    in = new StreamPrinter( processInput,
          new PrintStream( process.getOutputStream() ) );
    in.setFlush( true );
    out = new StreamPrinter( process.getInputStream(), yourOutput );
    error = new StreamPrinter( process.getErrorStream(), yourError );
    in.start();
    out.start();
    error.start();
    out.join();
    error.join();
    return process.waitFor();
    }

    /**
     * Returns the target processes' exit value.
     *
     * @return This processes' exit value.
     */

    public int exitValue() {
  return process.exitValue();
    }

    /**
     * Destroys the target process.
     */

    public void destroy() throws IllegalThreadStateException {
  process.destroy();
    }
} /** SimpleProcess **/ 
TOP

Related Classes of gnu.dtools.ritopt.SimpleProcess

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.