2012-06-29 08:02:24 -05:00
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*
|
|
|
|
* This file incorporates work covered by the following license notice:
|
|
|
|
*
|
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
|
|
* with this work for additional information regarding copyright
|
|
|
|
* ownership. The ASF licenses this file to you 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 .
|
|
|
|
*/
|
2003-01-27 09:27:53 -06:00
|
|
|
package helper;
|
|
|
|
|
2010-09-13 02:33:05 -05:00
|
|
|
import java.io.BufferedReader;
|
2003-01-27 09:27:53 -06:00
|
|
|
import java.io.InputStream;
|
|
|
|
import java.io.File;
|
|
|
|
import java.io.PrintWriter;
|
|
|
|
import java.io.PrintStream;
|
|
|
|
import java.io.LineNumberReader;
|
|
|
|
import java.io.InputStreamReader;
|
|
|
|
import java.io.OutputStreamWriter;
|
2008-06-13 06:45:59 -05:00
|
|
|
import lib.TestParameters;
|
|
|
|
import util.PropertyName;
|
|
|
|
import util.utils;
|
2003-01-27 09:27:53 -06:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Class collect information from input stream in
|
|
|
|
* background (sparate thread) and outputs it to
|
|
|
|
* some log stream. I helps to avoid buffer overflow
|
|
|
|
* when output stream has small buffer size (e.g.
|
|
|
|
* in case when handling stdout from external
|
|
|
|
* <code>Process</code>)
|
|
|
|
*
|
|
|
|
* This class is currently used by ProcesHandler
|
|
|
|
* internally only.
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
class Pump extends Thread
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
|
2003-01-27 09:27:53 -06:00
|
|
|
private LineNumberReader reader;
|
2008-06-13 06:45:59 -05:00
|
|
|
private String pref;
|
2003-01-27 09:27:53 -06:00
|
|
|
private StringBuffer buf = new StringBuffer(256);
|
2008-06-13 06:45:59 -05:00
|
|
|
private PrintWriter log;
|
2010-09-13 02:33:05 -05:00
|
|
|
private boolean bOutput;
|
2003-01-27 09:27:53 -06:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates Pump for specified <code>InputStream</code>.
|
|
|
|
* This Pump also synchronously output text read to
|
|
|
|
* log by prefixed lines. Constructor immediately
|
|
|
|
* starts reading in a separate thread.
|
|
|
|
*
|
|
|
|
* @param is Stream which requires permanent reading.
|
|
|
|
* @param log Writer where prefixed text lines to be output
|
|
|
|
* @param outPrefix A prefix which is printed at the
|
|
|
|
* beginning of each output line.
|
|
|
|
*/
|
2010-09-13 02:33:05 -05:00
|
|
|
public Pump(InputStream is, PrintWriter log, String outPrefix, boolean _bOutput)
|
2009-07-03 05:14:57 -05:00
|
|
|
{
|
|
|
|
this.pref = (outPrefix == null) ? "" : outPrefix;
|
2003-01-27 09:27:53 -06:00
|
|
|
reader = new LineNumberReader(new InputStreamReader(is));
|
2008-06-13 06:45:59 -05:00
|
|
|
this.log = log;
|
2010-09-13 02:33:05 -05:00
|
|
|
this.bOutput = _bOutput;
|
2008-06-13 06:45:59 -05:00
|
|
|
start();
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
|
2009-07-03 05:14:57 -05:00
|
|
|
public void run()
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
String line = reader.readLine();
|
2009-07-03 05:14:57 -05:00
|
|
|
while (line != null)
|
|
|
|
{
|
2010-09-13 02:33:05 -05:00
|
|
|
if (bOutput)
|
|
|
|
{
|
|
|
|
log.println(pref + line);
|
|
|
|
log.flush();
|
|
|
|
}
|
2003-01-27 09:27:53 -06:00
|
|
|
buf.append(line).append('\n');
|
2008-06-13 06:45:59 -05:00
|
|
|
line = reader.readLine();
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
2009-07-03 05:14:57 -05:00
|
|
|
}
|
|
|
|
catch (java.io.IOException e)
|
|
|
|
{
|
2010-12-03 22:28:03 -06:00
|
|
|
log.println(pref + "Exception occurred: " + e);
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the text collected from input stream.
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public String getStringBuffer()
|
|
|
|
{
|
2003-01-27 09:27:53 -06:00
|
|
|
return buf.toString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Class provides convenient way for running external program
|
|
|
|
* handle its standard streams, control execution and check results.
|
|
|
|
* Instance of this class must be created only for a single
|
|
|
|
* execution. If you need to execute the same command again you
|
|
|
|
* should create a new instance for this.
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public class ProcessHandler
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
|
2003-01-27 09:27:53 -06:00
|
|
|
private String cmdLine;
|
2004-12-10 10:00:25 -06:00
|
|
|
private String[] cmdLineArray;
|
2003-01-27 09:27:53 -06:00
|
|
|
private String[] envVars = null;
|
|
|
|
private File workDir = null;
|
|
|
|
private PrintWriter log;
|
|
|
|
private int exitValue = -1;
|
|
|
|
private boolean isFinished = false;
|
|
|
|
private boolean isStarted = false;
|
2003-11-18 09:14:43 -06:00
|
|
|
private boolean mbTimedOut = false;
|
|
|
|
private long mTimeOut = 0;
|
2003-01-27 09:27:53 -06:00
|
|
|
private String stdInBuff = "";
|
2008-06-13 06:45:59 -05:00
|
|
|
private Pump stdout = null;
|
|
|
|
private Pump stderr = null;
|
|
|
|
private PrintStream stdIn = null;
|
2009-07-03 05:14:57 -05:00
|
|
|
private Process m_aProcess = null;
|
2008-06-13 06:45:59 -05:00
|
|
|
private TestParameters param = null;
|
|
|
|
private boolean debug = false;
|
2010-09-13 02:33:05 -05:00
|
|
|
private boolean bUseOutput = true;
|
|
|
|
|
|
|
|
private int m_nProcessTimeout = 0;
|
|
|
|
private String m_sProcessKiller;
|
|
|
|
private ProcessWatcher m_aWatcher;
|
2003-01-27 09:27:53 -06:00
|
|
|
|
2003-11-18 09:14:43 -06:00
|
|
|
/**
|
|
|
|
* Creates instance with specified external command.
|
|
|
|
* Debug info and output
|
|
|
|
* of external command is printed to stdout.
|
2008-06-13 06:45:59 -05:00
|
|
|
* @param cmdLine
|
2003-11-18 09:14:43 -06:00
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public ProcessHandler(String cmdLine)
|
|
|
|
{
|
2003-11-18 09:14:43 -06:00
|
|
|
this(cmdLine, null, null, null, 0);
|
|
|
|
}
|
|
|
|
|
2005-11-02 10:43:42 -06:00
|
|
|
/**
|
|
|
|
* Creates instance with specified external command
|
|
|
|
* including parameters as an array.
|
|
|
|
* Debug info and output
|
|
|
|
* of external command is printed to stdout.
|
2008-01-14 06:21:18 -06:00
|
|
|
* @param cmdLines
|
2005-11-02 10:43:42 -06:00
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public ProcessHandler(String[] cmdLines)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
this(null, null, null, null, 0);
|
|
|
|
cmdLineArray = cmdLines;
|
|
|
|
}
|
2004-12-10 10:00:25 -06:00
|
|
|
|
2005-11-02 10:43:42 -06:00
|
|
|
/**
|
|
|
|
* Creates instance with specified external command
|
|
|
|
* including parameters as an array, with environment
|
|
|
|
* variables.
|
|
|
|
* Debug info and output
|
|
|
|
* of external command is printed to stdout.
|
2008-01-14 06:21:18 -06:00
|
|
|
* @param cmdLines
|
|
|
|
* @param envVars
|
2005-11-02 10:43:42 -06:00
|
|
|
* @see java.lang.Runtime exec(String[], String[])
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public ProcessHandler(String[] cmdLines, String[] envVars)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
this(null, null, null, envVars, 0);
|
|
|
|
cmdLineArray = cmdLines;
|
|
|
|
}
|
2005-11-02 10:43:42 -06:00
|
|
|
|
2008-01-14 06:21:18 -06:00
|
|
|
/**
|
|
|
|
* Creates instance with specified external command
|
|
|
|
* including parameters as an array, with environment
|
|
|
|
* variables. The command will be started in workDir.
|
|
|
|
* Debug info and output
|
|
|
|
* of external command is printed to stdout.
|
|
|
|
* @param cmdLines
|
|
|
|
* @param workDir
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public ProcessHandler(String[] cmdLines, File workDir)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
this(null, null, workDir, null, 0);
|
|
|
|
cmdLineArray = cmdLines;
|
2008-01-14 06:21:18 -06:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2003-01-27 09:27:53 -06:00
|
|
|
/**
|
|
|
|
* Creates instance with specified external command and
|
2008-01-14 06:21:18 -06:00
|
|
|
* log stream where debug info and output
|
|
|
|
* of external command is printed out. The command will be started in workDir.
|
|
|
|
* @param cmdLines
|
|
|
|
* @param log
|
|
|
|
* @param workDir
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public ProcessHandler(String[] cmdLines, PrintWriter log, File workDir)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
this(null, log, workDir, null, 0);
|
|
|
|
cmdLineArray = cmdLines;
|
2008-01-14 06:21:18 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates instance with specified external command and
|
|
|
|
* log stream where debug info and output
|
|
|
|
* of external command is printed out.
|
2008-06-13 06:45:59 -05:00
|
|
|
* @param cmdLine
|
|
|
|
* @param log
|
2003-01-27 09:27:53 -06:00
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public ProcessHandler(String cmdLine, PrintWriter log)
|
|
|
|
{
|
2003-11-18 09:14:43 -06:00
|
|
|
this(cmdLine, log, null, null, 0);
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
2003-11-18 09:14:43 -06:00
|
|
|
|
2008-06-13 06:45:59 -05:00
|
|
|
/**
|
|
|
|
* Creates instance with specified external command and set the time out for the command.
|
|
|
|
* @param cmdLine
|
|
|
|
* @param timeOut
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public ProcessHandler(String cmdLine, int timeOut)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
this(cmdLine, null, null, null, timeOut);
|
|
|
|
}
|
|
|
|
|
2003-01-27 09:27:53 -06:00
|
|
|
/**
|
2003-11-18 09:14:43 -06:00
|
|
|
* Creates instance with specified external command which
|
|
|
|
* will be executed in the some work directory.
|
2003-01-27 09:27:53 -06:00
|
|
|
* Debug info and output
|
2003-11-18 09:14:43 -06:00
|
|
|
* of external commandis printed to stdout.
|
2008-06-13 06:45:59 -05:00
|
|
|
* @param cmdLine
|
|
|
|
* @param workDir
|
2003-01-27 09:27:53 -06:00
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public ProcessHandler(String cmdLine, File workDir)
|
|
|
|
{
|
2003-11-18 09:14:43 -06:00
|
|
|
this(cmdLine, null, workDir, null, 0);
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
2003-11-18 09:14:43 -06:00
|
|
|
|
2008-01-14 06:21:18 -06:00
|
|
|
/**
|
|
|
|
* Creates instance with specified external command which
|
|
|
|
* will be executed in the some work directory.
|
|
|
|
* Debug info and output printed in log stream.
|
2008-06-13 06:45:59 -05:00
|
|
|
* @param cmdLine
|
|
|
|
* @param log
|
|
|
|
* @param workDir
|
2008-01-14 06:21:18 -06:00
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public ProcessHandler(String cmdLine, PrintWriter log, File workDir)
|
|
|
|
{
|
2008-01-14 06:21:18 -06:00
|
|
|
this(cmdLine, log, workDir, null, 0);
|
|
|
|
}
|
|
|
|
|
2003-01-27 09:27:53 -06:00
|
|
|
/**
|
|
|
|
* Creates instance with specified external command which
|
|
|
|
* will be executed in the some work directory and
|
|
|
|
* log stream where debug info and output
|
|
|
|
* of external command is printed .
|
|
|
|
* The specified environment variables are set for the new process.
|
|
|
|
* If log stream is null, logging is printed to stdout.
|
2008-01-14 06:21:18 -06:00
|
|
|
* @param cmdLine
|
|
|
|
* @param log
|
|
|
|
* @param workDir
|
|
|
|
* @param envVars
|
2003-01-27 09:27:53 -06:00
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public ProcessHandler(String cmdLine, PrintWriter log, File workDir, String[] envVars)
|
|
|
|
{
|
2003-11-18 09:14:43 -06:00
|
|
|
this(cmdLine, log, workDir, envVars, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates instance with specified external command which
|
|
|
|
* will be executed in the some work directory and
|
|
|
|
*
|
2008-01-14 06:21:18 -06:00
|
|
|
* @param cmdLine the command to be executed
|
2003-11-18 09:14:43 -06:00
|
|
|
* @param log log stream where debug info and output
|
|
|
|
* of external command is printed .
|
|
|
|
* @param workDir The working directory of the new process
|
|
|
|
* @param envVars The specified environment variables are
|
|
|
|
* set for the new process.
|
|
|
|
* If log stream is null, logging is printed to stdout.
|
|
|
|
* @param timeOut When started sychronisly, the maximum time the
|
|
|
|
* process will live. When the process being destroyed
|
|
|
|
* a log will be written out. It can be asked on
|
|
|
|
* <code>isTimedOut()</code> if it has been terminated.
|
|
|
|
*
|
|
|
|
* timeOut > 0
|
|
|
|
* Waits specified time in miliSeconds for
|
|
|
|
* process to exit and return its status.
|
|
|
|
*
|
|
|
|
* timeOut = 0
|
|
|
|
* Waits for the process to end regulary
|
|
|
|
*
|
|
|
|
* timeOut < 0
|
|
|
|
* Kills the process immediately
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public ProcessHandler(String cmdLine, PrintWriter log, File workDir, String[] envVars, long timeOut)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
this.cmdLine = cmdLine;
|
2003-01-27 09:27:53 -06:00
|
|
|
this.workDir = workDir;
|
|
|
|
this.log = log;
|
2008-06-13 06:45:59 -05:00
|
|
|
this.cmdLine = cmdLine;
|
2003-01-27 09:27:53 -06:00
|
|
|
this.envVars = envVars;
|
2009-07-03 05:14:57 -05:00
|
|
|
if (log == null)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
this.log = new PrintWriter(new OutputStreamWriter(System.out));
|
2009-07-03 05:14:57 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2003-01-27 09:27:53 -06:00
|
|
|
this.log = log;
|
2008-06-13 06:45:59 -05:00
|
|
|
}
|
2003-11-18 09:14:43 -06:00
|
|
|
this.mTimeOut = timeOut;
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
2003-11-18 09:14:43 -06:00
|
|
|
|
2008-06-13 06:45:59 -05:00
|
|
|
/**
|
|
|
|
* Creates instance with specified external command which
|
|
|
|
* will be executed in the some work directory and
|
|
|
|
* log stream where debug info and output of external command is printed.
|
|
|
|
* If log stream is null, logging is printed to stdout.
|
|
|
|
* From the <CODE>TestParameters</CODE> the <CODE>OfficeWachter</CODE> get a ping.
|
|
|
|
* @param commands
|
|
|
|
* @param log
|
|
|
|
* @param workDir
|
2008-11-26 06:04:07 -06:00
|
|
|
* @param shortWait If this parameter is ture the <CODE>mTimeOut</CODE> is set to 5000 ms, else it is set to
|
2008-06-13 06:45:59 -05:00
|
|
|
* half of time out from parameter timeout.
|
|
|
|
* @param param the TestParameters
|
|
|
|
* @see lib.TestParameters
|
|
|
|
* @see helper.OfficeWatcher
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public ProcessHandler(String[] commands, PrintWriter log, File workDir, int shortWait, TestParameters param)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
this(null, log, workDir, null, 0);
|
|
|
|
this.cmdLineArray = commands;
|
|
|
|
this.param = param;
|
2009-07-03 05:14:57 -05:00
|
|
|
if (shortWait != 0)
|
|
|
|
{
|
2008-11-26 06:04:07 -06:00
|
|
|
this.mTimeOut = shortWait;
|
2009-07-03 05:14:57 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
this.mTimeOut = (long) (param.getInt(PropertyName.TIME_OUT) / 1.3);
|
|
|
|
}
|
|
|
|
debug = param.getBool(PropertyName.DEBUG_IS_ACTIVE);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2010-09-13 02:33:05 -05:00
|
|
|
/**
|
|
|
|
* If not equal 0, the time to maximal wait.
|
|
|
|
* @param _n
|
|
|
|
*/
|
|
|
|
public void setProcessTimeout(int _n)
|
|
|
|
{
|
|
|
|
m_nProcessTimeout = _n;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This command will call after ProcessTimeout is arrived.
|
|
|
|
* @param _s
|
|
|
|
*/
|
|
|
|
public void setProcessKiller(String _s)
|
|
|
|
{
|
|
|
|
m_sProcessKiller = _s;
|
|
|
|
}
|
|
|
|
|
2008-06-13 06:45:59 -05:00
|
|
|
/**
|
|
|
|
* This method do an asynchronous execution of the commands. To avoid a interruption on long running processes
|
|
|
|
* caused by <CODE>OfficeWatcher</CODE>, the OfficeWatcher get frequently a ping.
|
|
|
|
* @see helper.OfficeWatcher
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public void runCommand()
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
|
|
|
|
boolean changedText = true;
|
|
|
|
String memText = "";
|
|
|
|
|
|
|
|
this.executeAsynchronously();
|
|
|
|
|
|
|
|
OfficeWatcher ow = null;
|
2009-07-03 05:14:57 -05:00
|
|
|
if (param != null)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
ow = (OfficeWatcher) param.get(PropertyName.OFFICE_WATCHER);
|
|
|
|
}
|
2009-07-06 05:30:52 -05:00
|
|
|
if (ow != null)
|
|
|
|
{
|
|
|
|
ow.ping();
|
|
|
|
}
|
2008-06-13 06:45:59 -05:00
|
|
|
|
2009-07-06 05:30:52 -05:00
|
|
|
int hangcheck = 10;
|
2009-07-03 05:14:57 -05:00
|
|
|
while (!this.isFinished() && changedText)
|
|
|
|
{
|
2009-07-06 05:30:52 -05:00
|
|
|
// dbg("runCommand: waiting " + mTimeOut / 1000 + " seconds while command execution is ongoing... " + count);
|
|
|
|
// shortWait(mTimeOut);
|
|
|
|
// shortWait(2000); // wait 2 seconds.
|
2009-01-06 09:13:58 -06:00
|
|
|
//waitFor(mTimeOut);
|
2009-07-06 05:30:52 -05:00
|
|
|
waitFor(2000, false); // wait but don't kill
|
2008-06-13 06:45:59 -05:00
|
|
|
|
2009-07-03 05:14:57 -05:00
|
|
|
if (ow != null)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
ow.ping();
|
|
|
|
}
|
|
|
|
// check for changes in the output stream. If there are no changes, the process maybe hangs
|
2009-07-03 05:14:57 -05:00
|
|
|
if (!this.isFinished())
|
|
|
|
{
|
2009-07-06 05:30:52 -05:00
|
|
|
hangcheck--;
|
|
|
|
if (hangcheck < 0)
|
2009-07-03 05:14:57 -05:00
|
|
|
{
|
2009-07-06 05:30:52 -05:00
|
|
|
String sOutputText = getOutputText();
|
|
|
|
if (sOutputText.length() == memText.length())
|
|
|
|
{
|
|
|
|
changedText = false;
|
2010-09-13 02:33:05 -05:00
|
|
|
// dbg("runCommand Could not detect changes in output stream!!!");
|
2009-07-06 05:30:52 -05:00
|
|
|
}
|
|
|
|
hangcheck = 10;
|
|
|
|
memText = this.getOutputText();
|
2008-06-13 06:45:59 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-07-03 05:14:57 -05:00
|
|
|
if (!this.isFinished())
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
dbg("runCommand Process ist not finished but there are no changes in output stream.");
|
|
|
|
this.kill();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-07-03 05:14:57 -05:00
|
|
|
public boolean isTimedOut()
|
|
|
|
{
|
2003-11-18 09:14:43 -06:00
|
|
|
return mbTimedOut;
|
|
|
|
}
|
|
|
|
|
2009-07-03 05:14:57 -05:00
|
|
|
private void setTimedOut(boolean bTimedOut)
|
|
|
|
{
|
2003-11-18 09:14:43 -06:00
|
|
|
mbTimedOut = bTimedOut;
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Executes the command and returns only when the process
|
|
|
|
* exits.
|
|
|
|
*
|
|
|
|
* @return <code>true</code> if process was successfully
|
|
|
|
* started and correcly exits (exit code doesn't affect
|
|
|
|
* to this result).
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public boolean executeSynchronously()
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
execute();
|
|
|
|
return waitFor(mTimeOut);
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Executes the command immediately returns. The process
|
|
|
|
* remains in running state. Control of its state should
|
|
|
|
* be made by <code>waitFor</code> methods.
|
|
|
|
*
|
|
|
|
* @return <code>true</code> if process was successfully
|
|
|
|
* started.
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public boolean executeAsynchronously()
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
execute();
|
|
|
|
return isStarted();
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
|
2009-07-03 05:14:57 -05:00
|
|
|
public synchronized void kill()
|
|
|
|
{
|
|
|
|
if (!isStarted())
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
return;
|
|
|
|
}
|
2004-03-19 07:29:29 -06:00
|
|
|
boolean exit = false;
|
2008-06-13 06:45:59 -05:00
|
|
|
int counter = 1;
|
2009-07-03 05:14:57 -05:00
|
|
|
while (counter < 3 && !exit)
|
|
|
|
{
|
|
|
|
m_aProcess.destroy();
|
2004-03-19 07:29:29 -06:00
|
|
|
|
2009-07-03 05:14:57 -05:00
|
|
|
try
|
|
|
|
{
|
2008-09-30 02:44:27 -05:00
|
|
|
Thread.sleep(1000 * counter); // 5000
|
2004-03-19 07:29:29 -06:00
|
|
|
}
|
2009-07-03 05:14:57 -05:00
|
|
|
catch (java.lang.InterruptedException e)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
try
|
|
|
|
{
|
|
|
|
final int exit_Value = m_aProcess.exitValue();
|
|
|
|
if (exit_Value < 1)
|
|
|
|
{
|
2005-06-14 09:42:28 -05:00
|
|
|
exit = true;
|
2009-07-03 05:14:57 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-06-14 09:42:28 -05:00
|
|
|
counter++;
|
2008-06-13 06:45:59 -05:00
|
|
|
}
|
|
|
|
dbg("kill: process closed with exit code " + exit_Value);
|
2009-07-03 05:14:57 -05:00
|
|
|
}
|
|
|
|
catch (java.lang.IllegalThreadStateException e)
|
|
|
|
{
|
|
|
|
if (counter < 3)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
dbg("kill: Couldn't close process after " + counter + " attempts, trying again");
|
2004-03-19 07:29:29 -06:00
|
|
|
}
|
|
|
|
counter++;
|
|
|
|
}
|
|
|
|
}
|
2003-01-27 09:27:53 -06:00
|
|
|
isStarted = false;
|
|
|
|
}
|
|
|
|
|
2009-07-29 08:59:06 -05:00
|
|
|
/**
|
|
|
|
* Returns the time in seconds since 1st January 1970
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
public static long getSystemTime()
|
|
|
|
{
|
|
|
|
// Calendar cal = new GregorianCalendar();
|
|
|
|
// final long nTime = cal.getTimeInMillis();
|
|
|
|
final long nTime = System.currentTimeMillis();
|
|
|
|
return nTime;
|
|
|
|
}
|
|
|
|
private long m_nExactStartTimeInMillisec;
|
|
|
|
|
|
|
|
private void initialExactStartTime()
|
|
|
|
{
|
|
|
|
m_nExactStartTimeInMillisec = getSystemTime();
|
|
|
|
}
|
|
|
|
|
|
|
|
public long getProcessStartTime()
|
|
|
|
{
|
|
|
|
return m_nExactStartTimeInMillisec;
|
|
|
|
}
|
|
|
|
|
2010-09-13 02:33:05 -05:00
|
|
|
private void showEnvVars()
|
|
|
|
{
|
|
|
|
if (envVars != null)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < envVars.length; i++)
|
|
|
|
{
|
|
|
|
log.println("env: " + envVars[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
log.println("env: null");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-07-03 05:14:57 -05:00
|
|
|
protected void execute()
|
|
|
|
{
|
|
|
|
if (isStarted())
|
|
|
|
{
|
2003-01-27 09:27:53 -06:00
|
|
|
throw new RuntimeException(
|
2009-07-03 05:14:57 -05:00
|
|
|
"The process handler has already been executed.");
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
2008-06-13 06:45:59 -05:00
|
|
|
final Runtime runtime = Runtime.getRuntime();
|
2009-07-03 05:14:57 -05:00
|
|
|
try
|
|
|
|
{
|
|
|
|
if (cmdLine == null)
|
|
|
|
{
|
2010-09-13 02:33:05 -05:00
|
|
|
log.println(utils.getDateTime() + "execute: Starting command from array: ");
|
2009-07-03 05:14:57 -05:00
|
|
|
for (int i = 0; i < cmdLineArray.length; i++)
|
|
|
|
{
|
2010-09-13 02:33:05 -05:00
|
|
|
log.println(cmdLineArray[i]);
|
|
|
|
// log.print(" ");
|
2004-12-10 10:00:25 -06:00
|
|
|
}
|
2010-09-13 02:33:05 -05:00
|
|
|
showEnvVars();
|
2008-09-30 02:44:27 -05:00
|
|
|
log.println("");
|
2009-07-29 08:59:06 -05:00
|
|
|
initialExactStartTime();
|
2010-09-13 02:33:05 -05:00
|
|
|
initializeProcessKiller();
|
2009-07-03 05:14:57 -05:00
|
|
|
m_aProcess = runtime.exec(cmdLineArray, envVars);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (workDir != null)
|
|
|
|
{
|
2010-09-13 02:33:05 -05:00
|
|
|
log.println(utils.getDateTime() + "execute: Starting command: ");
|
|
|
|
log.println(cmdLine + " path=" + workDir.getAbsolutePath());
|
|
|
|
showEnvVars();
|
2009-07-03 05:14:57 -05:00
|
|
|
m_aProcess = runtime.exec(cmdLine, envVars, workDir);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-09-13 02:33:05 -05:00
|
|
|
log.println(utils.getDateTime() + "execute: Starting command: ");
|
|
|
|
log.println(cmdLine);
|
|
|
|
showEnvVars();
|
2009-07-03 05:14:57 -05:00
|
|
|
m_aProcess = runtime.exec(cmdLine, envVars);
|
2004-12-10 10:00:25 -06:00
|
|
|
}
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
2008-06-13 06:45:59 -05:00
|
|
|
isStarted = true;
|
2009-07-03 05:14:57 -05:00
|
|
|
}
|
|
|
|
catch (java.io.IOException e)
|
|
|
|
{
|
|
|
|
if (cmdLine == null)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
log.println(utils.getDateTime() + "execute: The command array can't be started: " + e);
|
2009-07-03 05:14:57 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
log.println(utils.getDateTime() + "execute: The command " + cmdLine + " can't be started: " + e);
|
2004-12-10 10:00:25 -06:00
|
|
|
}
|
2003-01-27 09:27:53 -06:00
|
|
|
return;
|
|
|
|
}
|
2008-06-13 06:45:59 -05:00
|
|
|
dbg("execute: pump io-streams");
|
2010-09-13 02:33:05 -05:00
|
|
|
stdout = new Pump(m_aProcess.getInputStream(), log, "out > ", bUseOutput);
|
|
|
|
stderr = new Pump(m_aProcess.getErrorStream(), log, "err > ", bUseOutput);
|
2009-07-03 05:14:57 -05:00
|
|
|
stdIn = new PrintStream(m_aProcess.getOutputStream());
|
|
|
|
|
2009-07-29 08:59:06 -05:00
|
|
|
// int nExitValue = m_aProcess.exitValue();
|
|
|
|
// int dummy = 0;
|
|
|
|
|
2008-06-13 06:45:59 -05:00
|
|
|
dbg("execute: flush io-streams");
|
2003-01-27 09:27:53 -06:00
|
|
|
|
2008-06-13 06:45:59 -05:00
|
|
|
flushInput();
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This method is useful when the process was executed
|
|
|
|
* asynchronously. Waits for process to exit and return
|
|
|
|
* its result.
|
|
|
|
*
|
|
|
|
* @return <code>true</code> if process correctly exited
|
|
|
|
* (exit code doesn't affect to this result).
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public boolean waitFor()
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
return waitFor(0);
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This method is useful when the process was executed
|
|
|
|
* asynchronously. Waits during specified time for process
|
|
|
|
* to exit and return its status.
|
|
|
|
*
|
2008-06-13 06:45:59 -05:00
|
|
|
* @param timeout > 0
|
2003-11-18 09:14:43 -06:00
|
|
|
* Waits specified time in miliSeconds for
|
|
|
|
* process to exit and return its status.
|
|
|
|
*
|
|
|
|
* = 0
|
|
|
|
* Waits for the process to end regulary
|
|
|
|
*
|
|
|
|
* < 0
|
|
|
|
* Kills the process immediately
|
|
|
|
*
|
2003-01-27 09:27:53 -06:00
|
|
|
* @return <code>true</code> if process correctly exited
|
|
|
|
* (exit code doesn't affect to this result).
|
|
|
|
*/
|
2009-07-29 08:59:06 -05:00
|
|
|
public boolean waitFor(long timeout)
|
|
|
|
{
|
|
|
|
return waitFor(timeout, true);
|
|
|
|
}
|
2009-07-06 05:30:52 -05:00
|
|
|
|
|
|
|
private boolean waitFor(long timeout, boolean bKillProcessAfterTimeout)
|
2009-07-03 05:14:57 -05:00
|
|
|
{
|
|
|
|
if (isFinished())
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
return true;
|
|
|
|
}
|
2009-07-03 05:14:57 -05:00
|
|
|
if (!isStarted())
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
return false;
|
|
|
|
}
|
2003-01-27 09:27:53 -06:00
|
|
|
|
2009-07-03 05:14:57 -05:00
|
|
|
if (timeout == 0)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
m_aProcess.waitFor();
|
|
|
|
}
|
|
|
|
catch (InterruptedException e)
|
|
|
|
{
|
2003-01-27 09:27:53 -06:00
|
|
|
log.println("The process was interrupted: " + e);
|
|
|
|
}
|
2008-06-13 06:45:59 -05:00
|
|
|
isFinished = true;
|
2009-07-03 05:14:57 -05:00
|
|
|
try
|
|
|
|
{
|
|
|
|
exitValue = m_aProcess.exitValue();
|
|
|
|
}
|
|
|
|
catch (IllegalThreadStateException e)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
}
|
2009-07-03 05:14:57 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
while (!isFinished && timeout > 0)
|
|
|
|
{
|
2003-11-18 09:14:43 -06:00
|
|
|
isFinished = true;
|
2003-01-27 09:27:53 -06:00
|
|
|
Thread.sleep(1000);
|
2008-06-13 06:45:59 -05:00
|
|
|
timeout -= 1000;
|
2009-07-03 05:14:57 -05:00
|
|
|
try
|
|
|
|
{
|
|
|
|
exitValue = m_aProcess.exitValue(); // throws exception if not finished
|
|
|
|
}
|
|
|
|
catch (IllegalThreadStateException e)
|
|
|
|
{
|
2003-11-18 09:14:43 -06:00
|
|
|
isFinished = false;
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
}
|
2009-07-03 05:14:57 -05:00
|
|
|
if (timeout < 0)
|
|
|
|
{
|
2003-11-18 09:14:43 -06:00
|
|
|
setTimedOut(true);
|
|
|
|
log.println("The process has timed out!");
|
|
|
|
}
|
2009-07-03 05:14:57 -05:00
|
|
|
}
|
|
|
|
catch (InterruptedException ex)
|
|
|
|
{
|
2003-01-27 09:27:53 -06:00
|
|
|
log.println("The process was interrupted: " + ex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-07-06 05:30:52 -05:00
|
|
|
if (bKillProcessAfterTimeout == true)
|
2009-07-03 05:14:57 -05:00
|
|
|
{
|
2009-07-06 05:30:52 -05:00
|
|
|
if (!isFinished)
|
|
|
|
{
|
|
|
|
log.println("Going to destroy the process!!");
|
|
|
|
m_aProcess.destroy();
|
|
|
|
log.println("Process has been destroyed!");
|
|
|
|
}
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
2005-02-24 10:22:10 -06:00
|
|
|
// Removed as hung up in SDK test 'PathSettings'
|
|
|
|
// try {
|
|
|
|
// stdout.join();
|
|
|
|
// stderr.join();
|
|
|
|
// } catch (InterruptedException e) {}
|
2003-01-27 09:27:53 -06:00
|
|
|
|
2008-06-13 06:45:59 -05:00
|
|
|
return isFinished();
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
|
2009-07-03 05:14:57 -05:00
|
|
|
protected void flushInput()
|
|
|
|
{
|
|
|
|
if (stdIn == null)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
return;
|
|
|
|
}
|
2003-01-27 09:27:53 -06:00
|
|
|
|
2009-07-03 05:14:57 -05:00
|
|
|
synchronized(stdInBuff)
|
|
|
|
{
|
2003-01-27 09:27:53 -06:00
|
|
|
stdIn.print(stdInBuff);
|
|
|
|
stdIn.flush();
|
2008-06-13 06:45:59 -05:00
|
|
|
stdInBuff = "";
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the text output by external command to stdout.
|
2008-06-13 06:45:59 -05:00
|
|
|
* @return the text output by external command to stdout
|
2003-01-27 09:27:53 -06:00
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public String getOutputText()
|
|
|
|
{
|
|
|
|
if (stdout == null)
|
|
|
|
{
|
2003-05-15 12:04:04 -05:00
|
|
|
return "";
|
2009-07-03 05:14:57 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2003-05-15 12:04:04 -05:00
|
|
|
return stdout.getStringBuffer();
|
2008-06-13 06:45:59 -05:00
|
|
|
}
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
2008-06-13 06:45:59 -05:00
|
|
|
|
2003-01-27 09:27:53 -06:00
|
|
|
/**
|
|
|
|
* Returns the text output by external command to stderr.
|
2008-06-13 06:45:59 -05:00
|
|
|
* @return the text output by external command to stderr
|
2003-01-27 09:27:53 -06:00
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public String getErrorText()
|
|
|
|
{
|
|
|
|
if (stderr == null)
|
|
|
|
{
|
2003-05-15 12:04:04 -05:00
|
|
|
return "";
|
2009-07-03 05:14:57 -05:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2003-05-15 12:04:04 -05:00
|
|
|
return stderr.getStringBuffer();
|
2008-06-13 06:45:59 -05:00
|
|
|
}
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Prints the string specified to sdtin of external
|
|
|
|
* command. '\n' is not added so if you need you
|
|
|
|
* should terminate the string with '\n'. <p>
|
|
|
|
*
|
|
|
|
* The method can also be called before the command
|
|
|
|
* starts its execution. Then the text is buffered
|
|
|
|
* and transfered to command when it will be started.
|
2008-06-13 06:45:59 -05:00
|
|
|
* @param str
|
2003-01-27 09:27:53 -06:00
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public void printInputText(String str)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
stdInBuff += str;
|
2003-01-27 09:27:53 -06:00
|
|
|
flushInput();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns information about was the command started or
|
|
|
|
* not.
|
|
|
|
*
|
|
|
|
* @return <code>true</code> if the external command was
|
|
|
|
* found and successfully started.
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public boolean isStarted()
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
return isStarted;
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the information about the final state of command
|
|
|
|
* execution.
|
|
|
|
*
|
|
|
|
* @return <code>true</code> if the command correctly starts,
|
|
|
|
* exits and was not interrupted due to timeout.
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public boolean isFinished()
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
return isFinished;
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns exit code of the external command.
|
|
|
|
*
|
|
|
|
* @return exit code of command if it was finished,
|
|
|
|
* -1 if not.
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public int getExitCode()
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
exitValue = m_aProcess.exitValue();
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
//System.out.println("No ExitValue available");
|
2008-06-13 06:45:59 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
return exitValue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Causes the thread to sleep some time.
|
|
|
|
* @param milliseconds
|
|
|
|
*/
|
2009-07-03 05:14:57 -05:00
|
|
|
public static void shortWait(long milliseconds)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
Thread.sleep(milliseconds);
|
2009-07-03 05:14:57 -05:00
|
|
|
}
|
|
|
|
catch (InterruptedException e)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
System.out.println("While waiting :" + e);
|
2005-02-02 06:56:23 -06:00
|
|
|
}
|
2008-06-13 06:45:59 -05:00
|
|
|
}
|
2005-02-02 06:56:23 -06:00
|
|
|
|
2009-07-03 05:14:57 -05:00
|
|
|
private void dbg(String message)
|
|
|
|
{
|
|
|
|
if (debug)
|
|
|
|
{
|
2008-06-13 06:45:59 -05:00
|
|
|
log.println(utils.getDateTime() + "PH." + message);
|
|
|
|
}
|
2003-01-27 09:27:53 -06:00
|
|
|
}
|
2010-09-13 02:33:05 -05:00
|
|
|
|
|
|
|
public void noOutput()
|
|
|
|
{
|
|
|
|
bUseOutput = false;
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
class ProcessWatcher extends Thread
|
|
|
|
{
|
|
|
|
|
|
|
|
private int m_nTimeoutInSec;
|
|
|
|
private String m_sProcessToStart;
|
|
|
|
private boolean m_bInterrupt;
|
|
|
|
|
|
|
|
public ProcessWatcher(int _nTimeOut, String _sProcess)
|
|
|
|
{
|
|
|
|
m_nTimeoutInSec = _nTimeOut;
|
|
|
|
m_sProcessToStart = _sProcess;
|
|
|
|
m_bInterrupt = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* returns true, if the thread should hold on
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
public synchronized boolean isInHoldOn()
|
|
|
|
{
|
|
|
|
return m_bInterrupt;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Marks the thread to hold on, next time
|
|
|
|
* STUPID: The thread must poll this flag itself.
|
|
|
|
*
|
|
|
|
* Reason: interrupt() seems not to work as expected.
|
|
|
|
*/
|
|
|
|
public synchronized void holdOn()
|
|
|
|
{
|
|
|
|
m_bInterrupt = true;
|
|
|
|
interrupt();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void run()
|
|
|
|
{
|
|
|
|
while (m_nTimeoutInSec > 0)
|
|
|
|
{
|
|
|
|
m_nTimeoutInSec--;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
sleep(1000);
|
|
|
|
}
|
|
|
|
catch(java.lang.InterruptedException e)
|
|
|
|
{
|
|
|
|
// interrupt flag is set back to 'not interrupted' :-(
|
|
|
|
}
|
|
|
|
if (isInHoldOn())
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (m_nTimeoutInSec <= 0 && !isInHoldOn()) // not zero, so we are interrupted.
|
|
|
|
{
|
|
|
|
system(m_sProcessToStart);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Start an external Process
|
|
|
|
* @param _sProcess
|
|
|
|
*/
|
|
|
|
private void system(String _sProcess)
|
|
|
|
{
|
|
|
|
if (_sProcess == null)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
|
|
|
|
// run a _sProcess command
|
|
|
|
// using the Runtime exec method:
|
|
|
|
Process p = Runtime.getRuntime().exec(_sProcess);
|
|
|
|
|
|
|
|
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
|
|
|
|
|
|
|
|
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
|
|
|
|
|
|
|
|
// read the output from the command
|
|
|
|
String s;
|
|
|
|
while ((s = stdInput.readLine()) != null)
|
|
|
|
{
|
|
|
|
System.out.println("out:" + s);
|
|
|
|
}
|
|
|
|
|
|
|
|
// read any errors from the attempted command
|
|
|
|
while ((s = stdError.readLine()) != null)
|
|
|
|
{
|
|
|
|
System.out.println("err:" + s);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
catch (java.io.IOException e)
|
|
|
|
{
|
|
|
|
System.out.println("exception caught: ");
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If the timeout only given by setProcessTimeout(int seconds) function is != 0,
|
|
|
|
* a extra thread is created and after time has run out, the ProcessKiller string
|
|
|
|
* given by function setProcessKiller(string) will execute.
|
|
|
|
* So it is possible to kill a running office after a given time of seconds.
|
|
|
|
*/
|
|
|
|
private void initializeProcessKiller()
|
|
|
|
{
|
|
|
|
if (m_nProcessTimeout != 0)
|
|
|
|
{
|
|
|
|
m_aWatcher = new ProcessWatcher(m_nProcessTimeout, m_sProcessKiller);
|
|
|
|
m_aWatcher.start();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* to stop the extra thread, before he will kill a running office. This will stop the thread.
|
|
|
|
*/
|
|
|
|
public void stopWatcher()
|
|
|
|
{
|
|
|
|
if (m_aWatcher != null)
|
|
|
|
{
|
|
|
|
m_aWatcher.holdOn();
|
|
|
|
shortWait(5000);
|
|
|
|
}
|
|
|
|
}
|
2003-11-18 09:14:43 -06:00
|
|
|
}
|