refactored code to better show the logic

git-svn-id: https://svn.apache.org/repos/asf/maven/shared/trunk@1597312 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/it/reactor/verify.bsh b/src/it/reactor/verify.bsh
index 17c1e47..cffa5c5 100644
--- a/src/it/reactor/verify.bsh
+++ b/src/it/reactor/verify.bsh
@@ -36,7 +36,7 @@
 
 String resolved = FileUtils.fileRead( new File( basedir, "resolved-module-z-deps-y.txt" ) );
 
-if ( !"Could not resolve the following dependencies: [org.apache.maven.its.dependency-tree:module-y-deps-x:jar:1.0-SNAPSHOT (compile), org.apache.maven.its.dependency-tree:module-x:jar:1.0-SNAPSHOT (compile)]".equals( resolved ) )
+if ( !"Could not resolve following dependencies: [org.apache.maven.its.dependency-tree:module-y-deps-x:jar:1.0-SNAPSHOT (compile), org.apache.maven.its.dependency-tree:module-x:jar:1.0-SNAPSHOT (compile)]".equals( resolved ) )
 {
     throw new Exception( "unexpected content in resolved-module-z-deps-y.txt written by ResolveDependenciesLifecycleParticipant" );
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java
index c17c904..c5100ce 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java
@@ -46,14 +46,14 @@
     /**
      * Build the dependency graph, with a hack to include dependencies contained in the reactor projects
      * but that are not yet compiled, which is the minimum prerequisite for Maven core's
-     * ReactorReader to find them. Notice that this hack doesn't work for Maven 2.
+     * ReactorReader to find them. Notice that this hack hasn't been done for Maven 2.
      * <p>Notice: If Maven core did collect instead of resolving dependencies (ie did not try to get the
      * artifacts but only the poms), probably this hack wouldn't be necessary even for people requiring
      * the dependency graph before compiling. TODO: for Maven 3, use Aether to collect dependencies.</p>
      *
      * @param project the project
      * @param filter artifact filter (can be <code>null</code>)
-     * @param reactorProjects Collection of those projects contained in the reactor.
+     * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>).
      * @return the dependency graph
      * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
      */
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java
index 85bea70..122d624 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java
@@ -63,7 +63,7 @@
     public DependencyNode buildDependencyGraph( MavenProject project, ArtifactFilter filter )
         throws DependencyGraphBuilderException
     {
-        return buildDependencyGraph( project, filter, Collections.<MavenProject>emptyList() );
+        return buildDependencyGraph( project, filter, null );
     }
 
     /**
@@ -71,7 +71,7 @@
      *
      * @param project the project
      * @param filter artifact filter (can be <code>null</code>)
-     * @param reactorProjects Collection of those projects contained in the reactor.
+     * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>)
      * @return DependencyNode containing the dependency graph.
      * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
      */
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
index 6386860..bb0fbca 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
@@ -73,12 +73,13 @@
 
     /**
      * Builds the dependency graph for Maven 2.
-     *
-     * NB the reactor projects are ignored as Maven 2 is not able to resolve projects from the reactor.
-     *
-     * @param project           the project
-     * @param filter            artifact filter (can be <code>null</code>)
-     * @param reactorProjects   Ignored.
+     * <p>
+     * notice: the reactor projects are ignored as no work has been done to try to do the same hack as with Maven 3.
+     * </p>
+     * 
+     * @param project the project
+     * @param filter artifact filter (can be <code>null</code>)
+     * @param reactorProjects Ignored.
      * @return DependencyNode containing the dependency graph.
      * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
      */
@@ -86,7 +87,11 @@
                                                 Collection<MavenProject> reactorProjects )
         throws DependencyGraphBuilderException
     {
-        getLogger().warn( "Reactor projects ignored - reactor dependencies cannot be resolved in Maven2" );
+        if ( reactorProjects != null )
+        {
+            getLogger().warn( "Reactor projects ignored - reactor project collection not implemented" );
+        }
+
         return buildDependencyGraph( project, filter );
     }
 
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java
index 9687a71..4256816 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java
@@ -76,15 +76,16 @@
     public DependencyNode buildDependencyGraph( MavenProject project, ArtifactFilter filter )

         throws DependencyGraphBuilderException

     {

-        return buildDependencyGraph( project, filter, Collections.<MavenProject>emptyList() );

+        return buildDependencyGraph( project, filter, null );

     }

 

     /**

-     * Builds the dependency graph for Maven 3.1+ including any dependencies from any projects in the reactor.

+     * Builds the dependency graph for Maven 3.1+, eventually hacking for collecting projects from

+     * reactor not yet built.

      *

      * @param project the project

      * @param filter artifact filter (can be <code>null</code>)

-     * @param reactorProjects Collection of those projects contained in the reactor.

+     * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>).

      * @return DependencyNode containing the dependency graph.

      * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.

      */

