You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2006/08/02 02:28:08 UTC

svn commit: r427819 [1/2] - in /maven/plugins/branches/MASSEMBLY-124/src: main/java/org/apache/maven/plugin/assembly/ main/java/org/apache/maven/plugin/assembly/archive/phase/ main/java/org/apache/maven/plugin/assembly/archive/task/ main/java/org/apach...

Author: jdcasey
Date: Tue Aug  1 17:28:06 2006
New Revision: 427819

URL: http://svn.apache.org/viewvc?rev=427819&view=rev
Log:
Almost finished unit testing the assembler phases. Adding more unit tests, a refactoring of the module-set assembler phase, and a few other minor bugfixes.

Added:
    maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/FileItemAssemblyPhaseTest.java   (with props)
    maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/ModuleSetAssemblyPhaseTest.java   (with props)
    maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/RepositoryAssemblyPhaseTest.java   (with props)
Modified:
    maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/AssemblerConfigurationSource.java
    maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/DependencySetAssemblyPhase.java
    maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/FileItemAssemblyPhase.java
    maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/ModuleSetAssemblyPhase.java
    maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/RepositoryAssemblyPhase.java
    maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddArtifactTask.java
    maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddFileSetsTask.java
    maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReader.java
    maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/mojos/AbstractAssemblyMojo.java
    maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/repository/DefaultRepositoryAssembler.java
    maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/utils/FilterUtils.java
    maven/plugins/branches/MASSEMBLY-124/src/main/mdo/component.mdo
    maven/plugins/branches/MASSEMBLY-124/src/main/mdo/descriptor.mdo
    maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/DependencySetAssemblyPhaseTest.java
    maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/FileSetAssemblyPhaseTest.java
    maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/task/AddArtifactTaskTest.java
    maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/task/testutils/MockAndControlForAddArtifactTask.java
    maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/task/testutils/MockAndControlForAddFileSetsTask.java
    maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReaderTest.java
    maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/testutils/TestFileManager.java
    maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/utils/AssemblyFileUtilsTest.java
    maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/utils/FilterUtilsTest.java

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/AssemblerConfigurationSource.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/AssemblerConfigurationSource.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/AssemblerConfigurationSource.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/AssemblerConfigurationSource.java Tue Aug  1 17:28:06 2006
@@ -53,4 +53,6 @@
 
     List getReactorProjects();
 
+    List getRemoteRepositories();
+
 }

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/DependencySetAssemblyPhase.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/DependencySetAssemblyPhase.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/DependencySetAssemblyPhase.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/DependencySetAssemblyPhase.java Tue Aug  1 17:28:06 2006
@@ -1,18 +1,11 @@
 package org.apache.maven.plugin.assembly.archive.phase;
 
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
 import org.apache.maven.plugin.assembly.archive.ArchiveCreationException;
 import org.apache.maven.plugin.assembly.archive.task.AddArtifactTask;
 import org.apache.maven.plugin.assembly.filter.AssemblyScopeArtifactFilter;
 import org.apache.maven.plugin.assembly.format.AssemblyFormattingException;
-import org.apache.maven.plugin.assembly.utils.AssemblyFormatUtils;
 import org.apache.maven.plugin.assembly.utils.FilterUtils;
 import org.apache.maven.plugins.assembly.model.Assembly;
 import org.apache.maven.plugins.assembly.model.DependencySet;
