blob: 59624fb69d53c3a55dbf753252df339e53dba16b [file] [log] [blame]
package org.apache.maven.plugin.assembly;
/*
* 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.handler.ArtifactHandler;
import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
import org.apache.maven.artifact.versioning.VersionRange;
import org.apache.maven.model.Model;
import org.apache.maven.plugin.Mojo;
import org.apache.maven.plugin.testing.AbstractMojoTestCase;
import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
import org.codehaus.plexus.archiver.Archiver;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.UnArchiver;
import org.codehaus.plexus.archiver.manager.ArchiverManager;
import org.codehaus.plexus.archiver.manager.NoSuchArchiverException;
import org.codehaus.plexus.util.DirectoryScanner;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.StringUtils;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/**
* Test common features of all assembly mojos.
*
* @todo Switch to use test-only mojos, once we can generate descriptors for those...
*/
public class BasicAbstractAssemblyMojoFeaturesTest
extends AbstractMojoTestCase
{
public void testOutputFileNameMapping() throws Exception
{
String pluginConfig = "outputFileNameMapping-pluginConfig.xml";
List requiredDependencies = new ArrayList();
requiredDependencies.add( "dependencies/test.jar" );
requiredDependencies.add( "dependencies/test2.jar" );
Mojo mojo = run( pluginConfig, "directory-inline" );
assertFilesAdded( mojo, requiredDependencies );
}
public void testModuleSetSourceIncludedBinariesNotIncluded() throws Exception
{
String pluginConfig = "moduleSetSourceIncludedBinariesNotIncluded-pluginConfig.xml";
Mojo mojo = run( pluginConfig, "attached" );
List required = Collections.singletonList( "sources/module1/src/main/java/org/test/module1/App.java" );
assertFilesAdded( mojo, required );
}
private Mojo run( String pluginConfig, String mojoName ) throws Exception
{
String pluginConfigResource = "basicAbstractAssemblyMojoFeaturesTest/" + pluginConfig;
File pluginConfigFile = new File( getBasedir(), "src/test/plugin-configs/" + pluginConfigResource );
assertTrue( "Cannot find plugin-configuration: \'" + pluginConfigResource + "\' in context-classloader\'s classpath.", pluginConfigFile.exists() );
// TODO: Need to replace this with test-only mojos...
Mojo mojo = (Mojo) lookupMojo( mojoName, pluginConfigFile.getAbsolutePath() );
FileLoggingArchiverManagerStub archiverManager = (FileLoggingArchiverManagerStub) getVariableValueFromObject( mojo, "archiverManager" );
archiverManager.clearArchiver();
mojo.execute();
return mojo;
}
private void assertFilesAdded( Mojo mojo, List requiredDependencies ) throws Exception
{
FileLoggingArchiverManagerStub archiverManager = (FileLoggingArchiverManagerStub) getVariableValueFromObject( mojo, "archiverManager" );
FileLoggingArchiverStub archiver = (FileLoggingArchiverStub) archiverManager.getArchiver( (File)null );
Set addedFiles = archiver.getAddedFiles();
System.out.println( "The following files were added to the test assembly:\n" + addedFiles.toString().replace(',', '\n' ) );
for ( Iterator it = requiredDependencies.iterator(); it.hasNext(); )
{
String targetPath = (String) it.next();
assertTrue( "Required dependency path missing: \'" + targetPath + "\'", addedFiles.contains( targetPath ) );
}
}
public static final class BasedirSettableMavenProjectStub extends MavenProjectStub
{
File basedir;
public File getBasedir()
{
return basedir;
}
public void setBasedir( File basedir )
{
this.basedir = basedir;
}
}
public static final class FileLoggingArchiverManagerStub
implements ArchiverManager
{
private FileLoggingArchiverStub archiverStub;
public Archiver getArchiver( String string ) throws NoSuchArchiverException
{
if ( archiverStub == null )
{
archiverStub = new FileLoggingArchiverStub();
}
return archiverStub;
}
void clearArchiver()
{
archiverStub = null;
}
public UnArchiver getUnArchiver( String arg0 ) throws NoSuchArchiverException
{
// TODO Auto-generated method stub
return null;
}
public UnArchiver getUnArchiver( File arg0 ) throws NoSuchArchiverException
{
// TODO Auto-generated method stub
return null;
}
public Archiver getArchiver( File arg0 ) throws NoSuchArchiverException
{
// TODO Auto-generated method stub
return null;
}
}
public static final class FileLoggingArchiverStub
implements Archiver
{
private Set files = new LinkedHashSet();
private DirectoryScanner scanner = new DirectoryScanner();
public void addFile( File file, String targetPath, int mode ) throws ArchiverException
{
files.add( targetPath );
}
public void addFile( File file, String targetPath ) throws ArchiverException
{
files.add( targetPath );
}
public Set getAddedFiles()
{
return files;
}
public void addDirectory( File dir ) throws ArchiverException
{
System.out.println( "Add dir 1" );
addDirectory_( dir, null, null, null );
}
public void addDirectory( File dir, String prefix ) throws ArchiverException
{
System.out.println( "Add dir 2" );
addDirectory_( dir, prefix, null, null );
}
public void addDirectory( File dir, String[] includes, String[] excludes ) throws ArchiverException
{
System.out.println( "Add dir 3" );
addDirectory_( dir, null, includes, excludes );
}
public void addDirectory( File dir, String prefix, String[] includes, String[] excludes ) throws ArchiverException
{
System.out.println( "Add dir 3" );
addDirectory_( dir, prefix, includes, excludes );
}
private void addDirectory_( File dir, String prefix, String[] includes, String[] excludes ) throws ArchiverException
{
try
{
String include = StringUtils.join( includes, "," );
String exclude = StringUtils.join( excludes, "," );
String prepend = prefix;
if ( prepend != null && !prepend.endsWith( "/" ) )
{
prepend += "/";
}
System.out.println( "Scanning: " + dir + "\nwith includes: " + include + "\nand excludes: " + exclude + "\nand prepending dir prefix: " + prepend );
List fileNames = FileUtils.getFileNames( dir, include, exclude, false );
for ( Iterator it = fileNames.iterator(); it.hasNext(); )
{
String name = (String) it.next();
String fn = prepend + dir.getPath() + "/" + name;
fn.replace( '\\', '/' );
System.out.println( "Adding: " + fn );
files.add( fn );
}
}
catch ( IOException e )
{
throw new ArchiverException( "Error scanning for file names.", e );
}
}
public void createArchive() throws ArchiverException, IOException
{
// TODO Auto-generated method stub
}
public int getDefaultDirectoryMode()
{
// TODO Auto-generated method stub
return 0;
}
public int getDefaultFileMode()
{
// TODO Auto-generated method stub
return 0;
}
public File getDestFile()
{
// TODO Auto-generated method stub
return null;
}
public Map getFiles()
{
// TODO Auto-generated method stub
return null;
}
public boolean getIncludeEmptyDirs()
{
// TODO Auto-generated method stub
return false;
}
public void setDefaultDirectoryMode( int arg0 )
{
// TODO Auto-generated method stub
}
public void setDefaultFileMode( int arg0 )
{
// TODO Auto-generated method stub
}
public void setDestFile( File arg0 )
{
// TODO Auto-generated method stub
}
public void setIncludeEmptyDirs( boolean arg0 )
{
// TODO Auto-generated method stub
}
}
public static final class TwoDependencyReactorProjectStub
extends MavenProjectStub
{
private String groupId = "org.test.project";
private String artifactId = "test-project";
private String version = "1";
private String packaging = "jar";
private String scope = "compile";
private String depOneArtifactId;
private String depOneGroupId;
private String depOneVersion;
private String depOneType = "jar";
private String depOneScope = "compile";
private File depOneFile;
private String depTwoArtifactId;
private String depTwoGroupId;
private String depTwoVersion;
private String depTwoType = "jar";
private String depTwoScope = "compile";
private File depTwoFile;
private LinkedHashSet artifacts;
public Set getArtifacts()
{
artifacts = new LinkedHashSet();
addArtifact( depOneGroupId, depOneArtifactId, depOneVersion, depOneType, depOneScope, depOneFile );
addArtifact( depTwoGroupId, depTwoArtifactId, depTwoVersion, depTwoType, depTwoScope, depTwoFile );
return artifacts;
}
private void addArtifact( String groupId, String artifactId, String version, String type, String scope, File file )
{
Artifact artifact = new HandlerEquippedArtifactStub( groupId, artifactId, version, type, scope );
artifact.setFile( file );
artifacts .add( artifact );
}
public Artifact getArtifact()
{
return new HandlerEquippedArtifactStub( groupId, artifactId, version, packaging, scope );
}
public TwoDependencyReactorProjectStub()
{
Model model = getModel();
if( model == null )
{
model = new Model();
setModel( model );
}
Properties props = model.getProperties();
if ( props == null )
{
props = new Properties();
model.setProperties( props );
}
}
}
public static final class HandlerEquippedArtifactStub implements Artifact
{
private String type;
private String artifactId;
private String groupId;
private String version;
private String classifier;
private String scope;
private File file;
public HandlerEquippedArtifactStub( String groupId, String artifactId, String version, String type, String scope )
{
this.groupId = groupId;
this.artifactId = artifactId;
this.version = version;
this.type = type;
this.scope = scope;
}
public HandlerEquippedArtifactStub()
{
}
public ArtifactHandler getArtifactHandler()
{
ArtifactHandler handler = new ArtifactHandler()
{
public String getClassifier()
{
return classifier;
}
public String getDirectory()
{
return null;
}
public String getExtension()
{
return type;
}
public String getLanguage()
{
return "java";
}
public String getPackaging()
{
return type;
}
public boolean isAddedToClasspath()
{
return true;
}
public boolean isIncludesDependencies()
{
return true;
}
};
return handler;
}
public void addMetadata( ArtifactMetadata arg0 )
{
// TODO Auto-generated method stub
}
public String getArtifactId()
{
return artifactId;
}
public List getAvailableVersions()
{
return Collections.singletonList( version );
}
public String getBaseVersion()
{
return version;
}
public String getClassifier()
{
return classifier;
}
public String getDependencyConflictId()
{
return groupId + ":" + artifactId + ":" + type + ":" + version;
}
public ArtifactFilter getDependencyFilter()
{
// TODO Auto-generated method stub
return null;
}
public List getDependencyTrail()
{
// TODO Auto-generated method stub
return null;
}
public String getDownloadUrl()
{
// TODO Auto-generated method stub
return null;
}
public File getFile()
{
return file;
}
public String getGroupId()
{
return groupId;
}
public String getId()
{
return getDependencyConflictId() + ":" + scope;
}
public Collection getMetadataList()
{
return null;
}
public ArtifactRepository getRepository()
{
return null;
}
public String getScope()
{
return scope;
}
public ArtifactVersion getSelectedVersion() throws OverConstrainedVersionException
{
return null;
}
public String getType()
{
return type;
}
public String getVersion()
{
return version;
}
public VersionRange getVersionRange()
{
return VersionRange.createFromVersion( version );
}
public boolean hasClassifier()
{
return classifier != null;
}
public boolean isOptional()
{
return false;
}
public boolean isRelease()
{
return false;
}
public boolean isResolved()
{
return true;
}
public boolean isSelectedVersionKnown() throws OverConstrainedVersionException
{
return true;
}
public boolean isSnapshot()
{
return false;
}
public void selectVersion( String arg0 )
{
}
public void setArtifactHandler( ArtifactHandler arg0 )
{
}
public void setArtifactId( String artifactId )
{
this.artifactId = artifactId;
}
public void setAvailableVersions( List arg0 )
{
}
public void setBaseVersion( String version )
{
this.version = version;
}
public void setDependencyFilter( ArtifactFilter arg0 )
{
}
public void setDependencyTrail( List arg0 )
{
}
public void setDownloadUrl( String arg0 )
{
}
public void setFile( File file )
{
this.file = file;
if ( file.exists() )
{
Writer writer = null;
try
{
writer = new FileWriter( file );
writer.write( "test artifact" );
}
catch ( IOException e )
{
IllegalArgumentException error = new IllegalArgumentException( "Cannot write test file: " + file + ". Reason: " + e.getMessage() );
error.initCause( e );
throw error;
}
finally
{
IOUtil.close( writer );
}
}
}
public void setGroupId( String groupId )
{
this.groupId = groupId;
}
public void setRelease( boolean arg0 )
{
}
public void setRepository( ArtifactRepository arg0 )
{
}
public void setResolved( boolean arg0 )
{
}
public void setResolvedVersion( String version )
{
this.version = version;
}
public void setScope( String scope )
{
this.scope = scope;
}
public void setVersion( String version )
{
this.version = version;
}
public void setVersionRange( VersionRange arg0 )
{
}
public void updateVersion( String arg0, ArtifactRepository arg1 )
{
}
public int compareTo( Object o )
{
return 0;
}
public void setOptional( boolean optional )
{
}
}
}