Index: pom.xml =================================================================== --- pom.xml (revision 615545) +++ pom.xml (working copy) @@ -285,8 +285,8 @@ org.apache.maven.wagon - wagon-http-lightweight - 1.0-beta-2 + wagon-http + 1.0-rc1-SNAPSHOT easymock Index: maven-core/src/main/java/org/apache/maven/MavenArtifactFilterManager.java =================================================================== --- maven-core/src/main/java/org/apache/maven/MavenArtifactFilterManager.java (revision 615545) +++ maven-core/src/main/java/org/apache/maven/MavenArtifactFilterManager.java (working copy) @@ -67,6 +67,9 @@ artifacts.add( "wagon-http-lightweight" ); artifacts.add( "wagon-ssh" ); artifacts.add( "wagon-ssh-external" ); + artifacts.add( "commons-logging" ); + artifacts.add( "commons-httpclient" ); + artifacts.add( "commons-codec" ); return new ExclusionSetFilter( artifacts ); } Index: maven-core/pom.xml =================================================================== --- maven-core/pom.xml (revision 615545) +++ maven-core/pom.xml (working copy) @@ -151,7 +151,7 @@ org.apache.maven.wagon - wagon-http-lightweight + wagon-http runtime Index: maven-artifact-manager/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java =================================================================== --- maven-artifact-manager/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java (revision 615545) +++ maven-artifact-manager/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java (working copy) @@ -39,13 +39,11 @@ import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.CountDownLatch; public class DefaultArtifactResolver extends AbstractLogEnabled @@ -63,6 +61,11 @@ private ArtifactCollector artifactCollector; + public DefaultArtifactResolver() + { + super(); + } + // ---------------------------------------------------------------------- // Implementation // ---------------------------------------------------------------------- @@ -297,23 +300,39 @@ artifactResolutionResult = artifactCollector.collect( artifacts, originatingArtifact, managedVersions, localRepository, remoteRepositories, source, filter, listeners ); + ThreadPoolExecutor resolveArtifactPool = new ThreadPoolExecutor(3, 5, 3, TimeUnit.SECONDS, new ArrayBlockingQueue(1000)); List resolvedArtifacts = new ArrayList(); List missingArtifacts = new ArrayList(); + CountDownLatch latch = new CountDownLatch(artifactResolutionResult.getArtifactResolutionNodes().size()); + Map> nodesByGroupId = new HashMap>(); for ( Iterator i = artifactResolutionResult.getArtifactResolutionNodes().iterator(); i.hasNext(); ) { ResolutionNode node = (ResolutionNode) i.next(); - try + List nodes = nodesByGroupId.get(node.getArtifact().getGroupId()); + if (nodes == null) { - resolve( node.getArtifact(), node.getRemoteRepositories(), localRepository ); - resolvedArtifacts.add( node.getArtifact() ); + nodes = new ArrayList(); + nodesByGroupId.put(node.getArtifact().getGroupId(), nodes); } - catch ( ArtifactNotFoundException anfe ) + nodes.add(node); + } + + try { + for (List nodes : nodesByGroupId.values()) { - getLogger().debug( anfe.getMessage(), anfe ); - - missingArtifacts.add( node.getArtifact() ); + resolveArtifactPool.execute(new ResolveArtifactTask(resolveArtifactPool, latch, nodes, localRepository, resolvedArtifacts, missingArtifacts)); } + latch.await(); + } catch (InterruptedException e) { + throw new ArtifactResolutionException("Resolution interrupted", null, e); + } catch (RuntimeException ex) { + if (ex.getCause() instanceof ArtifactResolutionException) + throw (ArtifactResolutionException) ex.getCause(); + else + throw ex; + } finally { + resolveArtifactPool.shutdownNow(); } if ( missingArtifacts.size() > 0 ) @@ -342,4 +361,51 @@ remoteRepositories, source, null, listeners ); } + private class ResolveArtifactTask implements Runnable { + private List nodes; + private ArtifactRepository localRepository; + private List resolvedArtifacts; + private List missingArtifacts; + private CountDownLatch latch; + private ThreadPoolExecutor pool; + + public ResolveArtifactTask(ThreadPoolExecutor pool, CountDownLatch latch, List nodes, ArtifactRepository localRepository, List resolvedArtifacts, List missingArtifacts) { + this.nodes = nodes; + this.localRepository = localRepository; + this.resolvedArtifacts = resolvedArtifacts; + this.missingArtifacts = missingArtifacts; + this.latch = latch; + this.pool = pool; + } + + public void run() { + //getLogger().info("Size of nodes: "+nodes.size()+" on thread: "+Thread.currentThread().getId()); + Iterator i = nodes.iterator(); + ResolutionNode node = i.next(); + i.remove(); + try { + resolveArtifact(node); + if (i.hasNext()) + pool.execute(new ResolveArtifactTask(pool, latch, nodes, localRepository, resolvedArtifacts, missingArtifacts)); + } catch (ArtifactResolutionException e) { + throw new RuntimeException(e); + } + latch.countDown(); + } + + private void resolveArtifact(ResolutionNode node) throws ArtifactResolutionException { + try + { + resolve( node.getArtifact(), node.getRemoteRepositories(), localRepository ); + resolvedArtifacts.add( node.getArtifact() ); + } + catch ( ArtifactNotFoundException anfe ) + { + getLogger().debug( anfe.getMessage(), anfe ); + + missingArtifacts.add( node.getArtifact() ); + } + } + } + } Index: maven-artifact-manager/pom.xml =================================================================== --- maven-artifact-manager/pom.xml (revision 615545) +++ maven-artifact-manager/pom.xml (working copy) @@ -65,6 +65,14 @@ + org.apache.maven.plugins + maven-compiler-plugin + + 1.5 + 1.5 + + + maven-surefire-plugin