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 2009/11/07 16:11:28 UTC

svn commit: r833697 - in /maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven: execution/MavenSession.java lifecycle/DefaultLifecycleExecutor.java

Author: bentmann
Date: Sat Nov  7 15:11:27 2009
New Revision: 833697

URL: http://svn.apache.org/viewvc?rev=833697&view=rev
Log:
o Reverted changes introduced in r833566 due to IT failuree

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

Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java?rev=833697&r1=833696&r2=833697&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java Sat Nov  7 15:11:27 2009
@@ -43,7 +43,7 @@
  * @author Jason van Zyl
  * @version $Id$
  */
-public class MavenSession implements Cloneable
+public class MavenSession
 {
     private PlexusContainer container;
     
@@ -318,11 +318,6 @@
     {
         this.projectDependencyGraph = projectDependencyGraph;
     }
-    
-    public ProjectDependencyGraph getProjectDependencyGraph()
-    {
-        return projectDependencyGraph;
-    }
 
     public String getReactorFailureBehavior()
     {
@@ -366,27 +361,4 @@
         return request.getStartTime();
     }
 
-    @Override
-    public MavenSession clone()
-    {
-        try
-        {
-            return (MavenSession) super.clone();
-        }
-        catch ( CloneNotSupportedException e )
-        {
-            throw new RuntimeException("Bug", e);
-        }
-    }
-    
-    public void merge( MavenSession session )
-    {
-        if ( session.blackListedProjects != null )
-        {
-            for ( String projectId : session.blackListedProjects )
-            {
-                blackListedProjects.add( projectId );
-            }
-        }
-    }
 }

Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=833697&r1=833696&r2=833697&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Sat Nov  7 15:11:27 2009
@@ -31,12 +31,6 @@
 import java.util.StringTokenizer;
 import java.util.TreeMap;
 import java.util.TreeSet;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CompletionService;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorCompletionService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
 
 import org.apache.maven.ProjectDependenciesResolver;
 import org.apache.maven.artifact.Artifact;
@@ -54,12 +48,10 @@
 import org.apache.maven.execution.MavenExecutionRequest;
 import org.apache.maven.execution.MavenExecutionResult;
 import org.apache.maven.execution.MavenSession;
-import org.apache.maven.execution.ProjectDependencyGraph;
 import org.apache.maven.lifecycle.mapping.LifecycleMapping;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.PluginExecution;
-import org.apache.maven.plugin.BuildPluginManager;
 import org.apache.maven.plugin.InvalidPluginDescriptorException;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -67,6 +59,7 @@
 import org.apache.maven.plugin.MojoNotFoundException;
 import org.apache.maven.plugin.PluginConfigurationException;
 import org.apache.maven.plugin.PluginDescriptorParsingException;
+import org.apache.maven.plugin.BuildPluginManager;
 import org.apache.maven.plugin.PluginManagerException;
 import org.apache.maven.plugin.PluginNotFoundException;
 import org.apache.maven.plugin.PluginResolutionException;
@@ -259,242 +252,116 @@
         }
 
         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" );
-        if (threadCountProperty != null) {
-            try {
-                threadCount = Integer.parseInt( threadCountProperty );
-            } catch (NumberFormatException e) {
-                logger.warn( "Couldn't parse thread count, will default to 1: " + threadCountProperty );
-            }
-        }
-        if ( logger.isDebugEnabled() )
+        for ( ProjectBuild projectBuild : projectBuilds )
         {
-            logger.debug( "Thread pool: " + threadCount );
-        }
-        Executor executor = Executors.newFixedThreadPool( threadCount );
-        CompletionService<IndividualProjectBuildResult> service = new ExecutorCompletionService<IndividualProjectBuildResult>( executor );
-        HashSet<Future<IndividualProjectBuildResult>> futures = new HashSet<Future<IndividualProjectBuildResult>>();
-        
-        // schedule independent projects
-        for (ProjectBuild projectBuild : projectBuilds) {
-            if ( pdg.getUpstreamProjects( projectBuild.project, false ).size() == 0 ) {
-                if ( logger.isDebugEnabled() )
-                {
-                    logger.debug( "Scheduling: " + projectBuild.project );
-                }
-                CallableBuilder cb = new CallableBuilder( result, projectBuild, projectIndex, oldContextClassLoader, session );
-                futures.add( service.submit( cb ) );
-            }
-        }
-        
-        HashSet<MavenProject> finishedProjects = new HashSet<MavenProject>();
-        
-        // for each finished project
-        for (int i = 0; i < projectBuilds.size(); i++) {
-            IndividualProjectBuildResult ipbr;
+            MavenProject currentProject = projectBuild.project;
+
+            long buildStartTime = System.currentTimeMillis();
+
             try
             {
-                ipbr = service.take().get();
-            }
-            catch ( Exception e )
-            {
-                break;
-            }
-            if (ipbr.shouldHaltBuild) break;
-            ProjectBuild projectBuild = ipbr.projectBuild;
-            MavenProject finishedProject = projectBuild.project;
-            finishedProjects.add( finishedProject );
-            // schedule dependent projects, if all of their requirements are met
-            for ( MavenProject dependentProject : pdg.getDownstreamProjects( finishedProject, false ) )  {
-                boolean allRequirementsMet = true;
-                for ( MavenProject requirement : pdg.getUpstreamProjects( dependentProject, false ) ) {
-                    if (!finishedProjects.contains( requirement ) ) {
-                        if ( logger.isDebugEnabled() )
-                        {
-                            logger.debug( "Not scheduling " + dependentProject + " because requirement not met: " + requirement);
-                        }
-                        allRequirementsMet = false;
-                        break;
-                    }
-                }
-                if (allRequirementsMet) {
-                    ProjectBuild scheduledDependent = projectBuildMap.get( dependentProject );
-                    if ( logger.isDebugEnabled() )
-                    {
-                        logger.debug( "Scheduling: " + dependentProject );
-                    }
-                    CallableBuilder cb = new CallableBuilder( result, scheduledDependent, projectIndex, oldContextClassLoader, session );
-                    futures.add( service.submit( cb ) );
-                }
-            }   
-        }
-        
-        // cancel outstanding builds (if any)
-        for (Future<IndividualProjectBuildResult> future : futures) {
-            future.cancel( true /* mayInterruptIfRunning */ );
-        }
-        
+                session.setCurrentProject( currentProject );
 
