package org.jenkins.tools.test.maven;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jenkins.tools.test.exception.PomExecutionException;
public class ExternalMavenRunner implements MavenRunner {
private File mvn;
public ExternalMavenRunner(File mvn) {
this.mvn = mvn;
}
public void run(Config config, File baseDirectory, File buildLogFile, String... goals) throws PomExecutionException {
List<String> cmd = new ArrayList<String>();
cmd.add(mvn.getAbsolutePath());
cmd.add("--batch-mode");
if (config.userSettingsFile != null) {
cmd.add("--settings=" + config.userSettingsFile);
}
for (Map.Entry<String,String> entry : config.userProperties.entrySet()) {
cmd.add("--define=" + entry);
}
cmd.addAll(Arrays.asList(goals));
System.out.println("running " + cmd + " in " + baseDirectory + " >> " + buildLogFile);
try {
Process p = new ProcessBuilder(cmd).directory(baseDirectory).redirectErrorStream(true).start();
List<String> succeededPluginArtifactIds = new ArrayList<String>();
InputStream is = p.getInputStream();
try {
FileOutputStream os = new FileOutputStream(buildLogFile, true);
try {
PrintWriter w = new PrintWriter(os);
try {
String completed = null;
Pattern pattern = Pattern.compile("\\[INFO\\] --- (.+):.+:.+ [(].+[)] @ .+ ---");
BufferedReader r = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = r.readLine()) != null) {
System.out.println(line);
w.println(line);
Matcher m = pattern.matcher(line);
if (m.matches()) {
if (completed != null) {
succeededPluginArtifactIds.add(completed);
}
completed = m.group(1);
} else if (line.equals("[INFO] BUILD SUCCESS") && completed != null) {
succeededPluginArtifactIds.add(completed);
}
}
w.flush();
System.out.println("succeeded artifactIds: " + succeededPluginArtifactIds);
} finally {
w.close();
}
} finally {
os.close();
}
} finally {
is.close();
}
if (p.waitFor() != 0) {
throw new PomExecutionException(cmd + " failed in " + baseDirectory, succeededPluginArtifactIds, /* TODO */Collections.<Throwable>emptyList(), Collections.<String>emptyList());
}
} catch (PomExecutionException x) {
throw x;
} catch (Exception x) {
throw new PomExecutionException(x);
}
}
}