package com.openedit.util;
import java.io.InputStream;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ProcessContainer
{
private static final Log log = LogFactory.getLog(ProcessContainer.class);
protected int fieldReturnCode;
protected Process fieldProcess;
protected Exception fieldException;
protected Thread fieldThread;
protected boolean fieldFinished;
protected String fieldErrors;
protected String fieldStandardOut;
protected List fieldCommands;
public int getReturnCode()
{
return fieldReturnCode;
}
public void setReturnCode( int returnCode )
{
fieldReturnCode = returnCode;
}
public String getErrors()
{
return fieldErrors;
}
public void setErrors( String errors )
{
fieldErrors = errors;
}
public String getStandardOut()
{
return fieldStandardOut;
}
public void setStandardOut( String standardOut )
{
fieldStandardOut = standardOut;
}
public Process getProcess()
{
return fieldProcess;
}
public void setProcess( Process process )
{
fieldProcess = process;
}
public Exception getException()
{
return fieldException;
}
public void setException( Exception exception )
{
fieldException = exception;
}
public Thread getThread()
{
if ( fieldThread == null )
{
fieldThread = createExecThread();
}
return fieldThread;
}
public void terminate()
{
if( !isFinished() )
{
log.debug( "Terminating " + getCommands().get(0) );
getProcess().destroy();
getThread().getState();
setFinished( true );
}
}
public boolean isFinished()
{
return fieldFinished;
}
public void setFinished( boolean finished )
{
fieldFinished = finished;
}
protected Thread createExecThread()
{
Thread execThread = new Thread( new Runnable( ){
public void run()
{
try
{
Process proc = Runtime.getRuntime().exec(commandsAsArray());
setProcess( proc );
InputStreamHandler errors = createStreamHandler( proc.getErrorStream() );
InputStreamHandler standardOut = createStreamHandler( proc.getInputStream() );
errors.start();
standardOut.start();
setReturnCode( proc.waitFor() );
setErrors( errors.getBuffer().toString() );
setStandardOut( standardOut.getBuffer().toString() );
}
catch ( Exception e )
{
log.error( e );
}
finally
{
terminate();
}
}
protected InputStreamHandler createStreamHandler( InputStream inStream )
{
InputStreamHandler errors = new InputStreamHandler();
errors.setStream( inStream );
errors.setCommand( commandsAsArray()[0] );
return errors;
}
});
return execThread;
}
public List getCommands()
{
return fieldCommands;
}
public void setCommands( List commands )
{
fieldCommands = commands;
}
protected String[] commandsAsArray()
{
return (String[]) getCommands().toArray(new String[getCommands().size()]);
}
}