[MASSEMBLY-675] Maven Assembly packaging wildcard-excluded dependencies

Require maven to solve dependencies instead of building requests, fixing wildcard exclusion problem
diff --git a/src/main/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolver.java b/src/main/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolver.java
index 741b19d..936e250 100644
--- a/src/main/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolver.java
+++ b/src/main/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolver.java
@@ -20,20 +20,14 @@
  */
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
-import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
-import org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.plugins.assembly.AssemblerConfigurationSource;
 import org.apache.maven.plugins.assembly.archive.ArchiveCreationException;
 import org.apache.maven.plugins.assembly.archive.phase.ModuleSetAssemblyPhase;
@@ -49,7 +43,6 @@
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.repository.RepositorySystem;
 import org.apache.maven.shared.artifact.filter.resolve.ScopeFilter;
-import org.apache.maven.shared.artifact.filter.resolve.transform.ArtifactIncludeFilterTransformer;
 import org.apache.maven.shared.artifact.resolve.ArtifactResult;
 import org.apache.maven.shared.dependencies.resolve.DependencyResolverException;
 import org.codehaus.plexus.component.annotations.Component;
@@ -93,43 +86,28 @@
                                                        currentProject );
             updateModuleSetResolutionRequirements( assemblyId, moduleSet, dependencySet, info, configSource );
 
-            resolve( assembly, configSource, result, dependencySet, info );
+            result.put( dependencySet, resolve( info, currentProject ) );
 
         }
         return result;
     }
 
-    private void resolve( Assembly assembly, AssemblerConfigurationSource configSource,
-                          Map<DependencySet, Set<Artifact>> result, DependencySet dependencySet,
-                          ResolutionManagementInfo info )
-        throws DependencyResolutionException
+    private Set<Artifact> resolve( ResolutionManagementInfo info, MavenProject project )
     {
-        Set<Artifact> artifacts;
-        if ( info.isResolutionRequired() )
+        Set<Artifact> artifacts = new HashSet<>();
+        if ( info.isResolvedTransitively() )
         {
-            final List<ArtifactRepository> repos =
-                aggregateRemoteArtifactRepositories( configSource.getRemoteRepositories(), info.getEnabledProjects() );
-
-            artifacts = info.getArtifacts();
-            if ( info.isResolvedTransitively() )
-            {
-                getLogger().debug( "Resolving project dependencies transitively." );
-                
-                ArtifactFilter filter = new ArtifactIncludeFilterTransformer().transform( info.getScopeFilter() );
-                artifacts = resolveTransitively( artifacts, repos, filter, configSource );
-            }
-            else
-            {
-                getLogger().debug( "Resolving project dependencies ONLY. "
-                                       + "Transitive dependencies WILL NOT be included in the results." );
-                artifacts = resolveNonTransitively( assembly, artifacts, configSource, repos );
-            }
+            getLogger().debug( "Resolving project dependencies transitively." );
+            artifacts = project.getArtifacts();
         }
         else
         {
-            artifacts = new HashSet<Artifact>();
+            getLogger().debug( "Resolving project dependencies ONLY. "
+                + "Transitive dependencies WILL NOT be included in the results." );
+            artifacts = project.getDependencyArtifacts();
         }
-        result.put( dependencySet, artifacts );
+
+        return artifacts;
     }
 
     @Override
@@ -152,114 +130,29 @@
                                                        configSource.getMavenSession().getProjectBuildingRequest(),
                                                        currentProject );
 
-            resolve( assembly, configSource, result, dependencySet, info );
+            result.put( dependencySet, resolve( info, currentProject ) );
 
         }
         return result;
     }
 
