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/08/27 01:18:59 UTC

svn commit: r808219 - in /maven/components/trunk: maven-core/src/main/java/org/apache/maven/lifecycle/ maven-core/src/main/java/org/apache/maven/plugin/ maven-embedder/src/main/java/org/apache/maven/cli/

Author: bentmann
Date: Wed Aug 26 23:18:59 2009
New Revision: 808219

URL: http://svn.apache.org/viewvc?rev=808219&view=rev
Log:
o Restored forking for aggregators

Modified:
    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/plugin/MojoExecution.java
    maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ExecutionEventLogger.java

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=808219&r1=808218&r2=808219&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 Wed Aug 26 23:18:59 2009
@@ -146,6 +146,11 @@
         }
     }
 
+    private static String getKey( MavenProject project )
+    {
+        return project.getGroupId() + ':' + project.getArtifactId() + ':' + project.getVersion();
+    }
+
     public void execute( MavenSession session )
     {
         fireEvent( session, null, LifecycleEventCatapult.SESSION_STARTED );
@@ -154,9 +159,13 @@
 
         List<ProjectBuild> projectBuilds;
 
+        ProjectIndex projectIndex;
+
         try
         {
             projectBuilds = calculateProjectBuilds( session );
+
+            projectIndex = new ProjectIndex( session.getProjects() );
         }
         catch ( Exception e )
         {
@@ -258,7 +267,7 @@
 
                 for ( MojoExecution mojoExecution : executionPlan.getExecutions() )
                 {
-                    execute( currentProject, session, mojoExecution );
+                    execute( session, mojoExecution, projectIndex );
                 }
 
                 long buildEndTime = System.currentTimeMillis();
@@ -308,7 +317,7 @@
         fireEvent( session, null, LifecycleEventCatapult.SESSION_ENDED );
     }
 
-    private void execute( MavenProject project, MavenSession session, MojoExecution mojoExecution )
+    private void execute( MavenSession session, MojoExecution mojoExecution, ProjectIndex projectIndex )
         throws MojoFailureException, MojoExecutionException, PluginConfigurationException, PluginManagerException
     {
         MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
@@ -328,29 +337,49 @@
             }
         }
 
-        MavenProject executionProject = null;
+        List<MavenProject> forkedProjects = Collections.emptyList();
 
-        List<MojoExecution> forkedExecutions = mojoExecution.getForkedExecutions();
+        Map<String, List<MojoExecution>> forkedExecutions = mojoExecution.getForkedExecutions();
 
         if ( !forkedExecutions.isEmpty() )
         {
             fireEvent( session, mojoExecution, LifecycleEventCatapult.FORK_STARTED );
 
+            MavenProject project = session.getCurrentProject();
+
+            forkedProjects = new ArrayList<MavenProject>( forkedExecutions.size() );
+
             try
             {
-                executionProject = project.clone();
-
-                session.setCurrentProject( executionProject );
-                try
+                for ( Map.Entry<String, List<MojoExecution>> fork : forkedExecutions.entrySet() )
                 {
-                    for ( MojoExecution forkedExecution : forkedExecutions )
+                    int index = projectIndex.indices.get( fork.getKey() );
+
+                    MavenProject forkedProject = projectIndex.projects.get( fork.getKey() );
+
+                    forkedProjects.add( forkedProject );
+
+                    MavenProject executedProject = forkedProject.clone();
+
+                    forkedProject.setExecutionProject( executedProject );
+
+                    try
                     {
-                        execute( executionProject, session, forkedExecution );
+                        session.setCurrentProject( executedProject );
+                        session.getProjects().set( index, executedProject );
+                        projectIndex.projects.put( fork.getKey(), executedProject );
+
+                        for ( MojoExecution forkedExecution : fork.getValue() )
+                        {
+                            execute( session, forkedExecution, projectIndex );
+                        }
+                    }
+                    finally
+                    {
+                        projectIndex.projects.put( fork.getKey(), forkedProject );
+                        session.getProjects().set( index, forkedProject );
+                        session.setCurrentProject( project );
                     }
-                }
-                finally
-                {
-                    session.setCurrentProject( project );
                 }
 
                 fireEvent( session, mojoExecution, LifecycleEventCatapult.FORK_SUCCEEDED );
@@ -385,8 +414,6 @@
 
         try
         {
-            project.setExecutionProject( executionProject );
-
             pluginManager.executeMojo( session, mojoExecution );
 
             fireEvent( session, mojoExecution, LifecycleEventCatapult.MOJO_SUCCEEDED );
@@ -415,6 +442,37 @@
 
             throw e;
         }
+        finally
+        {
+            for ( MavenProject forkedProject : forkedProjects )
+            {
+                forkedProject.setExecutionProject( null );
+            }
+        }
+    }
+
+    private static final class ProjectIndex
+    {
+
+        Map<String, MavenProject> projects;
+
+        Map<String, Integer> indices;
+
+        ProjectIndex( List<MavenProject> projects )
+        {
+            this.projects = new HashMap<String, MavenProject>( projects.size() * 2 );
+            this.indices = new HashMap<String, Integer>( projects.size() * 2 );
+
+            for ( int i = 0; i < projects.size(); i++ )
+            {
+                MavenProject project = projects.get( i );
+                String key = getKey( project );
+
+                this.projects.put( key, project );
+                this.indices.put( key, Integer.valueOf( i ) );
+            }
+        }
+
     }
 
     private List<ProjectBuild> calculateProjectBuilds( MavenSession session )
@@ -579,6 +637,12 @@
         return mojoDescriptor.isAggregator() || !mojoDescriptor.isProjectRequired();
     }
 
