Bug 451566 - DefaultRepositorySystem.resolveDependencies() fails with NPE when dependency collection fails early and yields not even a root node
Skipped artifact resolution step if dependency collection didn't yield any nodes and allowed underlying exception from collector to bubble up Project: http://git-wip-us.apache.org/repos/asf/maven-aether/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-aether/commit/ab199198 Tree: http://git-wip-us.apache.org/repos/asf/maven-aether/tree/ab199198 Diff: http://git-wip-us.apache.org/repos/asf/maven-aether/diff/ab199198 Branch: refs/heads/master Commit: ab19919869fb90be10e2904c6e01851d0b12dfef Parents: 1cbc81d Author: Benjamin Bentmann <bentm...@sonatype.com> Authored: Sun Nov 16 22:02:02 2014 +0100 Committer: Benjamin Bentmann <bentm...@sonatype.com> Committed: Sun Nov 16 22:02:02 2014 +0100 ---------------------------------------------------------------------- .../internal/impl/DefaultRepositorySystem.java | 49 +++++++++++--------- .../impl/DefaultRepositorySystemTest.java | 34 ++++++++++++++ 2 files changed, 62 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-aether/blob/ab199198/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java ---------------------------------------------------------------------- diff --git a/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java b/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java index 8882814..f15683f 100644 --- a/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java +++ b/aether-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultRepositorySystem.java @@ -345,35 +345,42 @@ public class DefaultRepositorySystem dce = e; collectResult = e.getResult(); } - result.setRoot( collectResult.getRoot() ); - result.setCycles( collectResult.getCycles() ); - result.setCollectExceptions( collectResult.getExceptions() ); + if ( collectResult != null ) + { + result.setRoot( collectResult.getRoot() ); + result.setCycles( collectResult.getCycles() ); + result.setCollectExceptions( collectResult.getExceptions() ); + } } else { throw new IllegalArgumentException( "dependency node or collect request missing" ); } - ArtifactRequestBuilder builder = new ArtifactRequestBuilder( trace ); - DependencyFilter filter = request.getFilter(); - DependencyVisitor visitor = ( filter != null ) ? new FilteringDependencyVisitor( builder, filter ) : builder; - visitor = new TreeDependencyVisitor( visitor ); - result.getRoot().accept( visitor ); - List<ArtifactRequest> requests = builder.getRequests(); - - List<ArtifactResult> results; - try + if ( result.getRoot() != null ) { - results = artifactResolver.resolveArtifacts( session, requests ); - } - catch ( ArtifactResolutionException e ) - { - are = e; - results = e.getResults(); - } - result.setArtifactResults( results ); + ArtifactRequestBuilder builder = new ArtifactRequestBuilder( trace ); + DependencyFilter filter = request.getFilter(); + DependencyVisitor visitor = + ( filter != null ) ? new FilteringDependencyVisitor( builder, filter ) : builder; + visitor = new TreeDependencyVisitor( visitor ); + result.getRoot().accept( visitor ); + + List<ArtifactResult> results; + try + { + List<ArtifactRequest> requests = builder.getRequests(); + results = artifactResolver.resolveArtifacts( session, requests ); + } + catch ( ArtifactResolutionException e ) + { + are = e; + results = e.getResults(); + } + result.setArtifactResults( results ); - updateNodesWithResolvedArtifacts( results ); + updateNodesWithResolvedArtifacts( results ); + } if ( dce != null ) { http://git-wip-us.apache.org/repos/asf/maven-aether/blob/ab199198/aether-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultRepositorySystemTest.java ---------------------------------------------------------------------- diff --git a/aether-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultRepositorySystemTest.java b/aether-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultRepositorySystemTest.java index 2cdb035..9a0b609 100644 --- a/aether-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultRepositorySystemTest.java +++ b/aether-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultRepositorySystemTest.java @@ -16,10 +16,19 @@ import java.util.Arrays; import java.util.List; import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.collection.CollectResult; +import org.eclipse.aether.collection.DependencyCollectionException; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.impl.DependencyCollector; import org.eclipse.aether.internal.test.util.TestUtils; import org.eclipse.aether.repository.Authentication; import org.eclipse.aether.repository.Proxy; import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.resolution.DependencyRequest; +import org.eclipse.aether.resolution.DependencyResolutionException; import org.eclipse.aether.util.repository.AuthenticationBuilder; import org.eclipse.aether.util.repository.DefaultAuthenticationSelector; import org.eclipse.aether.util.repository.DefaultMirrorSelector; @@ -103,4 +112,29 @@ public class DefaultRepositorySystemTest assertSame( auth, deployRepo.getAuthentication() ); } + @Test + public void testResolveDependencies_NoRootNode() + throws Exception + { + DependencyRequest request = new DependencyRequest(); + request.setCollectRequest( new CollectRequest().setRoot( new Dependency( new DefaultArtifact( "g:a:v" ), "" ) ) ); + system.setDependencyCollector( new DependencyCollector() + { + public CollectResult collectDependencies( RepositorySystemSession session, CollectRequest request ) + throws DependencyCollectionException + { + throw new DependencyCollectionException( null ); + } + } ); + try + { + system.resolveDependencies( session, request ); + fail( "Expected exception" ); + } + catch ( DependencyResolutionException e ) + { + assertTrue( e.getCause() instanceof DependencyCollectionException ); + } + } + }