You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@maven.apache.org by jd...@apache.org on 2005/08/16 18:21:46 UTC

svn commit: r233012 - in /maven/components/trunk/maven-plugins/maven-assembly-plugin: ./ src/main/java/org/apache/maven/plugin/assembly/

Author: jdcasey
Date: Tue Aug 16 09:21:39 2005
New Revision: 233012

URL: http://svn.apache.org/viewcvs?rev=233012&view=rev
Log:
Applying patch from Jason Grant for unpacking assemblies and for attaching assemblies as attached artifacts - Thanks, Jason

Added:
    maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AbstractUnpackingMojo.java   (with props)
    maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/UnpackMojo.java   (with props)
Modified:
    maven/components/trunk/maven-plugins/maven-assembly-plugin/pom.xml
    maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblyMojo.java

Modified: maven/components/trunk/maven-plugins/maven-assembly-plugin/pom.xml
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-assembly-plugin/pom.xml?rev=233012&r1=233011&r2=233012&view=diff
==============================================================================
--- maven/components/trunk/maven-plugins/maven-assembly-plugin/pom.xml (original)
+++ maven/components/trunk/maven-plugins/maven-assembly-plugin/pom.xml Tue Aug 16 09:21:39 2005
@@ -37,6 +37,11 @@
       <version>2.0-beta-1-SNAPSHOT</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-project</artifactId>
+      <version>2.0-beta-1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
       <groupId>plexus</groupId>
       <artifactId>plexus-archiver</artifactId>
       <version>1.0-alpha-1</version>

Added: maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AbstractUnpackingMojo.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AbstractUnpackingMojo.java?rev=233012&view=auto
==============================================================================
--- maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AbstractUnpackingMojo.java (added)
+++ maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AbstractUnpackingMojo.java Tue Aug 16 09:21:39 2005
@@ -0,0 +1,126 @@
+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 java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.apache.maven.plugin.AbstractMojo;
+import org.codehaus.plexus.util.IOUtil;
+
+/**
+ * Base routines for assembly and unpack goals
+ *
+ * @version $Id$
+ */
+public abstract class AbstractUnpackingMojo
+    extends AbstractMojo
+{
+    static protected final String[] EMPTY_STRING_ARRAY = {};
+
+    /**
+     * @parameter expression="${project.build.directory}"
+     * @required
+     */
+    protected File outputDirectory;
+
+    /**
+     * @parameter expression="${project.build.finalName}"
+     * @required
+     */
+    protected String finalName;
+
+    /**
+     * @parameter expression="${project.artifacts}"
+     * @readonly
+     */
+    protected Set dependencies;
+
+    /**
+	 * Directory to unpack JARs into if needed
+	 * @parameter  expression="${project.build.directory}/assembly/work"
+	 * @required
+	 */
+	protected File workDirectory;
+
+	protected void unpack(File file, File location) throws IOException {
+		String fileName = file.getAbsolutePath().toLowerCase().trim();
+		// Should be checking for '.' too?
+		// Not doing this to be consistent with existing code
+		if ( fileName.endsWith( "jar" ) )
+		{
+			unpackJar( file, location );
+		}
+		else if( fileName.endsWith( "zip" ) )
+		{
+			unpackZip( file, location );
+		}
+	}
+
+	private void unpackJar( File file, File tempLocation )
+	    throws IOException
+	{
+	    if ( !file.getAbsolutePath().toLowerCase().trim().endsWith( "jar" ) )
+	    {
+	        getLog().warn( "Trying to unpack a non-jar file " + file.getAbsolutePath() + " - IGNORING" );
+	        return;
+	    }
+	
+	    JarFile jar = new JarFile( file );
+	    for ( Enumeration e = jar.entries(); e.hasMoreElements(); )
+	    {
+	        JarEntry entry = (JarEntry) e.nextElement();
+	
+	        if ( !entry.isDirectory() )
+	        {
+	            File outFile = new File( tempLocation, entry.getName() );
+	            outFile.getParentFile().mkdirs();
+	            IOUtil.copy( jar.getInputStream( entry ), new FileOutputStream( outFile ) );
+	        }
+	    }
+	}
+
+	private void unpackZip(File file, File tempLocation) throws IOException {
+	    if ( !file.getAbsolutePath().toLowerCase().trim().endsWith( "zip" ) )
+	    {
+	        getLog().warn( "Trying to unpack a non-zip file " + file.getAbsolutePath() + " - IGNORING" );
+	        return;
+	    }
+	
+	    ZipFile zip = new ZipFile( file );
+	    for ( Enumeration e = zip.entries(); e.hasMoreElements(); )
+	    {
+	        ZipEntry entry = (ZipEntry) e.nextElement();
+	
+	        if ( !entry.isDirectory() )
+	        {
+	            File outFile = new File( tempLocation, entry.getName() );
+	            outFile.getParentFile().mkdirs();
+	            IOUtil.copy( zip.getInputStream( entry ), new FileOutputStream( outFile ) );
+	        }
+	    }
+	}
+
+
+}

