/******************************************************************************
* Copyright (C) 2008 Low Heng Sin *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program 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 this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
*****************************************************************************/
package org.adempiere.webui.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.logging.Level;
import org.compiere.util.CLogger;
/**
* Execute OS Task
*
* @author Low Heng Sin
*/
public class OSTask extends Thread
{
/**
* Create Process with cmd
* @param cmd o/s command
*/
public OSTask (String cmd)
{
m_cmd = cmd;
} // Task
private String m_cmd;
private Process m_child = null;
private StringBuffer m_out = new StringBuffer();
private StringBuffer m_err = new StringBuffer();
/** The Output Stream of process */
private InputStream m_outStream;
/** The Error Output Stream of process */
private InputStream m_errStream;
/** The Input Stream of process */
private OutputStream m_inStream;
/** Logger */
private static CLogger log = CLogger.getCLogger(OSTask.class);
/** Read Out */
private Thread m_outReader = new Thread()
{
public void run()
{
log.fine("outReader");
try
{
int c;
while ((c = m_outStream.read()) != -1 && !isInterrupted())
{
m_out.append((char)c);
}
m_outStream.close();
}
catch (IOException ioe)
{
log.log(Level.SEVERE, "outReader", ioe);
}
log.fine("outReader - done");
} // run
}; // m_outReader
/** Read Out */
private Thread m_errReader = new Thread()
{
public void run()
{
log.fine("errReader");
try
{
int c;
while ((c = m_errStream.read()) != -1 && !isInterrupted())
{
m_err.append((char)c);
}
m_errStream.close();
}
catch (IOException ioe)
{
log.log(Level.SEVERE, "errReader", ioe);
}
log.fine("errReader - done");
} // run
}; // m_errReader
/**
* Execute it
*/
public void run()
{
log.info(m_cmd);
try
{
m_child = Runtime.getRuntime().exec(m_cmd);
//
m_outStream = m_child.getInputStream();
m_errStream = m_child.getErrorStream();
m_inStream = m_child.getOutputStream();
//
if (checkInterrupted())
return;
m_outReader.start();
m_errReader.start();
Integer exitValue = null;
while(exitValue == null)
{
//
try
{
Thread.sleep(500);
if (checkInterrupted())
return;
int i = m_child.exitValue();
exitValue = new Integer(i);
}
catch (Exception ie)
{
log.log(Level.INFO, "(ie) - " + ie);
}
// ExitValue
log.config("done");
}
}
catch (IOException ioe)
{
log.log(Level.SEVERE, "(ioe)", ioe);
m_err.append(ioe.getLocalizedMessage());
}
} // run
/**
* Check if interrupted
* @return true if interrupted
*/
private boolean checkInterrupted()
{
if (isInterrupted())
{
log.config("interrupted");
// interrupt child processes
if (m_child != null)
m_child.destroy();
m_child = null;
if (m_outReader != null && m_outReader.isAlive())
m_outReader.interrupt();
m_outReader = null;
if (m_errReader != null && m_errReader.isAlive())
m_errReader.interrupt();
m_errReader = null;
// close Streams
if (m_inStream != null)
try { m_inStream.close(); } catch (Exception e) {}
m_inStream = null;
if (m_outStream != null)
try { m_outStream.close(); } catch (Exception e) {}
m_outStream = null;
if (m_errStream != null)
try { m_errStream.close(); } catch (Exception e) {}
m_errStream = null;
//
return true;
}
return false;
} // checkInterrupted
/**
* Get Out Info
* @return StringBuffer
*/
public StringBuffer getOut()
{
return m_out;
} // getOut
/**
* Get Err Info
* @return StringBuffer
*/
public StringBuffer getErr()
{
return m_err;
} // getErr
/**
* Get The process input stream - i.e. we output to it
* @return OutputStream
*/
public OutputStream getInStream()
{
return m_inStream;
} // getInStream
} // Task