/** * Executes <code>commandLine</code>. Sometimes (especially observed on MacOS) the commandLine * isn't executed properly. In that cases another exec-method is to be used. To accomplish this * please use the special delimiter '<code>@@</code>'. If <code>commandLine</code> contains this * delimiter it is split into a String[] array and the special exec-method is used. * * <p>A possible {@link IOException} gets logged but no further processing is done. * * @param commandLine the command line to execute * @param timeout timeout for execution in milliseconds * @return response data from executed command line */ public static String executeCommandLineAndWaitResponse(String commandLine, int timeout) { String retval = null; CommandLine cmdLine = null; if (commandLine.contains(CMD_LINE_DELIMITER)) { String[] cmdArray = commandLine.split(CMD_LINE_DELIMITER); cmdLine = new CommandLine(cmdArray[0]); for (int i = 1; i < cmdArray.length; i++) { cmdLine.addArgument(cmdArray[i], false); } } else { cmdLine = CommandLine.parse(commandLine); } DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler(); ExecuteWatchdog watchdog = new ExecuteWatchdog(timeout); Executor executor = new DefaultExecutor(); ByteArrayOutputStream stdout = new ByteArrayOutputStream(); PumpStreamHandler streamHandler = new PumpStreamHandler(stdout); executor.setExitValue(1); executor.setStreamHandler(streamHandler); executor.setWatchdog(watchdog); try { executor.execute(cmdLine, resultHandler); logger.debug("executed commandLine '{}'", commandLine); } catch (ExecuteException e) { logger.error("couldn't execute commandLine '" + commandLine + "'", e); } catch (IOException e) { logger.error("couldn't execute commandLine '" + commandLine + "'", e); } // some time later the result handler callback was invoked so we // can safely request the exit code try { resultHandler.waitFor(); int exitCode = resultHandler.getExitValue(); retval = StringUtils.chomp(stdout.toString()); if (resultHandler.getException() != null) { logger.warn(resultHandler.getException().getMessage()); } else { logger.debug("exit code '{}', result '{}'", exitCode, retval); } } catch (InterruptedException e) { logger.error("Timeout occured when executing commandLine '" + commandLine + "'", e); } return retval; }
public int retrievePageCount(File source) { File target = new File( System.getProperty("java.io.tmpdir"), FilenameUtils.removeExtension(source.getName()) + ".pdf"); Map<String, Object> args = newHashMap(); args.put("source", source); args.put("targetDir", target.getParentFile()); CommandLine cmd = new CommandLine("loffice"); cmd.addArgument("--headless"); cmd.addArgument("--convert-to"); cmd.addArgument("pdf"); cmd.addArgument("--outdir"); cmd.addArgument("${targetDir}"); cmd.addArgument("${source}"); cmd.setSubstitutionMap(args); try { DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler(); ExecuteWatchdog watchdog = new ExecuteWatchdog(10L * 1000L); executor.setWatchdog(watchdog); logger.trace("About to execute command {}", cmd.toString()); executor.execute(cmd, resultHandler); resultHandler.waitFor(); final int exitValue = resultHandler.getExitValue(); if (exitValue != 0) { logger.error( "Unable to convert Microsoft Word file {} to PDF. Exit code = {}", source.getAbsolutePath(), exitValue); return -1; } final int pageCount = pdfDocumentInspector.retrievePageCount(target); deleteFileIfNeeded(target); return pageCount; } catch (IOException | InterruptedException e) { logger.error("Unable to create a PDF from {}", source.getAbsolutePath(), e); deleteFileIfNeeded(target); return -1; } }
@SuppressWarnings({"unchecked", "rawtypes"}) @Override protected int _exec() { int returnValue = 0; CommandLine cmdLine = getCommandLine(); DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler(); ExecuteWatchdog watchdog = new ScriptExecuteWatchdog(); DefaultExecutor executor = new DefaultExecutor(); executor.setExitValue(0); executor.setWorkingDirectory(currentDir); executor.setWatchdog(watchdog); if (terminal != null) { ExecuteStreamHandler monitorStreamHandler = new PumpStreamHandler(terminal.getOutputStream(), terminal.getErrorStream()); executor.setStreamHandler(monitorStreamHandler); } else { ExecuteStreamHandler silentStreamHandler = new PumpStreamHandler(); executor.setStreamHandler(silentStreamHandler); } Map procEnvironment = null; if (environment != null) { try { procEnvironment = EnvironmentUtils.getProcEnvironment(); procEnvironment.putAll(environment); } catch (IOException e) { logger.error(e.getMessage()); procEnvironment = null; } } try { executor.execute(cmdLine, procEnvironment, resultHandler); notifyStart(); } catch (Exception e) { logger.warn("[EXECUTOR] ERROR: {}", e.getMessage()); notifyError(-1, e.getMessage()); return 1; } try { if (resultHandler.hasResult()) { notifyRefresh(); } else { logger.info("[EXECUTOR] RUNNING"); while (!resultHandler.hasResult()) { resultHandler.waitFor(PrefUtil.getInt(PrefUtil.SCRIPT_RUN_REFRESH_TIME, 1000)); notifyRefresh(); } } } catch (InterruptedException e) { logger.warn("[EXECUTOR] INTERRUPTED"); watchdog.destroyProcess(); } finally { if (watchdog.killedProcess()) { logger.warn("[EXECUTOR] WAITING FOR KILL"); try { resultHandler.waitFor(PrefUtil.getInt(PrefUtil.SCRIPT_WAIT_FOR_KILL_REFRESH_TIME, 5000)); } catch (InterruptedException e) { logger.warn("[EXECUTOR] INTERRUPTED: {}", e.getMessage()); notifyError(-1, e.getMessage()); } } try { ExecuteException exception = resultHandler.getException(); if (exception != null) { returnValue = resultHandler.getExitValue(); logger.warn("[EXECUTOR] ERROR: {}", exception.getMessage()); if (terminal != null) { // String error = terminal.getErrorStream().peekLines(); // notifyError(returnValue, error); // error is empty notifyError(returnValue, exception.getMessage()); } else { notifyError(returnValue, exception.getMessage()); } service.shutdownNow(); } else { returnValue = resultHandler.getExitValue(); logger.info("[EXECUTOR] FINISH: {}", returnValue); notifyFinish(resultHandler.getExitValue()); } } catch (IllegalStateException e) { returnValue = -1; logger.warn("[EXECUTOR] INTERRUPTED: {}", e.getMessage()); notifyError(returnValue, e.getMessage()); } } if (!keepFileOnEnd) { internalDeleteOnEnd(); } return returnValue; }