brett 2005/04/05 22:11:00
Modified: maven-plugins/maven-assemble-plugin/src/main/java/org/apache/maven/plugin/assemble AssembleMojo.java maven-plugins/maven-assemble-plugin/src/main/mdo descriptor.mdo maven-plugins/maven-assemble-plugin/src/main/resources/assemblies bin.xml src.xml maven-plugins/maven-assemble-plugin pom.xml Log: add dependency handling, and make bugfixes to the assemble plugin Revision Changes Path 1.7 +251 -75 maven-components/maven-plugins/maven-assemble-plugin/src/main/java/org/apache/maven/plugin/assemble/AssembleMojo.java Index: AssembleMojo.java =================================================================== RCS file: /home/cvs/maven-components/maven-plugins/maven-assemble-plugin/src/main/java/org/apache/maven/plugin/assemble/AssembleMojo.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- AssembleMojo.java 30 Mar 2005 15:58:52 -0000 1.6 +++ AssembleMojo.java 6 Apr 2005 05:11:00 -0000 1.7 @@ -16,12 +16,17 @@ * 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.assemble.model.Assembly; +import org.apache.maven.plugins.assemble.model.DependencySet; import org.apache.maven.plugins.assemble.model.FileSet; import org.apache.maven.plugins.assemble.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; @@ -32,18 +37,23 @@ 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$ * @goal assemble + * @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.assemble.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.assemble.descriptorId" description="" + * @parameter name="dependencies" type="java.util.Set" required="false" validator="" expression="#project.artifacts" description="" */ public class AssembleMojo extends AbstractPlugin @@ -63,6 +73,8 @@ private String finalName; + private Set dependencies; + public void execute() throws PluginExecutionException { @@ -108,7 +120,7 @@ Assembly assembly = reader.read( r ); // TODO: include dependencies marked for distribution under certain formats - // TODO: how, might we plugin this into an installer, such as NSIS? + // TODO: how, might we plug this into an installer, such as NSIS? // TODO: allow file mode specifications? String fullName = finalName + "-" + assembly.getId(); @@ -120,96 +132,260 @@ String filename = fullName + "." + format; // TODO: use component roles? Can we do that in a mojo? - Archiver archiver; - if ( format.startsWith( "tar" ) ) + 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 ) ) { - 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 ); - } + archiver.addFile( artifact.getFile(), output + artifact.getFile().getName() ); } - else if ( format.startsWith( "zip" ) ) + } + } + } + + 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" ) ) { - archiver = new ZipArchiver(); + tarCompressionMethod.setValue( "gzip" ); } - else if ( format.startsWith( "jar" ) ) + else if ( compression.equals( "bz2" ) ) { - // TODO: use MavenArchiver for manifest? - archiver = new JarArchiver(); + tarCompressionMethod.setValue( "bzip2" ); } else { // TODO: better handling - throw new IllegalArgumentException( "Unknown format: " + format ); + 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; + } - for ( Iterator j = assembly.getFilesets().iterator(); j.hasNext(); ) + 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 ) { - FileSet fileset = (FileSet) j.next(); - String directory = fileset.getDirectory(); - String output = fileset.getOutputDirectory(); - if ( directory == null ) - { - directory = basedir; - if ( output == null ) - { - output = "/"; - } - } - else - { - if ( output == null ) - { - output = directory; - } - } - if ( !output.endsWith( "/" ) && !output.endsWith( "\\" ) ) - { - // TODO: shouldn't archiver do this? - output += '/'; - } - - String[] includes = (String[]) fileset.getIncludes().toArray( EMPTY_STRING_ARRAY ); - if ( includes.length == 0 ) - { - includes = null; - } - String[] excludes = null; - if ( !fileset.getExcludes().isEmpty() ) - { - excludes = (String[]) fileset.getExcludes().toArray( EMPTY_STRING_ARRAY ); - } - // TODO: default excludes? - archiver.addDirectory( new File( directory ), output, includes, excludes ); + output = ""; } + } + else + { + if ( output == null ) + { + output = directory; + } + } + output = getOutputDirectory( output ); - archiver.setDestFile( new File( outputDirectory, filename ) ); - archiver.createArchive(); + 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 ); } - finally + } + + 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 ) { - IOUtil.close( r ); + 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 ); } } } 1.3 +43 -2 maven-components/maven-plugins/maven-assemble-plugin/src/main/mdo/descriptor.mdo Index: descriptor.mdo =================================================================== RCS file: /home/cvs/maven-components/maven-plugins/maven-assemble-plugin/src/main/mdo/descriptor.mdo,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- descriptor.mdo 21 Mar 2005 07:23:48 -0000 1.2 +++ descriptor.mdo 6 Apr 2005 05:11:00 -0000 1.3 @@ -30,14 +30,21 @@ </association> </field> <field> - <name>filesets</name> + <name>fileSets</name> <version>1.0.0</version> - <required>true</required> <association> <type>FileSet</type> <multiplicity>*</multiplicity> </association> </field> + <field> + <name>dependencySets</name> + <version>1.0.0</version> + <association> + <type>DependencySet</type> + <multiplicity>*</multiplicity> + </association> + </field> </fields> </class> <class> @@ -73,6 +80,40 @@ </field> </fields> </class> + <class> + <name>DependencySet</name> + <version>1.0.0</version> + <fields> + <field> + <name>outputDirectory</name> + <version>1.0.0</version> + <type>String</type> + </field> + <field> + <name>scope</name> + <version>1.0.0</version> + <type>String</type> + <defaultValue>runtime</defaultValue> + <required>true</required> + </field> + <field> + <name>includes</name> + <version>1.0.0</version> + <association> + <type>String</type> + <multiplicity>*</multiplicity> + </association> + </field> + <field> + <name>excludes</name> + <version>1.0.0</version> + <association> + <type>String</type> + <multiplicity>*</multiplicity> + </association> + </field> + </fields> + </class> </classes> </model> 1.2 +7 -7 maven-components/maven-plugins/maven-assemble-plugin/src/main/resources/assemblies/bin.xml Index: bin.xml =================================================================== RCS file: /home/cvs/maven-components/maven-plugins/maven-assemble-plugin/src/main/resources/assemblies/bin.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- bin.xml 30 Mar 2005 15:41:23 -0000 1.1 +++ bin.xml 6 Apr 2005 05:11:00 -0000 1.2 @@ -5,22 +5,22 @@ <format>tar.bz2</format> <format>zip</format> </formats> - <filesets> - <fileset> + <fileSets> + <fileSet> <includes> <include>README*</include> <include>LICENSE*</include> <include>NOTICE*</include> </includes> - </fileset> + </fileSet> <!-- TODO: docs? --> - <fileset> + <fileSet> <!-- TODO: use expresssions instead: ${project.build.directory}, ${project.build.finalName} --> <directory>target</directory> - <outputDirectory>/</outputDirectory> + <outputDirectory></outputDirectory> <includes> <include>*.jar</include> </includes> - </fileset> - </filesets> + </fileSet> + </fileSets> </assembly> 1.2 +6 -6 maven-components/maven-plugins/maven-assemble-plugin/src/main/resources/assemblies/src.xml Index: src.xml =================================================================== RCS file: /home/cvs/maven-components/maven-plugins/maven-assemble-plugin/src/main/resources/assemblies/src.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- src.xml 30 Mar 2005 15:58:52 -0000 1.1 +++ src.xml 6 Apr 2005 05:11:00 -0000 1.2 @@ -5,18 +5,18 @@ <format>tar.bz2</format> <format>zip</format> </formats> - <filesets> - <fileset> + <fileSets> + <fileSet> <includes> <include>README*</include> <include>LICENSE*</include> <include>NOTICE*</include> <include>pom.xml</include> </includes> - </fileset> - <fileset> + </fileSet> + <fileSet> <!-- TODO: use expresssions instead: ${project.build.sourceDirectory}, etc --> <directory>src</directory> - </fileset> - </filesets> + </fileSet> + </fileSets> </assembly> 1.9 +5 -0 maven-components/maven-plugins/maven-assemble-plugin/pom.xml Index: pom.xml =================================================================== RCS file: /home/cvs/maven-components/maven-plugins/maven-assemble-plugin/pom.xml,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- pom.xml 6 Apr 2005 01:49:06 -0000 1.8 +++ pom.xml 6 Apr 2005 05:11:00 -0000 1.9 @@ -11,6 +11,11 @@ <version>1.0-SNAPSHOT</version> <dependencies> <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-artifact</artifactId> + <version>2.0-SNAPSHOT</version> + </dependency> + <dependency> <groupId>plexus</groupId> <artifactId>plexus-archiver</artifactId> <version>1.0-alpha-1</version>