/*
* Copyright 2007 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.codehaus.mojo.webtest.components;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.project.MavenProject;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.BuildLogger;
import org.apache.tools.ant.DefaultLogger;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.helper.ProjectHelper2;
import org.apache.tools.ant.types.Path;
/**
* Run a give ANT script
*/
public class AntExecutor
{
/**
* Run an ANT script within the JVM..
*
* @param antFile the ANT scripts to be executed
* @param userProperties the properties to be set for the ANT script
* @param mavenProject the current maven project
* @param artifacts the list of dependencies
* @param target the ANT target to be executed
* @throws DependencyResolutionRequiredException not dependencies were resolved
* @throws BuildException the build failed
*/
public AntExecutor( File antFile, Properties userProperties, MavenProject mavenProject, List artifacts, String target )
throws BuildException, DependencyResolutionRequiredException
{
File antBaseDir = antFile.getParentFile();
Project antProject = new Project();
antProject.init();
antProject.addBuildListener( this.createLogger() );
antProject.setBaseDir( antBaseDir );
ProjectHelper2.configureProject(antProject, antFile);
// ProjectHelper2 projectHelper = new ProjectHelper2();
// projectHelper.parse( antProject, antFile );
Enumeration propertyKeys = userProperties.keys();
while ( propertyKeys.hasMoreElements() )
{
String key = ( String ) propertyKeys.nextElement();
String value = userProperties.getProperty( key );
antProject.setUserProperty( key, value );
}
// NOTE: from maven-antrun-plugin
Path p = new Path( antProject );
p.setPath( StringUtils.join( mavenProject.getCompileClasspathElements().iterator(), File.pathSeparator ) );
/* maven.dependency.classpath it's deprecated as it's equal to maven.compile.classpath */
antProject.addReference( "maven.dependency.classpath", p );
antProject.addReference( "maven.compile.classpath", p );
p = new Path( antProject );
p.setPath( StringUtils.join( mavenProject.getRuntimeClasspathElements().iterator(), File.pathSeparator ) );
antProject.addReference( "maven.runtime.classpath", p );
p = new Path( antProject );
p.setPath( StringUtils.join( mavenProject.getTestClasspathElements().iterator(), File.pathSeparator ) );
antProject.addReference( "maven.test.classpath", p );
/* set maven.plugin.classpath with plugin dependencies */
antProject.addReference( "maven.plugin.classpath", getPathFromArtifacts( artifacts, antProject ) );
antProject.executeTarget( target );
}
/**
* @return a logger to capture the ANT ouptut
*/
private BuildLogger createLogger()
{
BuildLogger logger = new DefaultLogger();
logger.setMessageOutputLevel( Project.MSG_INFO );
logger.setOutputPrintStream( System.out );
logger.setErrorPrintStream( System.err );
logger.setEmacsMode( false );
return logger;
}
/**
* Build a class path based on a list of artifacts. Please
* not that this is copy & wasted from maven-antrun-plugin.
*
* @param artifacts the artifacts constituting the class path
* @param antProject the ant project
* @return a path
* @throws DependencyResolutionRequiredException not dependencies were resolved
*/
public Path getPathFromArtifacts( Collection artifacts, Project antProject )
throws DependencyResolutionRequiredException
{
if ( artifacts == null )
{
return new Path( antProject );
}
List list = new ArrayList( artifacts.size() );
for ( Iterator i = artifacts.iterator(); i.hasNext(); )
{
Artifact a = ( Artifact ) i.next();
File file = a.getFile();
if ( file == null )
{
throw new DependencyResolutionRequiredException( a );
}
list.add( file.getPath() );
}
Path p = new Path( antProject );
p.setPath( StringUtils.join( list.iterator(), File.pathSeparator ) );
return p;
}
}