@@ -127,51 +128,51 @@
         }

         catch ( DependencyResolutionException e )

         {

-            // Ignore any resolution failure for deps that are part of the reactor but have not yet been built.

-            // NB Typing has been removed because DependencyResolutionResult returns Sonatype Aether in 3.0.4 and

-            // Eclipse Aether in 3.1.1 and while dep-tree is a single module we can only compile against one of them.

-            //

-            // NB While applying this code to Maven3DependencyGraphBuilder is trivial it won't work because

-            // in Maven 3, MavenProject.getProjectReferences isn't populated. So we would need to have the reactor

-            // modules passed in separately which would change the API for DependencyGraphBuilder. If

-            // MavenProject.getProjectReferences were populated (like it should be) then this would work for Maven3 too.

-            //

-            // NB There doesn't seem to be any way to apply this to Maven2DependencyGraphBuilder as there is no

-            // concept of partial resolution like there is is 3 and 3.1

-            final DependencyResolutionResult result = e.getResult();

-

-            final List<Dependency> reactorDeps =

-                getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );

-            result.getUnresolvedDependencies().removeAll( reactorDeps );

-            Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );

-

-            if ( !result.getUnresolvedDependencies().isEmpty() )

+            if ( reactorProjects == null )

             {

-                throw new DependencyGraphBuilderException( "Could not resolve the following dependencies: "

-                    + result.getUnresolvedDependencies(), e );

+                throw new DependencyGraphBuilderException( "Could not resolve following dependencies: "

+                    + e.getResult().getUnresolvedDependencies(), e );

             }

 

-            getLogger().debug( "Resolved dependencies after ignoring reactor dependencies: " + reactorDeps );

-

-            return result;

+            // try collecting from reactor

+            return collectDependenciesFromReactor( e, reactorProjects );

         }

     }

 

+    private DependencyResolutionResult collectDependenciesFromReactor( DependencyResolutionException e,

+                                                                       Collection<MavenProject> reactorProjects )

+        throws DependencyGraphBuilderException

+    {

+        DependencyResolutionResult result = e.getResult();

+

+        List<Dependency> reactorDeps = getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );

+        result.getUnresolvedDependencies().removeAll( reactorDeps );

+        Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );

+

+        if ( !result.getUnresolvedDependencies().isEmpty() )

+        {

+            throw new DependencyGraphBuilderException( "Could not resolve nor collect following dependencies: "

+                + result.getUnresolvedDependencies(), e );

+        }

+

+        return result;

+    }

