package org.vaadin.mideaas.frontend;
import java.io.File;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Callable;
import org.apache.maven.shared.invoker.DefaultInvocationRequest;
import org.apache.maven.shared.invoker.DefaultInvoker;
import org.apache.maven.shared.invoker.InvocationOutputHandler;
import org.apache.maven.shared.invoker.InvocationRequest;
import org.apache.maven.shared.invoker.InvocationResult;
import org.apache.maven.shared.invoker.Invoker;
import org.apache.maven.shared.invoker.MavenInvocationException;
/**
* For running a Maven task in a separate thread.
*
*/
public class MavenTask implements Callable<InvocationResult> {
public interface LogListener {
public void newLine(String line);
}
private final File pomXml;
private final List<String> goals;
private final LogListener listener;
private final Properties properties;
private InvocationResult result;
public MavenTask(File pomXml, List<String> goals, Properties properties, LogListener listener) {
this.pomXml = pomXml;
this.goals = goals;
this.properties = properties;
this.listener = listener;
}
private void runMaven() {
InvocationRequest request = new DefaultInvocationRequest();
request.setPomFile(pomXml);
request.setGoals(goals);
InvocationOutputHandler handler;
if (listener!=null) {
handler = new InvocationOutputHandler() {
@Override
public void consumeLine(String li) {
// System.out.println("Maven log: " + li);
logLine(li);
}
};
} else {
// Empty handler. The default handler would output to System.out,
// and we don't want that. (?)
handler = new InvocationOutputHandler() {
@Override
public void consumeLine(String arg0) {
// Nothing.
}
};
}
request.setOutputHandler(handler);
request.setErrorHandler(handler);
request.setProperties(properties);
Invoker invoker = new DefaultInvoker();
invoker.setMavenHome(MavenUtil.getMavenHome());
try {
InvocationResult res = invoker.execute(request);
setResult(res);
} catch (MavenInvocationException e) {
e.printStackTrace();
}
}
private synchronized void logLine(String li) {
listener.newLine(li);
}
synchronized private void setResult(InvocationResult result) {
this.result = result;
}
@Override
public InvocationResult call() {
runMaven();
return result;
}
}