+    private boolean isForkingMojo( MojoDescriptor mojoDescriptor )
+    {
+        return StringUtils.isNotEmpty( mojoDescriptor.getExecuteGoal() )
+            || StringUtils.isNotEmpty( mojoDescriptor.getExecutePhase() );
+    }
+
     private static final class ProjectBuild
     {
 
@@ -700,9 +764,12 @@
             requiredDependencyResolutionScopes.add( requiredDependencyResolutionScope );
         }
 
-        for ( MojoExecution forkedExecution : mojoExecution.getForkedExecutions() )
+        for ( List<MojoExecution> forkedExecutions : mojoExecution.getForkedExecutions().values() )
         {
-            collectDependencyResolutionScopes( requiredDependencyResolutionScopes, forkedExecution );
+            for ( MojoExecution forkedExecution : forkedExecutions )
+            {
+                collectDependencyResolutionScopes( requiredDependencyResolutionScopes, forkedExecution );
+            }
         }
     }
 
@@ -796,145 +863,213 @@
     {
         MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
 
+        if ( !isForkingMojo( mojoDescriptor ) )
+        {
+            return;
+        }
+
         if ( !alreadyForkedExecutions.add( mojoDescriptor ) )
         {
             return;
         }
 
-        PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
+        List<MavenProject> forkedProjects;
 
-        if ( StringUtils.isNotEmpty( mojoDescriptor.getExecutePhase() ) )
+        if ( isAggregatorMojo( mojoDescriptor ) )
         {
-            String forkedPhase = mojoDescriptor.getExecutePhase();
+            forkedProjects = session.getProjects();
+        }
+        else
+        {
+            forkedProjects = Collections.singletonList( project );
+        }
 
-            Map<String, List<MojoExecution>> lifecycleMappings =
-                calculateLifecycleMappings( session, project, forkedPhase );
+        for ( MavenProject forkedProject : forkedProjects )
+        {
+            List<MojoExecution> forkedExecutions;
 
-            for ( List<MojoExecution> forkedExecutions : lifecycleMappings.values() )
+            if ( StringUtils.isNotEmpty( mojoDescriptor.getExecutePhase() ) )
             {
-                for ( MojoExecution forkedExecution : forkedExecutions )
-                {
-                    if ( forkedExecution.getMojoDescriptor() == null )
-                    {
-                        MojoDescriptor forkedMojoDescriptor =
-                            pluginManager.getMojoDescriptor( forkedExecution.getPlugin(), forkedExecution.getGoal(),
-                                                             getRepositoryRequest( session, project ) );
+                forkedExecutions =
+                    calculateForkedLifecycle( mojoExecution, session, forkedProject, alreadyForkedExecutions );
+            }
+            else
+            {
+                forkedExecutions = calculateForkedGoal( mojoExecution, session, forkedProject, alreadyForkedExecutions );
+            }
 
-                        forkedExecution.setMojoDescriptor( forkedMojoDescriptor );
-                    }
+            mojoExecution.addForkedExecutions( getKey( forkedProject ), forkedExecutions );
+        }
+    }
 
-                    populateMojoExecutionConfiguration( project, forkedExecution, false );
-                }
-            }
+    private List<MojoExecution> calculateForkedGoal( MojoExecution mojoExecution, MavenSession session,
+                                                     MavenProject project,
+                                                     Collection<MojoDescriptor> alreadyForkedExecutions )
+        throws MojoNotFoundException, PluginNotFoundException, PluginResolutionException,
+        PluginDescriptorParsingException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException,
+        LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException
+    {
+        MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
 
-            String forkedLifecycle = mojoDescriptor.getExecuteLifecycle();
+        PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
 
-            if ( StringUtils.isNotEmpty( forkedLifecycle ) )
-            {
-                org.apache.maven.plugin.lifecycle.Lifecycle lifecycleOverlay;
+        String forkedGoal = mojoDescriptor.getExecuteGoal();
 
-                try
-                {
-                    lifecycleOverlay = pluginDescriptor.getLifecycleMapping( forkedLifecycle );
-                }
-                catch ( IOException e )
-                {
-                    throw new PluginDescriptorParsingException( pluginDescriptor.getPlugin(), e );
-                }
-                catch ( XmlPullParserException e )
-                {
-                    throw new PluginDescriptorParsingException( pluginDescriptor.getPlugin(), e );
-                }
+        MojoDescriptor forkedMojoDescriptor = pluginDescriptor.getMojo( forkedGoal );
+        if ( forkedMojoDescriptor == null )
+        {
+            throw new MojoNotFoundException( forkedGoal, pluginDescriptor );
+        }
 
-                if ( lifecycleOverlay == null )
-                {
-                    throw new LifecycleNotFoundException( forkedLifecycle );
-                }
+        MojoExecution forkedExecution = new MojoExecution( forkedMojoDescriptor, forkedGoal );
 
-                for ( Phase phase : lifecycleOverlay.getPhases() )
-                {
-                    List<MojoExecution> forkedExecutions = lifecycleMappings.get( phase.getId() );
-                    if ( forkedExecutions != null )
-                    {
-                        for ( Execution execution : phase.getExecutions() )
-                        {
-                            for ( String goal : execution.getGoals() )
-                            {
-                                MojoDescriptor forkedMojoDescriptor;
+        populateMojoExecutionConfiguration( project, forkedExecution, true );
 
-                                if ( goal.indexOf( ':' ) < 0 )
-                                {
-                                    forkedMojoDescriptor = pluginDescriptor.getMojo( goal );
-                                    if ( forkedMojoDescriptor == null )
-                                    {
-                                        throw new MojoNotFoundException( goal, pluginDescriptor );
-                                    }
-                                }
-                                else
-                                {
-                                    forkedMojoDescriptor = getMojoDescriptor( goal, session, project );
-                                }
-
-                                MojoExecution forkedExecution =
-                                    new MojoExecution( forkedMojoDescriptor, mojoExecution.getExecutionId() );
+        extractMojoConfiguration( forkedExecution );
 
-                                Xpp3Dom forkedConfiguration = (Xpp3Dom) execution.getConfiguration();
+        calculateForkedExecutions( forkedExecution, session, project, alreadyForkedExecutions );
 
-                                forkedExecution.setConfiguration( forkedConfiguration );
+        return Collections.singletonList( forkedExecution );
+    }
 
-                                populateMojoExecutionConfiguration( project, forkedExecution, true );
+    private List<MojoExecution> calculateForkedLifecycle( MojoExecution mojoExecution, MavenSession session,
+                                                          MavenProject project,
+                                                          Collection<MojoDescriptor> alreadyForkedExecutions )
+        throws MojoNotFoundException, PluginNotFoundException, PluginResolutionException,
+        PluginDescriptorParsingException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException,
+        LifecyclePhaseNotFoundException, LifecycleNotFoundException, PluginVersionResolutionException
+    {
+        MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
 
-                                forkedExecutions.add( forkedExecution );
-                            }
-                        }
+        String forkedPhase = mojoDescriptor.getExecutePhase();
 
-                        Xpp3Dom phaseConfiguration = (Xpp3Dom) phase.getConfiguration();
-                        if ( phaseConfiguration != null )
-                        {
-                            for ( MojoExecution forkedExecution : forkedExecutions )
-                            {
-                                Xpp3Dom forkedConfiguration = forkedExecution.getConfiguration();
+        Map<String, List<MojoExecution>> lifecycleMappings = calculateLifecycleMappings( session, project, forkedPhase );
 
-                                forkedConfiguration = Xpp3Dom.mergeXpp3Dom( phaseConfiguration, forkedConfiguration );
+        for ( List<MojoExecution> forkedExecutions : lifecycleMappings.values() )
+        {
+            for ( MojoExecution forkedExecution : forkedExecutions )
+            {
+                if ( forkedExecution.getMojoDescriptor() == null )
+                {
+                    MojoDescriptor forkedMojoDescriptor =
+                        pluginManager.getMojoDescriptor( forkedExecution.getPlugin(), forkedExecution.getGoal(),
+                                                         getRepositoryRequest( session, project ) );
 
-                                forkedExecution.setConfiguration( forkedConfiguration );
-                            }
-                        }
-                    }
+                    forkedExecution.setMojoDescriptor( forkedMojoDescriptor );
                 }
+
+                populateMojoExecutionConfiguration( project, forkedExecution, false );
             }
+        }
 
-            for ( List<MojoExecution> forkedExecutions : lifecycleMappings.values() )
+        injectLifecycleOverlay( lifecycleMappings, mojoExecution, session, project );
+
+        List<MojoExecution> mojoExecutions = new ArrayList<MojoExecution>();
+
+        for ( List<MojoExecution> forkedExecutions : lifecycleMappings.values() )
+        {
+            for ( MojoExecution forkedExecution : forkedExecutions )
             {
-                for ( MojoExecution forkedExecution : forkedExecutions )
-                {
-                    extractMojoConfiguration( forkedExecution );
+                extractMojoConfiguration( forkedExecution );
 
-                    calculateForkedExecutions( forkedExecution, session, project, alreadyForkedExecutions );
+                calculateForkedExecutions( forkedExecution, session, project, alreadyForkedExecutions );
 
-                    mojoExecution.addForkedExecution( forkedExecution );
-                }
+                mojoExecutions.add( forkedExecution );
             }
         }
-        else if ( StringUtils.isNotEmpty( mojoDescriptor.getExecuteGoal() ) )
+
+        return mojoExecutions;
+    }
+
+    private void injectLifecycleOverlay( Map<String, List<MojoExecution>> lifecycleMappings,
+                                         MojoExecution mojoExecution, MavenSession session, MavenProject project )
+        throws PluginDescriptorParsingException, LifecycleNotFoundException, MojoNotFoundException,
+        PluginNotFoundException, PluginResolutionException, NoPluginFoundForPrefixException,
+        InvalidPluginDescriptorException, PluginVersionResolutionException
+    {
+        MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
+
+        PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
+
+        String forkedLifecycle = mojoDescriptor.getExecuteLifecycle();
+
+        if ( StringUtils.isEmpty( forkedLifecycle ) )
         {
-            String forkedGoal = mojoDescriptor.getExecuteGoal();
+            return;
+        }
+
+        org.apache.maven.plugin.lifecycle.Lifecycle lifecycleOverlay;
+
+        try
+        {
+            lifecycleOverlay = pluginDescriptor.getLifecycleMapping( forkedLifecycle );
+        }
+        catch ( IOException e )
+        {
+            throw new PluginDescriptorParsingException( pluginDescriptor.getPlugin(), e );
+        }
+        catch ( XmlPullParserException e )
+        {
+            throw new PluginDescriptorParsingException( pluginDescriptor.getPlugin(), e );
+        }
+
+        if ( lifecycleOverlay == null )
+        {
+            throw new LifecycleNotFoundException( forkedLifecycle );
+        }
+
+        for ( Phase phase : lifecycleOverlay.getPhases() )
+        {
+            List<MojoExecution> forkedExecutions = lifecycleMappings.get( phase.getId() );
 
-            MojoDescriptor forkedMojoDescriptor = pluginDescriptor.getMojo( forkedGoal );
-            if ( forkedMojoDescriptor == null )
+            if ( forkedExecutions != null )
             {
-                throw new MojoNotFoundException( forkedGoal, pluginDescriptor );
-            }
+                for ( Execution execution : phase.getExecutions() )
+                {
+                    for ( String goal : execution.getGoals() )
+                    {
+                        MojoDescriptor forkedMojoDescriptor;
 
-            MojoExecution forkedExecution = new MojoExecution( forkedMojoDescriptor, forkedGoal );
+                        if ( goal.indexOf( ':' ) < 0 )
+                        {
+                            forkedMojoDescriptor = pluginDescriptor.getMojo( goal );
+                            if ( forkedMojoDescriptor == null )
+                            {
+                                throw new MojoNotFoundException( goal, pluginDescriptor );
+                            }
+                        }
+                        else
+                        {
+                            forkedMojoDescriptor = getMojoDescriptor( goal, session, project );
+                        }
+
+                        MojoExecution forkedExecution =
+                            new MojoExecution( forkedMojoDescriptor, mojoExecution.getExecutionId() );
+
+                        Xpp3Dom forkedConfiguration = (Xpp3Dom) execution.getConfiguration();
 
-            populateMojoExecutionConfiguration( project, forkedExecution, true );
+                        forkedExecution.setConfiguration( forkedConfiguration );
 
-            extractMojoConfiguration( forkedExecution );
+                        populateMojoExecutionConfiguration( project, forkedExecution, true );
 
-            calculateForkedExecutions( forkedExecution, session, project, alreadyForkedExecutions );
+                        forkedExecutions.add( forkedExecution );
+                    }
+                }
 
-            mojoExecution.addForkedExecution( forkedExecution );
+                Xpp3Dom phaseConfiguration = (Xpp3Dom) phase.getConfiguration();
+
+                if ( phaseConfiguration != null )
+                {
+                    for ( MojoExecution forkedExecution : forkedExecutions )
+                    {
+                        Xpp3Dom forkedConfiguration = forkedExecution.getConfiguration();
+
+                        forkedConfiguration = Xpp3Dom.mergeXpp3Dom( phaseConfiguration, forkedConfiguration );
+
+                        forkedExecution.setConfiguration( forkedConfiguration );
+                    }
+                }
+            }
         }
     }
 

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/MojoExecution.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/MojoExecution.java?rev=808219&r1=808218&r2=808219&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/MojoExecution.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/MojoExecution.java Wed Aug 26 23:18:59 2009
@@ -19,8 +19,9 @@
  * under the License.
  */
 
-import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.maven.model.Plugin;
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
@@ -64,7 +65,11 @@
      */
     private String lifecyclePhase;
 
-    private List<MojoExecution> forkedExecutions = new ArrayList<MojoExecution>();
+    /**
+     * The executions to fork before this execution, indexed by the groupId:artifactId:version of the project on which
+     * the forked execution are to be run and in reactor build order.
+     */
+    private Map<String, List<MojoExecution>> forkedExecutions = new LinkedHashMap<String, List<MojoExecution>>();
 
     public MojoExecution( Plugin plugin, String goal, String executionId )
     {
@@ -219,19 +224,14 @@
         this.mojoDescriptor = mojoDescriptor;
     }
 
-    public List<MojoExecution> getForkedExecutions()
+    public Map<String, List<MojoExecution>> getForkedExecutions()
     {
         return forkedExecutions;
     }
 
-    public void addForkedExecution( MojoExecution forkedExecution )
+    public void addForkedExecutions( String projectKey, List<MojoExecution> forkedExecutions )
     {
-        if ( forkedExecution == null )
-        {
-            throw new IllegalArgumentException( "forked execution missing" );
-        }
-
-        forkedExecutions.add( forkedExecution );
+        this.forkedExecutions.put( projectKey, forkedExecutions );
     }
 
 }

Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ExecutionEventLogger.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ExecutionEventLogger.java?rev=808219&r1=808218&r2=808219&view=diff
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ExecutionEventLogger.java (original)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ExecutionEventLogger.java Wed Aug 26 23:18:59 2009
@@ -270,6 +270,7 @@
             {
                 buffer.append( " (" ).append( me.getExecutionId() ).append( ')' );
             }
+            buffer.append( " @ " ).append( event.getProject().getArtifactId() );
             buffer.append( " ---" );
 
             logger.info( "" );