You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by df...@apache.org on 2009/11/10 18:18:20 UTC

svn commit: r834551 - in /maven/maven-3/branches/MNG-3004/maven-core/src/main/java/org/apache/maven: execution/MavenSession.java lifecycle/DefaultLifecycleExecutor.java

Author: dfabulich
Date: Tue Nov 10 17:18:19 2009
New Revision: 834551

URL: http://svn.apache.org/viewvc?rev=834551&view=rev
Log:
All ITs pass

Modified:
    maven/maven-3/branches/MNG-3004/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
    maven/maven-3/branches/MNG-3004/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java

Modified: maven/maven-3/branches/MNG-3004/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
URL: http://svn.apache.org/viewvc/maven/maven-3/branches/MNG-3004/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java?rev=834551&r1=834550&r2=834551&view=diff
==============================================================================
--- maven/maven-3/branches/MNG-3004/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java (original)
+++ maven/maven-3/branches/MNG-3004/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java Tue Nov 10 17:18:19 2009
@@ -68,6 +68,8 @@
     private ProjectDependencyGraph projectDependencyGraph;
 
     private Collection<String> blackListedProjects;
+    
+    private volatile boolean halted = false;
 
     @Deprecated
     public MavenSession( PlexusContainer container, MavenExecutionRequest request, MavenExecutionResult result, MavenProject project )
@@ -378,15 +380,33 @@
             throw new RuntimeException( "Bug", e );
         }
     }
+    
+    public void halt()
+    {
+        halted = true;
+    }
+    
+    public boolean isHalted()
+    {
+        return halted;
+    }
 
     public void merge( MavenSession session )
     {
         if ( session.blackListedProjects != null )
         {
+            if ( blackListedProjects == null )
+            {
+                blackListedProjects = new HashSet<String>();
+            }
             for ( String projectId : session.blackListedProjects )
             {
                 blackListedProjects.add( projectId );
             }
         }
+        if ( session.halted )
+        {
+            halted = true;
+        }
     }
 }

Modified: maven/maven-3/branches/MNG-3004/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
URL: http://svn.apache.org/viewvc/maven/maven-3/branches/MNG-3004/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=834551&r1=834550&r2=834551&view=diff
==============================================================================
--- maven/maven-3/branches/MNG-3004/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java (original)
+++ maven/maven-3/branches/MNG-3004/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Tue Nov 10 17:18:19 2009
@@ -260,13 +260,7 @@
 
         ClassLoader oldContextClassLoader = Thread.currentThread().getContextClassLoader();
 
-        HashMap<MavenProject, ProjectBuild> projectBuildMap = new HashMap<MavenProject, ProjectBuild>();
-        for ( ProjectBuild projectBuild : projectBuilds )
-        {
-            projectBuildMap.put( projectBuild.project, projectBuild );
-        }
 
-        ProjectDependencyGraph pdg = session.getProjectDependencyGraph();
 
         int threadCount = 1;
         String threadCountProperty = (String) session.getUserProperties().get( "maven.threads.experimental" );
@@ -285,10 +279,51 @@
         {
             logger.debug( "Thread pool: " + threadCount );
         }
