Author: jdcasey Date: Fri Aug 22 10:53:57 2008 New Revision: 688137 URL: http://svn.apache.org/viewvc?rev=688137&view=rev Log: Minor performance improvements for highly interconnected reactor builds.
Modified: maven/components/branches/maven-2.0.10-RC/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java maven/components/branches/maven-2.0.10-RC/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java maven/components/branches/maven-2.0.10-RC/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java Modified: maven/components/branches/maven-2.0.10-RC/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.10-RC/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=688137&r1=688136&r2=688137&view=diff ============================================================================== --- maven/components/branches/maven-2.0.10-RC/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java (original) +++ maven/components/branches/maven-2.0.10-RC/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Fri Aug 22 10:53:57 2008 @@ -565,8 +565,6 @@ MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor(); - calculateConcreteState( project, session ); - PlexusConfiguration configuration = mojoDescriptor.getMojoConfiguration(); boolean usesReactorProjects = mojoDescriptor.isAggregator() || usesSessionOrReactorProjects( configuration ); @@ -574,6 +572,10 @@ { calculateAllConcreteStates( session ); } + else + { + calculateConcreteState( project, session, true ); + } calculateConcreteConfiguration( mojoExecution, project, session ); @@ -603,8 +605,6 @@ if ( hasFork ) { - createExecutionProject( project, session ); - if ( usesReactorProjects ) { List reactorProjects = session.getSortedProjects(); @@ -613,10 +613,14 @@ MavenProject reactorProject = (MavenProject) it.next(); if ( reactorProject.getExecutionProject() == null ) { - createExecutionProject( reactorProject, session ); + createExecutionProject( reactorProject, session, false ); } } } + else + { + createExecutionProject( project, session, true ); + } } if ( mojoDescriptor.getExecutePhase() != null || mojoDescriptor.getExecuteGoal() != null ) @@ -653,18 +657,20 @@ if ( hasFork ) { // TODO: Would be nice to find a way to cause the execution project to stay in a concrete state... - calculateConcreteState( project.getExecutionProject(), session ); - if ( usesReactorProjects ) { + calculateAllConcreteStates( session ); List reactorProjects = session.getSortedProjects(); for ( Iterator it = reactorProjects.iterator(); it.hasNext(); ) { MavenProject reactorProject = (MavenProject) it.next(); - calculateConcreteState( reactorProject, session ); - calculateConcreteState( reactorProject.getExecutionProject(), session ); + calculateConcreteState( reactorProject.getExecutionProject(), session, false ); } } + else + { + calculateConcreteState( project.getExecutionProject(), session, true ); + } } try @@ -716,23 +722,25 @@ // } // } - restoreDynamicState( project, session ); - if ( usesReactorProjects ) { restoreAllDynamicStates( session ); } + else + { + restoreDynamicState( project, session, true ); + } } } - private void createExecutionProject( MavenProject project, MavenSession session ) + private void createExecutionProject( MavenProject project, MavenSession session, boolean processProjectReferences ) throws LifecycleExecutionException { if ( project.getExecutionProject() == null ) { MavenProject executionProject = new MavenProject( project ); - calculateConcreteState( executionProject, session ); + calculateConcreteState( executionProject, session, processProjectReferences ); project.setExecutionProject( executionProject ); } @@ -815,19 +823,19 @@ { for ( Iterator it = projects.iterator(); it.hasNext(); ) { - calculateConcreteState( (MavenProject) it.next(), session ); + calculateConcreteState( (MavenProject) it.next(), session, false ); } } } - private void calculateConcreteState( MavenProject project, MavenSession session ) + private void calculateConcreteState( MavenProject project, MavenSession session, boolean processReferences ) throws LifecycleExecutionException { if ( mavenProjectBuilder != null && project != null ) { try { - mavenProjectBuilder.calculateConcreteState( project, session.getProjectBuilderConfiguration() ); + mavenProjectBuilder.calculateConcreteState( project, session.getProjectBuilderConfiguration(), processReferences ); } catch ( ModelInterpolationException e ) { @@ -845,17 +853,17 @@ for ( Iterator it = reactorProjects.iterator(); it.hasNext(); ) { MavenProject project = (MavenProject) it.next(); - restoreDynamicState( project, session ); + restoreDynamicState( project, session, false ); } } } - private void restoreDynamicState( MavenProject project, MavenSession session ) + private void restoreDynamicState( MavenProject project, MavenSession session, boolean processReferences ) throws LifecycleExecutionException { try { - mavenProjectBuilder.restoreDynamicState( project, session.getProjectBuilderConfiguration() ); + mavenProjectBuilder.restoreDynamicState( project, session.getProjectBuilderConfiguration(), processReferences ); } catch ( ModelInterpolationException e ) { Modified: maven/components/branches/maven-2.0.10-RC/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.10-RC/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java?rev=688137&r1=688136&r2=688137&view=diff ============================================================================== --- maven/components/branches/maven-2.0.10-RC/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java (original) +++ maven/components/branches/maven-2.0.10-RC/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java Fri Aug 22 10:53:57 2008 @@ -1806,11 +1806,33 @@ container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY ); } - // NOTE: This is a code hotspot, PLEASE be careful about the performance of logic inside or - // called from this method. + /** + * [EMAIL PROTECTED] + */ public void calculateConcreteState( MavenProject project, ProjectBuilderConfiguration config ) throws ModelInterpolationException { + calculateConcreteStateInternal( project, config, true, new HashSet() ); + } + + /** + * [EMAIL PROTECTED] + */ + public void calculateConcreteState( MavenProject project, ProjectBuilderConfiguration config, boolean processProjectReferences ) + throws ModelInterpolationException + { + calculateConcreteStateInternal( project, config, processProjectReferences, ( processProjectReferences ? new HashSet() : null ) ); + } + + /* + * NOTE: This is a code hotspot, PLEASE be careful about the performance of logic inside or + * called from this method. + * + * NOTE: If processProjectReferences == false, processedProjects MUST NOT BE USED. It will be null. + */ + private void calculateConcreteStateInternal( MavenProject project, ProjectBuilderConfiguration config, boolean processProjectReferences, Set processedProjects ) + throws ModelInterpolationException + { if ( !project.isConcrete() ) { Build build = project.getBuild(); @@ -1873,11 +1895,15 @@ project.setBuild( model.getBuild() ); } - calculateConcreteProjectReferences( project, config ); + if ( processProjectReferences ) + { + processedProjects.add( project.getId() ); + calculateConcreteProjectReferences( project, config, processedProjects ); + } if ( project.getExecutionProject() != null ) { - calculateConcreteState( project.getExecutionProject(), config ); + calculateConcreteStateInternal( project.getExecutionProject(), config, processProjectReferences, processedProjects ); } project.setConcrete( true ); @@ -1897,7 +1923,8 @@ } private void calculateConcreteProjectReferences( MavenProject project, - ProjectBuilderConfiguration config ) + ProjectBuilderConfiguration config, + Set processedProjects ) throws ModelInterpolationException { Map projectRefs = project.getProjectReferences(); @@ -1907,7 +1934,10 @@ for ( Iterator it = projectRefs.values().iterator(); it.hasNext(); ) { MavenProject reference = (MavenProject) it.next(); - calculateConcreteState( reference, config ); + if ( !processedProjects.contains( reference.getId() ) ) + { + calculateConcreteStateInternal( reference, config, true, processedProjects ); + } } } } @@ -1936,11 +1966,33 @@ return result; } - // NOTE: This is a code hotspot, PLEASE be careful about the performance of logic inside or - // called from this method. + /** + * [EMAIL PROTECTED] + */ public void restoreDynamicState( MavenProject project, ProjectBuilderConfiguration config ) throws ModelInterpolationException { + restoreDynamicStateInternal( project, config, true, new HashSet() ); + } + + /** + * [EMAIL PROTECTED] + */ + public void restoreDynamicState( MavenProject project, ProjectBuilderConfiguration config, boolean processProjectReferences ) + throws ModelInterpolationException + { + restoreDynamicStateInternal( project, config, processProjectReferences, ( processProjectReferences ? new HashSet() : null ) ); + } + + /* + * NOTE: This is a code hotspot, PLEASE be careful about the performance of logic inside or + * called from this method. + * + * NOTE: If processProjectReferences == false, processedProjects MUST NOT BE USED. It will be null. + */ + private void restoreDynamicStateInternal( MavenProject project, ProjectBuilderConfiguration config, boolean processProjectReferences, Set processedProjects ) + throws ModelInterpolationException + { if ( !project.isConcrete() || !projectWasChanged( project ) ) { return; @@ -1949,11 +2001,15 @@ restoreBuildRoots( project, config, getLogger().isDebugEnabled() ); restoreModelBuildSection( project, config, getLogger().isDebugEnabled() ); - restoreDynamicProjectReferences( project, config ); + if ( processProjectReferences ) + { + processedProjects.add( project.getId() ); + restoreDynamicProjectReferences( project, config, processedProjects ); + } if ( project.getExecutionProject() != null ) { - restoreDynamicState( project.getExecutionProject(), config ); + restoreDynamicStateInternal( project.getExecutionProject(), config, processProjectReferences, processedProjects ); } project.setConcrete( false ); @@ -2004,7 +2060,7 @@ private boolean objectEquals( Object obj1, Object obj2 ) { - return obj1 == null ? obj2 == null : obj1 == obj2 || obj1.equals( obj2 ); + return obj1 == null ? obj2 == null : obj2 != null && ( obj1 == obj2 || obj1.equals( obj2 ) ); } private void propagateNewPlugins( MavenProject project ) @@ -2038,7 +2094,8 @@ } private void restoreDynamicProjectReferences( MavenProject project, - ProjectBuilderConfiguration config ) + ProjectBuilderConfiguration config, + Set processedProjects ) throws ModelInterpolationException { Map projectRefs = project.getProjectReferences(); @@ -2047,7 +2104,10 @@ for ( Iterator it = projectRefs.values().iterator(); it.hasNext(); ) { MavenProject projectRef = (MavenProject) it.next(); - restoreDynamicState( projectRef, config ); + if ( !processedProjects.contains( projectRef.getId() ) ) + { + restoreDynamicStateInternal( projectRef, config, true, processedProjects ); + } } } } Modified: maven/components/branches/maven-2.0.10-RC/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.10-RC/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java?rev=688137&r1=688136&r2=688137&view=diff ============================================================================== --- maven/components/branches/maven-2.0.10-RC/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java (original) +++ maven/components/branches/maven-2.0.10-RC/maven-project/src/main/java/org/apache/maven/project/MavenProjectBuilder.java Fri Aug 22 10:53:57 2008 @@ -119,9 +119,39 @@ // API BELOW IS USED TO PRESERVE DYNAMISM IN THE BUILD SECTION OF THE POM. // ---------------------------------------------------------------------------- + /** + * Variant of [EMAIL PROTECTED] MavenProjectBuilder#calculateConcreteState(MavenProject, ProjectBuilderConfiguration, boolean)} + * which assumes that project references should be processed. This is provided for performance reasons, for cases + * where you know all projects in the reactor will be processed, making traversal of project references unnecessary. + */ void calculateConcreteState( MavenProject project, ProjectBuilderConfiguration config ) throws ModelInterpolationException; + /** + * Up to this point, the build section of the POM remains uninterpolated except for the artifact coordinates + * it contains. This method will interpolate the build section and associated project-instance data + * structures. Along with the [EMAIL PROTECTED] MavenProjectBuilder#restoreDynamicState(MavenProject, ProjectBuilderConfiguration, boolean)} + * method, this method allows expressions in these areas of the POM and project instance to + * be reevaluated in the event that a mojo changes one the build-path values, or a project property. + */ + void calculateConcreteState( MavenProject project, ProjectBuilderConfiguration config, boolean processReferences ) + throws ModelInterpolationException; + + /** + * Variant of [EMAIL PROTECTED] MavenProjectBuilder#restoreDynamicState(MavenProject, ProjectBuilderConfiguration, boolean)} + * which assumes that project references should be processed. This is provided for performance reasons, for cases + * where you know all projects in the reactor will be processed, making traversal of project references unnecessary. + */ void restoreDynamicState( MavenProject project, ProjectBuilderConfiguration config ) throws ModelInterpolationException; + + /** + * In the event that a mojo execution has changed one or more build paths, or changed the project properties, + * this method can restore the build section of the POM to its uninterpolated form, to allow reevaluation of + * any expressions that may depend on this changed information. This method will short-circuit if the project + * is not in a concrete state (see [EMAIL PROTECTED] MavenProjectBuilder#calculateConcreteState(MavenProject, ProjectBuilderConfiguration, boolean)} + * or if the properties and build paths of the project remain unchanged. + */ + void restoreDynamicState( MavenProject project, ProjectBuilderConfiguration config, boolean processReferences ) + throws ModelInterpolationException; }