* @see OperationFacet#invokeOperation(String, Configuration)
*/
@Override
public OperationResult invokeOperation(String name, Configuration configuration) throws Exception {
OperationResult result = new OperationResult();
String arguments = configuration.getSimpleValue(OPERATION_PARAM_ARGUMENTS, null);
String waitTimeStr = configuration.getSimpleValue(OPERATION_PARAM_WAIT_TIME, null);
String captureOutputStr = configuration.getSimpleValue(OPERATION_PARAM_CAPTURE_OUTPUT, null);
String killOnTimeoutStr = configuration.getSimpleValue(OPERATION_PARAM_KILL_ON_TIMEOUT, null);
long waitTime;
boolean captureOutput;
boolean killOnTimeout;
if (waitTimeStr != null) {
try {
waitTime = Long.parseLong(waitTimeStr);
waitTime *= 1000L; // the parameter is specified in seconds, but we need it in milliseconds
} catch (NumberFormatException e) {
throw new NumberFormatException("Wait time parameter value is invalid: " + waitTimeStr);
}
} else {
waitTime = DEFAULT_MAX_WAIT_TIME;
}
captureOutput = captureOutputStr == null || Boolean.parseBoolean(captureOutputStr);
killOnTimeout = killOnTimeoutStr == null || Boolean.parseBoolean(killOnTimeoutStr);
ProcessExecutionResults exeResults = executeExecutable(arguments, waitTime, captureOutput, killOnTimeout);
Integer exitcode = exeResults.getExitCode();
String output = exeResults.getCapturedOutput();
Throwable error = exeResults.getError();
if (error != null) {
result.setErrorMessage(ThrowableUtil.getAllMessages(error));
}
Configuration resultsConfig = result.getComplexResults();
if (exitcode != null) {
resultsConfig.put(new PropertySimple(OPERATION_RESULT_EXITCODE, exitcode));
}
if (output != null) {
resultsConfig.put(new PropertySimple(OPERATION_RESULT_OUTPUT, output.trim()));