+        
+        if ( threadCount > 0 )
+        {
+            multithreadedBuild( session, result, projectBuilds, projectIndex, 
+                                oldContextClassLoader, threadCount );
+        }
+        else
+        {
+            for ( ProjectBuild projectBuild : projectBuilds )
+            {
+                CallableBuilder cb = new CallableBuilder( result, projectBuild, projectIndex, 
+                                         oldContextClassLoader, session );
+                try
+                {
+                    cb.call();
+                    if ( session.isHalted() ) break;
+                }
+                catch ( Exception e )
+                {
+                    break;
+                }
+            }
+        }
+
+        fireEvent( session, null, LifecycleEventCatapult.SESSION_ENDED );
+    }
+
+    private void multithreadedBuild( MavenSession session, MavenExecutionResult result,
+                                     List<ProjectBuild> projectBuilds, ProjectIndex projectIndex,
+                                     ClassLoader oldContextClassLoader,
+                                     int threadCount )
+    {
+        
+        HashMap<MavenProject, ProjectBuild> projectBuildMap = new HashMap<MavenProject, ProjectBuild>();
+        
+        for ( ProjectBuild projectBuild : projectBuilds )
+        {
+            projectBuildMap.put( projectBuild.project, projectBuild );
+        }
+
+        ProjectDependencyGraph pdg = session.getProjectDependencyGraph();
         Executor executor = Executors.newFixedThreadPool( threadCount );
-        CompletionService<IndividualProjectBuildResult> service =
-            new ExecutorCompletionService<IndividualProjectBuildResult>( executor );
-        HashSet<Future<IndividualProjectBuildResult>> futures = new HashSet<Future<IndividualProjectBuildResult>>();
+        CompletionService<ProjectBuild> service =
+            new ExecutorCompletionService<ProjectBuild>( executor );
+        HashSet<Future<ProjectBuild>> futures = new HashSet<Future<ProjectBuild>>();
 
         // schedule independent projects
         for ( ProjectBuild projectBuild : projectBuilds )
@@ -310,18 +345,17 @@
         // for each finished project
         for ( int i = 0; i < projectBuilds.size(); i++ )
         {
-            IndividualProjectBuildResult ipbr;
+            ProjectBuild projectBuild;
             try
             {
-                ipbr = service.take().get();
+                projectBuild = service.take().get();
             }
             catch ( Exception e )
             {
                 break;
             }
-            if ( ipbr.shouldHaltBuild )
+            if ( session.isHalted() )
                 break;
-            ProjectBuild projectBuild = ipbr.projectBuild;
             MavenProject finishedProject = projectBuild.project;
             finishedProjects.add( finishedProject );
             // schedule dependent projects, if all of their requirements are met
@@ -356,16 +390,14 @@
         }
 
         // cancel outstanding builds (if any)
-        for ( Future<IndividualProjectBuildResult> future : futures )
+        for ( Future<ProjectBuild> future : futures )
         {
             future.cancel( true /* mayInterruptIfRunning */);
         }
-
-        fireEvent( session, null, LifecycleEventCatapult.SESSION_ENDED );
     }
 
     private class CallableBuilder
-        implements Callable<IndividualProjectBuildResult>
+        implements Callable<ProjectBuild>
     {
 
         final MavenExecutionResult result;
@@ -388,30 +420,15 @@
             this.originalSession = originalSession;
         }
 
-        public IndividualProjectBuildResult call()
+        public ProjectBuild call()
             throws Exception
         {
-            boolean shouldHaltBuild =
-                buildProject( result, projectBuild, projectIndex, oldContextClassLoader, originalSession );
-            return new IndividualProjectBuildResult( shouldHaltBuild, projectBuild );
-        }
-    }
-
-    private class IndividualProjectBuildResult
-    {
-        public IndividualProjectBuildResult( boolean shouldHaltBuild, ProjectBuild projectBuild )
-        {
-            this.shouldHaltBuild = shouldHaltBuild;
-            this.projectBuild = projectBuild;
+            buildProject( result, projectBuild, projectIndex, oldContextClassLoader, originalSession );
+            return projectBuild;
         }
-
-        final boolean shouldHaltBuild;
-
-        final ProjectBuild projectBuild;
-
     }
 
-    private boolean buildProject( MavenExecutionResult result, ProjectBuild projectBuild, ProjectIndex projectIndex,
+    private void buildProject( MavenExecutionResult result, ProjectBuild projectBuild, ProjectIndex projectIndex,
                                   ClassLoader oldContextClassLoader, MavenSession originalSession )
     {
         MavenSession session = originalSession.clone();
@@ -423,11 +440,11 @@
         {
             session.setCurrentProject( currentProject );
 
-            if ( session.isBlackListed( currentProject ) )
+            if ( session.isBlackListed( currentProject ) || session.isHalted() )
             {
                 fireEvent( session, null, LifecycleEventCatapult.PROJECT_SKIPPED );
 
-                return false;
+                return;
             }
 
             fireEvent( session, null, LifecycleEventCatapult.PROJECT_STARTED );
@@ -505,7 +522,8 @@
             else if ( MavenExecutionRequest.REACTOR_FAIL_FAST.equals( session.getReactorFailureBehavior() ) )
             {
                 // abort the build
-                return true;
+                originalSession.halt();
+                return;
             }
             else
             {
@@ -520,7 +538,6 @@
 
             Thread.currentThread().setContextClassLoader( oldContextClassLoader );
         }
-        return false;
     }
 
     private void resolveProjectDependencies( MavenProject project, Collection<String> scopesToCollect,