Author: jdcasey Date: Thu Aug 28 13:47:05 2008 New Revision: 689976 URL: http://svn.apache.org/viewvc?rev=689976&view=rev Log: [MNG-3729] Fixing problems with project.executionProject being set to null after innermost forking mojo is finished, leaving it to cause a NPE when the next mojo uses it via reactorProjects. integration test will follow next.
Modified: maven/components/branches/maven-2.1.0-RC/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Modified: maven/components/branches/maven-2.1.0-RC/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.0-RC/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=689976&r1=689975&r2=689976&view=diff ============================================================================== --- maven/components/branches/maven-2.1.0-RC/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java (original) +++ maven/components/branches/maven-2.1.0-RC/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Thu Aug 28 13:47:05 2008 @@ -601,22 +601,21 @@ if ( hasFork ) { + // NOTE: This must always happen, regardless of treatment of reactorProjects below, because + // if we're in a forked execution right now, the current project will itself be an execution project of + // something in the reactorProjects list, and won't have a next-stage executionProject created + // for it otherwise, which leaves the project == null for the upcoming forked execution. + createExecutionProject( project, session, true ); + if ( usesReactorProjects ) { List reactorProjects = session.getSortedProjects(); for ( Iterator it = reactorProjects.iterator(); it.hasNext(); ) { MavenProject reactorProject = (MavenProject) it.next(); - if ( reactorProject.getExecutionProject() == null ) - { - createExecutionProject( reactorProject, session, false ); - } + createExecutionProject( reactorProject, session, false ); } } - else - { - createExecutionProject( project, session, true ); - } } if ( mojoDescriptor.getExecutePhase() != null || mojoDescriptor.getExecuteGoal() != null ) @@ -652,6 +651,12 @@ if ( hasFork ) { + // NOTE: This must always happen, regardless of treatment of reactorProjects below, because + // if we're in a forked execution right now, the current project will itself be an execution project of + // something in the reactorProjects list, and may not have had its own executionProject instance reset to + // a concrete state again after the previous forked executions. + calculateConcreteState( project.getExecutionProject(), session, true ); + // FIXME: Would be nice to find a way to cause the execution project to stay in a concrete state... // TODO: Test this! It should be fixed, but I don't want to destabilize until I have the issue I'm working on fixed. if ( usesReactorProjects ) @@ -664,10 +669,6 @@ calculateConcreteState( reactorProject.getExecutionProject(), session, false ); } } - else - { - calculateConcreteState( project.getExecutionProject(), session, true ); - } } try @@ -703,44 +704,17 @@ { throw new LifecycleExecutionException( e.getMessage(), e ); } - - if ( hasFork ) - { - project.setExecutionProject( null ); - - if ( usesReactorProjects ) - { - List reactorProjects = session.getSortedProjects(); - for ( Iterator it = reactorProjects.iterator(); it.hasNext(); ) - { - MavenProject reactorProject = (MavenProject) it.next(); - reactorProject.setExecutionProject( null ); - } - } - } - -// if ( usesReactorProjects ) -// { -// restoreAllDynamicStates( session ); -// } -// else -// { -// restoreDynamicState( project, session, true ); -// } } } private void createExecutionProject( MavenProject project, MavenSession session, boolean processProjectReferences ) throws LifecycleExecutionException { - if ( project.getExecutionProject() == null ) - { - MavenProject executionProject = new MavenProject( project ); - - calculateConcreteState( executionProject, session, processProjectReferences ); - - project.setExecutionProject( executionProject ); - } + MavenProject executionProject = new MavenProject( project ); + + calculateConcreteState( executionProject, session, processProjectReferences ); + + project.setExecutionProject( executionProject ); } private boolean usesSessionOrReactorProjects( PlexusConfiguration configuration )