package fr.inria.diversify.buildSystem.maven; import org.apache.maven.shared.invoker.*; import org.codehaus.plexus.component.annotations.Component; import org.codehaus.plexus.util.cli.CommandLineException; import org.codehaus.plexus.util.cli.CommandLineUtils; import org.codehaus.plexus.util.cli.Commandline; import java.io.File; import java.io.InputStream; /** * User: Simon * Date: 9/9/13 * Time: 3:15 PM */ @Component(role = Invoker.class, hint = "default") public class MavenInvoker implements Invoker { public static final String ROLE_HINT = "default"; private static final InvokerLogger DEFAULT_LOGGER = new SystemOutLogger(); private static final InvocationOutputHandler DEFAULT_OUTPUT_HANDLER = new SystemOutHandler(); private File localRepositoryDirectory; private InvokerLogger logger = DEFAULT_LOGGER; private File workingDirectory; private File mavenHome; private File mavenExecutable; private InvocationOutputHandler outputHandler = DEFAULT_OUTPUT_HANDLER; private InputStream inputStream; private InvocationOutputHandler errorHandler = DEFAULT_OUTPUT_HANDLER; private int timeOut = 0; public InvocationResult execute(InvocationRequest request) throws MavenInvocationException { MavenCommandLineBuilder cliBuilder = new MavenCommandLineBuilder(); InvokerLogger logger = getLogger(); if (logger != null) { cliBuilder.setLogger(getLogger()); } File localRepo = getLocalRepositoryDirectory(); if (localRepo != null) { cliBuilder.setLocalRepositoryDirectory(getLocalRepositoryDirectory()); } File mavenHome = getMavenHome(); if (mavenHome != null) { cliBuilder.setMavenHome(getMavenHome()); } File mavenExecutable = getMavenExecutable(); if (mavenExecutable != null) { cliBuilder.setMavenExecutable(mavenExecutable); } File workingDirectory = getWorkingDirectory(); if (workingDirectory != null) { cliBuilder.setWorkingDirectory(getWorkingDirectory()); } Commandline cli; try { cli = cliBuilder.build(request); } catch (CommandLineConfigurationException e) { throw new MavenInvocationException("Error configuring command-line. Reason: " + e.getMessage(), e); } MavenInvocationResult result = new MavenInvocationResult(); try { int exitCode = executeCommandLine(cli, request); result.setExitCode(exitCode); } catch (CommandLineException e) { result.setExecutionException(e); } return result; } private int executeCommandLine(Commandline cli, InvocationRequest request) throws CommandLineException { int result = Integer.MIN_VALUE; InputStream inputStream = request.getInputStream(this.inputStream); InvocationOutputHandler outputHandler = request.getOutputHandler(this.outputHandler); InvocationOutputHandler errorHandler = request.getErrorHandler(this.errorHandler); if (getLogger().isDebugEnabled()) { getLogger().debug("Executing: " + cli); } if (request.isInteractive()) { if (inputStream == null) { getLogger().warn( "Maven will be executed in interactive mode" + ", but no input stream has been configured for this MavenInvoker instance."); result = CommandLineUtils.executeCommandLine(cli, outputHandler, errorHandler); } else { result = CommandLineUtils.executeCommandLine(cli, inputStream, outputHandler, errorHandler, timeOut); } } else { if (inputStream != null) { getLogger().info("Executing in batch mode. The configured input stream will be ignored."); } result = CommandLineUtils.executeCommandLine(cli, outputHandler, errorHandler, timeOut); } return result; } public File getLocalRepositoryDirectory() { return localRepositoryDirectory; } public InvokerLogger getLogger() { return logger; } public Invoker setLocalRepositoryDirectory(File localRepositoryDirectory) { this.localRepositoryDirectory = localRepositoryDirectory; return this; } public Invoker setLogger(InvokerLogger logger) { this.logger = (logger != null) ? logger : DEFAULT_LOGGER; return this; } public File getWorkingDirectory() { return workingDirectory; } public Invoker setWorkingDirectory(File workingDirectory) { this.workingDirectory = workingDirectory; return this; } public File getMavenHome() { return mavenHome; } public Invoker setMavenHome(File mavenHome) { this.mavenHome = mavenHome; return this; } public File getMavenExecutable() { return mavenExecutable; } public Invoker setMavenExecutable(File mavenExecutable) { this.mavenExecutable = mavenExecutable; return this; } public void setTimeOut(int i) { this.timeOut = i; } public Invoker setErrorHandler(InvocationOutputHandler errorHandler) { this.errorHandler = errorHandler; return this; } public Invoker setInputStream(InputStream inputStream) { this.inputStream = inputStream; return this; } public Invoker setOutputHandler(InvocationOutputHandler outputHandler) { this.outputHandler = outputHandler; return this; } }