/**
* 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 PMD from command line. Deals with the differences, when PMD is run on Windows or on Linux.
*
* @author Andreas Dangel
*/
public class PMDExecutor {
private static final String PMD_BIN_PREFIX = "pmd-bin-";
private static final String SOURCE_DIRECTORY_FLAG = "-d";
private static final String RULESET_FLAG = "-R";
private static final String FORMAT_FLAG = "-f";
private static final String FORMATTER = "text";
private PMDExecutor() {
// this is a helper class only
}
private static ExecutionResult runPMDUnix(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, "pmd");
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 runPMDWindows(Path tempDir, String ... arguments) throws Exception {
String cmd = tempDir.resolve(PMD_BIN_PREFIX + PMD.VERSION + "/bin/pmd.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 the PMD found in tempDir against the given sourceDirectory path with the given ruleset.
*
* @param tempDir the directory, to which the binary distribution has been extracted
* @param sourceDirectory the source directory, that PMD should analyze
* @param ruleset the ruleset, that PMD should execute
* @return collected result of the execution
* @throws Exception if the execution fails for any reason (executable not found, ...)
*/
public static ExecutionResult runPMDRules(Path tempDir, String sourceDirectory, String ruleset) throws Exception {
if (SystemUtils.IS_OS_WINDOWS) {
return runPMDWindows(tempDir, SOURCE_DIRECTORY_FLAG, sourceDirectory, RULESET_FLAG, ruleset, FORMAT_FLAG, FORMATTER);
} else {
return runPMDUnix(tempDir, SOURCE_DIRECTORY_FLAG, sourceDirectory, RULESET_FLAG, ruleset, FORMAT_FLAG, FORMATTER);
}
}
/**
* Executes PMD 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 PMD with
* @return collected result of the execution
* @throws Exception if the execution fails for any reason (executable not found, ...)
*/
public static ExecutionResult runPMD(Path tempDir, String ... arguments) throws Exception {
if (SystemUtils.IS_OS_WINDOWS) {
return runPMDWindows(tempDir, arguments);
} else {
return runPMDUnix(tempDir, arguments);
}
}
}