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;
}