+

     private List<Dependency> getReactorDependencies( Collection<MavenProject> reactorProjects, List<?> dependencies )

     {

-        final Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>();

-        for ( final MavenProject project : reactorProjects )

+        Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>();

+        for ( MavenProject project : reactorProjects )

         {

             reactorProjectsIds.add( new ArtifactKey( project ) );

         }

 

-        final List<Dependency> reactorDeps = new ArrayList<Dependency>();

-        for ( final Object untypedDependency : dependencies )

+        List<Dependency> reactorDeps = new ArrayList<Dependency>();

+        for ( Object untypedDependency : dependencies )

         {

-            final Dependency dependency = (Dependency) untypedDependency;

-            final org.eclipse.aether.artifact.Artifact depArtifact = dependency.getArtifact();

+            Dependency dependency = (Dependency) untypedDependency;

+            org.eclipse.aether.artifact.Artifact depArtifact = dependency.getArtifact();

 

-            final ArtifactKey key =

+            ArtifactKey key =

                 new ArtifactKey( depArtifact.getGroupId(), depArtifact.getArtifactId(), depArtifact.getVersion() );

 

             if ( reactorProjectsIds.contains( key ) )

diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
index 7718057..f47363a 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
@@ -75,15 +75,16 @@
     public DependencyNode buildDependencyGraph( MavenProject project, ArtifactFilter filter )
         throws DependencyGraphBuilderException
     {
-        return buildDependencyGraph( project, filter, Collections.<MavenProject>emptyList() );
+        return buildDependencyGraph( project, filter, null );
     }
 
     /**
-     * Builds the dependency graph for Maven 3 including any dependencies from any projects in the reactor.
+     * Builds the dependency graph for Maven 3, eventually hacking for collecting projects from
+     * reactor not yet built.
      *
      * @param project the project
      * @param filter artifact filter (can be <code>null</code>)
-     * @param reactorProjects Collection of those projects contained in the reactor.
+     * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>).
      * @return DependencyNode containing the dependency graph.
      * @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
      */
@@ -97,7 +98,7 @@
         DependencyResolutionRequest request =
             new DefaultDependencyResolutionRequest( project, projectBuildingRequest.getRepositorySession() );
 
-        final DependencyResolutionResult result = resolveDependencies( request, reactorProjects );
+        DependencyResolutionResult result = resolveDependencies( request, reactorProjects );
 
         return buildDependencyNode( null, result.getDependencyGraph(), project.getArtifact(), filter );
     }
@@ -112,52 +113,53 @@
         }
         catch ( DependencyResolutionException e )
         {
-            // Ignore any resolution failure for deps that are part of the reactor but have not yet been built.
-            // NB Typing has been removed because DependencyResolutionResult returns Sonatype aether in 3.0.4 and
-            // Eclipse aether in 3.1.1 and while dep-tree is a single module we can only compile against one of them.
-            //
-            // NB While applying this code to Maven3DependencyGraphBuilder is trivial it won't work because
-            // in Maven 3, MavenProject.getProjectReferences isn't populated. So we would need to have the reactor
-            // modules passed in separately which would change the API for DependencyGraphBuilder. If
-            // MavenProject.getProjectReferences were populated (like it should be) then this would work for Maven3 too.
-            //
-            // NB There doesn't seem to be any way to apply this to Maven2DependencyGraphBuilder as there is no
-            // concept of partial resolution like there is is 3 and 3.1
-            final DependencyResolutionResult result = e.getResult();
-
-            final List<Dependency> reactorDeps =
-                getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );
-            result.getUnresolvedDependencies().removeAll( reactorDeps );
-            Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );
-
-            if ( !result.getUnresolvedDependencies().isEmpty() )
+            if ( reactorProjects == null )
             {
-                throw new DependencyGraphBuilderException( "Could not resolve the following dependencies: "
-                    + result.getUnresolvedDependencies(), e );
+                throw new DependencyGraphBuilderException( "Could not resolve following dependencies: "
+                    + e.getResult().getUnresolvedDependencies(), e );
             }
 
-            getLogger().debug( "Resolved dependencies after ignoring reactor dependencies: " + reactorDeps );
-
-            return result;
+            // try collecting from reactor
+            return collectDependenciesFromReactor( e, reactorProjects );
         }
     }
 
+    private DependencyResolutionResult collectDependenciesFromReactor( DependencyResolutionException e,
+                                                                       Collection<MavenProject> reactorProjects )
+        throws DependencyGraphBuilderException
+    {
+        DependencyResolutionResult result = e.getResult();
+
+        List<Dependency> reactorDeps = getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );
+
+        result.getUnresolvedDependencies().removeAll( reactorDeps );
+        Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );
+
+        if ( !result.getUnresolvedDependencies().isEmpty() )
+        {
+            throw new DependencyGraphBuilderException( "Could not resolve nor collect following dependencies: "
+                + result.getUnresolvedDependencies(), e );
+        }
+
+        return result;
+    }
+
     private List<org.sonatype.aether.graph.Dependency> getReactorDependencies( Collection<MavenProject> reactorProjects,
                                                                                List<?> dependencies )
     {
-        final Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>();
-        for ( final MavenProject project : reactorProjects )
+        Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>();
+        for ( MavenProject project : reactorProjects )
         {
             reactorProjectsIds.add( new ArtifactKey( project ) );
         }
 
-        final List<Dependency> reactorDeps = new ArrayList<Dependency>();
-        for ( final Object untypedDependency : dependencies )
+        List<Dependency> reactorDeps = new ArrayList<Dependency>();
+        for ( Object untypedDependency : dependencies )
         {
-            final Dependency dependency = (Dependency) untypedDependency;
-            final org.sonatype.aether.artifact.Artifact depArtifact = dependency.getArtifact();
+            Dependency dependency = (Dependency) untypedDependency;
+            org.sonatype.aether.artifact.Artifact depArtifact = dependency.getArtifact();
 
-            final ArtifactKey key =
+            ArtifactKey key =
                 new ArtifactKey( depArtifact.getGroupId(), depArtifact.getArtifactId(), depArtifact.getVersion() );
 
             if ( reactorProjectsIds.contains( key ) )