Propchange: maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AbstractUnpackingMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AbstractUnpackingMojo.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblyMojo.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblyMojo.java?rev=233012&r1=233011&r2=233012&view=diff
==============================================================================
--- maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblyMojo.java (original)
+++ maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblyMojo.java Tue Aug 16 09:21:39 2005
@@ -17,17 +17,18 @@
  */
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
 import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter;
 import org.apache.maven.artifact.resolver.filter.IncludesArtifactFilter;
 import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
-import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 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.apache.maven.project.MavenProject;
 import org.codehaus.plexus.archiver.Archiver;
 import org.codehaus.plexus.archiver.ArchiverException;
 import org.codehaus.plexus.archiver.jar.JarArchiver;
@@ -37,19 +38,14 @@
 import org.codehaus.plexus.util.introspection.ReflectionValueExtractor;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -64,410 +60,384 @@
  * @execute phase="package"
  */
 public class AssemblyMojo
-    extends AbstractMojo
+    extends AbstractUnpackingMojo
 {
-    private static final String[] EMPTY_STRING_ARRAY = {};
 
+	/**
+	 * @parameter expression="${maven.assembly.descriptorId}"
+	 */
+	protected String descriptorId;
+	/**
+	 * @parameter expression="${maven.assembly.descriptor}"
+	 */
+	protected File descriptor;
+	/**
+	 * @parameter expression="${basedir}"
+	 * @required
+	 * @readonly
+	 */
+	private String basedir;
+	
     /**
-     * @parameter expression="${basedir}"
+     * @parameter expression="${project}"
      * @required
      * @readonly
      */
-    private String basedir;
+    private MavenProject project;
 
     /**
-     * @parameter expression="${project.build.directory}"
+     * @parameter expression="${component.org.apache.maven.artifact.factory.ArtifactFactory}"
      * @required
-     */
-    private File outputDirectory;
-
-    /**
-     * @parameter expression="${maven.assembly.descriptor}"
-     */
-    private File descriptor;
-
-    /**
-     * @parameter expression="${maven.assembly.descriptorId}"
-     */
-    private String descriptorId;
-
-    /**
-     * @parameter expression="${project.build.finalName}"
-     * @required
-     */
-    private String finalName;
-
-    /**
-     * @parameter expression="${project.artifacts}"
      * @readonly
      */
-    private Set dependencies;
-
-    /**
-     * Directory to unpack JARs into if needed
-     *
-     * @parameter expression="${project.build.directory}/assembly/work"
-     * @required
-     */
-    private File workDirectory;
-
-    public void execute()
-        throws MojoExecutionException
-    {
-        try
-        {
-            doExecute();
-        }
-        catch ( Exception e )
-        {
-            // TODO: don't catch exception
-            throw new MojoExecutionException( "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 )
-            {
-                throw new MojoExecutionException( "Descriptor with ID '" + descriptorId + "' not found" );
-            }
-            r = new InputStreamReader( resourceAsStream );
-        }
-        else
-        {
-            // TODO: better exception
-            throw new MojoExecutionException( "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(), assembly.isIncludeBaseDirectory() );
-                processDependencySets( archiver, assembly.getDependencySets(), assembly.isIncludeBaseDirectory() );
-
-                archiver.setDestFile( new File( outputDirectory, filename ) );
-                archiver.createArchive();
-            }
-        }
-        finally
-        {
-            IOUtil.close( r );
-        }
-    }
-
-    private void processDependencySets( Archiver archiver, List dependencySets, boolean includeBaseDirectory )
-        throws ArchiverException, IOException, Exception
-    {
-        for ( Iterator i = dependencySets.iterator(); i.hasNext(); )
-        {
-            DependencySet dependencySet = (DependencySet) i.next();
-            String output = dependencySet.getOutputDirectory();
-            output = getOutputDirectory( output, includeBaseDirectory );
-
-            AndArtifactFilter filter = new AndArtifactFilter();
-            filter.add( new ScopeArtifactFilter( dependencySet.getScope() ) );
-            if ( !dependencySet.getIncludes().isEmpty() )
-            {
-                filter.add( new IncludesArtifactFilter( dependencySet.getIncludes() ) );
-            }
-            if ( !dependencySet.getExcludes().isEmpty() )
-            {
-                filter.add( new ExcludesArtifactFilter( dependencySet.getExcludes() ) );
-            }
-
-            // TODO: includes and excludes
-            for ( Iterator j = dependencies.iterator(); j.hasNext(); )
-            {
-                Artifact artifact = (Artifact) j.next();
-
-                if ( filter.include( artifact ) )
-                {
-                    String name = artifact.getFile().getName();
-                    if ( dependencySet.isUnpack() )
-                    {
-                        // TODO: something like zipfileset in plexus-archiver
-//                        archiver.addJar(  )
-
-                        File tempLocation = new File( workDirectory, name.substring( 0, name.length() - 4 ) );
-                        boolean process = false;
-                        if ( !tempLocation.exists() )
-                        {
-                            tempLocation.mkdirs();
-                            process = true;
-                        }
-                        else if ( artifact.getFile().lastModified() > tempLocation.lastModified() )
-                        {
-                            process = true;
-                        }
-
-                        if ( process )
-                        {
-                            unpackJar( artifact.getFile(), tempLocation );
-                        }
-                        archiver.addDirectory( tempLocation, null,
-                                               (String[]) getJarExcludes().toArray( EMPTY_STRING_ARRAY ) );
-                    }
-                    else
-                    {
-                        archiver.addFile( artifact.getFile(), output +
-                            evaluateFileNameMapping( dependencySet.getOutputFileNameMapping(), artifact ) );
-                    }
-                }
-            }
-        }
-    }
-
-    private String evaluateFileNameMapping( String expression, Artifact artifact )
-        throws Exception
-    {
-        // this matches the last ${...} string
-        Pattern pat = Pattern.compile( "^(.*)\\$\\{([^\\}]+)\\}(.*)$" );
-        Matcher mat = pat.matcher( expression );
-
-        String left,right;
-        Object middle;
-
-        if ( mat.matches() )
-        {
-            left = evaluateFileNameMapping( mat.group( 1 ), artifact );
-            middle = ReflectionValueExtractor.evaluate( "dep." + mat.group( 2 ), artifact );
-            right = mat.group( 3 );
-
-            if ( middle == null )
-            {
-                // TODO: There should be a more generic way dealing with that. Having magic words is not good at all.
-                // probe for magic word
-                if ( mat.group( 2 ).trim().equals( "extension" ) )
-                {
-                    ArtifactHandler artifactHandler = artifact.getArtifactHandler();
-                    middle = artifactHandler.getExtension();
-                }
-                else
-                {
-                    middle = "${" + mat.group( 2 ) + "}";
-                }
-            }
-
-            return left + middle + right;
-        }
-
-        return expression;
-    }
-
-    private void unpackJar( File file, File tempLocation )
-        throws IOException
-    {
-        if ( !file.getAbsolutePath().toLowerCase().trim().endsWith( "jar" ) )
-        {
-            getLog().warn( "Trying to unpack a none jar file " + file.getAbsolutePath() + " - IGNORING" );
-            return;
-        }
-
-        JarFile jar = new JarFile( file );
-        for ( Enumeration e = jar.entries(); e.hasMoreElements(); )
-        {
-            JarEntry entry = (JarEntry) e.nextElement();
-
-            if ( !entry.isDirectory() )
-            {
-                File outFile = new File( tempLocation, entry.getName() );
-                outFile.getParentFile().mkdirs();
-                IOUtil.copy( jar.getInputStream( entry ), new FileOutputStream( outFile ) );
-            }
-        }
-    }
-
-    private List getJarExcludes()
-    {
-        List l = new ArrayList( getDefaultExcludes() );
-        l.add( "META-INF/**" );
-        return l;
-    }
-
-    private String getOutputDirectory( String output, boolean includeBaseDirectory )
-    {
-        if ( output == null )
-        {
-            output = "";
-        }
-        if ( !output.endsWith( "/" ) && !output.endsWith( "\\" ) )
-        {
-            // TODO: shouldn't archiver do this?
-            output += '/';
-        }
-
-        if ( includeBaseDirectory )
-        {
-            if ( output.startsWith( "/" ) )
-            {
-                output = finalName + output;
-            }
-            else
-            {
-                output = finalName + "/" + output;
-            }
-        }
-        else
-        {
-            if ( output.startsWith( "/" ) )
-            {
-                output = output.substring( 1 );
-            }
-        }
-        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 );
-            }
-
-            // TODO: should be able to do this on a file/dir basis
-            tarArchiver.getOptions().setDirMode( "0700" );
-            tarArchiver.getOptions().setMode( "0700" );
-        }
-        else if ( format.startsWith( "zip" ) )
-        {
-            archiver = new ZipArchiver();
-        }
-        else if ( format.startsWith( "jar" ) )
-        {
-            // TODO: use MavenArchiver for manifest?
-            JarArchiver jarArchiver = new JarArchiver();
-            jarArchiver.setCompress( true );
-            archiver = jarArchiver;
-
-        }
-        else
-        {
-            // TODO: better handling
-            throw new IllegalArgumentException( "Unknown format: " + format );
-        }
-        return archiver;
-    }
-
-    private void processFileSets( Archiver archiver, List fileSets, boolean includeBaseDirecetory )
-        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, includeBaseDirecetory );
-
-            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" );
+    private ArtifactFactory artifactFactory;
 