-        fireEvent( session, null, LifecycleEventCatapult.SESSION_ENDED );
-    }
+                if ( session.isBlackListed( currentProject ) )
+                {
+                    fireEvent( session, null, LifecycleEventCatapult.PROJECT_SKIPPED );
 
-    private class CallableBuilder implements Callable<IndividualProjectBuildResult> {
+                    continue;
+                }
 
-        final MavenExecutionResult result;
-        final ProjectBuild projectBuild;
-        final ProjectIndex projectIndex;
-        final ClassLoader oldContextClassLoader;
-        final MavenSession originalSession;
-        
-        public CallableBuilder( MavenExecutionResult result, ProjectBuild projectBuild, ProjectIndex projectIndex,
-                                ClassLoader oldContextClassLoader, MavenSession originalSession )
-        {
-            this.result = result;
-            this.projectBuild = projectBuild;
-            this.projectIndex = projectIndex;
-            this.oldContextClassLoader = oldContextClassLoader;
-            this.originalSession = originalSession;
-        }
-        
-        public IndividualProjectBuildResult 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;
-        }
-        final boolean shouldHaltBuild;
-        final ProjectBuild projectBuild;
-        
-    }
-    
-    private boolean buildProject( MavenExecutionResult result,
-                                       ProjectBuild projectBuild, ProjectIndex projectIndex,
-                                       ClassLoader oldContextClassLoader, MavenSession originalSession )
-    {
-        MavenSession session = originalSession.clone();
-        MavenProject currentProject = projectBuild.project;
+                fireEvent( session, null, LifecycleEventCatapult.PROJECT_STARTED );
 
-        long buildStartTime = System.currentTimeMillis();
+                ClassRealm projectRealm = currentProject.getClassRealm();
+                if ( projectRealm != null )
+                {
+                    Thread.currentThread().setContextClassLoader( projectRealm );
+                }
 
-        try
-        {
-            session.setCurrentProject( currentProject );
+                MavenExecutionPlan executionPlan =
+                    calculateExecutionPlan( session, currentProject, projectBuild.taskSegment );
 
-            if ( session.isBlackListed( currentProject ) )
-            {
-                fireEvent( session, null, LifecycleEventCatapult.PROJECT_SKIPPED );
+                if ( logger.isDebugEnabled() )
+                {
+                    debugProjectPlan( currentProject, executionPlan );
+                }
 
-                return false;
-            }
+                // TODO: once we have calculated the build plan then we should accurately be able to download
+                // the project dependencies. Having it happen in the plugin manager is a tangled mess. We can optimize
+                // this later by looking at the build plan. Would be better to just batch download everything required
+                // by the reactor.
 
-            fireEvent( session, null, LifecycleEventCatapult.PROJECT_STARTED );
+                List<MavenProject> projectsToResolve;
 
-            ClassRealm projectRealm = currentProject.getClassRealm();
-            if ( projectRealm != null )
-            {
-                Thread.currentThread().setContextClassLoader( projectRealm );
-            }
+                if ( projectBuild.taskSegment.aggregating )
+                {
+                    projectsToResolve = session.getProjects();
+                }
+                else
+                {
+                    projectsToResolve = Collections.singletonList( currentProject );
+                }
 
-            MavenExecutionPlan executionPlan =
-                calculateExecutionPlan( session, currentProject, projectBuild.taskSegment );
+                for ( MavenProject project : projectsToResolve )
+                {
+                    resolveProjectDependencies( project, executionPlan.getRequiredCollectionScopes(),
+                                                executionPlan.getRequiredResolutionScopes(), session,
+                                                projectBuild.taskSegment.aggregating );
+                }
 
-            if ( logger.isDebugEnabled() )
-            {
-                debugProjectPlan( currentProject, executionPlan );
-            }
+                DependencyContext dependencyContext =
+                    new DependencyContext( executionPlan, projectBuild.taskSegment.aggregating );
 
-            // TODO: once we have calculated the build plan then we should accurately be able to download
-            // the project dependencies. Having it happen in the plugin manager is a tangled mess. We can optimize
-            // this later by looking at the build plan. Would be better to just batch download everything required
-            // by the reactor.
+                for ( MojoExecution mojoExecution : executionPlan.getExecutions() )
+                {
+                    execute( session, mojoExecution, projectIndex, dependencyContext );
+                }
 
-            List<MavenProject> projectsToResolve;
+                long buildEndTime = System.currentTimeMillis();
 
-            if ( projectBuild.taskSegment.aggregating )
-            {
-                projectsToResolve = session.getProjects();
-            }
-            else
-            {
-                projectsToResolve = Collections.singletonList( currentProject );
-            }
+                result.addBuildSummary( new BuildSuccess( currentProject, buildEndTime - buildStartTime ) );
 
-            for ( MavenProject project : projectsToResolve )
-            {
-                resolveProjectDependencies( project, executionPlan.getRequiredCollectionScopes(),
-                                            executionPlan.getRequiredResolutionScopes(), session,
-                                            projectBuild.taskSegment.aggregating );
+                fireEvent( session, null, LifecycleEventCatapult.PROJECT_SUCCEEDED );
             }
-
-            DependencyContext dependencyContext =
-                new DependencyContext( executionPlan, projectBuild.taskSegment.aggregating );
-
-            for ( MojoExecution mojoExecution : executionPlan.getExecutions() )
+            catch ( Exception e )
             {
-                execute( session, mojoExecution, projectIndex, dependencyContext );
-            }
-
-            long buildEndTime = System.currentTimeMillis();
-
-            result.addBuildSummary( new BuildSuccess( currentProject, buildEndTime - buildStartTime ) );
-
-            fireEvent( session, null, LifecycleEventCatapult.PROJECT_SUCCEEDED );
-        }
-        catch ( Exception e )
-        {
-            result.addException( e );
+                result.addException( e );
 
-            long buildEndTime = System.currentTimeMillis();
+                long buildEndTime = System.currentTimeMillis();
 
-            result.addBuildSummary( new BuildFailure( currentProject, buildEndTime - buildStartTime, e ) );
+                result.addBuildSummary( new BuildFailure( currentProject, buildEndTime - buildStartTime, e ) );
 
-            fireEvent( session, null, LifecycleEventCatapult.PROJECT_FAILED );
+                fireEvent( session, null, LifecycleEventCatapult.PROJECT_FAILED );
 
-            if ( MavenExecutionRequest.REACTOR_FAIL_NEVER.equals( session.getReactorFailureBehavior() ) )
-            {
-                // continue the build
-            }
-            else if ( MavenExecutionRequest.REACTOR_FAIL_AT_END.equals( session.getReactorFailureBehavior() ) )
-            {
-                // continue the build but ban all projects that depend on the failed one
-                session.blackList( currentProject );
-            }
-            else if ( MavenExecutionRequest.REACTOR_FAIL_FAST.equals( session.getReactorFailureBehavior() ) )
-            {
-                // abort the build
-                return true;
+                if ( MavenExecutionRequest.REACTOR_FAIL_NEVER.equals( session.getReactorFailureBehavior() ) )
+                {
+                    // continue the build
+                }
+                else if ( MavenExecutionRequest.REACTOR_FAIL_AT_END.equals( session.getReactorFailureBehavior() ) )
+                {
+                    // continue the build but ban all projects that depend on the failed one
+                    session.blackList( currentProject );
+                }
+                else if ( MavenExecutionRequest.REACTOR_FAIL_FAST.equals( session.getReactorFailureBehavior() ) )
+                {
+                    // abort the build
+                    break;
+                }
+                else
+                {
+                    throw new IllegalArgumentException( "invalid reactor failure behavior "
+                        + session.getReactorFailureBehavior() );
+                }
             }
-            else
+            finally
             {
-                throw new IllegalArgumentException( "invalid reactor failure behavior "
-                    + session.getReactorFailureBehavior() );
+                session.setCurrentProject( null );
+
+                Thread.currentThread().setContextClassLoader( oldContextClassLoader );
             }
         }
-        finally
-        {
-            session.setCurrentProject( null );
-            originalSession.merge( session );
 
-            Thread.currentThread().setContextClassLoader( oldContextClassLoader );
-        }
-        return false;
+        fireEvent( session, null, LifecycleEventCatapult.SESSION_ENDED );
     }
 
     private void resolveProjectDependencies( MavenProject project, Collection<String> scopesToCollect,