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( "" );