/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.it;
import java.nio.file.Path;
import java.util.Arrays;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.SystemUtils;
import net.sourceforge.pmd.PMD;
/**
* Executes CPD from command line. Deals with the differences, when CPD is run on Windows or on Linux.
*
* @author Andreas Dangel
*/
public class CpdExecutor {
private static final String PMD_BIN_PREFIX = "pmd-bin-";
private CpdExecutor() {
// this is a helper class only
}
private static ExecutionResult runCpdUnix(Path tempDir, String ... arguments) throws Exception {
String cmd = tempDir.resolve(PMD_BIN_PREFIX + PMD.VERSION + "/bin/run.sh").toAbsolutePath().toString();
ProcessBuilder pb = new ProcessBuilder(cmd, "cpd");
pb.command().addAll(Arrays.asList(arguments));
pb.redirectErrorStream(true);
Process process = pb.start();
String output = IOUtils.toString(process.getInputStream());
int result = process.waitFor();
return new ExecutionResult(result, output);
}
private static ExecutionResult runCpdWindows(Path tempDir, String ... arguments) throws Exception {
String cmd = tempDir.resolve(PMD_BIN_PREFIX + PMD.VERSION + "/bin/cpd.bat").toAbsolutePath().toString();
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.command().addAll(Arrays.asList(arguments));
pb.redirectErrorStream(true);
Process process = pb.start();
String output = IOUtils.toString(process.getInputStream());
int result = process.waitFor();
return new ExecutionResult(result, output);
}
/**
* Executes CPD found in tempDir with the given command line arguments.
* @param tempDir the directory, to which the binary distribution has been extracted
* @param arguments the arguments to execute CPD with
* @return collected result of the execution
* @throws Exception if the execution fails for any reason (executable not found, ...)
*/
public static ExecutionResult runCpd(Path tempDir, String ... arguments) throws Exception {
if (SystemUtils.IS_OS_WINDOWS) {
return runCpdWindows(tempDir, arguments);
} else {
return runCpdUnix(tempDir, arguments);
}
}
}