-        return defaultExcludes;
-    }
+	
 
+	public void execute() throws MojoExecutionException {
+	    try
+	    {
+	        doExecute();
+	    }
+	    catch ( Exception e )
+	    {
+	        // TODO: don't catch exception
+	        throw new MojoExecutionException( "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 )
+	        {
+	            throw new MojoExecutionException( "Descriptor with ID '" + descriptorId + "' not found" );
+	        }
+	        r = new InputStreamReader( resourceAsStream );
+	    }
+	    else
+	    {
+	        // TODO: better exception
+	        throw new MojoExecutionException( "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(), assembly.isIncludeBaseDirectory() );
+	            processDependencySets( archiver, assembly.getDependencySets(), assembly.isIncludeBaseDirectory() );
+	
+	            File destFile = new File( outputDirectory, filename );
+	            archiver.setDestFile( destFile );
+	            archiver.createArchive();
+	            
+	            addAttachedArtifact( destFile , format);
+	        }
+	    }
+	    finally
+	    {
+	        IOUtil.close( r );
+	    }
+	}
+
+	private void addAttachedArtifact(File destFile, String format) {
+		
+        Artifact artifact = artifactFactory.createArtifactWithClassifier( 
+        		project.getGroupId(),
+                project.getArtifactId(),
+                project.getVersion(), 
+                format,
+                null );
+                
+        artifact.setFile( destFile );
+
+        project.addAttachedArtifact( artifact );		
+		
+	}
+
+	private void processDependencySets(Archiver archiver, List dependencySets, boolean includeBaseDirectory) throws ArchiverException, IOException, Exception {
+	        for ( Iterator i = dependencySets.iterator(); i.hasNext(); )
+	        {
+	            DependencySet dependencySet = (DependencySet) i.next();
+	            String output = dependencySet.getOutputDirectory();
+	            output = getOutputDirectory( output, includeBaseDirectory );
+	
+	            AndArtifactFilter filter = new AndArtifactFilter();
+	            filter.add( new ScopeArtifactFilter( dependencySet.getScope() ) );
+	            if ( !dependencySet.getIncludes().isEmpty() )
+	            {
+	                filter.add( new IncludesArtifactFilter( dependencySet.getIncludes() ) );
+	            }
+	            if ( !dependencySet.getExcludes().isEmpty() )
+	            {
+	                filter.add( new ExcludesArtifactFilter( dependencySet.getExcludes() ) );
+	            }
+	
+	            // TODO: includes and excludes
+	            for ( Iterator j = dependencies.iterator(); j.hasNext(); )
+	            {
+	                Artifact artifact = (Artifact) j.next();
+	
+	                if ( filter.include( artifact ) )
+	                {
+	                    String name = artifact.getFile().getName();
+	                    if ( dependencySet.isUnpack() )
+	                    {
+	                        // TODO: something like zipfileset in plexus-archiver
+	//                        archiver.addJar(  )
+	
+	                        File tempLocation = new File( workDirectory, name.substring( 0, name.length() - 4 ) );
+	                        boolean process = false;
+	                        if ( !tempLocation.exists() )
+	                        {
+	                            tempLocation.mkdirs();
+	                            process = true;
+	                        }
+	                        else if ( artifact.getFile().lastModified() > tempLocation.lastModified() )
+	                        {
+	                            process = true;
+	                        }
+	
+	                        if ( process )
+	                        {
+	                            unpack( artifact.getFile(), tempLocation );
+	                        }
+	                        archiver.addDirectory( tempLocation, null,
+	                                               (String[]) getJarExcludes().toArray( EMPTY_STRING_ARRAY ) );
+	                    }
+	                    else
+	                    {
+	                        archiver.addFile( artifact.getFile(), output +
+	                            evaluateFileNameMapping( dependencySet.getOutputFileNameMapping(), artifact ) );
+	                    }
+	                }
+	            }
+	        }
+	    }
+
+	private void processFileSets(Archiver archiver, List fileSets, boolean includeBaseDirecetory) 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, includeBaseDirecetory );
+	
+	        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 );
+	    }
+	}
+	
+	private String evaluateFileNameMapping( String expression, Artifact artifact )
+    throws Exception
+	{
+	    // this matches the last ${...} string
+	    Pattern pat = Pattern.compile( "^(.*)\\$\\{([^\\}]+)\\}(.*)$" );
+	    Matcher mat = pat.matcher( expression );
+	
+	    String left,right;
+	    Object middle;
+	
+	    if ( mat.matches() )
+	    {
+	        left = evaluateFileNameMapping( mat.group( 1 ), artifact );
+	        middle = ReflectionValueExtractor.evaluate( "dep." + mat.group( 2 ), artifact );
+	        right = mat.group( 3 );
+	
+	        if ( middle == null )
+	        {
+	            // TODO: There should be a more generic way dealing with that. Having magic words is not good at all.
+	            // probe for magic word
+	            if ( mat.group( 2 ).trim().equals( "extension" ) )
+	            {
+	                ArtifactHandler artifactHandler = artifact.getArtifactHandler();
+	                middle = artifactHandler.getExtension();
+	            }
+	            else
+	            {
+	                middle = "${" + mat.group( 2 ) + "}";
+	            }
+	        }
+	
+	        return left + middle + right;
+	    }
+	
+	    return expression;
+	}
+	
+	private List getJarExcludes()
+	{
+	    List l = new ArrayList( getDefaultExcludes() );
+	    l.add( "META-INF/**" );
+	    return l;
+	}
+	
+	private String getOutputDirectory( String output, boolean includeBaseDirectory )
+	{
+	    if ( output == null )
+	    {
+	        output = "";
+	    }
+	    if ( !output.endsWith( "/" ) && !output.endsWith( "\\" ) )
+	    {
+	        // TODO: shouldn't archiver do this?
+	        output += '/';
+	    }
+	
+	    if ( includeBaseDirectory )
+	    {
+	        if ( output.startsWith( "/" ) )
+	        {
+	            output = finalName + output;
+	        }
+	        else
+	        {
+	            output = finalName + "/" + output;
+	        }
+	    }
+	    else
+	    {
+	        if ( output.startsWith( "/" ) )
+	        {
+	            output = output.substring( 1 );
+	        }
+	    }
+	    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 );
+	        }
+	
+	        // TODO: should be able to do this on a file/dir basis
+	        tarArchiver.getOptions().setDirMode( "0700" );
+	        tarArchiver.getOptions().setMode( "0700" );
+	    }
+	    else if ( format.startsWith( "zip" ) )
+	    {
+	        archiver = new ZipArchiver();
+	    }
+	    else if ( format.startsWith( "jar" ) )
+	    {
+	        // TODO: use MavenArchiver for manifest?
+	        JarArchiver jarArchiver = new JarArchiver();
+	        jarArchiver.setCompress( true );
+	        archiver = jarArchiver;
+	
+	    }
+	    else
+	    {
+	        // TODO: better handling
+	        throw new IllegalArgumentException( "Unknown format: " + format );
+	    }
+	    return archiver;
+	}
+	
+	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;
+	}
+	
 }

