blob: 1e42829373fad3693b4023a24bec44e8adfcbbb6 [file] [log] [blame]
package org.apache.maven.script.ant;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.ContextEnabled;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.PluginParameterExpressionEvaluator;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.path.PathTranslator;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.PropertyHelper;
import org.apache.tools.ant.types.Path;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.UnArchiver;
import org.codehaus.plexus.archiver.zip.ZipUnArchiver;
import org.codehaus.plexus.component.MapOrientedComponent;
import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
import org.codehaus.plexus.component.factory.ant.AntComponentExecutionException;
import org.codehaus.plexus.component.factory.ant.AntScriptInvoker;
import org.codehaus.plexus.component.repository.ComponentRequirement;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.StringUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class AntMojoWrapper
extends AbstractMojo
implements ContextEnabled, MapOrientedComponent, LogEnabled
{
private Map pluginContext;
private final AntScriptInvoker scriptInvoker;
private Project antProject;
private MavenProject mavenProject;
private MojoExecution mojoExecution;
private MavenSession session;
private PathTranslator pathTranslator;
private Logger logger;
private transient List unconstructedParts = new ArrayList();
public AntMojoWrapper( AntScriptInvoker scriptInvoker )
{
this.scriptInvoker = scriptInvoker;
}
public void execute()
throws MojoExecutionException
{
if ( antProject == null )
{
antProject = scriptInvoker.getProject();
}
Map allConfig = new HashMap();
if ( pluginContext != null && !pluginContext.isEmpty() )
{
allConfig.putAll( pluginContext );
}
Map refs = scriptInvoker.getReferences();
if ( refs != null )
{
allConfig.putAll( refs );
for ( Iterator it = refs.entrySet().iterator(); it.hasNext(); )
{
Map.Entry entry = (Map.Entry) it.next();
String key = (String) entry.getKey();
if ( key.startsWith( PathTranslator.class.getName() ) )
{
pathTranslator = (PathTranslator) entry.getValue();
}
}
}
mavenProject = (MavenProject) allConfig.get( "project" );
mojoExecution = (MojoExecution) allConfig.get( "mojoExecution" );
session = (MavenSession) allConfig.get( "session" );
unpackFileBasedResources();
addClasspathReferences();
if ( logger.isDebugEnabled() && !unconstructedParts.isEmpty() )
{
StringBuffer buffer = new StringBuffer();
buffer.append( "The following standard Maven Ant-mojo support objects could not be created:\n\n" );
for ( Iterator it = unconstructedParts.iterator(); it.hasNext(); )
{
String part = (String) it.next();
buffer.append( "\n- " ).append( part );
}
buffer.append( "\n\nMaven project, session, mojo-execution, or path-translation parameter information is " );
buffer.append( "\nmissing from this mojo's plugin descriptor." );
buffer.append( "\n\nPerhaps this Ant-based mojo depends on maven-script-ant < 2.1.0, " );
buffer.append( "or used maven-plugin-tools-ant < 2.2 during release?\n\n" );
logger.debug( buffer.toString() );
}
try
{
scriptInvoker.invoke();
}
catch ( AntComponentExecutionException e )
{
throw new MojoExecutionException( "Failed to execute: " + e.getMessage(), e );
}
unconstructedParts.clear();
}
public void setPluginContext( Map pluginContext )
{
this.pluginContext = pluginContext;
}
public Map getPluginContext()
{
return pluginContext;
}
public void addComponentRequirement( ComponentRequirement requirementDescriptor, Object requirementValue )
throws ComponentConfigurationException
{
scriptInvoker.addComponentRequirement( requirementDescriptor, requirementValue );
}
public void setComponentConfiguration( Map componentConfiguration )
throws ComponentConfigurationException
{
scriptInvoker.setComponentConfiguration( componentConfiguration );
antProject = scriptInvoker.getProject();
}
private void unpackFileBasedResources()
throws MojoExecutionException
{
if ( mojoExecution == null || mavenProject == null )
{
unconstructedParts.add( "Unpacked Ant build scripts (in Maven build directory)." );
return;
}
// What we need to write out any resources in the plugin to the target directory of the
// mavenProject using the Ant-based plugin:
//
// 1. Need a reference to the plugin JAR itself
// 2. Need a reference to the ${basedir} of the mavenProject
PluginDescriptor pluginDescriptor = mojoExecution.getMojoDescriptor().getPluginDescriptor();
File pluginJar = pluginDescriptor.getPluginArtifact().getFile();
String resourcesPath = pluginDescriptor.getArtifactId();
File outputDirectory = new File( mavenProject.getBuild().getDirectory() );
try
{
UnArchiver ua = new ZipUnArchiver( pluginJar );
ua.extract( resourcesPath, outputDirectory );
}
catch ( ArchiverException e )
{
throw new MojoExecutionException( "Error extracting resources from your Ant-based plugin.", e );
}
}
private void addClasspathReferences()
throws MojoExecutionException
{
try
{
if ( mavenProject != null && session != null && pathTranslator != null )
{
ExpressionEvaluator exprEvaluator =
new PluginParameterExpressionEvaluator( session, mojoExecution, pathTranslator, logger, mavenProject,
mavenProject.getProperties() );
PropertyHelper propertyHelper = PropertyHelper.getPropertyHelper( antProject );
propertyHelper.setNext( new AntPropertyHelper( exprEvaluator, mavenProject.getArtifacts(), getLog() ) );
}
else
{
unconstructedParts.add( "Maven parameter expression evaluator for Ant properties." );
}
if ( mavenProject != null )
{
// Compile classpath
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 */
scriptInvoker.getReferences().put( "maven.dependency.classpath", p );
antProject.addReference( "maven.dependency.classpath", p );
scriptInvoker.getReferences().put( "maven.compile.classpath", p );
antProject.addReference( "maven.compile.classpath", p );
// Runtime classpath
p = new Path( antProject );
p.setPath( StringUtils.join( mavenProject.getRuntimeClasspathElements().iterator(), File.pathSeparator ) );
scriptInvoker.getReferences().put( "maven.runtime.classpath", p );
antProject.addReference( "maven.runtime.classpath", p );
// Test classpath
p = new Path( antProject );
p.setPath( StringUtils.join( mavenProject.getTestClasspathElements().iterator(), File.pathSeparator ) );
scriptInvoker.getReferences().put( "maven.test.classpath", p );
antProject.addReference( "maven.test.classpath", p );
}
else
{
unconstructedParts.add( "Maven standard project-based classpath references." );
}
if ( mojoExecution != null )
{
// Plugin dependency classpath
Path p = getPathFromArtifacts( mojoExecution.getMojoDescriptor().getPluginDescriptor().getArtifacts(), antProject );
scriptInvoker.getReferences().put( "maven.plugin.classpath", p );
antProject.addReference( "maven.plugin.classpath", p );
}
else
{
unconstructedParts.add( "Maven standard plugin-based classpath references." );
}
}
catch ( DependencyResolutionRequiredException e )
{
throw new MojoExecutionException( "Error creating classpath references for Ant-based plugin scripts.", e );
}
}
public Path getPathFromArtifacts( Collection artifacts,
Project antProject )
throws DependencyResolutionRequiredException
{
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;
}
public Project getAntProject()
{
return antProject;
}
public void setAntProject( Project antProject )
{
this.antProject = antProject;
}
public MavenProject getMavenProject()
{
return mavenProject;
}
public void setMavenProject( MavenProject mavenProject )
{
this.mavenProject = mavenProject;
}
public MojoExecution getMojoExecution()
{
return mojoExecution;
}
public void setMojoExecution( MojoExecution mojoExecution )
{
this.mojoExecution = mojoExecution;
}
public MavenSession getSession()
{
return session;
}
public void setSession( MavenSession session )
{
this.session = session;
}
public PathTranslator getPathTranslator()
{
return pathTranslator;
}
public void setPathTranslator( PathTranslator pathTranslator )
{
this.pathTranslator = pathTranslator;
}
public AntScriptInvoker getScriptInvoker()
{
return scriptInvoker;
}
public void enableLogging( Logger logger )
{
this.logger = logger;
}
}