@@ -20,6 +13,12 @@
 import org.codehaus.plexus.archiver.Archiver;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
 /**
  * @plexus.component role="org.apache.maven.plugin.assembly.archive.phase.AssemblyArchiverPhase"
  *                   role-hint="dependency-sets"
@@ -49,11 +48,6 @@
     {
         MavenProject project = configSource.getProject();
 
-        String destDirectory = dependencySet.getOutputDirectory();
-
-        destDirectory = AssemblyFormatUtils.getOutputDirectory( destDirectory, project, configSource.getFinalName(),
-                                                                includeBaseDirectory );
-
         getLogger().info( "Processing DependencySet" );
 
         Set dependencyArtifacts = getDependencyArtifacts( project, dependencySet );
@@ -62,18 +56,14 @@
         {
             Artifact artifact = (Artifact) j.next();
 
-            String fileNameMapping = AssemblyFormatUtils.evaluateFileNameMapping( dependencySet
-                .getOutputFileNameMapping(), artifact );
-
-            String outputLocation = destDirectory + fileNameMapping;
-
-            AddArtifactTask task = new AddArtifactTask( artifact, outputLocation );
-
-            int dirMode = Integer.parseInt( dependencySet.getDirectoryMode(), 8 );
-            int fileMode = Integer.parseInt( dependencySet.getFileMode(), 8 );
+            AddArtifactTask task = new AddArtifactTask( artifact );
 
-            task.setDirectoryMode( dirMode );
-            task.setFileMode( fileMode );
+            task.setProject( project );
+            task.setOutputDirectory( dependencySet.getOutputDirectory() );
+            task.setFileNameMapping( dependencySet.getOutputFileNameMapping() );
+            task.setIncludeBaseDirectory( includeBaseDirectory );
+            task.setDirectoryMode( dependencySet.getDirectoryMode() );
+            task.setFileMode( dependencySet.getFileMode() );
             task.setUnpack( dependencySet.isUnpack() );
 
             task.execute( archiver, configSource );

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/FileItemAssemblyPhase.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/FileItemAssemblyPhase.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/FileItemAssemblyPhase.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/FileItemAssemblyPhase.java Tue Aug  1 17:28:06 2006
@@ -76,7 +76,7 @@
 
             try
             {
-                archiver.addFile( source, target, Integer.parseInt( fileItem.getFileMode() ) );
+                archiver.addFile( source, target, Integer.parseInt( fileItem.getFileMode(), 8 ) );
             }
             catch ( ArchiverException e )
             {

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/ModuleSetAssemblyPhase.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/ModuleSetAssemblyPhase.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/ModuleSetAssemblyPhase.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/ModuleSetAssemblyPhase.java Tue Aug  1 17:28:06 2006
@@ -1,23 +1,11 @@
 package org.apache.maven.plugin.assembly.archive.phase;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
 import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
 import org.apache.maven.plugin.assembly.archive.ArchiveCreationException;
 import org.apache.maven.plugin.assembly.archive.task.AddArtifactTask;
 import org.apache.maven.plugin.assembly.archive.task.AddFileSetsTask;
-import org.apache.maven.plugin.assembly.filter.AssemblyExcludesArtifactFilter;
-import org.apache.maven.plugin.assembly.filter.AssemblyIncludesArtifactFilter;
 import org.apache.maven.plugin.assembly.format.AssemblyFormattingException;
-import org.apache.maven.plugin.assembly.utils.AssemblyFormatUtils;
 import org.apache.maven.plugin.assembly.utils.FilterUtils;
 import org.apache.maven.plugin.assembly.utils.ProjectUtils;
 import org.apache.maven.plugins.assembly.model.Assembly;
@@ -25,163 +13,216 @@
 import org.apache.maven.plugins.assembly.model.ModuleSet;
 import org.apache.maven.plugins.assembly.model.ModuleSources;
 import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectBuilder;
+import org.apache.maven.project.ProjectBuildingException;
 import org.apache.maven.wagon.PathUtils;
 import org.codehaus.plexus.archiver.Archiver;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
 /**
- * @plexus.component role="org.apache.maven.plugin.assembly.archive.phase.AssemblyArchiverPhase"
- *                   role-hint="module-sets"
+ * @plexus.component role="org.apache.maven.plugin.assembly.archive.phase.AssemblyArchiverPhase" role-hint="module-sets"
  */
 public class ModuleSetAssemblyPhase
     extends AbstractLogEnabled
     implements AssemblyArchiverPhase
 {
 
+    /**
+     * @plexus.requirement
+     */
+    private MavenProjectBuilder projectBuilder;
+    
+    public ModuleSetAssemblyPhase()
+    {
+        // needed for plexus
+    }
+    
+    public ModuleSetAssemblyPhase( MavenProjectBuilder projectBuilder )
+    {
+        this.projectBuilder = projectBuilder;
+    }
+
     public void execute( Assembly assembly, Archiver archiver, AssemblerConfigurationSource configSource )
         throws ArchiveCreationException, AssemblyFormattingException
     {
         List moduleSets = assembly.getModuleSets();
-        MavenProject project = configSource.getProject();
+
         boolean includeBaseDirectory = assembly.isIncludeBaseDirectory();
 
         for ( Iterator i = moduleSets.iterator(); i.hasNext(); )
         {
-            ModuleSet moduleSet = (ModuleSet) i.next();
+            ModuleSet moduleSet = ( ModuleSet ) i.next();
 
-            AndArtifactFilter moduleFilter = new AndArtifactFilter();
+            Set moduleProjects = getModuleProjects( moduleSet, configSource );
 
-            if ( !moduleSet.getIncludes().isEmpty() )
-            {
-                moduleFilter.add( new AssemblyIncludesArtifactFilter( moduleSet.getIncludes() ) );
-            }
-            if ( !moduleSet.getExcludes().isEmpty() )
-            {
-                moduleFilter.add( new AssemblyExcludesArtifactFilter( moduleSet.getExcludes() ) );
-            }
+            addModuleSourceFileSets( moduleSet.getSources(), moduleProjects, archiver, configSource,
+                                     includeBaseDirectory );
 
-            Set allModuleProjects;
-            try
-            {
-                allModuleProjects = ProjectUtils.getProjectModules( project, configSource.getReactorProjects(),
-                                                                    getLogger() );
-            }
-            catch ( IOException e )
-            {
-                throw new ArchiveCreationException( "Error retrieving module-set for project: " + project.getId()
-                    + ": " + e.getMessage(), e );
-            }
-
-            Set moduleProjects = new HashSet( allModuleProjects );
+            addModuleBinaries( moduleSet.getBinaries(), moduleProjects, archiver, configSource, includeBaseDirectory );
+        }
+    }
 
-            FilterUtils.filterProjects( moduleProjects, moduleSet.getIncludes(), moduleSet.getExcludes(), false );
+    protected void addModuleBinaries( ModuleBinaries binaries, Set moduleProjects, Archiver archiver,
+                                      AssemblerConfigurationSource configSource, boolean includeBaseDirectory )
+        throws ArchiveCreationException, AssemblyFormattingException
+    {
+        if ( binaries == null )
+        {
+            return;
+        }
 
-            List moduleFileSets = new ArrayList();
+        Set visitedArtifacts = new HashSet();
+        
+        for ( Iterator j = moduleProjects.iterator(); j.hasNext(); )
+        {
+            MavenProject project = ( MavenProject ) j.next();
+            Artifact artifact = project.getArtifact();
 
-            for ( Iterator j = moduleProjects.iterator(); j.hasNext(); )
+            addArtifact( artifact, project, archiver, configSource, binaries, includeBaseDirectory );
+            
+            visitedArtifacts.add( artifact.getDependencyConflictId() );
+        }
+        
+        if ( binaries.isIncludeDependencies() )
+        {
+            // FIXME: This will produce unpredictable results when module dependencies have a version conflict.
+            getLogger().warn( "NOTE: Currently, inclusion of module dependencies may produce unpredictable " +
+                    "results if a version conflict occurs." );
+            
+            for ( Iterator it = moduleProjects.iterator(); it.hasNext(); )
             {
-                MavenProject moduleProject = (MavenProject) j.next();
+                MavenProject moduleProject = ( MavenProject ) it.next();
 
-                ModuleSources sources = moduleSet.getSources();
-                if ( sources != null )
-                {
-                    sources.setDirectory( PathUtils.toRelative( moduleProject.getBasedir(), sources.getDirectory() ) );
+                Set binaryDependencies = moduleProject.getArtifacts();
 
-                    moduleFileSets.add( sources );
-                }
+                List includes = binaries.getIncludes();
+                
+                // we don't need to include dependencies which have already been found.
+                List excludes = collectExcludesFromQueuedArtifacts( visitedArtifacts, binaries.getExcludes() );
 
-                ModuleBinaries binaries = moduleSet.getBinaries();
+                FilterUtils.filterArtifacts( binaryDependencies, includes, excludes, true, Collections.EMPTY_LIST,
+                                             getLogger() );
 
-                if ( binaries != null )
+                for ( Iterator binDepIterator = binaryDependencies.iterator(); binDepIterator.hasNext(); )
                 {
-                    Artifact moduleArtifact = moduleProject.getArtifact();
-
-                    if ( moduleArtifact.getFile() == null )
+                    Artifact artifact = ( Artifact ) binDepIterator.next();
+                    MavenProject project;
+                    try
                     {
-                        throw new ArchiveCreationException(
-                                                            "Included module: "
-                                                                + moduleProject.getId()
-                                                                + " does not have an artifact with a file. Please ensure the package phase is run before the assembly is generated." );
+                        project = projectBuilder.buildFromRepository( artifact, configSource.getRemoteRepositories(),
+                                                            configSource.getLocalRepository() );
                     }
+                    catch ( ProjectBuildingException e )
+                    {
+                        throw new ArchiveCreationException( "Error retrieving POM of module-dependency: " + artifact.getId()
+                                        + "; Reason: " + e.getMessage(), e );
+                    }
+                    
+                    addArtifact( artifact, project, archiver, configSource, binaries, includeBaseDirectory );
+                    
+                    visitedArtifacts.add( artifact.getDependencyConflictId() );
+                }
+            }
+        }
+    }
 
-                    String fileNameMapping = AssemblyFormatUtils.evaluateFileNameMapping( binaries
-                        .getOutputFileNameMapping(), moduleArtifact );
-
-                    String output = binaries.getOutputDirectory();
-                    output = AssemblyFormatUtils.getOutputDirectory( output, moduleProject,
-                                                                     configSource.getFinalName(), includeBaseDirectory );
+    protected List collectExcludesFromQueuedArtifacts( Set visitedArtifacts, List binaryExcludes )
+    {
+        List excludes = binaryExcludes;
+        
+        if ( excludes == null )
+        {
+            excludes = new ArrayList();
+        }
+        else
+        {
+            excludes = new ArrayList( excludes );
+        }
+        
+        for ( Iterator it = visitedArtifacts.iterator(); it.hasNext(); )
+        {
+            excludes.add( it.next() );
+        }
+        
+        return excludes;
+    }
 
-                    String outputLocation = output + fileNameMapping;
+    protected void addArtifact( Artifact artifact, MavenProject project, Archiver archiver,
+                              AssemblerConfigurationSource configSource, ModuleBinaries binaries, boolean includeBaseDirectory )
+        throws ArchiveCreationException, AssemblyFormattingException
+    {
+        if ( artifact.getFile() == null )
+        {
+            throw new ArchiveCreationException( "Artifact: " + artifact.getId()
+                            + " (included by module) does not have an artifact with a file. "
+                            + "Please ensure the package phase is run before the assembly is generated." );
+        }
 
-                    int fileMode = Integer.parseInt( binaries.getFileMode(), 8 );
-                    int dirMode = Integer.parseInt( binaries.getDirectoryMode(), 8 );
+        AddArtifactTask task = new AddArtifactTask( artifact );
 
-                    getLogger().debug(
-                                       "ModuleSet[" + output + "]" + " dir perms: "
-                                           + Integer.toString( archiver.getDefaultDirectoryMode(), 8 )
-                                           + " file perms: " + Integer.toString( archiver.getDefaultFileMode(), 8 ) );
+        task.setFileNameMapping( binaries.getOutputFileNameMapping() );
+        task.setIncludeBaseDirectory( includeBaseDirectory );
+        task.setOutputDirectory( binaries.getOutputDirectory() );
+        task.setProject( project );
+        task.setDirectoryMode( binaries.getDirectoryMode() );
+        task.setFileMode( binaries.getFileMode() );
+        task.setUnpack( binaries.isUnpack() );
 
-                    AddArtifactTask task = new AddArtifactTask( moduleArtifact, outputLocation );
+        task.execute( archiver, configSource );
+    }
 
-                    task.setDirectoryMode( dirMode );
-                    task.setFileMode( fileMode );
-                    task.setUnpack( binaries.isUnpack() );
-                    
-                    task.execute( archiver, configSource );
-                    
-                    if ( binaries.isIncludeDependencies() )
-                    {
-                        Set binaryDependencies = moduleProject.getArtifacts();
+    protected void addModuleSourceFileSets( ModuleSources sources, Set moduleProjects, Archiver archiver,
+                                            AssemblerConfigurationSource configSource, boolean includeBaseDirectory )
+        throws ArchiveCreationException, AssemblyFormattingException
+    {
+        if ( sources == null )
+        {
+            return;
+        }
 
-                        List includes = binaries.getIncludes();
-                        List excludes = binaries.getExcludes();
+        for ( Iterator j = moduleProjects.iterator(); j.hasNext(); )
+        {
+            MavenProject moduleProject = ( MavenProject ) j.next();
 
-                        FilterUtils.filterArtifacts( binaryDependencies, includes, excludes, true,
-                                                     Collections.EMPTY_LIST, getLogger() );
+            sources.setDirectory( PathUtils.toRelative( moduleProject.getBasedir(), sources.getDirectory() ) );
 
-                        for ( Iterator binDepIterator = binaryDependencies.iterator(); binDepIterator.hasNext(); )
-                        {
-                            Artifact binaryDependency = (Artifact) binDepIterator.next();
-
-                            String depFileNameMapping = AssemblyFormatUtils.evaluateFileNameMapping( binaries
-                                .getOutputFileNameMapping(), binaryDependency );
-                            
-                            String depOutputLocation = output + depFileNameMapping;
-
-                            AddArtifactTask depTask = new AddArtifactTask( binaryDependency, depOutputLocation );
-
-                            depTask.setDirectoryMode( dirMode );
-                            depTask.setFileMode( fileMode );
-                            depTask.setUnpack( binaries.isUnpack() );
-                            
-                            depTask.execute( archiver, configSource );
-                        }
-                    }
-                }
+            AddFileSetsTask task = new AddFileSetsTask( Collections.singletonList( sources ) );
 
-                if ( !moduleFileSets.isEmpty() )
-                {
-                    AddFileSetsTask task = new AddFileSetsTask( moduleFileSets );
-                    
-                    task.setLogger( getLogger() );
-                    task.setIncludeBaseDirectory( includeBaseDirectory );
-                    
-                    task.execute( archiver, configSource );
-                }
-            }
+            task.setProject( moduleProject );
+            task.setLogger( getLogger() );
+            task.setIncludeBaseDirectory( includeBaseDirectory );
 
-            allModuleProjects.removeAll( moduleProjects );
+            task.execute( archiver, configSource );
+        }
+    }
 
