/*
* CapturePlugin by Andreas Hessel (Vidrec@gmx.de), Bodo Tasche
*
* This program 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.
*
* 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.
*
* Change History:
*
* 2008-06-13 Frank Schaeckermann (FSCHAECK)
* Added the capture of STDERR output to method executeApplication for
* easier troubleshooting of capture driver problems.
*
* CVS information:
* $RCSfile$
* $Source$
* $Date: 2010-05-02 12:11:29 +0200 (Sun, 02 May 2010) $
* $Author: bananeweizen $
* $Revision: 6610 $
*/
package captureplugin.drivers.defaultdriver;
import java.awt.Window;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import javax.swing.JOptionPane;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import util.exc.ErrorHandler;
import util.io.ExecutionHandler;
import util.io.stream.InputStreamProcessor;
import util.io.stream.StreamUtilities;
import util.paramhandler.ParamParser;
import util.ui.Localizer;
import util.ui.UiUtilities;
import captureplugin.drivers.utils.ProgramTime;
import captureplugin.utils.CaptureUtilities;
/**
* This Class executes the Application/URL
*/
class CaptureExecute {
/** Translator */
private static final Localizer mLocalizer = Localizer.getLocalizerFor(CaptureExecute.class);
/** Data for Export */
private DeviceConfig mData = new DeviceConfig();
/** parent window */
private Window mParent;
/** Success ? */
private boolean mError = true;
private int mExitValue = 0;
private static CaptureExecute mInstance = null;
/**
* Creates the Execute
*
* @param window
* Frame
* @param data
* Data
*/
private CaptureExecute(Window window, DeviceConfig data) {
mParent = window;
mData = data;
mInstance = this;
}
private DefaultKonfigurator createDialog() {
return new DefaultKonfigurator(mParent, mData);
}
/**
* Gets the capture execute for the given values.
*
* @param window
* The parent frame for the capture execute.
* @param data
* The configuration for the capture execute.
* @return The capture execute for the given values.
*/
public static CaptureExecute getInstance(Window window, DeviceConfig data) {
if (mInstance == null) {
new CaptureExecute(window, data);
} else {
mInstance.mParent = window;
mInstance.mData = data;
}
return mInstance;
}
/**
* Add a Program
*
* @param programTime
* Program to add
* @return Success?
*/
public boolean addProgram(ProgramTime programTime) {
if (StringUtils.isBlank(mData.getParameterFormatAdd())) {
JOptionPane.showMessageDialog(mParent, mLocalizer.msg("NoParamsAdd",
"Please specify parameters for adding of the program!"), mLocalizer.msg("CapturePlugin", "Capture Plugin"),
JOptionPane.OK_OPTION);
createDialog().show(DefaultKonfigurator.TAB_PARAMETER);
return false;
}
return execute(programTime, mData.getParameterFormatAdd());
}
/**
* Remove a Program
*
* @param programTime
* Program to remove
* @return Success?
*/
public boolean removeProgram(ProgramTime programTime) {
if (StringUtils.isBlank(mData.getParameterFormatAdd()) || (StringUtils.isBlank(mData.getParameterFormatRem()))) {
JOptionPane.showMessageDialog(mParent, mLocalizer.msg("NoParams", "Please specify Parameters for the Program!"),
mLocalizer.msg("CapturePlugin", "Capture Plugin"), JOptionPane.OK_OPTION);
createDialog().show(DefaultKonfigurator.TAB_PARAMETER);
return false;
}
return execute(programTime, mData.getParameterFormatRem());
}
/**
* Executes the Program in mData and uses program
*
* @param programTime
* Program to use for Command-Line
* @param param
* Parameter
* @return true if successful
*/
public boolean execute(ProgramTime programTime, String param) {
try {
String output;
if (!checkParams()) {
return false;
}
ParamParser parser = new ParamParser(new CaptureParamLibrary(mData, programTime));
String params = parser.analyse(param, programTime.getProgram());
if (parser.showErrors(mParent)) {
return false;
}
if (mData.getUseWebUrl()) {
output = executeUrl(params);
} else {
output = executeApplication(params);
}
params = CaptureUtilities.replaceIgnoreCase(params, mData.getPassword(), "***");
output = CaptureUtilities.replaceIgnoreCase(output, mData.getPassword(), "***");
if (!mData.useReturnValue()) {
mError = false;
}
if (mError && mExitValue != 249) {
ResultDialog dialog = new ResultDialog(mParent, params, output, true);
UiUtilities.centerAndShow(dialog);
return false;
}
if (!mData.getDialogOnlyOnError() || (mData.getDialogOnlyOnError() && mError && mExitValue != 249)) {
ResultDialog dialog = new ResultDialog(mParent, params, output, false);
UiUtilities.centerAndShow(dialog);
}
} catch (Exception e) {
ErrorHandler.handle(mLocalizer.msg("ErrorExecute", "Error while excecuting."), e);
return false;
}
return mExitValue == 0;
}
/**
* Checks the Parameters
*
* @return true if OK
*/
private boolean checkParams() {
if (!mData.getUseWebUrl() && StringUtils.isBlank(mData.getProgramPath())) {
JOptionPane.showMessageDialog(mParent, mLocalizer.msg("NoProgram", "Please specify Application to use!"),
mLocalizer.msg("CapturePlugin", "Capture Plugin"), JOptionPane.OK_OPTION);
createDialog().show(DefaultKonfigurator.TAB_PATH);
return false;
}
if (mData.getUseWebUrl() && StringUtils.isBlank(mData.getWebUrl())) {
JOptionPane.showMessageDialog(mParent, mLocalizer.msg("NoUrl", "Please specify URL to use!"), mLocalizer.msg(
"CapturePlugin", "Capture Plugin"), JOptionPane.OK_OPTION);
createDialog().show(DefaultKonfigurator.TAB_PATH);
return false;
}
return true;
}
/**
* Starts an Application
*
* @param params
* Params for the Application
* @return Output of Application
*/
private String executeApplication(String params) {
ExecutionHandler executionHandler;
try {
executionHandler = new ExecutionHandler(params, mData.getProgramPath());
executionHandler.execute(true, true);
} catch (Exception e) {
ErrorHandler.handle(mLocalizer.msg("ProblemAtStart", "Problems while starting Application."), e);
return null;
}
int time = 0;
// wait until the process has exited, max MaxTimouts
if (mData.getTimeout() > 0) {
while (time < mData.getTimeout() * 1000) {
try {
Thread.sleep(100);
time += 100;
executionHandler.exitValue();
break;
} catch (Exception e) {
// Empty
}
}
} else {
while (true) {
try {
Thread.sleep(100);
executionHandler.exitValue();
break;
} catch (Exception e) {
// Empty
}
}
}
while (time < mData.getTimeout() * 1000) {
try {
Thread.sleep(100);
time += 100;
executionHandler.exitValue();
break;
} catch (Exception e) {
// Empty
}
}
// get the process output
String output = "";
String errors = ""; // also capture STDERR output FSCHAECK - 2008-06-13
if (!executionHandler.getInputStreamReaderThread().isAlive()) {
output = executionHandler.getOutput();
}
// read STDERR output and add to return value if necessary - FSCHAECK -
// 2008-06-13
if (!executionHandler.getErrorStreamReaderThread().isAlive()) {
errors = executionHandler.getOutput();
if (errors.length() > 0) {
if (output.length() > 0) {
output = output + "\n\n" + errors;
} else {
output = errors;
}
}
}
mError = executionHandler.exitValue() != 0;
mExitValue = executionHandler.exitValue();
return output;
}
/**
* Executes the URL
*
* @param params
* Params for the URL
* @return Result-Page
* @throws Exception
* Problems while loading the URL
*/
private String executeUrl(String params) throws Exception {
final StringBuilder result = new StringBuilder();
URL url = new URL(mData.getWebUrl() + '?' + params);
URLConnection uc = url.openConnection();
String userpassword = mData.getUsername() + ':' + mData.getPassword();
String encoded = new String(Base64.encodeBase64(userpassword.getBytes()));
uc.setRequestProperty("Authorization", "Basic " + encoded);
if (uc instanceof HttpURLConnection) {
if (((HttpURLConnection) uc).getResponseCode() != HttpURLConnection.HTTP_OK) {
InputStream content = ((HttpURLConnection) uc).getErrorStream();
StreamUtilities.inputStream(content, new InputStreamProcessor() {
@Override
public void process(InputStream input) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(input));
String line;
while ((line = in.readLine()) != null) {
result.append(line);
}
}
});
mError = true;
mExitValue = 1;
return result.toString();
}
}
StreamUtilities.inputStream(uc, new InputStreamProcessor() {
@Override
public void process(InputStream input) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(input));
String line;
while ((line = in.readLine()) != null) {
result.append(line);
}
}
});
mError = false;
mExitValue = 0;
return result.toString();
}
}