Author: jdcasey
Date: Thu Jul 28 20:47:07 2005
New Revision: 226334

URL: http://svn.apache.org/viewcvs?rev=226334&view=rev
Log:
Resolving: MNG-250


Modified:
    
maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
    
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
    
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java
    
maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
    
maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml

Modified: 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java?rev=226334&r1=226333&r2=226334&view=diff
==============================================================================
--- 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
 (original)
+++ 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
 Thu Jul 28 20:47:07 2005
@@ -125,11 +125,14 @@
         }
 
         EventDispatcher dispatcher = request.getEventDispatcher();
+        
         String event = MavenEvents.REACTOR_EXECUTION;
 
         dispatcher.dispatchStart( event, request.getBaseDirectory() );
 
         List projects;
+        
+        MavenProject topLevelProject;
 
         try
         {
@@ -137,8 +140,14 @@
             
             projects = collectProjects( files, request.getLocalRepository(), 
request.isRecursive(),
                                         request.getSettings() );
-
-            projects = ProjectSorter.getSortedProjects( projects );
+            
+            // the reasoning here is that the list is still unsorted according 
to dependency, so the first project
+            // SHOULD BE the top-level, or the one we want to start with if 
we're doing an aggregated build.
+            
+            // TODO: !![jc; 28-jul-2005] check this; if we're using '-r' and 
there are aggregator tasks, this will result in weirdness.
+            topLevelProject = (MavenProject) projects.get( 0 );
+            
+            projects = ProjectSorter.getSortedProjects(projects);
 
             if ( projects.isEmpty() )
             {
@@ -152,10 +161,6 @@
         {
             throw new ReactorException( "Error processing projects for the 
reactor: ", e );
         }
-        catch ( CycleDetectedException e )
-        {
-            throw new ReactorException( "Error processing projects for the 
reactor: ", e );
-        }
         catch ( ArtifactResolutionException e )
         {
             dispatcher.dispatchError( event, request.getBaseDirectory(), e );
@@ -180,38 +185,73 @@
 
             return response;
         }
+        catch ( CycleDetectedException e )
+        {
+            dispatcher.dispatchError( event, request.getBaseDirectory(), e );
+
+            MavenExecutionResponse response = new MavenExecutionResponse();
+            response.setStart( new Date() );
+            response.setFinish( new Date() );
+            response.setException( e );
+            logFailure( response, e, null );
+
+            return response;
+        }
 
         try
         {
             MavenSession session = createSession( request, projects );
             
-            List goals = request.getGoals();
-
-            for ( Iterator iterator = projects.iterator(); iterator.hasNext(); 
)
+            try
             {
-                MavenProject project = (MavenProject) iterator.next();
-
-                line();
-
-                getLogger().info( "Building " + project.getName() );
+                MavenExecutionResponse response = lifecycleExecutor.execute( 
session, topLevelProject, dispatcher );
+                
+                // TODO: is this perhaps more appropriate in the CLI?
+                if ( response.isExecutionFailure() )
+                {
+                    dispatcher.dispatchError( event, 
request.getBaseDirectory(), response.getException() );
 
-                line();
+                    // TODO: yuck! Revisit when cleaning up the exception 
handling from the top down
+                    Throwable exception = response.getException();
 
-                try
-                {
-                    MavenExecutionResponse response = processProject( session, 
goals, project, dispatcher );
-                    if ( response.isExecutionFailure() )
+                    if ( exception instanceof MojoExecutionException )
                     {
-                        dispatcher.dispatchError( event, 
request.getBaseDirectory(), response.getException() );
-
-                        return response;
+                        if ( exception.getCause() == null )
+                        {
+                            MojoExecutionException e = 
(MojoExecutionException) exception;
+                            
+                            logFailure( response, e, e.getLongMessage() );
+                        }
+                        else
+                        {
+                            // TODO: throw exceptions like this, so "failures" 
are just that
+                            logError( response );
+                        }
+                    }
+                    else if ( exception instanceof ArtifactResolutionException 
)
+                    {
+                        logFailure( response, exception, null );
+                    }
+                    else
+                    {
+                        // TODO: this should be a "FATAL" exception, reported 
to the
+                        // developers - however currently a LOT of
+                        // "user" errors fall through the cracks (like invalid 
POMs, as
+                        // one example)
+                        logError( response );
                     }
+                    
+                    return response;
                 }
-                catch ( LifecycleExecutionException e )
+                else
                 {
-                    throw new ReactorException( "Error executing project 
within the reactor", e );
+                    logSuccess( response );
                 }
             }
+            catch ( LifecycleExecutionException e )
+            {
+                throw new ReactorException( "Error executing project within 
the reactor", e );
+            }
 
             dispatcher.dispatchEnd( event, request.getBaseDirectory() );
 
@@ -277,70 +317,6 @@
         return projects;
     }
 
-    private MavenExecutionResponse processProject( MavenSession session, List 
goals, MavenProject project,
-                                                   EventDispatcher dispatcher )
-        throws LifecycleExecutionException
-    {
-        // !! This is ripe for refactoring to an aspect.
-        // Event monitoring.
-        String event = MavenEvents.PROJECT_EXECUTION;
-
-        dispatcher.dispatchStart( event, project.getId() );
-
-        MavenExecutionResponse response;
-        try
-        {
-            // Actual meat of the code.
-            response = lifecycleExecutor.execute( goals, session, project );
-
-            dispatcher.dispatchEnd( event, project.getId() );
-        }
-        catch ( LifecycleExecutionException e )
-        {
-            dispatcher.dispatchError( event, project.getId(), e );
-            throw e;
-        }
-        // End event monitoring.
-
-        // TODO: is this perhaps more appropriate in the CLI?
-        if ( response.isExecutionFailure() )
-        {
-            // TODO: yuck! Revisit when cleaning up the exception handling 
from the top down
-            Throwable exception = response.getException();
-
-            if ( exception instanceof MojoExecutionException )
-            {
-                if ( exception.getCause() == null )
-                {
-                    MojoExecutionException e = (MojoExecutionException) 
exception;
-                    logFailure( response, e, e.getLongMessage() );
-                }
-                else
-                {
-                    // TODO: throw exceptions like this, so "failures" are 
just that
-                    logError( response );
-                }
-            }
-            else if ( exception instanceof ArtifactResolutionException )
-            {
-                logFailure( response, exception, null );
-            }
-            else
-            {
-                // TODO: this should be a "FATAL" exception, reported to the
-                // developers - however currently a LOT of
-                // "user" errors fall through the cracks (like invalid POMs, as
-                // one example)
-                logError( response );
-            }
-        }
-        else
-        {
-            logSuccess( response );
-        }
-        return response;
-    }
-
     public MavenProject getProject( File pom, ArtifactRepository 
localRepository, Settings settings )
         throws ProjectBuildingException, ArtifactResolutionException
     {
@@ -691,6 +667,7 @@
                 files = Collections.singletonList( projectFile );
             }
         }
+        
         return files;
     }
 

Modified: 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=226334&r1=226333&r2=226334&view=diff
==============================================================================
--- 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
 (original)
+++ 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
 Thu Jul 28 20:47:07 2005
@@ -30,6 +30,8 @@
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.PluginExecution;
 import org.apache.maven.model.PluginManagement;
+import org.apache.maven.monitor.event.EventDispatcher;
+import org.apache.maven.monitor.event.MavenEvents;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.PluginManager;
@@ -40,7 +42,6 @@
 import org.apache.maven.plugin.lifecycle.Execution;
 import org.apache.maven.plugin.lifecycle.Lifecycle;
 import org.apache.maven.plugin.lifecycle.Phase;
-import org.apache.maven.plugin.mapping.MavenPluginMappingBuilder;
 import org.apache.maven.plugin.version.PluginVersionResolutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.injection.ModelDefaultsInjector;
@@ -77,8 +78,6 @@
 
     private ModelDefaultsInjector modelDefaultsInjector;
 
-    private MavenPluginMappingBuilder pluginMappingBuilder;
-
     private PluginManager pluginManager;
 
     private ExtensionManager extensionManager;
@@ -101,9 +100,11 @@
      * @param session
      * @param project
      */
-    public MavenExecutionResponse execute( List tasks, MavenSession session, 
MavenProject project )
+    public MavenExecutionResponse execute( MavenSession session, MavenProject 
project, EventDispatcher dispatcher )
         throws LifecycleExecutionException
     {
+        List taskSegments = segmentTaskListByAggregationNeeds( 
session.getGoals(), session, project );
+        
         MavenExecutionResponse response = new MavenExecutionResponse();
 
         response.setStart( new Date() );
@@ -119,11 +120,7 @@
             Map handlers = findArtifactTypeHandlers( project, 
session.getSettings(), session.getLocalRepository() );
             artifactHandlerManager.addHandlers( handlers );
 
-            for ( Iterator i = tasks.iterator(); i.hasNext(); )
-            {
-                String task = (String) i.next();
-                executeGoal( task, session, project );
-            }
+            executeTaskSegments( taskSegments, session, project, dispatcher );
         }
         catch ( MojoExecutionException e )
         {
@@ -157,6 +154,178 @@
         return response;
     }
 
+    private void executeTaskSegments( List taskSegments, MavenSession session, 
MavenProject project,
+                                     EventDispatcher dispatcher )
+        throws PluginNotFoundException, MojoExecutionException, 
ArtifactResolutionException,
+        LifecycleExecutionException
+    {
+        for ( Iterator it = taskSegments.iterator(); it.hasNext(); )
+        {
+            TaskSegment segment = (TaskSegment) it.next();
+            
+            if ( segment.aggregate() )
+            {
+                line();
+
+                getLogger().info( "Building " + project.getName() );
+                
+                getLogger().info( "  " + segment );
+
+                line();
+
+                // !! This is ripe for refactoring to an aspect.
+                // Event monitoring.
+                String event = MavenEvents.PROJECT_EXECUTION;
+
+                dispatcher.dispatchStart( event, project.getId() + " ( " + 
segment + " )" );
+
+                try
+                {
+                    // only call once, with the top-level project (assumed to 
be provided as a parameter)...
+                    for ( Iterator goalIterator = 
segment.getTasks().iterator(); goalIterator.hasNext(); )
+                    {
+                        String task = (String) goalIterator.next();
+
+                        executeGoal( task, session, project );
+                    }
+                    
+                    dispatcher.dispatchEnd( event, project.getId() + " ( " + 
segment + " )" );
+                }
+                catch ( LifecycleExecutionException e )
+                {
+                    dispatcher.dispatchError( event, project.getId() + " ( " + 
segment + " )", e );
+                    
+                    throw e;
+                }
+            }
+            else
+            {
+                List sortedProjects = session.getSortedProjects();
+                
+                // iterate over projects, and execute on each...
+                for ( Iterator projectIterator = sortedProjects.iterator(); 
projectIterator.hasNext(); )
+                {
+                    MavenProject currentProject = (MavenProject) 
projectIterator.next();
+                    
+                    line();
+
+                    getLogger().info( "Building " + currentProject.getName() );
+                    
+                    getLogger().info( "  " + segment );
+
+                    line();
+
+                    // !! This is ripe for refactoring to an aspect.
+                    // Event monitoring.
+                    String event = MavenEvents.PROJECT_EXECUTION;
+
+                    dispatcher.dispatchStart( event, currentProject.getId() + 
" ( " + segment + " )" );
+
+                    try
+                    {
+                        for ( Iterator goalIterator = 
segment.getTasks().iterator(); goalIterator.hasNext(); )
+                        {
+                            String task = (String) goalIterator.next();
+
+                            executeGoal( task, session, currentProject );
+                        }
+                        
+                        dispatcher.dispatchEnd( event, currentProject.getId() 
+ " ( " + segment + " )" );
+                    }
+                    catch ( LifecycleExecutionException e )
+                    {
+                        dispatcher.dispatchError( event, 
currentProject.getId() + " ( " + segment + " )", e );
+                        
+                        throw e;
+                    }
+                }
+            }
+        }
+    }
+
+    private List segmentTaskListByAggregationNeeds( List tasks, MavenSession 
session, MavenProject project ) 
+        throws LifecycleExecutionException
+    {
+        List segments = new ArrayList();
+        
+        TaskSegment currentSegment = null;
+        for ( Iterator it = tasks.iterator(); it.hasNext(); )
+        {
+            String task = (String) it.next();
+            
+            // if it's a phase, then we don't need to check whether it's an 
aggregator.
+            // simply add it to the current task partition.
+            if ( phases.contains( task ) )
+            {
+                if ( currentSegment != null && currentSegment.aggregate() )
+                {
+                    segments.add( currentSegment );
+                    currentSegment = null;
+                }
+                
+                if ( currentSegment == null )
+                {
+                    currentSegment = new TaskSegment();
+                }
+                
+                currentSegment.add( task );
+            }
+            else
+            {
+                MojoDescriptor mojo = null;
+                try
+                {
+                    mojo = getMojoDescriptor( task, session, project );
+                }
+                catch ( LifecycleExecutionException e )
+                {
+                    getLogger().info( "Cannot find mojo descriptor for: \'" + 
task + "\' - Treating as non-aggregator." );
+                    getLogger().debug( "", e );
+                }
+                catch ( ArtifactResolutionException e )
+                {
+                    getLogger().info( "Cannot find mojo descriptor for: \'" + 
task + "\' - Treating as non-aggregator." );
+                    getLogger().debug( "", e );
+                }
+                
+                if ( mojo != null && mojo.isAggregator() )
+                {
+                    if ( currentSegment != null && !currentSegment.aggregate() 
)
+                    {
+                        segments.add( currentSegment );
+                        currentSegment = null;
+                    }
+                    
+                    if ( currentSegment == null )
+                    {
+                        currentSegment = new TaskSegment( true );
+                    }
+                    
+                    currentSegment.add( task );
+                }
+                else
+                {
+                    if ( currentSegment != null && currentSegment.aggregate() )
+                    {
+                        segments.add( currentSegment );
+                        currentSegment = null;
+                    }
+                    
+                    if ( currentSegment == null )
+                    {
+                        currentSegment = new TaskSegment();
+                    }
+                    
+                    currentSegment.add( task );
+                }
+            }
+        }
+        
+        segments.add( currentSegment );
+        
+        return segments;
+    }
+
     private void executeGoal( String task, MavenSession session, MavenProject 
project )
         throws LifecycleExecutionException, PluginNotFoundException, 
MojoExecutionException, ArtifactResolutionException
     {
@@ -716,6 +885,70 @@
             }
 
             project.addPlugin( plugin );
+        }
+    }
+    
+    protected void line()
+    {
+        getLogger().info( 
"----------------------------------------------------------------------------" 
);
+    }
+
+    private static class TaskSegment
+    {
+        private boolean aggregate = false;
+        private List tasks = new ArrayList();
+        
+        TaskSegment()
+        {
+            
+        }
+        
+        TaskSegment( boolean aggregate )
+        {
+            this.aggregate = aggregate;
+        }
+        
+        public String toString()
+        {
+            StringBuffer message = new StringBuffer();
+            
+            message.append( " task-segment: [" );
+            
+            for ( Iterator it = tasks.iterator(); it.hasNext(); )
+            {
+                String task = (String) it.next();
+                
+                message.append( task );
+                
+                if ( it.hasNext() )
+                {
+                    message.append( ", ");
+                }
+            }
+            
+            message.append( "]" );
+            
+            if ( aggregate )
+            {
+                message.append( " (aggregator-style)" );
+            }
+            
+            return message.toString();
+        }
+
+        boolean aggregate()
+        {
+            return aggregate;
+        }
+        
+        void add( String task )
+        {
+            tasks.add( task );
+        }
+        
+        List getTasks()
+        {
+            return tasks;
         }
     }
 }

Modified: 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java?rev=226334&r1=226333&r2=226334&view=diff
==============================================================================
--- 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java
 (original)
+++ 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java
 Thu Jul 28 20:47:07 2005
@@ -18,10 +18,9 @@
 
 import org.apache.maven.execution.MavenExecutionResponse;
 import org.apache.maven.execution.MavenSession;
+import org.apache.maven.monitor.event.EventDispatcher;
 import org.apache.maven.project.MavenProject;
 
-import java.util.List;
-
 /**
  * @author <a href="mailto:[EMAIL PROTECTED]">Jason van Zyl</a>
  * @version $Id$
@@ -30,7 +29,7 @@
 {
     String ROLE = LifecycleExecutor.class.getName();
 
-    MavenExecutionResponse execute( List tasks, MavenSession session, 
MavenProject project )
+    MavenExecutionResponse execute( MavenSession session, MavenProject 
project, EventDispatcher dispatcher )
         throws LifecycleExecutionException;
 
 }

Modified: 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java?rev=226334&r1=226333&r2=226334&view=diff
==============================================================================
--- 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
 (original)
+++ 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
 Thu Jul 28 20:47:07 2005
@@ -276,7 +276,7 @@
         throws ArtifactResolutionException, PlexusContainerException
     {
         artifactResolver.resolve( pluginArtifact, 
project.getPluginArtifactRepositories(), localRepository );
-
+        
         PlexusContainer child = container.createChildContainer( 
plugin.getKey(),
                                                                 
Collections.singletonList( pluginArtifact.getFile() ),
                                                                 
Collections.EMPTY_MAP,

Modified: 
maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml
URL: 
http://svn.apache.org/viewcvs/maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml?rev=226334&r1=226333&r2=226334&view=diff
==============================================================================
--- 
maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml
 (original)
+++ 
maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml
 Thu Jul 28 20:47:07 2005
@@ -137,9 +137,6 @@
           <role>org.apache.maven.project.injection.ModelDefaultsInjector</role>
         </requirement>
         <requirement>
-          
<role>org.apache.maven.plugin.mapping.MavenPluginMappingBuilder</role>
-        </requirement>
-        <requirement>
           
<role>org.apache.maven.artifact.handler.manager.ArtifactHandlerManager</role>
         </requirement>
       </requirements>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to