-    Set<Artifact> resolveNonTransitively( final Assembly assembly, final Set<Artifact> dependencyArtifacts,
-                                          final AssemblerConfigurationSource configSource,
-                                          final List<ArtifactRepository> repos )
-        throws DependencyResolutionException
-    {
-
-        final List<Artifact> missing = new ArrayList<Artifact>();
-        final Set<Artifact> resolved = new LinkedHashSet<Artifact>();
-        for ( final Artifact depArtifact : dependencyArtifacts )
-        {
-            ArtifactResolutionRequest req = new ArtifactResolutionRequest();
-            req.setLocalRepository( configSource.getLocalRepository() );
-            req.setRemoteRepositories( repos );
-            req.setArtifact( depArtifact );
-
-            ArtifactResolutionResult resolve = resolver.resolve( req );
-            if ( resolve.hasExceptions() )
-            {
-                if ( getLogger().isDebugEnabled() )
-                {
-                    getLogger().debug(
-                        "Failed to resolve: " + depArtifact.getId() + " for assembly: " + assembly.getId() );
-                }
-                missing.add( depArtifact );
-            }
-            else
-            {
-                resolved.add( depArtifact );
-            }
-        }
-
-        if ( !missing.isEmpty() )
-
-        {
-            final MavenProject project = configSource.getProject();
-            final Artifact rootArtifact = project.getArtifact();
-
-            final Throwable error =
-                new MultipleArtifactsNotFoundException( rootArtifact, new ArrayList<Artifact>( resolved ), missing,
-                                                        repos );
-
-            throw new DependencyResolutionException( "Failed to resolve dependencies for: " + assembly.getId(), error );
-        }
-
-        return resolved;
-    }
-
-    private Set<Artifact> resolveTransitively( final Set<Artifact> dependencyArtifacts,
-                                               final List<ArtifactRepository> repos,
-                                               final ArtifactFilter filter,
-                                               final AssemblerConfigurationSource configSource )
-        throws DependencyResolutionException
-    {
-        final MavenProject project = configSource.getProject();
-
-        ArtifactResolutionRequest req = new ArtifactResolutionRequest();
-        req.setLocalRepository( configSource.getLocalRepository() );
-        req.setResolveRoot( false );
-        req.setRemoteRepositories( repos );
-        req.setResolveTransitively( true );
-        req.setArtifact( project.getArtifact() );
-        req.setArtifactDependencies( dependencyArtifacts );
-        req.setManagedVersionMap( project.getManagedVersionMap() );
-        req.setCollectionFilter( filter );
-        req.setOffline( configSource.getMavenSession().isOffline() );
-        req.setForceUpdate( configSource.getMavenSession().getRequest().isUpdateSnapshots() );
-        req.setServers( configSource.getMavenSession().getRequest().getServers() );
-        req.setMirrors( configSource.getMavenSession().getRequest().getMirrors() );
-        req.setProxies( configSource.getMavenSession().getRequest().getProxies() );
-
-        ArtifactResolutionResult result;
-
-        result = resolver.resolve( req );
-        if ( result.hasExceptions() )
-        {
-            throw new DependencyResolutionException( "Failed to resolve dependencies for assembly: ",
-                                                     result.getExceptions().get( 0 ) );
-        }
-
-        getLogger().debug( "While resolving dependencies of " + project.getId() + ":" );
-
-        FilterUtils.reportFilteringStatistics( Collections.singleton( filter ), getLogger() );
-
-        return result.getArtifacts();
-    }
 
     void updateRepositoryResolutionRequirements( final Assembly assembly, final ResolutionManagementInfo requirements )
     {
         final List<Repository> repositories = assembly.getRepositories();
 
         Set<String> rootScopes = new HashSet<String>();
-        
+
         if ( repositories != null && !repositories.isEmpty() )
         {
-            
+
             requirements.setResolutionRequired( true );
             for ( final Repository repo : repositories )
             {
                 rootScopes.add( repo.getScope() );
             }
         }
-        
+
         requirements.setScopeFilter( FilterUtils.newScopeFilter( rootScopes ) );
     }
 
@@ -321,9 +214,9 @@
         requirements.setResolvedTransitively( set.isUseTransitiveDependencies() );
 
         ScopeFilter scopeFilter = FilterUtils.newScopeFilter( set.getScope() );
-        
+
         requirements.setScopeFilter( scopeFilter );
-        
+
         for ( final MavenProject project : projects )
         {
             if ( project == null )
diff --git a/src/main/java/org/apache/maven/plugins/assembly/mojos/SingleAssemblyMojo.java b/src/main/java/org/apache/maven/plugins/assembly/mojos/SingleAssemblyMojo.java
index 1d8d843..2e33b90 100644
--- a/src/main/java/org/apache/maven/plugins/assembly/mojos/SingleAssemblyMojo.java
+++ b/src/main/java/org/apache/maven/plugins/assembly/mojos/SingleAssemblyMojo.java
@@ -41,7 +41,7 @@
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
  * @version $Id$
  */
-@Mojo( name = "single", inheritByDefault = false, requiresDependencyResolution = ResolutionScope.COMPILE,
+@Mojo( name = "single", inheritByDefault = false, requiresDependencyResolution = ResolutionScope.TEST,
     threadSafe = true )
 public class SingleAssemblyMojo
     extends AbstractAssemblyMojo