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