-            for ( Iterator it = allModuleProjects.iterator(); it.hasNext(); )
-            {
-                MavenProject excludedProject = (MavenProject) it.next();
+    protected Set getModuleProjects( ModuleSet moduleSet, AssemblerConfigurationSource configSource )
+        throws ArchiveCreationException
+    {
+        MavenProject project = configSource.getProject();
 
-                // would be better to have a way to find out when a specified
-                // include or exclude
-                // is never triggered and warn() it.
-                getLogger().debug( "module: " + excludedProject.getId() + " not included" );
-            }
+        Set moduleProjects;
+        try
+        {
+            moduleProjects = ProjectUtils.getProjectModules( project, configSource.getReactorProjects(), getLogger() );
         }
+        catch ( IOException e )
+        {
+            throw new ArchiveCreationException( "Error retrieving module-set for project: " + project.getId() + ": "
+                            + e.getMessage(), e );
+        }
+
+        FilterUtils.filterProjects( moduleProjects, moduleSet.getIncludes(), moduleSet.getExcludes(), true,
+                                    getLogger() );
+        return moduleProjects;
     }
 
 }

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/RepositoryAssemblyPhase.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/RepositoryAssemblyPhase.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/RepositoryAssemblyPhase.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/phase/RepositoryAssemblyPhase.java Tue Aug  1 17:28:06 2006
@@ -1,24 +1,27 @@
 package org.apache.maven.plugin.assembly.archive.phase;
 
-import java.io.File;
-import java.util.Iterator;
-import java.util.List;
-
 import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
 import org.apache.maven.plugin.assembly.archive.ArchiveCreationException;
+import org.apache.maven.plugin.assembly.archive.task.AddDirectoryTask;
 import org.apache.maven.plugin.assembly.format.AssemblyFormattingException;
 import org.apache.maven.plugin.assembly.repository.RepositoryAssembler;
 import org.apache.maven.plugin.assembly.repository.RepositoryAssemblyException;
+import org.apache.maven.plugin.assembly.utils.AssemblyFormatUtils;
 import org.apache.maven.plugins.assembly.model.Assembly;
 import org.apache.maven.plugins.assembly.model.Repository;
 import org.codehaus.plexus.archiver.Archiver;
-import org.codehaus.plexus.archiver.ArchiverException;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
 
 /**
  * @plexus.component role="org.apache.maven.plugin.assembly.archive.phase.AssemblyArchiverPhase"
  *                   role-hint="repositories"
  */
 public class RepositoryAssemblyPhase
+    extends AbstractLogEnabled
     implements AssemblyArchiverPhase
 {
 
@@ -26,20 +29,30 @@
      * @plexus.requirement
      */
     private RepositoryAssembler repositoryAssembler;
+    
+    public RepositoryAssemblyPhase()
+    {
+        // used for plexus.
+    }
+    
+    // introduced for testing.
+    public RepositoryAssemblyPhase( RepositoryAssembler repositoryAssembler )
+    {
+        this.repositoryAssembler = repositoryAssembler;
+    }
 
     public void execute( Assembly assembly, Archiver archiver, AssemblerConfigurationSource configSource )
         throws ArchiveCreationException, AssemblyFormattingException
     {
-        List modulesList = assembly.getRepositories();
+        List repositoriesList = assembly.getRepositories();
         
-        boolean includeBaseDirectory = assembly.isIncludeBaseDirectory();
         File tempRoot = configSource.getTemporaryRootDirectory();
 
-        for ( Iterator i = modulesList.iterator(); i.hasNext(); )
+        for ( Iterator i = repositoriesList.iterator(); i.hasNext(); )
         {
             Repository repository = (Repository) i.next();
 
-            File repositoryDirectory = new File( tempRoot, repository.getOutputDirectory() );
+            File repositoryDirectory = new File( tempRoot, "repositories/" + repository.getOutputDirectory() );
 
             if ( !repositoryDirectory.exists() )
             {
@@ -55,21 +68,18 @@
                 throw new ArchiveCreationException( "Failed to assembly repository: " + e.getMessage(), e );
             }
 
-            try
-            {
-                if ( includeBaseDirectory )
-                {
-                    archiver.addDirectory( repositoryDirectory, repository.getOutputDirectory() + "/" );
-                }
-                else
-                {
-                    archiver.addDirectory( repositoryDirectory );
-                }
-            }
-            catch ( ArchiverException e )
-            {
-                throw new ArchiveCreationException( "Error adding directory to archive: " + e.getMessage(), e );
-            }
+            String outputDirectory =
+                AssemblyFormatUtils.getOutputDirectory( repository.getOutputDirectory(), configSource.getProject(),
+                                                        configSource.getFinalName(),
+                                                        assembly.isIncludeBaseDirectory() );
+            
+            AddDirectoryTask task = new AddDirectoryTask( repositoryDirectory );
+            
+            task.setDirectoryMode( Integer.parseInt( repository.getDirectoryMode(), 8 ) );
+            task.setFileMode( Integer.parseInt( repository.getFileMode(), 8 ) );
+            task.setOutputDirectory( outputDirectory );
+            
+            task.execute( archiver, configSource );
         }
     }
 

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddArtifactTask.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddArtifactTask.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddArtifactTask.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddArtifactTask.java Tue Aug  1 17:28:06 2006
@@ -6,7 +6,10 @@
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
 import org.apache.maven.plugin.assembly.archive.ArchiveCreationException;
+import org.apache.maven.plugin.assembly.format.AssemblyFormattingException;
+import org.apache.maven.plugin.assembly.utils.AssemblyFormatUtils;
 import org.apache.maven.plugin.assembly.utils.TypeConversionUtils;
+import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.archiver.Archiver;
 import org.codehaus.plexus.archiver.ArchiverException;
 
@@ -24,19 +27,33 @@
 
     private List excludes;
 
-    private final String outputLocation;
-
     private final Artifact artifact;
 
-    public AddArtifactTask( Artifact artifact, String outputLocation )
+    private MavenProject project;
+
+    private String outputDirectory;
+
+    private String outputFileNameMapping;
+
+    private boolean includeBaseDirectory;
+
+    public AddArtifactTask( Artifact artifact )
     {
         this.artifact = artifact;
-        this.outputLocation = outputLocation;
     }
 
     public void execute( Archiver archiver, AssemblerConfigurationSource configSource )
-        throws ArchiveCreationException
+        throws ArchiveCreationException, AssemblyFormattingException
     {
+        String destDirectory = outputDirectory;
+
+        destDirectory = AssemblyFormatUtils.getOutputDirectory( destDirectory, project, configSource.getFinalName(),
+                                                                includeBaseDirectory );
+
+        String fileNameMapping = AssemblyFormatUtils.evaluateFileNameMapping( outputFileNameMapping, artifact );
+
+        String outputLocation = destDirectory + fileNameMapping;
+
         if ( unpack )
         {
             String[] includesArray = TypeConversionUtils.toStringArray( includes );
@@ -93,9 +110,9 @@
         }
     }
 
-    public void setDirectoryMode( int directoryMode )
+    public void setDirectoryMode( String rawDirectoryMode )
     {
-        this.directoryMode = directoryMode;
+        this.directoryMode = Integer.parseInt( rawDirectoryMode, 8 );
     }
 
     public void setExcludes( List excludes )
@@ -103,9 +120,9 @@
         this.excludes = excludes;
     }
 