Added: maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/UnpackMojo.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/UnpackMojo.java?rev=233012&view=auto
==============================================================================
--- maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/UnpackMojo.java (added)
+++ maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/UnpackMojo.java Tue Aug 16 09:21:39 2005
@@ -0,0 +1,76 @@
+package org.apache.maven.plugin.assembly;
+
+import java.io.File;
+import java.util.Iterator;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.plugin.MojoExecutionException;
+
+/*
+ * 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.
+ */
+
+
+/**
+ * Unpack project dependencies.  Currently supports dependencies of type jar and zip.
+ *
+ * @version $Id$
+ * @goal unpack
+ * @requiresDependencyResolution test
+ */
+public class UnpackMojo
+    extends AbstractUnpackingMojo
+{
+
+	public void execute() throws MojoExecutionException {
+	    try
+	    {
+	        doExecute();
+	    }
+	    catch ( Exception e )
+	    {
+	        // TODO: don't catch exception
+	        throw new MojoExecutionException( "Error unpacking", e );
+	    }
+	}
+
+	private void doExecute() throws Exception {
+
+        for ( Iterator j = dependencies.iterator(); j.hasNext(); )
+        {
+            Artifact artifact = (Artifact) j.next();
+
+            String name = artifact.getFile().getName();
+            
+            File tempLocation = new File( workDirectory, name.substring( 0, name.length() - 4 ) );
+            boolean process = false;
+            if ( !tempLocation.exists() )
+            {
+                tempLocation.mkdirs();
+                process = true;
+            }
+            else if ( artifact.getFile().lastModified() > tempLocation.lastModified() )
+            {
+                process = true;
+            }
+
+            if ( process )
+            {
+            	File file = artifact.getFile();
+            	unpack(file, tempLocation);
+            }
+        }            
+	}
+}
\ No newline at end of file

Propchange: maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/UnpackMojo.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-plugins/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/UnpackMojo.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org