[MNG-4960] [regression] Make-like reactor mode does not build selected project when resuming from one of its prerequisites

git-svn-id: https://svn.apache.org/repos/asf/maven/maven-3/trunk@1056770 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
index 1f2da41..79d09dd 100644
--- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
+++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
@@ -694,48 +694,59 @@
     {
         ProjectDependencyGraph graph = new DefaultProjectDependencyGraph( sorter );
 
-        Collection<MavenProject> activeProjects = sorter.getSortedProjects();
+        List<MavenProject> activeProjects = sorter.getSortedProjects();
 
-        File reactorDirectory;
-        if ( request.getBaseDirectory() != null )
+        activeProjects = trimSelectedProjects( activeProjects, graph, request );
+        activeProjects = trimResumedProjects( activeProjects, request );
+
+        if ( activeProjects.size() != sorter.getSortedProjects().size() )
         {
-            reactorDirectory = new File( request.getBaseDirectory() );
+            graph = new FilteredProjectDependencyGraph( graph, activeProjects );
         }
-        else
-        {
-            reactorDirectory = null;
-        }
+
+        return graph;
+    }
+
+    private List<MavenProject> trimSelectedProjects( List<MavenProject> projects, ProjectDependencyGraph graph,
+                                                     MavenExecutionRequest request )
+        throws MavenExecutionException
+    {
+        List<MavenProject> result = projects;
 
         if ( !request.getSelectedProjects().isEmpty() )
         {
-            List<MavenProject> selectedProjects = new ArrayList<MavenProject>( request.getSelectedProjects().size() );
-
-            for ( String selectedProject : request.getSelectedProjects() )
+            File reactorDirectory = null;
+            if ( request.getBaseDirectory() != null )
             {
-                MavenProject project = null;
+                reactorDirectory = new File( request.getBaseDirectory() );
+            }
 
-                for ( MavenProject activeProject : activeProjects )
+            Collection<MavenProject> selectedProjects = new LinkedHashSet<MavenProject>( projects.size() );
+
+            for ( String selector : request.getSelectedProjects() )
+            {
+                MavenProject selectedProject = null;
+
+                for ( MavenProject project : projects )
                 {
-                    if ( isMatchingProject( activeProject, selectedProject, reactorDirectory ) )
+                    if ( isMatchingProject( project, selector, reactorDirectory ) )
                     {
-                        project = activeProject;
+                        selectedProject = project;
                         break;
                     }
                 }
 
-                if ( project != null )
+                if ( selectedProject != null )
                 {
-                    selectedProjects.add( project );
+                    selectedProjects.add( selectedProject );
                 }
                 else
                 {
                     throw new MavenExecutionException( "Could not find the selected project in the reactor: "
-                        + selectedProject, request.getPom() );
+                        + selector, request.getPom() );
                 }
             }
 
-            activeProjects = selectedProjects;
-
             boolean makeUpstream = false;
             boolean makeDownstream = false;
 
@@ -760,58 +771,73 @@
 
             if ( makeUpstream || makeDownstream )
             {
-                activeProjects = new LinkedHashSet<MavenProject>( selectedProjects );
-
-                for ( MavenProject selectedProject : selectedProjects )
+                for ( MavenProject selectedProject : new ArrayList<MavenProject>( selectedProjects ) )
                 {
                     if ( makeUpstream )
                     {
-                        activeProjects.addAll( graph.getUpstreamProjects( selectedProject, true ) );
+                        selectedProjects.addAll( graph.getUpstreamProjects( selectedProject, true ) );
                     }
                     if ( makeDownstream )
                     {
-                        activeProjects.addAll( graph.getDownstreamProjects( selectedProject, true ) );
+                        selectedProjects.addAll( graph.getDownstreamProjects( selectedProject, true ) );
                     }
                 }
             }
+
+            result = new ArrayList<MavenProject>( selectedProjects.size() );
+
+            for ( MavenProject project : projects )
+            {
+                if ( selectedProjects.contains( project ) )
+                {
+                    result.add( project );
+                }
+            }
         }
 
+        return result;
+    }
+
+    private List<MavenProject> trimResumedProjects( List<MavenProject> projects, MavenExecutionRequest request )
+        throws MavenExecutionException
+    {
+        List<MavenProject> result = projects;
+
         if ( StringUtils.isNotEmpty( request.getResumeFrom() ) )
         {
-            String selectedProject = request.getResumeFrom();
+            File reactorDirectory = null;
+            if ( request.getBaseDirectory() != null )
+            {
+                reactorDirectory = new File( request.getBaseDirectory() );
+            }
 
-            List<MavenProject> projects = new ArrayList<MavenProject>( activeProjects.size() );
+            String selector = request.getResumeFrom();
+
+            result = new ArrayList<MavenProject>( projects.size() );
 
             boolean resumed = false;
 
-            for ( MavenProject project : activeProjects )
+            for ( MavenProject project : projects )
             {
-                if ( !resumed && isMatchingProject( project, selectedProject, reactorDirectory ) )
+                if ( !resumed && isMatchingProject( project, selector, reactorDirectory ) )
                 {
                     resumed = true;
                 }
 
                 if ( resumed )
                 {
-                    projects.add( project );
+                    result.add( project );
                 }
             }
 
             if ( !resumed )
             {
-                throw new MavenExecutionException( "Could not find project to resume reactor build from: "
-                    + selectedProject + " vs " + activeProjects, request.getPom() );
+                throw new MavenExecutionException( "Could not find project to resume reactor build from: " + selector
+                    + " vs " + projects, request.getPom() );
             }
-
-            activeProjects = projects;
         }
 
-        if ( activeProjects.size() != sorter.getSortedProjects().size() )
-        {
-            graph = new FilteredProjectDependencyGraph( graph, activeProjects );
-        }
-
-        return graph;
+        return result;
     }
 
     private boolean isMatchingProject( MavenProject project, String selector, File reactorDirectory )