-    public void setFileMode( int fileMode )
+    public void setFileMode( String rawFileMode )
     {
-        this.fileMode = fileMode;
+        this.fileMode = Integer.parseInt( rawFileMode, 8 );
     }
 
     public void setIncludes( List includes )
@@ -116,6 +133,26 @@
     public void setUnpack( boolean unpack )
     {
         this.unpack = unpack;
+    }
+
+    public void setProject( MavenProject project )
+    {
+        this.project = project;
+    }
+
+    public void setOutputDirectory( String outputDirectory )
+    {
+        this.outputDirectory = outputDirectory;
+    }
+
+    public void setFileNameMapping( String outputFileNameMapping )
+    {
+        this.outputFileNameMapping = outputFileNameMapping;
+    }
+
+    public void setIncludeBaseDirectory( boolean includeBaseDirectory )
+    {
+        this.includeBaseDirectory = includeBaseDirectory;
     }
 
 }

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddFileSetsTask.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddFileSetsTask.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddFileSetsTask.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/archive/task/AddFileSetsTask.java Tue Aug  1 17:28:06 2006
@@ -26,6 +26,8 @@
 
     private Logger logger;
 
+    private MavenProject project;
+
     public AddFileSetsTask( List fileSets )
     {
         this.fileSets = fileSets;
@@ -73,7 +75,11 @@
         FileSetFormatter fileSetFormatter = new FileSetFormatter( configSource, logger );
 
         File basedir = configSource.getBasedir();
-        MavenProject project = configSource.getProject();
+        
+        if ( project == null )
+        {
+            project = configSource.getProject();
+        }
 
         String destDirectory = fileSet.getOutputDirectory();
 
@@ -168,6 +174,11 @@
     public void setIncludeBaseDirectory( boolean includeBaseDirectory )
     {
         this.includeBaseDirectory = includeBaseDirectory;
+    }
+
+    public void setProject( MavenProject project )
+    {
+        this.project = project;
     }
 
 }

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReader.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReader.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReader.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReader.java Tue Aug  1 17:28:06 2006
@@ -11,6 +11,7 @@
 import org.apache.maven.plugins.assembly.model.DependencySet;
 import org.apache.maven.plugins.assembly.model.FileItem;
 import org.apache.maven.plugins.assembly.model.FileSet;
+import org.apache.maven.plugins.assembly.model.Repository;
 import org.apache.maven.plugins.assembly.model.io.xpp3.AssemblyXpp3Reader;
 import org.apache.maven.plugins.assembly.model.io.xpp3.ComponentXpp3Reader;
 import org.apache.maven.project.MavenProject;
@@ -251,23 +252,37 @@
     {
         List dependencySetList = component.getDependencySets();
 
-        for ( int i = 0; i < dependencySetList.size(); ++i )
+        for ( Iterator it = dependencySetList.iterator(); it.hasNext(); )
         {
-            assembly.addDependencySet( (DependencySet) dependencySetList.get( i ) );
+            DependencySet dependencySet = ( DependencySet ) it.next();
+            assembly.addDependencySet( dependencySet );
         }
 
         List fileSetList = component.getFileSets();
 
-        for ( int i = 0; i < fileSetList.size(); ++i )
+        for ( Iterator it = fileSetList.iterator(); it.hasNext(); )
         {
-            assembly.addFileSet( (FileSet) fileSetList.get( i ) );
+            FileSet fileSet = ( FileSet ) it.next();
+            
+            assembly.addFileSet( fileSet );
         }
 
         List fileList = component.getFiles();
-
-        for ( int i = 0; i < fileList.size(); ++i )
+        
+        for ( Iterator it = fileList.iterator(); it.hasNext(); )
+        {
+            FileItem fileItem = ( FileItem ) it.next();
+            
+            assembly.addFile( fileItem );
+        }
+        
+        List repositoriesList = component.getRepositories();
+        
+        for ( Iterator it = repositoriesList.iterator(); it.hasNext(); )
         {
-            assembly.addFile( (FileItem) fileList.get( i ) );
+            Repository repository = ( Repository ) it.next();
+            
+            assembly.addRepository( repository );
         }
     }
 

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/mojos/AbstractAssemblyMojo.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/mojos/AbstractAssemblyMojo.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/mojos/AbstractAssemblyMojo.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/mojos/AbstractAssemblyMojo.java Tue Aug  1 17:28:06 2006
@@ -48,14 +48,21 @@
 {
 
     /**
-     * @parameter expression="${localRepository}"
+     * @parameter default-value="${localRepository}"
      */
     private ArtifactRepository localRepository;
 
     /**
+     * @parameter default-value="${project.remoteArtifactRepositories}"
+     * @required
+     * @readonly
+     */
+    private List remoteRepositories;
+    
+    /**
      * Contains the full list of projects in the reactor.
      *
-     * @parameter expression="${reactorProjects}"
+     * @parameter default-value="${reactorProjects}"
      * @required
      * @readonly
      */
@@ -64,7 +71,7 @@
     /**
      * The output directory of the assembled distribution file.
      *
-     * @parameter expression="${project.build.directory}"
+     * @parameter default-value="${project.build.directory}"
      * @required
      */
     private File outputDirectory;
@@ -72,7 +79,7 @@
     /**
      * The filename of the assembled distribution file.
      *
-     * @parameter expression="${project.build.finalName}"
+     * @parameter default-value="${project.build.finalName}"
      * @required
      */
     private String finalName;
@@ -80,7 +87,7 @@
     /**
      * Directory to unpack JARs into if needed
      *
-     * @parameter expression="${project.build.directory}/assembly/work"
+     * @parameter default-value="${project.build.directory}/assembly/work"
      * @required
      */
     private File workDirectory;
@@ -153,7 +160,7 @@
     /**
      * Base directory of the project.
      *
-     * @parameter expression="${basedir}"
+     * @parameter default-value="${basedir}"
      * @required
      * @readonly
      */
@@ -169,7 +176,7 @@
     /**
      * Temporary directory that contain the files to be assembled.
      *
-     * @parameter expression="${project.build.directory}/archive-tmp"
+     * @parameter default-value="${project.build.directory}/archive-tmp"
      * @required
      * @readonly
      */
@@ -178,7 +185,7 @@
     /**
      * Directory for site generated.
      *
-     * @parameter expression="${project.build.directory}/site"
+     * @parameter default-value="${project.build.directory}/site"
      * @readonly
      */
     private File siteDirectory;
@@ -207,7 +214,8 @@
     private MavenArchiveConfiguration archive;
 
     /**
-     * @parameter expression="${project.build.filters}"
+     * @parameter default-value="${project.build.filters}"
+     * @readonly
      */
     protected List filters;
 
@@ -519,6 +527,11 @@
     public void setWorkDirectory( File workDirectory )
     {
         this.workDirectory = workDirectory;
+    }
+    
+    public List getRemoteRepositories()
+    {
+        return remoteRepositories;
     }
     
 }

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/repository/DefaultRepositoryAssembler.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/repository/DefaultRepositoryAssembler.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/repository/DefaultRepositoryAssembler.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/repository/DefaultRepositoryAssembler.java Tue Aug  1 17:28:06 2006
@@ -16,23 +16,6 @@
  * limitations under the License.
  */
 
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Writer;
-import java.lang.reflect.Field;
-import java.security.NoSuchAlgorithmException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TimeZone;
-
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
@@ -57,7 +40,6 @@
 import org.apache.maven.plugin.assembly.utils.DigestUtils;
 import org.apache.maven.plugins.assembly.model.GroupVersionAlignment;
 import org.apache.maven.plugins.assembly.model.Repository;
-import org.apache.maven.plugins.assembly.model.SetBase;
 import org.apache.maven.project.DefaultMavenProjectBuilder;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectBuilder;
@@ -66,6 +48,23 @@
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.IOUtil;
 
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.lang.reflect.Field;
+import java.security.NoSuchAlgorithmException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+
 /**
  * @author Jason van Zyl
  */
@@ -151,11 +150,11 @@
         }
     }
 
