You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2010/07/25 14:05:32 UTC
svn commit: r979028 - in /maven/maven-3/trunk/maven-compat/src:
main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java
test/java/org/apache/maven/artifact/resolver/DefaultArtifactResolverTest.java
Author: bentmann
Date: Sun Jul 25 12:05:32 2010
New Revision: 979028
URL: http://svn.apache.org/viewvc?rev=979028&view=rev
Log:
[MNG-4738] DefaultArtifactResolver forks non-daemon threads
Submitted by: Benjamin Hanzelmann
Modified:
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java
maven/maven-3/trunk/maven-compat/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactResolverTest.java
Modified: maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java?rev=979028&r1=979027&r2=979028&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java (original)
+++ maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java Sun Jul 25 12:05:32 2010
@@ -32,8 +32,10 @@ import java.util.concurrent.CountDownLat
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
@@ -125,7 +127,7 @@ public class DefaultArtifactResolver
else
{
executor =
- new ThreadPoolExecutor( threads, threads, 3, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>() );
+ new ThreadPoolExecutor( threads, threads, 3, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new DaemonThreadCreator());
}
}
@@ -687,6 +689,26 @@ public class DefaultArtifactResolver
resolve( artifact, remoteRepositories, localRepository, null );
}
+ /**
+ * ThreadCreator for creating daemon threads with fixed ThreadGroup-name.
+ */
+ final static class DaemonThreadCreator
+ implements ThreadFactory
+ {
+ static final String THREADGROUP_NAME = "org.apache.maven.artifact.resolver.DefaultArtifactResolver";
+
+ final static ThreadGroup group = new ThreadGroup( THREADGROUP_NAME );
+
+ final static AtomicInteger threadNumber = new AtomicInteger( 1 );
+
+ public Thread newThread( Runnable r )
+ {
+ Thread newThread = new Thread( group, r, "resolver-" + threadNumber.getAndIncrement() );
+ newThread.setDaemon( true );
+ return newThread;
+ }
+ }
+
private class ResolveTask
implements Runnable
{
Modified: maven/maven-3/trunk/maven-compat/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactResolverTest.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-compat/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactResolverTest.java?rev=979028&r1=979027&r2=979028&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-compat/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactResolverTest.java (original)
+++ maven/maven-3/trunk/maven-compat/src/test/java/org/apache/maven/artifact/resolver/DefaultArtifactResolverTest.java Sun Jul 25 12:05:32 2010
@@ -1,10 +1,88 @@
package org.apache.maven.artifact.resolver;
-import org.codehaus.plexus.PlexusTestCase;
+import java.util.Collections;
+
+import org.apache.maven.artifact.AbstractArtifactComponentTestCase;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.resolver.DefaultArtifactResolver.DaemonThreadCreator;
public class DefaultArtifactResolverTest
- extends PlexusTestCase
+ extends AbstractArtifactComponentTestCase
{
+ private DefaultArtifactResolver artifactResolver;
+
+ private Artifact projectArtifact;
+
+ @Override
+ protected void setUp()
+ throws Exception
+ {
+ super.setUp();
+
+ artifactResolver = (DefaultArtifactResolver) lookup( ArtifactResolver.class );
+
+ projectArtifact = createLocalArtifact( "project", "3.0" );
+ }
+
+ @Override
+ protected void tearDown()
+ throws Exception
+ {
+ artifactFactory = null;
+ projectArtifact = null;
+ super.tearDown();
+ }
+
+ @Override
+ protected String component()
+ {
+ return "resolver";
+ }
+
+ public void testMNG4738()
+ throws Exception
+ {
+ Artifact g = createLocalArtifact( "g", "1.0" );
+ createLocalArtifact( "h", "1.0" );
+ artifactResolver.resolveTransitively( Collections.singleton( g ), projectArtifact, remoteRepositories(),
+ localRepository(), null );
+
+ // we want to see all top-level thread groups
+ ThreadGroup tg = Thread.currentThread().getThreadGroup();
+ while ( !( tg.getParent() != null ) )
+ {
+ tg = tg.getParent();
+ }
+
+ ThreadGroup[] tgList = new ThreadGroup[tg.activeGroupCount()];
+ tg.enumerate( tgList );
+
+ boolean seen = false;
+
+ for ( int i = 0; i < tgList.length; i++ )
+ {
+ if ( !tgList[i].getName().equals( DaemonThreadCreator.THREADGROUP_NAME ) )
+ {
+ continue;
+ }
+
+ seen = true;
+
+ tg = tgList[i];
+ Thread[] ts = new Thread[tg.activeCount()];
+ tg.enumerate( ts );
+
+ for ( Thread active : ts )
+ {
+ String name = active.getName();
+ boolean daemon = active.isDaemon();
+ assertTrue( name + " is no daemon Thread.", daemon );
+ }
+
+ }
+
+ assertTrue( "Could not find ThreadGroup: " + DaemonThreadCreator.THREADGROUP_NAME, seen );
+ }
public void testLookup()
throws Exception