All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.github.eirslett.maven.plugins.frontend.lib.ProcessExecutor Maven / Gradle / Ivy
package com.github.eirslett.maven.plugins.frontend.lib;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.ExecuteStreamHandler;
import org.apache.commons.exec.ExecuteWatchdog;
import org.apache.commons.exec.Executor;
import org.apache.commons.exec.LogOutputStream;
import org.apache.commons.exec.PumpStreamHandler;
import org.apache.commons.exec.ShutdownHookProcessDestroyer;
import org.slf4j.Logger;
final class ProcessExecutionException extends Exception {
private static final long serialVersionUID = 1L;
public ProcessExecutionException(String message) {
super(message);
}
public ProcessExecutionException(Throwable cause) {
super(cause);
}
}
final class ProcessExecutor {
private final static String PATH_ENV_VAR = "PATH";
private final Map environment;
private CommandLine commandLine;
private final Executor executor;
public ProcessExecutor(File workingDirectory, List paths, List command, Platform platform, Map additionalEnvironment){
this(workingDirectory, paths, command, platform, additionalEnvironment, 0);
}
public ProcessExecutor(File workingDirectory, List paths, List command, Platform platform, Map additionalEnvironment, long timeoutInSeconds) {
this.environment = createEnvironment(paths, platform, additionalEnvironment);
this.commandLine = createCommandLine(command);
this.executor = createExecutor(workingDirectory, timeoutInSeconds);
}
public String executeAndGetResult(final Logger logger) throws ProcessExecutionException {
ByteArrayOutputStream stdout = new ByteArrayOutputStream();
ByteArrayOutputStream stderr = new ByteArrayOutputStream();
int exitValue = execute(logger, stdout, stderr);
if (exitValue == 0) {
return stdout.toString().trim();
} else {
throw new ProcessExecutionException(stdout + " " + stderr);
}
}
public int executeAndRedirectOutput(final Logger logger) throws ProcessExecutionException {
OutputStream stdout = new LoggerOutputStream(logger, 0);
return execute(logger, stdout, stdout);
}
private int execute(final Logger logger, final OutputStream stdout, final OutputStream stderr)
throws ProcessExecutionException {
logger.debug("Executing command line {}", commandLine);
try {
ExecuteStreamHandler streamHandler = new PumpStreamHandler(stdout, stderr);
executor.setStreamHandler(streamHandler);
int exitValue = executor.execute(commandLine, environment);
logger.debug("Exit value {}", exitValue);
return exitValue;
} catch (ExecuteException e) {
if (executor.getWatchdog() != null && executor.getWatchdog().killedProcess()) {
throw new ProcessExecutionException("Process killed after timeout");
}
throw new ProcessExecutionException(e);
} catch (IOException e) {
throw new ProcessExecutionException(e);
}
}
private CommandLine createCommandLine(List command) {
CommandLine commmandLine = new CommandLine(command.get(0));
for (int i = 1;i < command.size();i++) {
String argument = command.get(i);
commmandLine.addArgument(argument, false);
}
return commmandLine;
}
private Map createEnvironment(final List paths, final Platform platform, final Map additionalEnvironment) {
final Map environment = new HashMap<>(System.getenv());
if (additionalEnvironment != null) {
environment.putAll(additionalEnvironment);
}
if (platform.isWindows()) {
for (final Map.Entry entry : environment.entrySet()) {
final String pathName = entry.getKey();
if (PATH_ENV_VAR.equalsIgnoreCase(pathName)) {
final String pathValue = entry.getValue();
environment.put(pathName, extendPathVariable(pathValue, paths));
}
}
} else {
final String pathValue = environment.get(PATH_ENV_VAR);
environment.put(PATH_ENV_VAR, extendPathVariable(pathValue, paths));
}
return environment;
}
private String extendPathVariable(final String existingValue, final List paths) {
final StringBuilder pathBuilder = new StringBuilder();
for (final String path : paths) {
pathBuilder.append(path).append(File.pathSeparator);
}
if (existingValue != null) {
pathBuilder.append(existingValue).append(File.pathSeparator);
}
return pathBuilder.toString();
}
private Executor createExecutor(File workingDirectory, long timeoutInSeconds) {
DefaultExecutor executor = new DefaultExecutor();
executor.setWorkingDirectory(workingDirectory);
executor.setProcessDestroyer(new ShutdownHookProcessDestroyer()); // Fixes #41
if (timeoutInSeconds > 0) {
executor.setWatchdog(new ExecuteWatchdog(timeoutInSeconds * 1000));
}
return executor;
}
private static class LoggerOutputStream extends LogOutputStream {
private final Logger logger;
LoggerOutputStream(Logger logger, int logLevel) {
super(logLevel);
this.logger = logger;
}
@Override
public final void flush() {
// buffer processing on close() only
}
@Override
protected void processLine(final String line, final int logLevel) {
logger.info(line);
}
}
}