-    private ArtifactFilter buildRepositoryFilter(SetBase repository, MavenProject project)
+    private ArtifactFilter buildRepositoryFilter(Repository repository, MavenProject project)
     {
         AndArtifactFilter filter = new AndArtifactFilter();
 
-        ArtifactFilter scopeFilter = new ScopeArtifactFilter( Artifact.SCOPE_RUNTIME );
+        ArtifactFilter scopeFilter = new ScopeArtifactFilter( repository.getScope() );
         filter.add( scopeFilter );
 
         // ----------------------------------------------------------------------------

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/utils/FilterUtils.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/utils/FilterUtils.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/utils/FilterUtils.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/java/org/apache/maven/plugin/assembly/utils/FilterUtils.java Tue Aug  1 17:28:06 2006
@@ -21,17 +21,28 @@
     {
     }
 
-    public static void filterProjects( Set projects, List includes, List excludes, boolean actTransitively )
+    public static void filterProjects( Set projects, List includes, List excludes, boolean actTransitively,
+                                       Logger logger )
     {
+        List allFilters = new ArrayList();
+        
         AndArtifactFilter filter = new AndArtifactFilter();
 
         if ( !includes.isEmpty() )
         {
-            filter.add( new AssemblyIncludesArtifactFilter( includes, actTransitively ) );
+            AssemblyIncludesArtifactFilter includeFilter =
+                new AssemblyIncludesArtifactFilter( includes, actTransitively );
+            
+            filter.add( includeFilter );
+            allFilters.add( includeFilter );
         }
         if ( !excludes.isEmpty() )
         {
-            filter.add( new AssemblyExcludesArtifactFilter( excludes, actTransitively ) );
+            AssemblyExcludesArtifactFilter excludeFilter =
+                new AssemblyExcludesArtifactFilter( excludes, actTransitively );
+                
+            filter.add( excludeFilter );
+            allFilters.add( excludeFilter );
         }
 
         for ( Iterator it = projects.iterator(); it.hasNext(); )
@@ -42,6 +53,16 @@
             if ( !filter.include( artifact ) )
             {
                 it.remove();
+            }
+        }
+        
+        for ( Iterator it = allFilters.iterator(); it.hasNext(); )
+        {
+            ArtifactFilter f = (ArtifactFilter) it.next();
+            
+            if ( f instanceof StatisticsReportingFilter )
+            {
+                ((StatisticsReportingFilter) f).reportMissedCriteria( logger );
             }
         }
     }

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/mdo/component.mdo
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/mdo/component.mdo?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/mdo/component.mdo (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/mdo/component.mdo Tue Aug  1 17:28:06 2006
@@ -61,6 +61,17 @@
             Specify assembly behavior for sets of dependencies.
           </description>
         </field>
+        <field>
+          <name>repositories</name>
+          <version>1.0.0</version>
+          <association>
+            <type>Repository</type>
+            <multiplicity>*</multiplicity>
+          </association>
+          <description>
+            Specify assembly behavior for sets of repositories.
+          </description>
+        </field>
       </fields>
     </class>
 
@@ -297,6 +308,73 @@
       </fields>
     </class>
 
+    <class>
+      <name>Repository</name>
+      <version>1.0.0</version>
+      <superClass>SetBase</superClass>
+      <description>Defines a Maven repository to be included in the assembly.</description>
+      <fields>
+        <field>
+          <name>includeMetadata</name>
+          <version>1.0.0</version>
+          <type>boolean</type>
+          <defaultValue>false</defaultValue>
+          <description>
+            If set to true, this property will trigger the creation of repository
+            metadata which will allow the repository to be used as a functional remote
+            repository.
+          </description>
+        </field>
+        <field>
+          <name>groupVersionAlignments</name>
+          <version>1.0.0</version>
+          <description>Align a group to a version or an individual artifact.</description>
+          <association>
+            <type>GroupVersionAlignment</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>scope</name>
+          <version>1.0.0</version>              
+          <type>String</type>
+          <defaultValue>runtime</defaultValue>
+          <required>true</required>
+          <description>
+            Specifies the scope for artifacts included in this repository.
+            Default scope value is "runtime".
+          </description>
+        </field>
+      </fields>
+    </class>
+    <class>
+      <name>GroupVersionAlignment</name>
+      <version>1.0.0</version>
+      <description>Defines a Maven repository to be included in the assembly.</description>
+      <fields>
+        <field>
+          <name>id</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <description>The groupId for which you want to align the versions.</description>
+        </field>
+        <field>
+          <name>version</name>
+          <version>1.0.0</version>
+          <type>String</type>
+          <description>The version you want to align this group to.</description>
+        </field>
+        <field>
+          <name>excludes</name>
+          <version>1.0.0</version>
+          <description>Artifact Ids of the artifacts you want excluded from version alignment.</description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+    </class>
   </classes>
 </model>
 

Modified: maven/plugins/branches/MASSEMBLY-124/src/main/mdo/descriptor.mdo
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/main/mdo/descriptor.mdo?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/main/mdo/descriptor.mdo (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/main/mdo/descriptor.mdo Tue Aug  1 17:28:06 2006
@@ -528,6 +528,17 @@
             <multiplicity>*</multiplicity>
           </association>
         </field>
+        <field>
+          <name>scope</name>
+          <version>1.0.0</version>              
+          <type>String</type>
+          <defaultValue>runtime</defaultValue>
+          <required>true</required>
+          <description>
+            Specifies the scope for artifacts included in this repository.
+            Default scope value is "runtime".
+          </description>
+        </field>
       </fields>
     </class>
     <class>

Modified: maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/DependencySetAssemblyPhaseTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/DependencySetAssemblyPhaseTest.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/DependencySetAssemblyPhaseTest.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/DependencySetAssemblyPhaseTest.java Tue Aug  1 17:28:06 2006
@@ -1,7 +1,6 @@
 package org.apache.maven.plugin.assembly.archive.phase;
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.model.Model;
 import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
 import org.apache.maven.plugin.assembly.archive.ArchiveCreationException;
@@ -50,12 +49,11 @@
         assembly.addDependencySet( ds );
         
         MockAndControlForAddArtifactTask macTask = new MockAndControlForAddArtifactTask( mockManager );
-        MockAndControlForArtifactHandler macHandler = new MockAndControlForArtifactHandler();
 
         macTask.expectArtifactGetFile();
         macTask.expectArtifactGetScope( Artifact.SCOPE_COMPILE );
-        macTask.expectArtifactGetClassifier( null );
-        macTask.expectArtifactGetArtifactHandler( macHandler.handler );
+        macTask.expectGetClassifier( null );
+        macTask.expectGetArtifactHandler();
 
         macTask.expectAddFile( outputLocation + "/artifact", 8 );
 
@@ -102,7 +100,6 @@
         MockAndControlForConfigSource macCS = new MockAndControlForConfigSource();
 
         macCS.enableGetProject( project );
-        macCS.enableGetFinalName( "final-name" );
 
         DependencySet ds = new DependencySet();
         ds.setOutputDirectory( "/out" );
@@ -145,12 +142,11 @@
         ds.setFileMode( Integer.toString( 8, 8 ) );
 
         MockAndControlForAddArtifactTask macTask = new MockAndControlForAddArtifactTask( mockManager );
-        MockAndControlForArtifactHandler macHandler = new MockAndControlForArtifactHandler();
 
         macTask.expectArtifactGetFile();
         macTask.expectArtifactGetScope( Artifact.SCOPE_COMPILE );
-        macTask.expectArtifactGetClassifier( null );
-        macTask.expectArtifactGetArtifactHandler( macHandler.handler );
+        macTask.expectGetClassifier( null );
+        macTask.expectGetArtifactHandler();
 
         if ( unpack )
         {
@@ -357,21 +353,6 @@
         {
             logger.info( message );
             control.setVoidCallable( MockControl.ONE_OR_MORE );
-        }
-    }
-
-    private final class MockAndControlForArtifactHandler
-    {
-        ArtifactHandler handler;
-
-        MockControl control;
-
-        MockAndControlForArtifactHandler()
-        {
-            control = MockControl.createControl( ArtifactHandler.class );
-            mockManager.add( control );
-
-            handler = ( ArtifactHandler ) control.getMock();
         }
     }
 

Added: maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/FileItemAssemblyPhaseTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/FileItemAssemblyPhaseTest.java?rev=427819&view=auto
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/FileItemAssemblyPhaseTest.java (added)
+++ maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/FileItemAssemblyPhaseTest.java Tue Aug  1 17:28:06 2006
@@ -0,0 +1,237 @@
+package org.apache.maven.plugin.assembly.archive.phase;
+
+import org.apache.maven.model.Model;
+import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
+import org.apache.maven.plugin.assembly.archive.ArchiveCreationException;
+import org.apache.maven.plugin.assembly.format.AssemblyFormattingException;
+import org.apache.maven.plugin.assembly.testutils.MockManager;
+import org.apache.maven.plugin.assembly.testutils.TestFileManager;
+import org.apache.maven.plugins.assembly.model.Assembly;
+import org.apache.maven.plugins.assembly.model.FileItem;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.archiver.Archiver;
+import org.codehaus.plexus.archiver.ArchiverException;
+import org.codehaus.plexus.logging.Logger;
+import org.easymock.MockControl;
+
+import java.io.File;
+import java.io.IOException;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+public class FileItemAssemblyPhaseTest
+    extends TestCase
+{
+
+    private TestFileManager fileManager = new TestFileManager( "file-item-phase.test.", "" );
+
+    public void tearDown()
+        throws IOException
+    {
+        fileManager.cleanUp();
+    }
+
+    public void testExecute_ShouldAddNothingWhenNoFileItemsArePresent()
+        throws ArchiveCreationException, AssemblyFormattingException
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
+
+        File basedir = fileManager.createTempDir();
+
+        macCS.expectGetBasedir( basedir );
+
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+
+        Assembly assembly = new Assembly();
+        assembly.setId( "test" );
+
+        mm.replayAll();
+
+        createPhase( macLogger.logger ).execute( assembly, null, macCS.configSource );
+
+        mm.verifyAll();
+    }
+
+    public void testExecute_ShouldAddAbsoluteFileNoFilterNoLineEndingConversion()
+        throws ArchiveCreationException, AssemblyFormattingException, IOException
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
+
+        File basedir = fileManager.createTempDir();
+
+        File file = fileManager.createFile( basedir, "file.txt", "This is a test file." );
+
+        macCS.expectGetBasedir( basedir );
+
+        File tempRoot = fileManager.createTempDir();
+
+        macCS.expectGetTemporaryRootDirectory( tempRoot );
+
+        macCS.expectGetProject( new MavenProject( new Model() ) );
+
+        macCS.expectGetFinalName( "final-name" );
+
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+
+        MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
+
+        Assembly assembly = new Assembly();
+        assembly.setId( "test" );
+
+        FileItem fi = new FileItem();
+        fi.setSource( file.getAbsolutePath() );
+        fi.setFiltered( false );
+        fi.setLineEnding( "keep" );
+        fi.setFileMode( "777" );
+
+        macArchiver.expectAddFile( file, "final-name/file.txt", Integer.parseInt( "777", 8 ) );
+
+        assembly.addFile( fi );
+
+        mm.replayAll();
+
+        createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource );
+
+        mm.verifyAll();
+    }
+
+    public void testExecute_ShouldAddRelativeFileNoFilterNoLineEndingConversion()
+        throws ArchiveCreationException, AssemblyFormattingException, IOException
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
+
+        File basedir = fileManager.createTempDir();
+
+        File file = fileManager.createFile( basedir, "file.txt", "This is a test file." );
+
+        macCS.expectGetBasedir( basedir );
+
+        File tempRoot = fileManager.createTempDir();
+
+        macCS.expectGetTemporaryRootDirectory( tempRoot );
+
+        macCS.expectGetProject( new MavenProject( new Model() ) );
+
+        macCS.expectGetFinalName( "final-name" );
+
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+
+        MockAndControlForArchiver macArchiver = new MockAndControlForArchiver( mm );
+
+        Assembly assembly = new Assembly();
+        assembly.setId( "test" );
+
+        FileItem fi = new FileItem();
+        fi.setSource( "file.txt" );
+        fi.setFiltered( false );
+        fi.setLineEnding( "keep" );
+        fi.setFileMode( "777" );
+
+        macArchiver.expectAddFile( file, "final-name/file.txt", Integer.parseInt( "777", 8 ) );
+
+        assembly.addFile( fi );
+
+        mm.replayAll();
+
+        createPhase( macLogger.logger ).execute( assembly, macArchiver.archiver, macCS.configSource );
+
+        mm.verifyAll();
+    }
+
+    private FileItemAssemblyPhase createPhase( Logger logger )
+    {
+        FileItemAssemblyPhase phase = new FileItemAssemblyPhase();
+        phase.enableLogging( logger );
+
+        return phase;
+    }
+
+    private final class MockAndControlForArchiver
+    {
+        Archiver archiver;
+
+        MockControl control;
+
+        public MockAndControlForArchiver( MockManager mockManager )
+        {
+            control = MockControl.createControl( Archiver.class );
+            mockManager.add( control );
+
+            archiver = ( Archiver ) control.getMock();
+        }
+
+        public void expectAddFile( File file, String outputLocation, int fileMode )
+        {
+            try
+            {
+                archiver.addFile( file, outputLocation, fileMode );
+            }
+            catch ( ArchiverException e )
+            {
+                Assert.fail( "Should never happen." );
+            }
+        }
+    }
+
+    private final class MockAndControlForConfigSource
+    {
+        AssemblerConfigurationSource configSource;
+
+        MockControl control;
+
+        public MockAndControlForConfigSource( MockManager mockManager )
+        {
+            control = MockControl.createControl( AssemblerConfigurationSource.class );
+            mockManager.add( control );
+
+            configSource = ( AssemblerConfigurationSource ) control.getMock();
+        }
+
+        public void expectGetProject( MavenProject project )
+        {
+            configSource.getProject();
+            control.setReturnValue( project, MockControl.ONE_OR_MORE );
+        }
+
+        public void expectGetFinalName( String finalName )
+        {
+            configSource.getFinalName();
+            control.setReturnValue( finalName, MockControl.ONE_OR_MORE );
+        }
+
+        public void expectGetTemporaryRootDirectory( File tempRoot )
+        {
+            configSource.getTemporaryRootDirectory();
+            control.setReturnValue( tempRoot, MockControl.ONE_OR_MORE );
+        }
+
+        public void expectGetBasedir( File basedir )
+        {
+            configSource.getBasedir();
+            control.setReturnValue( basedir, MockControl.ONE_OR_MORE );
+        }
+    }
+
+    private final class MockAndControlForLogger
+    {
+        Logger logger;
+
+        MockControl control;
+
+        public MockAndControlForLogger( MockManager mockManager )
+        {
+            control = MockControl.createControl( Logger.class );
+            mockManager.add( control );
+
+            logger = ( Logger ) control.getMock();
+        }
+    }
+
+}

