You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2008/08/22 19:53:57 UTC

svn commit: r688137 - in /maven/components/branches/maven-2.0.10-RC: maven-core/src/main/java/org/apache/maven/lifecycle/ maven-project/src/main/java/org/apache/maven/project/

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. 
+    /**
+     * {@inheritDoc}
+     */
     public void calculateConcreteState( MavenProject project, ProjectBuilderConfiguration config )
         throws ModelInterpolationException
     {
+        calculateConcreteStateInternal( project, config, true, new HashSet() );
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    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. 
+    /**
+     * {@inheritDoc}
+     */
     public void restoreDynamicState( MavenProject project, ProjectBuilderConfiguration config )
         throws ModelInterpolationException
     {
+        restoreDynamicStateInternal( project, config, true, new HashSet() );
+    }
+    
+    /**
+     * {@inheritDoc}
+     */
+    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 {@link 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 {@link 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 {@link 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 {@link 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;
 }