brett 2005/04/05 23:23:44
Added: maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly AssemblyMojo.java Removed: maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly AssembleMojo.java Log: rename assembly plugin Revision Changes Path 1.1 maven-components/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblyMojo.java Index: AssemblyMojo.java =================================================================== package org.apache.maven.plugin.assembly; /* * Copyright 2001-2005 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. */ import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; import org.apache.maven.plugin.AbstractPlugin; import org.apache.maven.plugin.PluginExecutionException; import org.apache.maven.plugins.assembly.model.Assembly; import org.apache.maven.plugins.assembly.model.DependencySet; import org.apache.maven.plugins.assembly.model.FileSet; import org.apache.maven.plugins.assembly.model.io.xpp3.AssemblyXpp3Reader; import org.codehaus.plexus.archiver.Archiver; import org.codehaus.plexus.archiver.ArchiverException; import org.codehaus.plexus.archiver.jar.JarArchiver; import org.codehaus.plexus.archiver.tar.TarArchiver; import org.codehaus.plexus.archiver.zip.ZipArchiver; import org.codehaus.plexus.util.IOUtil; import java.io.File; import java.io.FileReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; /** * @author <a href="mailto:[EMAIL PROTECTED]">Brett Porter</a> * @version $Id: AssemblyMojo.java,v 1.1 2005/04/06 06:23:44 brett Exp $ * @goal assembly * @requiresDependencyResolution test * @description assemble an application bundle or distribution * @parameter name="basedir" type="String" required="true" validator="" expression="#basedir" description="" * @parameter name="outputDirectory" type="java.io.File" required="true" validator="" expression="#project.build.directory" description="" * @parameter name="descriptor" type="java.io.File" required="false" validator="" expression="#maven.assembly.descriptor" description="" * @parameter name="finalName" type="String" required="true" validator="" expression="#project.build.finalName" description="" * @parameter name="descriptorId" type="String" required="false" validator="" expression="#maven.assembly.descriptorId" description="" * @parameter name="dependencies" type="java.util.Set" required="false" validator="" expression="#project.artifacts" description="" */ public class AssemblyMojo extends AbstractPlugin { private static final String[] EMPTY_STRING_ARRAY = {}; private String basedir; /** * @todo use java.io.File */ private String outputDirectory; private File descriptor; private String descriptorId; private String finalName; private Set dependencies; public void execute() throws PluginExecutionException { try { doExecute(); } catch ( Exception e ) { // TODO: don't catch exception throw new PluginExecutionException( "Error creating assembly", e ); } } private void doExecute() throws Exception { Reader r = null; if ( descriptor != null ) { r = new FileReader( descriptor ); } else if ( descriptorId != null ) { InputStream resourceAsStream = getClass().getResourceAsStream( "/assemblies/" + descriptorId + ".xml" ); if ( resourceAsStream == null ) { // TODO: better exception throw new Exception( "Descriptor with ID '" + descriptorId + "' not found" ); } r = new InputStreamReader( resourceAsStream ); } else { // TODO: better exception throw new Exception( "You must specify descriptor or descriptorId" ); } try { AssemblyXpp3Reader reader = new AssemblyXpp3Reader(); Assembly assembly = reader.read( r ); // TODO: include dependencies marked for distribution under certain formats // TODO: how, might we plug this into an installer, such as NSIS? // TODO: allow file mode specifications? String fullName = finalName + "-" + assembly.getId(); for ( Iterator i = assembly.getFormats().iterator(); i.hasNext(); ) { String format = (String) i.next(); String filename = fullName + "." + format; // TODO: use component roles? Can we do that in a mojo? Archiver archiver = createArchiver( format ); processFileSets( archiver, assembly.getFileSets() ); processDependencySets( archiver, assembly.getDependencySets() ); archiver.setDestFile( new File( outputDirectory, filename ) ); archiver.createArchive(); } } finally { IOUtil.close( r ); } } private void processDependencySets( Archiver archiver, List dependencySets ) throws ArchiverException { for ( Iterator i = dependencySets.iterator(); i.hasNext(); ) { DependencySet depedencySet = (DependencySet) i.next(); String output = depedencySet.getOutputDirectory(); output = getOutputDirectory( output ); AndArtifactFilter filter = new AndArtifactFilter(); filter.add( new ScopeArtifactFilter( depedencySet.getScope() ) ); if ( !depedencySet.getIncludes().isEmpty() ) { filter.add( new IncludesArtifactFilter( depedencySet.getIncludes() ) ); } if ( !depedencySet.getExcludes().isEmpty() ) { filter.add( new ExcludesArtifactFilter( depedencySet.getExcludes() ) ); } // TODO: includes and excludes for ( Iterator j = dependencies.iterator(); j.hasNext(); ) { Artifact artifact = (Artifact) j.next(); if ( filter.include( artifact ) ) { archiver.addFile( artifact.getFile(), output + artifact.getFile().getName() ); } } } } private String getOutputDirectory( String output ) { if ( output == null ) { output = ""; } if ( !output.endsWith( "/" ) && !output.endsWith( "\\" ) ) { // TODO: shouldn't archiver do this? output += '/'; } if ( output.startsWith( "/" ) ) { output = finalName + output; } else { output = finalName + "/" + output; } return output; } private Archiver createArchiver( String format ) throws ArchiverException { Archiver archiver; if ( format.startsWith( "tar" ) ) { TarArchiver tarArchiver = new TarArchiver(); archiver = tarArchiver; int index = format.indexOf( '.' ); if ( index >= 0 ) { // TODO: this needs a cleanup in plexus archiver - use a real typesafe enum TarArchiver.TarCompressionMethod tarCompressionMethod = new TarArchiver.TarCompressionMethod(); // TODO: this should accept gz and bz2 as well so we can skip over the switch String compression = format.substring( index + 1 ); if ( compression.equals( "gz" ) ) { tarCompressionMethod.setValue( "gzip" ); } else if ( compression.equals( "bz2" ) ) { tarCompressionMethod.setValue( "bzip2" ); } else { // TODO: better handling throw new IllegalArgumentException( "Unknown compression format: " + compression ); } tarArchiver.setCompression( tarCompressionMethod ); } } else if ( format.startsWith( "zip" ) ) { archiver = new ZipArchiver(); } else if ( format.startsWith( "jar" ) ) { // TODO: use MavenArchiver for manifest? archiver = new JarArchiver(); } else { // TODO: better handling throw new IllegalArgumentException( "Unknown format: " + format ); } return archiver; } private void processFileSets( Archiver archiver, java.util.List fileSets ) throws ArchiverException { for ( Iterator i = fileSets.iterator(); i.hasNext(); ) { FileSet fileSet = (FileSet) i.next(); String directory = fileSet.getDirectory(); String output = fileSet.getOutputDirectory(); if ( directory == null ) { directory = basedir; if ( output == null ) { output = ""; } } else { if ( output == null ) { output = directory; } } output = getOutputDirectory( output ); String[] includes = (String[]) fileSet.getIncludes().toArray( EMPTY_STRING_ARRAY ); if ( includes.length == 0 ) { includes = null; } List excludesList = fileSet.getExcludes(); excludesList.addAll( getDefaultExcludes() ); String[] excludes = (String[]) excludesList.toArray( EMPTY_STRING_ARRAY ); // TODO: default excludes should be in the archiver? archiver.addDirectory( new File( directory ), output, includes, excludes ); } } public List getDefaultExcludes() { List defaultExcludes = new ArrayList(); defaultExcludes.add( "**/*~" ); defaultExcludes.add( "**/#*#" ); defaultExcludes.add( "**/.#*" ); defaultExcludes.add( "**/%*%" ); defaultExcludes.add( "**/._*" ); // CVS defaultExcludes.add( "**/CVS" ); defaultExcludes.add( "**/CVS/**" ); defaultExcludes.add( "**/.cvsignore" ); // SCCS defaultExcludes.add( "**/SCCS" ); defaultExcludes.add( "**/SCCS/**" ); // Visual SourceSafe defaultExcludes.add( "**/vssver.scc" ); // Subversion defaultExcludes.add( "**/.svn" ); defaultExcludes.add( "**/.svn/**" ); // Mac defaultExcludes.add( "**/.DS_Store" ); return defaultExcludes; } // TODO: move to maven-artifact - generally useful private static class AndArtifactFilter implements ArtifactFilter { private final List filters = new ArrayList(); public boolean include( Artifact artifact ) { boolean include = true; for ( Iterator i = filters.iterator(); i.hasNext() && include; ) { ArtifactFilter filter = (ArtifactFilter) i.next(); if ( !filter.include( artifact ) ) { include = false; } } return include; } public void add( ArtifactFilter artifactFilter ) { filters.add( artifactFilter ); } } private static class IncludesArtifactFilter implements ArtifactFilter { private final List patterns; public IncludesArtifactFilter( List patterns ) { this.patterns = patterns; } public boolean include( Artifact artifact ) { String id = artifact.getGroupId() + ":" + artifact.getArtifactId(); boolean matched = false; for ( Iterator i = patterns.iterator(); i.hasNext() & !matched; ) { // TODO: what about wildcards? Just specifying groups? versions? if ( id.equals( i.next() ) ) { matched = true; } } return matched; } } private static class ExcludesArtifactFilter extends IncludesArtifactFilter { public ExcludesArtifactFilter( List patterns ) { super( patterns ); } public boolean include( Artifact artifact ) { return !super.include( artifact ); } } }