Propchange: maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/FileItemAssemblyPhaseTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/FileItemAssemblyPhaseTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/FileSetAssemblyPhaseTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/FileSetAssemblyPhaseTest.java?rev=427819&r1=427818&r2=427819&view=diff
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/FileSetAssemblyPhaseTest.java (original)
+++ maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/FileSetAssemblyPhaseTest.java Tue Aug  1 17:28:06 2006
@@ -13,6 +13,7 @@
 import org.easymock.MockControl;
 
 import java.io.File;
+import java.io.IOException;
 
 import junit.framework.TestCase;
 
@@ -23,6 +24,12 @@
     private MockManager mockManager = new MockManager();
     
     private TestFileManager fileManager = new TestFileManager( "file-set-assembly.test.", "" );
+    
+    public void tearDown()
+        throws IOException
+    {
+        fileManager.cleanUp();
+    }
     
     public void testShouldNotFailWhenNoFileSetsSpecified()
         throws ArchiveCreationException, AssemblyFormattingException

Added: maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/ModuleSetAssemblyPhaseTest.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/ModuleSetAssemblyPhaseTest.java?rev=427819&view=auto
==============================================================================
--- maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/ModuleSetAssemblyPhaseTest.java (added)
+++ maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/ModuleSetAssemblyPhaseTest.java Tue Aug  1 17:28:06 2006
@@ -0,0 +1,614 @@
+package org.apache.maven.plugin.assembly.archive.phase;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.ArtifactUtils;
+import org.apache.maven.model.Model;
+import org.apache.maven.plugin.assembly.AssemblerConfigurationSource;
+import org.apache.maven.plugin.assembly.archive.ArchiveCreationException;
+import org.apache.maven.plugin.assembly.archive.task.testutils.MockAndControlForAddArtifactTask;
+import org.apache.maven.plugin.assembly.archive.task.testutils.MockAndControlForAddFileSetsTask;
+import org.apache.maven.plugin.assembly.format.AssemblyFormattingException;
+import org.apache.maven.plugin.assembly.testutils.MockManager;
+import org.apache.maven.plugin.assembly.testutils.TestFileManager;
+import org.apache.maven.plugins.assembly.model.ModuleBinaries;
+import org.apache.maven.plugins.assembly.model.ModuleSet;
+import org.apache.maven.plugins.assembly.model.ModuleSources;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.logging.Logger;
+import org.easymock.MockControl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+public class ModuleSetAssemblyPhaseTest
+    extends TestCase
+{
+
+    private TestFileManager fileManager = new TestFileManager( "module-set-phase.test.", "" );
+
+    public void tearDown()
+        throws IOException
+    {
+        fileManager.cleanUp();
+    }
+
+    public void testAddModuleBinaries_ShouldReturnImmediatelyWhenBinariesIsNull()
+        throws ArchiveCreationException, AssemblyFormattingException
+    {
+        createPhase( null ).addModuleBinaries( null, null, null, null, false );
+    }
+
+    public void testAddModuleBinaries_ShouldAddOneModuleArtifactAndNoDeps()
+        throws ArchiveCreationException, AssemblyFormattingException, IOException
+    {
+        MockManager mm = new MockManager();
+        
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+        MockAndControlForAddArtifactTask macTask = new MockAndControlForAddArtifactTask( mm );
+        
+        macTask.expectArtifactGetFile( true );
+        macTask.expectGetFinalName( "final-name" );
+        macTask.expectGetClassifier( null );
+        macTask.expectGetArtifactHandler();
+        macTask.expectAddFile( "out/artifact", Integer.parseInt( "777", 8 ) );
+        
+        macTask.artifact.getDependencyConflictId();
+        macTask.artifactCtl.setReturnValue( "group:artifact:jar", MockControl.ONE_OR_MORE );
+        
+        ModuleBinaries binaries = new ModuleBinaries();
+        
+        binaries.setIncludeDependencies( false );
+        binaries.setUnpack( false );
+        binaries.setFileMode( "777" );
+        binaries.setOutputDirectory( "out" );
+        binaries.setOutputFileNameMapping( "artifact" );
+        
+        MavenProject project = createProject( "group", "artifact", "version", null );
+        project.setArtifact( macTask.artifact );
+        
+        Set projects = Collections.singleton( project );
+        
+        mm.replayAll();
+        
+        createPhase( macLogger.logger ).addModuleBinaries( binaries, projects, macTask.archiver, macTask.configSource, false );
+        
+        mm.verifyAll();
+    }
+
+    public void testCollectExcludesFromQueuedArtifacts_ShouldAddOneExclusion()
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+
+        List excludes = new ArrayList();
+
+        // nothing up this sleeve...
+        assertTrue( excludes.isEmpty() );
+
+        mm.replayAll();
+
+        Set artifactIds = Collections.singleton( "group:artifact:jar" );
+
+        List result = createPhase( macLogger.logger ).collectExcludesFromQueuedArtifacts( artifactIds, excludes );
+
+        assertEquals( 1, result.size() );
+
+        assertEquals( "group:artifact:jar", result.get( 0 ) );
+
+        mm.verifyAll();
+    }
+
+    public void testCollectExcludesFromQueuedArtifacts_ShouldHandleNullExcludesList()
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+
+        mm.replayAll();
+
+        Set artifactIds = Collections.singleton( "group:artifact:jar" );
+
+        List result = createPhase( macLogger.logger ).collectExcludesFromQueuedArtifacts( artifactIds, null );
+
+        assertEquals( 1, result.size() );
+
+        assertEquals( "group:artifact:jar", result.get( 0 ) );
+
+        mm.verifyAll();
+    }
+
+    public void testAddArtifact_ShouldThrowExceptionWhenArtifactFileIsNull()
+        throws AssemblyFormattingException, IOException
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForAddArtifactTask macTask = new MockAndControlForAddArtifactTask( mm );
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+
+        macTask.expectArtifactGetFile( false );
+
+        macTask.artifact.getId();
+        macTask.artifactCtl.setReturnValue( "group:artifact:type:version" );
+
+        mm.replayAll();
+
+        try
+        {
+            createPhase( macLogger.logger ).addArtifact( macTask.artifact, null, null, null, null, false );
+
+            fail( "Expected ArchiveCreationException since artifact file is null." );
+        }
+        catch ( ArchiveCreationException e )
+        {
+            // expected
+        }
+
+        mm.verifyAll();
+    }
+
+    public void testAddArtifact_ShouldAddOneArtifact()
+        throws AssemblyFormattingException, IOException, ArchiveCreationException
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForAddArtifactTask macTask = new MockAndControlForAddArtifactTask( mm );
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+
+        MavenProject project = createProject( "group", "artifact", "version", null );
+        project.setArtifact( macTask.artifact );
+
+        macTask.expectArtifactGetFile();
+        macTask.expectGetFinalName( "final-name" );
+        macTask.expectGetClassifier( null );
+        macTask.expectGetArtifactHandler();
+
+        macTask.expectAddFile( "out/artifact", Integer.parseInt( "777", 8 ) );
+
+        ModuleBinaries binaries = new ModuleBinaries();
+        binaries.setOutputDirectory( "out" );
+        binaries.setOutputFileNameMapping( "artifact" );
+        binaries.setUnpack( false );
+        binaries.setFileMode( "777" );
+
+        mm.replayAll();
+
+        createPhase( macLogger.logger ).addArtifact( macTask.artifact, project, macTask.archiver, macTask.configSource,
+                                                     binaries, false );
+
+        mm.verifyAll();
+    }
+
+    public void testAddModuleSourceFileSets_ShouldReturnImmediatelyIfSourcesIsNull()
+        throws ArchiveCreationException, AssemblyFormattingException
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+
+        mm.replayAll();
+
+        createPhase( macLogger.logger ).addModuleSourceFileSets( null, null, null, null, false );
+
+        mm.verifyAll();
+    }
+
+    public void testAddModuleSourceFileSets_ShouldAddOneSourceDirectory()
+        throws ArchiveCreationException, AssemblyFormattingException
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForAddFileSetsTask macTask = new MockAndControlForAddFileSetsTask( mm, fileManager );
+
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+        macLogger.expectDebug( true, true );
+
+        MavenProject project = createProject( "group", "artifact", "version", null );
+
+        Set projects = Collections.singleton( project );
+
+        ModuleSources sources = new ModuleSources();
+        sources.setDirectory( "/src" );
+        sources.setDirectoryMode( "777" );
+        sources.setFileMode( "777" );
+
+        macTask.expectGetArchiveBaseDirectory();
+
+        int mode = Integer.parseInt( "777", 8 );
+        int[] modes = { -1, -1, mode, mode };
+
+        macTask.expectAdditionOfSingleFileSet( project, project.getBasedir(), "final-name", false, modes, 1, true,
+                                               false );
+
+        mm.replayAll();
+
+        createPhase( macLogger.logger ).addModuleSourceFileSets( sources, projects, macTask.archiver,
+                                                                 macTask.configSource, false );
+
+        mm.verifyAll();
+    }
+
+    public void testGetModuleProjects_ShouldReturnNothingWhenReactorContainsOnlyCurrentProject()
+        throws ArchiveCreationException
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+        MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
+
+        MavenProject project = createProject( "group", "artifact", "version", null );
+
+        List projects = Collections.singletonList( project );
+
+        macCS.expectGetProject( project );
+        macCS.expectGetReactorProjects( projects );
+
+        ModuleSet moduleSet = new ModuleSet();
+
+        mm.replayAll();
+
+        Set moduleProjects = createPhase( macLogger.logger ).getModuleProjects( moduleSet, macCS.configSource );
+
+        assertTrue( moduleProjects.isEmpty() );
+
+        mm.verifyAll();
+    }
+
+    public void testGetModuleProjects_ShouldReturnNothingWhenReactorContainsTwoSiblingProjects()
+        throws ArchiveCreationException
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+        MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
+
+        MavenProject project = createProject( "group", "artifact", "version", null );
+        MavenProject project2 = createProject( "group", "artifact2", "version", null );
+
+        List projects = new ArrayList();
+        projects.add( project );
+        projects.add( project2 );
+
+        macCS.expectGetProject( project );
+        macCS.expectGetReactorProjects( projects );
+
+        ModuleSet moduleSet = new ModuleSet();
+
+        mm.replayAll();
+
+        Set moduleProjects = createPhase( macLogger.logger ).getModuleProjects( moduleSet, macCS.configSource );
+
+        assertTrue( moduleProjects.isEmpty() );
+
+        mm.verifyAll();
+    }
+
+    public void testGetModuleProjects_ShouldReturnModuleOfCurrentProject()
+        throws ArchiveCreationException
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+        MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
+
+        MavenProject project = createProject( "group", "artifact", "version", null );
+        MavenProject project2 = createProject( "group", "artifact2", "version", project );
+
+        List projects = new ArrayList();
+        projects.add( project );
+        projects.add( project2 );
+
+        macCS.expectGetProject( project );
+        macCS.expectGetReactorProjects( projects );
+
+        ModuleSet moduleSet = new ModuleSet();
+
+        mm.replayAll();
+
+        Set moduleProjects = createPhase( macLogger.logger ).getModuleProjects( moduleSet, macCS.configSource );
+
+        assertFalse( moduleProjects.isEmpty() );
+
+        MavenProject result = ( MavenProject ) moduleProjects.iterator().next();
+
+        assertEquals( "artifact2", result.getArtifactId() );
+
+        mm.verifyAll();
+    }
+
+    public void testGetModuleProjects_ShouldReturnDescendentModulesOfCurrentProject()
+        throws ArchiveCreationException
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+        MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
+
+        MavenProject project = createProject( "group", "artifact", "version", null );
+        MavenProject project2 = createProject( "group", "artifact2", "version", project );
+        MavenProject project3 = createProject( "group", "artifact3", "version", project2 );
+
+        List projects = new ArrayList();
+        projects.add( project );
+        projects.add( project2 );
+        projects.add( project3 );
+
+        macCS.expectGetProject( project );
+        macCS.expectGetReactorProjects( projects );
+
+        ModuleSet moduleSet = new ModuleSet();
+
+        mm.replayAll();
+
+        Set moduleProjects = createPhase( macLogger.logger ).getModuleProjects( moduleSet, macCS.configSource );
+
+        assertEquals( 2, moduleProjects.size() );
+
+        List check = new ArrayList();
+        check.add( project2 );
+        check.add( project3 );
+
+        verifyResultIs( check, moduleProjects );
+
+        mm.verifyAll();
+    }
+
+    public void testGetModuleProjects_ShouldExcludeModuleAndDescendentsTransitively()
+        throws ArchiveCreationException
+    {
+        MockManager mm = new MockManager();
+
+        MockAndControlForLogger macLogger = new MockAndControlForLogger( mm );
+        MockAndControlForConfigSource macCS = new MockAndControlForConfigSource( mm );
+
+        MavenProject project = createProject( "group", "artifact", "version", null );
+        addArtifact( project, mm, false, false );
+
+        MavenProject project2 = createProject( "group", "artifact2", "version", project );
+        addArtifact( project2, mm, true, false );
+
+        MavenProject project3 = createProject( "group", "artifact3", "version", project2 );
+        addArtifact( project3, mm, true, true );
+
+        List projects = new ArrayList();
+        projects.add( project );
+        projects.add( project2 );
+        projects.add( project3 );
+
+        macCS.expectGetProject( project );
+        macCS.expectGetReactorProjects( projects );
+
+        ModuleSet moduleSet = new ModuleSet();
+
+        moduleSet.addExclude( "group:artifact2" );
+
+        mm.replayAll();
+
+        Set moduleProjects = createPhase( macLogger.logger ).getModuleProjects( moduleSet, macCS.configSource );
+
+        assertTrue( moduleProjects.isEmpty() );
+
+        mm.verifyAll();
+    }
+
+    private void addArtifact( MavenProject project, MockManager mm, boolean expectIdentityChecks,
+                              boolean expectDepTrailCheck )
+    {
+        MockAndControlForArtifact macArtifact = new MockAndControlForArtifact( mm );
+
+        if ( expectIdentityChecks )
+        {
+            macArtifact.expectGetArtifactId( project.getArtifactId() );
+            macArtifact.expectGetGroupId( project.getGroupId() );
+            macArtifact.expectGetDependencyConflictId( project.getGroupId(), project.getArtifactId(),
+                                                       project.getPackaging() );
+        }
+
+        if ( expectDepTrailCheck )
+        {
+            LinkedList depTrail = new LinkedList();
+
+            MavenProject parent = project.getParent();
+            while ( parent != null )
+            {
+                depTrail.addLast( ArtifactUtils.versionlessKey( parent.getGroupId(), parent.getArtifactId() ) );
+
+                parent = parent.getParent();
+            }
+
+            macArtifact.expectGetDependencyTrail( depTrail );
+        }
+
+        project.setArtifact( macArtifact.artifact );
+    }
+
+    private void verifyResultIs( List check, Set moduleProjects )
+    {
+        boolean failed = false;
+
+        Set checkTooMany = new HashSet( moduleProjects );
+        checkTooMany.removeAll( check );
+
+        if ( !checkTooMany.isEmpty() )
+        {
+            failed = true;
+
+            System.out.println( "Unexpected projects in output: " );
+
+            for ( Iterator iter = checkTooMany.iterator(); iter.hasNext(); )
+            {
+                MavenProject project = ( MavenProject ) iter.next();
+
+                System.out.println( project.getId() );
+            }
+        }
+
+        Set checkTooFew = new HashSet( check );
+        checkTooFew.removeAll( moduleProjects );
+
+        if ( !checkTooFew.isEmpty() )
+        {
+            failed = true;
+
+            System.out.println( "Expected projects missing from output: " );
+
+            for ( Iterator iter = checkTooMany.iterator(); iter.hasNext(); )
+            {
+                MavenProject project = ( MavenProject ) iter.next();
+
+                System.out.println( project.getId() );
+            }
+        }
+
+        if ( failed )
+        {
+            Assert.fail( "See system output for more information." );
+        }
+    }
+
+    private MavenProject createProject( String groupId, String artifactId, String version, MavenProject parentProject )
+    {
+        Model model = new Model();
+        model.setArtifactId( artifactId );
+        model.setGroupId( groupId );
+        model.setVersion( version );
+
+        MavenProject project = new MavenProject( model );
+
+        File pomFile;
+        if ( parentProject == null )
+        {
+            File basedir = fileManager.createTempDir();
+            pomFile = new File( basedir, "pom.xml" );
+        }
+        else
+        {
+            File parentBase = parentProject.getBasedir();
+            pomFile = new File( parentBase, artifactId + "/pom.xml" );
+
+            parentProject.getModel().addModule( artifactId );
+            project.setParent( parentProject );
+        }
+
+        project.setFile( pomFile );
+
+        return project;
+    }
+
+    private ModuleSetAssemblyPhase createPhase( Logger logger )
+    {
+        ModuleSetAssemblyPhase phase = new ModuleSetAssemblyPhase();
+
+        phase.enableLogging( logger );
+
+        return phase;
+    }
+
+    private final class MockAndControlForArtifact
+    {
+        Artifact artifact;
+
+        MockControl control;
+
+        public MockAndControlForArtifact( MockManager mm )
+        {
+            control = MockControl.createControl( Artifact.class );
+            mm.add( control );
+
+            artifact = ( Artifact ) control.getMock();
+        }
+
+        public void expectGetDependencyTrail( LinkedList depTrail )
+        {
+            artifact.getDependencyTrail();
+            control.setReturnValue( depTrail, MockControl.ONE_OR_MORE );
+        }
+
+        public void expectGetDependencyConflictId( String groupId, String artifactId, String packaging )
+        {
+            artifact.getDependencyConflictId();
+            control.setReturnValue( groupId + ":" + artifactId + ":" + packaging, MockControl.ONE_OR_MORE );
+        }
+
+        void expectGetGroupId( String groupId )
+        {
+            artifact.getGroupId();
+            control.setReturnValue( groupId, MockControl.ONE_OR_MORE );
+        }
+
+        void expectGetArtifactId( String artifactId )
+        {
+            artifact.getArtifactId();
+            control.setReturnValue( artifactId, MockControl.ONE_OR_MORE );
+        }
+    }
+
+    private final class MockAndControlForLogger
+    {
+        Logger logger;
+
+        MockControl control;
+
+        public MockAndControlForLogger( MockManager mockManager )
+        {
+            control = MockControl.createControl( Logger.class );
+            mockManager.add( control );
+
+            logger = ( Logger ) control.getMock();
+        }
+
+        public void expectDebug( boolean debugCheck, boolean debugEnabled )
+        {
+            if ( debugCheck )
+            {
+                logger.isDebugEnabled();
+                control.setReturnValue( debugEnabled, MockControl.ONE_OR_MORE );
+            }
+
+            if ( !debugCheck || debugEnabled )
+            {
+                logger.debug( null );
+                control.setMatcher( MockControl.ALWAYS_MATCHER );
+                control.setVoidCallable( MockControl.ONE_OR_MORE );
+            }
+        }
+    }
+
+    private final class MockAndControlForConfigSource
+    {
+        AssemblerConfigurationSource configSource;
+
+        MockControl control;
+
+        MockAndControlForConfigSource( MockManager mockManager )
+        {
+            control = MockControl.createControl( AssemblerConfigurationSource.class );
+            mockManager.add( control );
+
+            configSource = ( AssemblerConfigurationSource ) control.getMock();
+        }
+
+        public void expectGetReactorProjects( List projects )
+        {
+            configSource.getReactorProjects();
+            control.setReturnValue( projects, MockControl.ONE_OR_MORE );
+        }
+
+        public void expectGetProject( MavenProject project )
+        {
+            configSource.getProject();
+            control.setReturnValue( project, MockControl.ONE_OR_MORE );
+        }
+    }
+
+}

Propchange: maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/ModuleSetAssemblyPhaseTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/plugins/branches/MASSEMBLY-124/src/test/java/org/apache/maven/plugin/assembly/archive/phase/ModuleSetAssemblyPhaseTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"