diff --git a/maven-core/pom.xml b/maven-core/pom.xml
index ae48d51236..9f5e3574b8 100644
--- a/maven-core/pom.xml
+++ b/maven-core/pom.xml
@@ -143,5 +143,11 @@ under the License.
plexus-active-collections
1.0-beta-1
+
+ easymock
+ easymock
+ 1.2_Java1.3
+ test
+
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
index 9b7f2b4250..ebe4331f11 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
@@ -28,7 +28,6 @@
import org.apache.maven.context.BuildContextManager;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.execution.ReactorManager;
-import org.apache.maven.lifecycle.binding.LifecycleBindingManager;
import org.apache.maven.lifecycle.binding.MojoBindingFactory;
import org.apache.maven.lifecycle.model.MojoBinding;
import org.apache.maven.lifecycle.plan.BuildPlan;
@@ -63,34 +62,31 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Stack;
/**
* @author Jason van Zyl
* @author Brett Porter
- * @version $Id: DefaultLifecycleExecutor.java,v 1.16 2005/03/04 09:04:25
- * jdcasey Exp $
- * @todo because of aggregation, we ended up with cli-ish stuff in here (like line() and the project logging, without much of the event handling)
+ * @version $Id$
+ * @todo because of aggregation, we ended up with cli-ish stuff in here (like line() and the project logging, without
+ * much of the event handling)
*/
-public class DefaultLifecycleExecutor
- extends AbstractLogEnabled
- implements LifecycleExecutor
+public class DefaultLifecycleExecutor extends AbstractLogEnabled implements LifecycleExecutor
{
// ----------------------------------------------------------------------
// Components
// ----------------------------------------------------------------------
private PluginManager pluginManager;
-
+
private PluginLoader pluginLoader;
-
+
private BuildPlanner buildPlanner;
private ArtifactHandlerManager artifactHandlerManager;
private MojoBindingFactory mojoBindingFactory;
- private LifecycleBindingManager lifecycleBindingManager;
-
private BuildContextManager buildContextManager;
// ----------------------------------------------------------------------
@@ -98,14 +94,13 @@ public class DefaultLifecycleExecutor
// ----------------------------------------------------------------------
/**
- * Execute a task. Each task may be a phase in the lifecycle or the
- * execution of a mojo.
- *
+ * Execute a task. Each task may be a phase in the lifecycle or the execution of a mojo.
+ *
* @param session
* @param rm
* @param dispatcher
*/
- public void execute( MavenSession session, ReactorManager rm, EventDispatcher dispatcher )
+ public void execute( final MavenSession session, final ReactorManager rm, final EventDispatcher dispatcher )
throws BuildFailureException, LifecycleExecutionException
{
// TODO: This is dangerous, particularly when it's just a collection of loose-leaf projects being built
@@ -114,7 +109,7 @@ public void execute( MavenSession session, ReactorManager rm, EventDispatcher di
List goals = session.getGoals();
- if ( goals.isEmpty() && rootProject != null )
+ if ( goals.isEmpty() && ( rootProject != null ) )
{
String goal = rootProject.getDefaultGoal();
@@ -146,8 +141,8 @@ public void execute( MavenSession session, ReactorManager rm, EventDispatcher di
executeTaskSegments( taskSegments, rm, session, rootProject, dispatcher );
}
- private void executeTaskSegments( List taskSegments, ReactorManager rm, MavenSession session,
- MavenProject rootProject, EventDispatcher dispatcher )
+ private void executeTaskSegments( final List taskSegments, final ReactorManager rm, final MavenSession session,
+ final MavenProject rootProject, final EventDispatcher dispatcher )
throws LifecycleExecutionException, BuildFailureException
{
for ( Iterator it = taskSegments.iterator(); it.hasNext(); )
@@ -165,11 +160,11 @@ private void executeTaskSegments( List taskSegments, ReactorManager rm, MavenSes
getLogger().info( " " + segment );
line();
-
+
String target = rootProject.getId() + " ( " + segment + " )";
getLogger().debug( "Constructing build plan for " + target );
-
+
// !! This is ripe for refactoring to an aspect.
// Event monitoring.
String event = MavenEvents.PROJECT_EXECUTION;
@@ -183,23 +178,22 @@ private void executeTaskSegments( List taskSegments, ReactorManager rm, MavenSes
// for the fork being executed, plus a stack of projects used in the ancestor execution contexts.
LifecycleExecutionContext ctx = new LifecycleExecutionContext( rootProject );
ctx.store( buildContextManager );
-
+
// NEW: Build up the execution plan, including configuration.
List mojoBindings = getLifecycleBindings( segment.getTasks(), rootProject, target );
-
+
// NEW: Then, iterate over each binding in that plan, and execute the associated mojo.
// only call once, with the top-level project (assumed to be provided as a parameter)...
for ( Iterator mojoIterator = mojoBindings.iterator(); mojoIterator.hasNext(); )
{
MojoBinding binding = (MojoBinding) mojoIterator.next();
- executeGoalAndHandleFailures( binding, session, dispatcher, event, rm, buildStartTime,
- target );
+ executeGoalAndHandleFailures( binding, session, dispatcher, event, rm, buildStartTime, target );
}
-
+
// clean up the execution context, so we don't pollute for future project-executions.
LifecycleExecutionContext.delete( buildContextManager );
-
+
rm.registerBuildSuccess( rootProject, System.currentTimeMillis() - buildStartTime );
dispatcher.dispatchEnd( event, target );
@@ -212,8 +206,7 @@ private void executeTaskSegments( List taskSegments, ReactorManager rm, MavenSes
getLogger().info( " " + segment );
- getLogger().info(
- "This project has been banned from further executions due to previous failures." );
+ getLogger().info( "This project has been banned from further executions due to previous failures." );
line();
}
@@ -238,7 +231,7 @@ private void executeTaskSegments( List taskSegments, ReactorManager rm, MavenSes
line();
String target = currentProject.getId() + " ( " + segment + " )";
-
+
// !! This is ripe for refactoring to an aspect.
// Event monitoring.
String event = MavenEvents.PROJECT_EXECUTION;
@@ -246,23 +239,25 @@ private void executeTaskSegments( List taskSegments, ReactorManager rm, MavenSes
long buildStartTime = System.currentTimeMillis();
dispatcher.dispatchStart( event, target );
-
+
LifecycleExecutionContext ctx = new LifecycleExecutionContext( currentProject );
ctx.store( buildContextManager );
List mojoBindings = getLifecycleBindings( segment.getTasks(), currentProject, target );
-
+
for ( Iterator mojoIterator = mojoBindings.iterator(); mojoIterator.hasNext(); )
{
MojoBinding mojoBinding = (MojoBinding) mojoIterator.next();
- getLogger().debug( "Mojo: " + mojoBinding.getGoal() + " has config:\n" + mojoBinding.getConfiguration() );
- executeGoalAndHandleFailures( mojoBinding, session, dispatcher, event, rm,
- buildStartTime, target );
+ getLogger().debug(
+ "Mojo: " + mojoBinding.getGoal() + " has config:\n"
+ + mojoBinding.getConfiguration() );
+ executeGoalAndHandleFailures( mojoBinding, session, dispatcher, event, rm, buildStartTime,
+ target );
}
LifecycleExecutionContext.delete( buildContextManager );
-
+
rm.registerBuildSuccess( currentProject, System.currentTimeMillis() - buildStartTime );
dispatcher.dispatchEnd( event, target );
@@ -276,7 +271,7 @@ private void executeTaskSegments( List taskSegments, ReactorManager rm, MavenSes
getLogger().info( " " + segment );
getLogger().info(
- "This project has been banned from further executions due to previous failures." );
+ "This project has been banned from further executions due to previous failures." );
line();
}
@@ -286,43 +281,43 @@ private void executeTaskSegments( List taskSegments, ReactorManager rm, MavenSes
}
/**
- * Retrieves the build plan for the current project, given the specified list of tasks. This
- * build plan will consist of MojoBindings, each fully configured to execute, which enables us
- * to enumerate the full build plan to the debug log-level, complete with the configuration each
- * mojo will use.
+ * Retrieves the build plan for the current project, given the specified list of tasks. This build plan will consist
+ * of MojoBindings, each fully configured to execute, which enables us to enumerate the full build plan to the debug
+ * log-level, complete with the configuration each mojo will use.
*/
- private List getLifecycleBindings( List tasks, MavenProject project, String targetDescription )
+ private List getLifecycleBindings( final List tasks, final MavenProject project, final String targetDescription )
throws LifecycleExecutionException
{
List mojoBindings;
try
{
BuildPlan plan = buildPlanner.constructBuildPlan( tasks, project );
-
+
if ( getLogger().isDebugEnabled() )
{
- getLogger().debug( "\n\nOur build plan is:\n" + BuildPlanUtils.listBuildPlan( plan, project, lifecycleBindingManager, false ) + "\n\n" );
+ getLogger().debug( "\n\nOur build plan is:\n" + BuildPlanUtils.listBuildPlan( plan, false ) + "\n\n" );
}
-
- mojoBindings = plan.getPlanMojoBindings( project, lifecycleBindingManager );
+
+ mojoBindings = plan.renderExecutionPlan( new Stack() );
}
catch ( LifecycleException e )
{
- throw new LifecycleExecutionException( "Failed to construct build plan for: " + targetDescription + ". Reason: "
- + e.getMessage(), e );
+ throw new LifecycleExecutionException( "Failed to construct build plan for: " + targetDescription
+ + ". Reason: " + e.getMessage(), e );
}
-
+
return mojoBindings;
}
- private void executeGoalAndHandleFailures( MojoBinding mojoBinding, MavenSession session, EventDispatcher dispatcher, String event, ReactorManager rm,
- long buildStartTime, String target )
+ private void executeGoalAndHandleFailures( final MojoBinding mojoBinding, final MavenSession session,
+ final EventDispatcher dispatcher, final String event,
+ final ReactorManager rm, final long buildStartTime, final String target )
throws BuildFailureException, LifecycleExecutionException
{
// NEW: Retrieve/use the current project stored in the execution context, for consistency.
LifecycleExecutionContext ctx = LifecycleExecutionContext.read( buildContextManager );
MavenProject project = ctx.getCurrentProject();
-
+
// NEW: Since the MojoBinding instances are configured when the build plan is constructed,
// all that remains to be done here is to load the PluginDescriptor, construct a MojoExecution
// instance, and call PluginManager.executeMojo( execution ). The MojoExecutor is constructed
@@ -342,16 +337,16 @@ private void executeGoalAndHandleFailures( MojoBinding mojoBinding, MavenSession
}
else
{
- throw new LifecycleExecutionException( "Failed to load plugin for: " + MojoBindingUtils.toString( mojoBinding )
- + ". Reason: " + e.getMessage(), e );
+ throw new LifecycleExecutionException( "Failed to load plugin for: "
+ + MojoBindingUtils.toString( mojoBinding ) + ". Reason: " + e.getMessage(), e );
}
}
-
+
if ( pluginDescriptor != null )
{
MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( mojoBinding.getGoal() );
MojoExecution mojoExecution = new MojoExecution( mojoDescriptor );
-
+
mojoExecution.setConfiguration( (Xpp3Dom) mojoBinding.getConfiguration() );
try
@@ -360,8 +355,8 @@ private void executeGoalAndHandleFailures( MojoBinding mojoBinding, MavenSession
}
catch ( PluginManagerException e )
{
- throw new LifecycleExecutionException( "Internal error in the plugin manager executing goal '" +
- mojoDescriptor.getId() + "': " + e.getMessage(), e );
+ throw new LifecycleExecutionException( "Internal error in the plugin manager executing goal '"
+ + mojoDescriptor.getId() + "': " + e.getMessage(), e );
}
catch ( ArtifactNotFoundException e )
{
@@ -390,8 +385,8 @@ private void executeGoalAndHandleFailures( MojoBinding mojoBinding, MavenSession
}
else
{
- throw new LifecycleExecutionException( "Failed to load plugin for: " + MojoBindingUtils.toString( mojoBinding )
- + ". Reason: unknown" );
+ throw new LifecycleExecutionException( "Failed to load plugin for: "
+ + MojoBindingUtils.toString( mojoBinding ) + ". Reason: unknown" );
}
}
catch ( LifecycleExecutionException e )
@@ -414,10 +409,11 @@ private void executeGoalAndHandleFailures( MojoBinding mojoBinding, MavenSession
}
}
- private boolean handleExecutionFailure( ReactorManager rm, MavenProject project, Exception e, MojoBinding mojoBinding,
- long buildStartTime )
+ private boolean handleExecutionFailure( final ReactorManager rm, final MavenProject project, final Exception e,
+ final MojoBinding mojoBinding, final long buildStartTime )
{
- rm.registerBuildFailure( project, e, MojoBindingUtils.toString( mojoBinding ), System.currentTimeMillis() - buildStartTime );
+ rm.registerBuildFailure( project, e, MojoBindingUtils.toString( mojoBinding ), System.currentTimeMillis()
+ - buildStartTime );
if ( ReactorManager.FAIL_FAST.equals( rm.getFailureBehavior() ) )
{
@@ -431,7 +427,8 @@ else if ( ReactorManager.FAIL_AT_END.equals( rm.getFailureBehavior() ) )
return false;
}
- private List segmentTaskListByAggregationNeeds( List tasks, MavenSession session, MavenProject rootProject )
+ private List segmentTaskListByAggregationNeeds( final List tasks, final MavenSession session,
+ final MavenProject rootProject )
throws LifecycleExecutionException, BuildFailureException
{
List segments = new ArrayList();
@@ -448,7 +445,7 @@ private List segmentTaskListByAggregationNeeds( List tasks, MavenSession session
// simply add it to the current task partition.
if ( LifecycleUtils.isValidPhaseName( task ) )
{
- if ( currentSegment != null && currentSegment.aggregate() )
+ if ( ( currentSegment != null ) && currentSegment.aggregate() )
{
segments.add( currentSegment );
currentSegment = null;
@@ -471,33 +468,37 @@ private List segmentTaskListByAggregationNeeds( List tasks, MavenSession session
}
catch ( PluginLoaderException e )
{
- // TODO: shouldn't hit this, investigate using the same resolution logic as
+ // TODO: shouldn't hit this, investigate using the same resolution logic as
// others for plugins in the reactor
getLogger().info(
- "Cannot find mojo descriptor for: \'" + task + "\' - Treating as non-aggregator." );
-
+ "Cannot find mojo descriptor for: \'" + task
+ + "\' - Treating as non-aggregator." );
+
getLogger().debug( "", e );
}
catch ( LifecycleSpecificationException e )
{
- String message = "Invalid task '" + task + "': you must specify a valid lifecycle phase, or"
- + " a goal in the format plugin:goal or pluginGroupId:pluginArtifactId:pluginVersion:goal";
-
+ String message =
+ "Invalid task '"
+ + task
+ + "': you must specify a valid lifecycle phase, or"
+ + " a goal in the format plugin:goal or pluginGroupId:pluginArtifactId:pluginVersion:goal";
+
throw new BuildFailureException( message, e );
}
catch ( LifecycleLoaderException e )
{
String message = "Cannot find plugin to match task '" + task + "'.";
-
+
throw new BuildFailureException( message, e );
}
// if the mojo descriptor was found, determine aggregator status according to:
// 1. whether the mojo declares itself an aggregator
// 2. whether the mojo DOES NOT require a project to function (implicitly avoid reactor)
- if ( mojo != null && ( mojo.isAggregator() || !mojo.isProjectRequired() ) )
+ if ( ( mojo != null ) && ( mojo.isAggregator() || !mojo.isProjectRequired() ) )
{
- if ( currentSegment != null && !currentSegment.aggregate() )
+ if ( ( currentSegment != null ) && !currentSegment.aggregate() )
{
segments.add( currentSegment );
currentSegment = null;
@@ -512,7 +513,7 @@ private List segmentTaskListByAggregationNeeds( List tasks, MavenSession session
}
else
{
- if ( currentSegment != null && currentSegment.aggregate() )
+ if ( ( currentSegment != null ) && currentSegment.aggregate() )
{
segments.add( currentSegment );
currentSegment = null;
@@ -545,18 +546,18 @@ private List segmentTaskListByAggregationNeeds( List tasks, MavenSession session
/**
* @todo Not particularly happy about this. Would like WagonManager and ArtifactTypeHandlerManager to be able to
- * lookup directly, or have them passed in
+ * lookup directly, or have them passed in
*
* @todo Move this sort of thing to the tail end of the project-building process
*/
- private Map findArtifactTypeHandlers( MavenSession session )
+ private Map findArtifactTypeHandlers( final MavenSession session )
throws LifecycleExecutionException, PluginNotFoundException
{
Map map = new HashMap();
for ( Iterator projectIterator = session.getSortedProjects().iterator(); projectIterator.hasNext(); )
{
MavenProject project = (MavenProject) projectIterator.next();
-
+
for ( Iterator i = project.getBuildPlugins().iterator(); i.hasNext(); )
{
Plugin plugin = (Plugin) i.next();
@@ -565,7 +566,8 @@ private Map findArtifactTypeHandlers( MavenSession session )
{
verifyPlugin( plugin, project, session );
- // TODO: if moved to the plugin manager we already have the descriptor from above and so do can lookup the container directly
+ // TODO: if moved to the plugin manager we already have the descriptor from above and so do can
+ // lookup the container directly
try
{
Map components = pluginManager.getPluginComponents( plugin, ArtifactHandler.ROLE );
@@ -577,8 +579,8 @@ private Map findArtifactTypeHandlers( MavenSession session )
}
catch ( PluginManagerException e )
{
- throw new LifecycleExecutionException( "Error looking up available components from plugin '" +
- plugin.getKey() + "': " + e.getMessage(), e );
+ throw new LifecycleExecutionException( "Error looking up available components from plugin '"
+ + plugin.getKey() + "': " + e.getMessage(), e );
}
// shudder...
@@ -596,11 +598,11 @@ private Map findArtifactTypeHandlers( MavenSession session )
return map;
}
- private PluginDescriptor verifyPlugin( Plugin plugin, MavenProject project, MavenSession session )
+ private PluginDescriptor verifyPlugin( final Plugin plugin, final MavenProject project, final MavenSession session )
throws LifecycleExecutionException, PluginNotFoundException
{
getLogger().debug( "Verifying plugin: " + plugin.getKey() );
-
+
PluginDescriptor pluginDescriptor;
try
{
@@ -608,8 +610,8 @@ private PluginDescriptor verifyPlugin( Plugin plugin, MavenProject project, Mave
}
catch ( PluginManagerException e )
{
- throw new LifecycleExecutionException(
- "Internal error in the plugin manager getting plugin '" + plugin.getKey() + "': " + e.getMessage(), e );
+ throw new LifecycleExecutionException( "Internal error in the plugin manager getting plugin '"
+ + plugin.getKey() + "': " + e.getMessage(), e );
}
catch ( PluginVersionResolutionException e )
{
@@ -638,14 +640,15 @@ private PluginDescriptor verifyPlugin( Plugin plugin, MavenProject project, Mave
return pluginDescriptor;
}
- private MojoDescriptor getMojoDescriptorForDirectInvocation( String task, MavenSession session, MavenProject project )
+ private MojoDescriptor getMojoDescriptorForDirectInvocation( final String task, final MavenSession session,
+ final MavenProject project )
throws LifecycleSpecificationException, PluginLoaderException, LifecycleLoaderException
{
MojoBinding binding = mojoBindingFactory.parseMojoBinding( task, project, true );
-
+
PluginDescriptor descriptor = pluginLoader.loadPlugin( binding, project );
MojoDescriptor mojoDescriptor = descriptor.getMojo( binding.getGoal() );
-
+
return mojoDescriptor;
}
@@ -658,14 +661,14 @@ private static class TaskSegment
{
private boolean aggregate;
- private List tasks = new ArrayList();
+ private final List tasks = new ArrayList();
TaskSegment()
{
}
- TaskSegment( boolean aggregate )
+ TaskSegment( final boolean aggregate )
{
this.aggregate = aggregate;
}
@@ -703,7 +706,7 @@ boolean aggregate()
return aggregate;
}
- void add( String task )
+ void add( final String task )
{
tasks.add( task );
}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManager.java b/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManager.java
index 81de4f78e4..1b048762c4 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManager.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManager.java
@@ -5,11 +5,8 @@
import org.apache.maven.lifecycle.LifecycleSpecificationException;
import org.apache.maven.lifecycle.LifecycleUtils;
import org.apache.maven.lifecycle.mapping.LifecycleMapping;
-import org.apache.maven.lifecycle.model.LifecycleBinding;
import org.apache.maven.lifecycle.model.LifecycleBindings;
import org.apache.maven.lifecycle.model.MojoBinding;
-import org.apache.maven.lifecycle.plan.DirectInvocationModifier;
-import org.apache.maven.lifecycle.plan.LifecyclePlannerException;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.model.ReportPlugin;
@@ -30,23 +27,20 @@
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
/**
- * Responsible for the gross construction of LifecycleBindings, or mappings of MojoBinding instances
- * to different parts of the three lifecycles: clean, build, and site. Also, handles transcribing
- * these LifecycleBindings instances into lists of MojoBinding's, which can be consumed by the
- * LifecycleExecutor.
+ * Responsible for the gross construction of LifecycleBindings, or mappings of MojoBinding instances to different parts
+ * of the three lifecycles: clean, build, and site. Also, handles transcribing these LifecycleBindings instances into
+ * lists of MojoBinding's, which can be consumed by the LifecycleExecutor.
*
* @author jdcasey
- *
+ *
*/
-public class DefaultLifecycleBindingManager
- implements LifecycleBindingManager, LogEnabled
+public class DefaultLifecycleBindingManager implements LifecycleBindingManager, LogEnabled
{
private ActiveMap bindingsByPackaging;
@@ -56,7 +50,7 @@ public class DefaultLifecycleBindingManager
private PluginLoader pluginLoader;
private MojoBindingFactory mojoBindingFactory;
-
+
private LegacyLifecycleMappingParser legacyLifecycleMappingParser;
private Logger logger;
@@ -68,11 +62,10 @@ public class DefaultLifecycleBindingManager
private List defaultReports;
/**
- * Retrieve the LifecycleBindings given by the lifecycle mapping component/file for the project's
- * packaging. Any applicable mojo configuration will be injected into the LifecycleBindings from
- * the POM.
+ * Retrieve the LifecycleBindings given by the lifecycle mapping component/file for the project's packaging. Any
+ * applicable mojo configuration will be injected into the LifecycleBindings from the POM.
*/
- public LifecycleBindings getBindingsForPackaging( MavenProject project )
+ public LifecycleBindings getBindingsForPackaging( final MavenProject project )
throws LifecycleLoaderException, LifecycleSpecificationException
{
String packaging = project.getPackaging();
@@ -114,12 +107,11 @@ public LifecycleBindings getBindingsForPackaging( MavenProject project )
/**
* Search all plugins configured in the POM that have extensions == true, looking for either a
- * {@link LifecycleBindingLoader} instance, or a {@link LifecycleMapping} instance that matches
- * the project's packaging. For the first match found, construct the corresponding LifecycleBindings
- * instance and return it after POM configurations have been injected into any appropriate
- * MojoBinding instances contained within.
+ * {@link LifecycleBindingLoader} instance, or a {@link LifecycleMapping} instance that matches the project's
+ * packaging. For the first match found, construct the corresponding LifecycleBindings instance and return it after
+ * POM configurations have been injected into any appropriate MojoBinding instances contained within.
*/
- private LifecycleBindings searchPluginsWithExtensions( MavenProject project )
+ private LifecycleBindings searchPluginsWithExtensions( final MavenProject project )
throws LifecycleLoaderException, LifecycleSpecificationException
{
List plugins = project.getBuildPlugins();
@@ -136,18 +128,20 @@ private LifecycleBindings searchPluginsWithExtensions( MavenProject project )
try
{
- loader = (LifecycleBindingLoader) pluginLoader.loadPluginComponent( LifecycleBindingLoader.ROLE, packaging,
- plugin, project );
+ loader =
+ (LifecycleBindingLoader) pluginLoader.loadPluginComponent( LifecycleBindingLoader.ROLE,
+ packaging, plugin, project );
}
catch ( ComponentLookupException e )
{
logger.debug( LifecycleBindingLoader.ROLE + " for packaging: " + packaging
- + " could not be retrieved from plugin: " + plugin.getKey() + ".\nReason: " + e.getMessage(), e );
+ + " could not be retrieved from plugin: " + plugin.getKey() + ".\nReason: "
+ + e.getMessage(), e );
}
catch ( PluginLoaderException e )
{
throw new LifecycleLoaderException( "Failed to load plugin: " + plugin.getKey() + ". Reason: "
- + e.getMessage(), e );
+ + e.getMessage(), e );
}
if ( loader != null )
@@ -161,18 +155,20 @@ private LifecycleBindings searchPluginsWithExtensions( MavenProject project )
LifecycleMapping mapping = null;
try
{
- mapping = (LifecycleMapping) pluginLoader.loadPluginComponent( LifecycleMapping.ROLE, packaging, plugin,
- project );
+ mapping =
+ (LifecycleMapping) pluginLoader.loadPluginComponent( LifecycleMapping.ROLE, packaging,
+ plugin, project );
}
catch ( ComponentLookupException e )
{
logger.debug( LifecycleMapping.ROLE + " for packaging: " + packaging
- + " could not be retrieved from plugin: " + plugin.getKey() + ".\nReason: " + e.getMessage(), e );
+ + " could not be retrieved from plugin: " + plugin.getKey() + ".\nReason: "
+ + e.getMessage(), e );
}
catch ( PluginLoaderException e )
{
throw new LifecycleLoaderException( "Failed to load plugin: " + plugin.getKey() + ". Reason: "
- + e.getMessage(), e );
+ + e.getMessage(), e );
}
if ( mapping != null )
@@ -197,11 +193,10 @@ private LifecycleBindings searchPluginsWithExtensions( MavenProject project )
}
/**
- * Construct the LifecycleBindings for the default lifecycle mappings, including injection of
- * configuration from the project into each MojoBinding, where appropriate.
+ * Construct the LifecycleBindings for the default lifecycle mappings, including injection of configuration from the
+ * project into each MojoBinding, where appropriate.
*/
- public LifecycleBindings getDefaultBindings( MavenProject project )
- throws LifecycleSpecificationException
+ public LifecycleBindings getDefaultBindings( final MavenProject project ) throws LifecycleSpecificationException
{
LifecycleBindings bindings = legacyLifecycleMappingParser.parseDefaultMappings( legacyLifecycles );
@@ -210,16 +205,15 @@ public LifecycleBindings getDefaultBindings( MavenProject project )
return bindings;
}
- public void enableLogging( Logger logger )
+ public void enableLogging( final Logger logger )
{
this.logger = logger;
}
/**
- * Construct the LifecycleBindings that constitute the extra mojos bound to the lifecycle within
- * the POM itself.
+ * Construct the LifecycleBindings that constitute the extra mojos bound to the lifecycle within the POM itself.
*/
- public LifecycleBindings getProjectCustomBindings( MavenProject project )
+ public LifecycleBindings getProjectCustomBindings( final MavenProject project )
throws LifecycleLoaderException, LifecycleSpecificationException
{
String projectId = project.getId();
@@ -245,15 +239,16 @@ public LifecycleBindings getProjectCustomBindings( MavenProject project )
PluginExecution execution = (PluginExecution) execIt.next();
List goals = execution.getGoals();
- if ( goals != null && !goals.isEmpty() )
+ if ( ( goals != null ) && !goals.isEmpty() )
{
for ( Iterator goalIterator = goals.iterator(); goalIterator.hasNext(); )
{
String goal = (String) goalIterator.next();
-
+
if ( goal == null )
{
- logger.warn( "Execution: " + execution.getId() + " in plugin: " + plugin.getKey() + " in the POM has a null goal." );
+ logger.warn( "Execution: " + execution.getId() + " in plugin: " + plugin.getKey()
+ + " in the POM has a null goal." );
continue;
}
@@ -278,14 +273,15 @@ public LifecycleBindings getProjectCustomBindings( MavenProject project )
}
catch ( PluginLoaderException e )
{
- throw new LifecycleLoaderException( "Failed to load plugin: " + plugin + ". Reason: "
- + e.getMessage(), e );
+ throw new LifecycleLoaderException( "Failed to load plugin: " + plugin
+ + ". Reason: " + e.getMessage(), e );
}
}
-
+
if ( pluginDescriptor.getMojos() == null )
{
- logger.error( "Somehow, the PluginDescriptor for plugin: " + plugin.getKey() + " contains no mojos. This is highly irregular. Ignoring..." );
+ logger.error( "Somehow, the PluginDescriptor for plugin: " + plugin.getKey()
+ + " contains no mojos. This is highly irregular. Ignoring..." );
continue;
}
@@ -294,8 +290,9 @@ public LifecycleBindings getProjectCustomBindings( MavenProject project )
if ( phase == null )
{
- throw new LifecycleSpecificationException( "No phase specified for goal: " + goal
- + " in plugin: " + plugin.getKey() + " from POM: " + projectId );
+ throw new LifecycleSpecificationException( "No phase specified for goal: "
+ + goal + " in plugin: " + plugin.getKey() + " from POM: "
+ + projectId );
}
}
@@ -313,12 +310,11 @@ public LifecycleBindings getProjectCustomBindings( MavenProject project )
}
/**
- * Construct the LifecycleBindings that constitute the mojos mapped to the lifecycles by an overlay
- * specified in a plugin. Inject mojo configuration from the POM into all appropriate MojoBinding
- * instances.
+ * Construct the LifecycleBindings that constitute the mojos mapped to the lifecycles by an overlay specified in a
+ * plugin. Inject mojo configuration from the POM into all appropriate MojoBinding instances.
*/
- public LifecycleBindings getPluginLifecycleOverlay( PluginDescriptor pluginDescriptor, String lifecycleId,
- MavenProject project )
+ public LifecycleBindings getPluginLifecycleOverlay( final PluginDescriptor pluginDescriptor,
+ final String lifecycleId, final MavenProject project )
throws LifecycleLoaderException, LifecycleSpecificationException
{
Lifecycle lifecycleOverlay = null;
@@ -362,21 +358,21 @@ public LifecycleBindings getPluginLifecycleOverlay( PluginDescriptor pluginDescr
// An example of this is the corbertura plugin that needs to call the surefire
// plugin in forking mode.
//
- //
- // test
- //
- //
- //
- // org.apache.maven.plugins:maven-surefire-plugin:test
- //
- //
- // ${project.build.directory}/generated-classes/cobertura
- // true
- // once
- //
- //
- //
- //
+ //
+ // test
+ //
+ //
+ //
+ // org.apache.maven.plugins:maven-surefire-plugin:test
+ //
+ //
+ // ${project.build.directory}/generated-classes/cobertura
+ // true
+ // once
+ //
+ //
+ //
+ //
// ----------------------------------------------------------------------
//
@@ -399,7 +395,8 @@ public LifecycleBindings getPluginLifecycleOverlay( PluginDescriptor pluginDescr
Xpp3Dom configuration = (Xpp3Dom) exec.getConfiguration();
if ( phase.getConfiguration() != null )
{
- configuration = Xpp3Dom.mergeXpp3Dom( new Xpp3Dom( (Xpp3Dom) phase.getConfiguration() ), configuration );
+ configuration =
+ Xpp3Dom.mergeXpp3Dom( new Xpp3Dom( (Xpp3Dom) phase.getConfiguration() ), configuration );
}
binding.setConfiguration( configuration );
@@ -414,15 +411,16 @@ public LifecycleBindings getPluginLifecycleOverlay( PluginDescriptor pluginDescr
{
// Merge in general configuration for a phase.
// TODO: this is all kind of backwards from the POMM. Let's align it all under 2.1.
- // We should create a new lifecycle executor for modelVersion >5.0.0
+ // We should create a new lifecycle executor for modelVersion >5.0.0
// [jdcasey; 08-March-2007] Not sure what the above to-do references...how _should_
// this work??
for ( Iterator j = phaseBindings.iterator(); j.hasNext(); )
{
MojoBinding binding = (MojoBinding) j.next();
- Xpp3Dom configuration = Xpp3Dom.mergeXpp3Dom( new Xpp3Dom( (Xpp3Dom) phase.getConfiguration() ),
- (Xpp3Dom) binding.getConfiguration() );
+ Xpp3Dom configuration =
+ Xpp3Dom.mergeXpp3Dom( new Xpp3Dom( (Xpp3Dom) phase.getConfiguration() ),
+ (Xpp3Dom) binding.getConfiguration() );
binding.setConfiguration( configuration );
}
@@ -434,18 +432,17 @@ public LifecycleBindings getPluginLifecycleOverlay( PluginDescriptor pluginDescr
}
/**
- * Retrieve the list of MojoBinding instances that correspond to the reports configured for the
- * specified project. Inject all appropriate configuration from the POM for each MojoBinding, using
- * the following precedence rules:
+ * Retrieve the list of MojoBinding instances that correspond to the reports configured for the specified project.
+ * Inject all appropriate configuration from the POM for each MojoBinding, using the following precedence rules:
*
*
- * - report-set-level configuration
- * - reporting-level configuration
- * - execution-level configuration
- * - plugin-level configuration
+ * - report-set-level configuration
+ * - reporting-level configuration
+ * - execution-level configuration
+ * - plugin-level configuration
*
*/
- public List getReportBindings( MavenProject project )
+ public List getReportBindings( final MavenProject project )
throws LifecycleLoaderException, LifecycleSpecificationException
{
if ( project.getModel().getReports() != null )
@@ -464,7 +461,7 @@ public List getReportBindings( MavenProject project )
List reportSets = reportPlugin.getReportSets();
- if ( reportSets == null || reportSets.isEmpty() )
+ if ( ( reportSets == null ) || reportSets.isEmpty() )
{
reports.addAll( getReportsForPlugin( reportPlugin, null, project ) );
}
@@ -485,11 +482,11 @@ public List getReportBindings( MavenProject project )
/**
* Retrieve the ReportPlugin instances referenced in the specified POM.
*/
- private List getReportPluginsForProject( MavenProject project )
+ private List getReportPluginsForProject( final MavenProject project )
{
List reportPlugins = project.getReportPlugins();
- if ( project.getReporting() == null || !project.getReporting().isExcludeDefaults() )
+ if ( ( project.getReporting() == null ) || !project.getReporting().isExcludeDefaults() )
{
if ( reportPlugins == null )
{
@@ -518,7 +515,8 @@ private List getReportPluginsForProject( MavenProject project )
for ( Iterator j = reportPlugins.iterator(); j.hasNext() && !found; )
{
ReportPlugin reportPlugin = (ReportPlugin) j.next();
- if ( reportPlugin.getGroupId().equals( groupId ) && reportPlugin.getArtifactId().equals( artifactId ) )
+ if ( reportPlugin.getGroupId().equals( groupId )
+ && reportPlugin.getArtifactId().equals( artifactId ) )
{
found = true;
}
@@ -541,8 +539,8 @@ private List getReportPluginsForProject( MavenProject project )
/**
* Retrieve any reports from the specified ReportPlugin which are referenced in the specified POM.
*/
- private List getReportsForPlugin( ReportPlugin reportPlugin, ReportSet reportSet, MavenProject project )
- throws LifecycleLoaderException
+ private List getReportsForPlugin( final ReportPlugin reportPlugin, final ReportSet reportSet,
+ final MavenProject project ) throws LifecycleLoaderException
{
PluginDescriptor pluginDescriptor;
try
@@ -552,7 +550,7 @@ private List getReportsForPlugin( ReportPlugin reportPlugin, ReportSet reportSet
catch ( PluginLoaderException e )
{
throw new LifecycleLoaderException( "Failed to load report plugin: " + reportPlugin.getKey() + ". Reason: "
- + e.getMessage(), e );
+ + e.getMessage(), e );
}
String pluginKey = BindingUtils.createPluginKey( reportPlugin.getGroupId(), reportPlugin.getArtifactId() );
@@ -565,7 +563,7 @@ private List getReportsForPlugin( ReportPlugin reportPlugin, ReportSet reportSet
// TODO: check ID is correct for reports
// if the POM configured no reports, give all from plugin
- if ( reportSet == null || reportSet.getReports().contains( mojoDescriptor.getGoal() ) )
+ if ( ( reportSet == null ) || reportSet.getReports().contains( mojoDescriptor.getGoal() ) )
{
String id = null;
if ( reportSet != null )
@@ -589,7 +587,7 @@ private List getReportsForPlugin( ReportPlugin reportPlugin, ReportSet reportSet
plugin.setGroupId( pluginDescriptor.getGroupId() );
plugin.setArtifactId( pluginDescriptor.getArtifactId() );
}
-
+
BindingUtils.injectPluginManagementInfo( plugin, project );
Map execMap = plugin.getExecutionsAsMap();
@@ -611,126 +609,4 @@ private List getReportsForPlugin( ReportPlugin reportPlugin, ReportSet reportSet
return reports;
}
- /**
- * Determine whether the first list contains all of the same MojoBinding instances, in the same
- * order, starting at index zero, as the second list. If so, it is either a perfect super-list
- * or an equal list, and return true. Return false otherwise.
- */
- private static boolean isSameOrSuperListOfMojoBindings( List superCandidate, List check )
- {
- if ( superCandidate == null || check == null )
- {
- return false;
- }
-
- if ( superCandidate.size() < check.size() )
- {
- return false;
- }
-
- List superKeys = new ArrayList( superCandidate.size() );
- for ( Iterator it = superCandidate.iterator(); it.hasNext(); )
- {
- MojoBinding binding = (MojoBinding) it.next();
-
- superKeys.add( LifecycleUtils.createMojoBindingKey( binding, true ) );
- }
-
- List checkKeys = new ArrayList( check.size() );
- for ( Iterator it = check.iterator(); it.hasNext(); )
- {
- MojoBinding binding = (MojoBinding) it.next();
-
- checkKeys.add( LifecycleUtils.createMojoBindingKey( binding, true ) );
- }
-
- return superKeys.subList( 0, checkKeys.size() ).equals( checkKeys );
- }
-
- /**
- * Traverse the specified LifecycleBindings instance for all of the specified tasks. If the task
- * is found to be a phase name, construct the list of all MojoBindings that lead up to that phase
- * in that lifecycle, and add them to the master MojoBinding list. If the task is not a phase name,
- * treat it as a direct mojo invocation, parse it into a MojoBinding (resolving the plugin prefix
- * first if necessary), and add it to the master MojoBinding list. Finally, return the master list.
- */
- public List assembleMojoBindingList( List tasks, LifecycleBindings bindings, MavenProject project )
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- return assembleMojoBindingList( tasks, bindings, Collections.EMPTY_MAP, project );
- }
-
- /**
- * Traverse the specified LifecycleBindings instance for all of the specified tasks. If the task
- * is found to be a phase name, construct the list of all MojoBindings that lead up to that phase
- * in that lifecycle, and add them to the master MojoBinding list. If the task is not a phase name,
- * treat it as a direct mojo invocation, parse it into a MojoBinding (resolving the plugin prefix
- * first if necessary), and add it to the master MojoBinding list.
- *
- * Then, iterate through all MojoBindings in the master list, and for each one that maps to an
- * entry in directInvocationModifiers, substitute the resultant MojoBinding list from that
- * modifier in place of the original MojoBinding.
- *
- * Finally, return the modified master list.
- */
- public List assembleMojoBindingList( List tasks, LifecycleBindings lifecycleBindings, Map directInvocationModifiers,
- MavenProject project )
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- List planBindings = new ArrayList();
-
- List lastMojoBindings = null;
- for ( Iterator it = tasks.iterator(); it.hasNext(); )
- {
- String task = (String) it.next();
-
- LifecycleBinding binding = LifecycleUtils.findLifecycleBindingForPhase( task, lifecycleBindings );
- if ( binding != null )
- {
- List mojoBindings = LifecycleUtils.getMojoBindingListForLifecycle( task, binding );
-
- // save these so we can reference the originals...
- List originalMojoBindings = mojoBindings;
-
- // if these mojo bindings are a superset of the last bindings, only add the difference.
- if ( isSameOrSuperListOfMojoBindings( mojoBindings, lastMojoBindings ) )
- {
- List revised = new ArrayList( mojoBindings );
- revised.removeAll( lastMojoBindings );
-
- if ( revised.isEmpty() )
- {
- continue;
- }
-
- mojoBindings = revised;
- }
-
- planBindings.addAll( mojoBindings );
- lastMojoBindings = originalMojoBindings;
- }
- else
- {
- MojoBinding mojoBinding = mojoBindingFactory.parseMojoBinding( task, project, true );
- BindingUtils.injectProjectConfiguration( mojoBinding, project );
-
- mojoBinding.setOrigin( "direct invocation" );
-
- String key = LifecycleUtils.createMojoBindingKey( mojoBinding, true );
- DirectInvocationModifier modifier = (DirectInvocationModifier) directInvocationModifiers.get( key );
-
- if ( modifier != null )
- {
- planBindings.addAll( modifier.getModifiedBindings( project, this ) );
- }
- else
- {
- planBindings.add( mojoBinding );
- }
- }
- }
-
- return planBindings;
- }
-
}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/binding/LifecycleBindingManager.java b/maven-core/src/main/java/org/apache/maven/lifecycle/binding/LifecycleBindingManager.java
index 642b82bc20..df881c2923 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/binding/LifecycleBindingManager.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/binding/LifecycleBindingManager.java
@@ -3,21 +3,18 @@
import org.apache.maven.lifecycle.LifecycleLoaderException;
import org.apache.maven.lifecycle.LifecycleSpecificationException;
import org.apache.maven.lifecycle.model.LifecycleBindings;
-import org.apache.maven.lifecycle.plan.LifecyclePlannerException;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.project.MavenProject;
import java.util.List;
-import java.util.Map;
/**
- * Responsible for the gross construction of LifecycleBindings, or mappings of MojoBinding instances
- * to different parts of the three lifecycles: clean, build, and site. Also, handles transcribing
- * these LifecycleBindings instances into lists of MojoBinding's, which can be consumed by the
- * LifecycleExecutor.
+ * Responsible for the gross construction of LifecycleBindings, or mappings of MojoBinding instances to different parts
+ * of the three lifecycles: clean, build, and site. Also, handles transcribing these LifecycleBindings instances into
+ * lists of MojoBinding's, which can be consumed by the LifecycleExecutor.
*
* @author jdcasey
- *
+ *
*/
public interface LifecycleBindingManager
{
@@ -25,74 +22,43 @@ public interface LifecycleBindingManager
String ROLE = LifecycleBindingManager.class.getName();
/**
- * Construct the LifecycleBindings for the default lifecycle mappings, including injection of
- * configuration from the project into each MojoBinding, where appropriate.
+ * Construct the LifecycleBindings for the default lifecycle mappings, including injection of configuration from the
+ * project into each MojoBinding, where appropriate.
*/
- LifecycleBindings getDefaultBindings( MavenProject project )
- throws LifecycleSpecificationException;
+ LifecycleBindings getDefaultBindings( MavenProject project ) throws LifecycleSpecificationException;
/**
- * Retrieve the LifecycleBindings given by the lifecycle mapping component/file for the project's
- * packaging. Any applicable mojo configuration will be injected into the LifecycleBindings from
- * the POM.
+ * Retrieve the LifecycleBindings given by the lifecycle mapping component/file for the project's packaging. Any
+ * applicable mojo configuration will be injected into the LifecycleBindings from the POM.
*/
LifecycleBindings getBindingsForPackaging( MavenProject project )
throws LifecycleLoaderException, LifecycleSpecificationException;
/**
- * Construct the LifecycleBindings that constitute the extra mojos bound to the lifecycle within
- * the POM itself.
+ * Construct the LifecycleBindings that constitute the extra mojos bound to the lifecycle within the POM itself.
*/
LifecycleBindings getProjectCustomBindings( MavenProject project )
throws LifecycleLoaderException, LifecycleSpecificationException;
/**
- * Construct the LifecycleBindings that constitute the mojos mapped to the lifecycles by an overlay
- * specified in a plugin. Inject mojo configuration from the POM into all appropriate MojoBinding
- * instances.
+ * Construct the LifecycleBindings that constitute the mojos mapped to the lifecycles by an overlay specified in a
+ * plugin. Inject mojo configuration from the POM into all appropriate MojoBinding instances.
*/
- LifecycleBindings getPluginLifecycleOverlay( PluginDescriptor pluginDescriptor, String lifecycleId, MavenProject project )
+ LifecycleBindings getPluginLifecycleOverlay( PluginDescriptor pluginDescriptor, String lifecycleId,
+ MavenProject project )
throws LifecycleLoaderException, LifecycleSpecificationException;
/**
- * Retrieve the list of MojoBinding instances that correspond to the reports configured for the
- * specified project. Inject all appropriate configuration from the POM for each MojoBinding, using
- * the following precedence rules:
+ * Retrieve the list of MojoBinding instances that correspond to the reports configured for the specified project.
+ * Inject all appropriate configuration from the POM for each MojoBinding, using the following precedence rules:
*
*
- * - report-set-level configuration
- * - reporting-level configuration
- * - execution-level configuration
- * - plugin-level configuration
+ * - report-set-level configuration
+ * - reporting-level configuration
+ * - execution-level configuration
+ * - plugin-level configuration
*
*/
- List getReportBindings( MavenProject project )
- throws LifecycleLoaderException, LifecycleSpecificationException;
-
- /**
- * Traverse the specified LifecycleBindings instance for all of the specified tasks. If the task
- * is found to be a phase name, construct the list of all MojoBindings that lead up to that phase
- * in that lifecycle, and add them to the master MojoBinding list. If the task is not a phase name,
- * treat it as a direct mojo invocation, parse it into a MojoBinding (resolving the plugin prefix
- * first if necessary), and add it to the master MojoBinding list.
- *
- * Then, iterate through all MojoBindings in the master list, and for each one that maps to an
- * entry in directInvocationModifiers, substitute the resultant MojoBinding list from that
- * modifier in place of the original MojoBinding.
- *
- * Finally, return the modified master list.
- */
- List assembleMojoBindingList( List tasks, LifecycleBindings bindings, Map directInvocationModifiers, MavenProject project )
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException;
-
- /**
- * Traverse the specified LifecycleBindings instance for all of the specified tasks. If the task
- * is found to be a phase name, construct the list of all MojoBindings that lead up to that phase
- * in that lifecycle, and add them to the master MojoBinding list. If the task is not a phase name,
- * treat it as a direct mojo invocation, parse it into a MojoBinding (resolving the plugin prefix
- * first if necessary), and add it to the master MojoBinding list. Finally, return the master list.
- */
- List assembleMojoBindingList( List tasks, LifecycleBindings lifecycleBindings, MavenProject project )
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException;
+ List getReportBindings( MavenProject project ) throws LifecycleLoaderException, LifecycleSpecificationException;
}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java
new file mode 100644
index 0000000000..1e637bcf67
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java
@@ -0,0 +1,282 @@
+package org.apache.maven.lifecycle.plan;
+
+import org.apache.maven.lifecycle.LifecycleLoaderException;
+import org.apache.maven.lifecycle.LifecycleSpecificationException;
+import org.apache.maven.lifecycle.LifecycleUtils;
+import org.apache.maven.lifecycle.MojoBindingUtils;
+import org.apache.maven.lifecycle.NoSuchPhaseException;
+import org.apache.maven.lifecycle.model.LifecycleBinding;
+import org.apache.maven.lifecycle.model.LifecycleBindings;
+import org.apache.maven.lifecycle.model.MojoBinding;
+import org.apache.maven.lifecycle.statemgmt.StateManagementUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Stack;
+
+public class BuildPlan
+{
+ private LifecycleBindings bindings;
+
+ private final List tasks;
+
+ private final Map forks;
+
+ private final List lateBoundMojos;
+
+ private List renderedLifecycleMojos = new ArrayList();
+
+ private final Map directInvocationBindings;
+
+ public BuildPlan( final LifecycleBindings packaging, final LifecycleBindings projectBindings,
+ final LifecycleBindings defaults, final List tasks )
+ throws LifecycleSpecificationException, LifecycleLoaderException
+ {
+ this( LifecycleUtils.mergeBindings( packaging, projectBindings, defaults, true, false ), tasks );
+ }
+
+ public BuildPlan( final LifecycleBindings bindings, final List tasks )
+ throws LifecycleSpecificationException, LifecycleLoaderException
+ {
+ this.bindings = bindings;
+ this.tasks = tasks;
+ forks = new HashMap();
+ lateBoundMojos = new ArrayList();
+ directInvocationBindings = new HashMap();
+ }
+
+ private BuildPlan( final LifecycleBindings bindings, final Map forks, final List lateBoundMojos,
+ final Map directInvocationBindings, final List tasks )
+ {
+ this.bindings = LifecycleUtils.cloneBindings( bindings );
+ this.forks = new HashMap( forks );
+ this.lateBoundMojos = new ArrayList( lateBoundMojos );
+ this.tasks = tasks;
+ this.directInvocationBindings = new HashMap( directInvocationBindings );
+ }
+
+ public void addLifecycleOverlay( final LifecycleBindings overlay )
+ {
+ bindings = LifecycleUtils.mergeBindings( overlay, bindings, null, true, true );
+ }
+
+ public void addTask( final String task, final MojoBinding binding )
+ throws LifecycleSpecificationException, LifecycleLoaderException
+ {
+ tasks.add( task );
+
+ if ( !LifecycleUtils.isValidPhaseName( task ) )
+ {
+ addDirectInvocationBinding( task, binding );
+ }
+ }
+
+ public LifecycleBindings getLifecycleBindings()
+ {
+ return bindings;
+ }
+
+ public List getTasks()
+ {
+ return tasks;
+ }
+
+ public void addDirectInvocationBinding( final String key, final MojoBinding binding )
+ {
+ directInvocationBindings.put( MojoBindingUtils.createMojoBindingKey( binding, false ), binding );
+ directInvocationBindings.put( key, binding );
+ }
+
+ public List getLateBoundMojos()
+ {
+ return lateBoundMojos;
+ }
+
+ public Map getDirectInvocationBindings()
+ {
+ return directInvocationBindings;
+ }
+
+ public Map getForks()
+ {
+ return forks;
+ }
+
+ public void addForkedExecution( final MojoBinding mojoBinding, final BuildPlan plan )
+ {
+ String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, false );
+
+ forks.put( key, plan );
+ }
+
+ public void addForkedExecution( final MojoBinding mojoBinding, final List forkedInvocations )
+ {
+ String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, false );
+
+ forks.put( key, forkedInvocations );
+ }
+
+ public void addLateBoundMojo( final MojoBinding mojoBinding )
+ {
+ lateBoundMojos.add( MojoBindingUtils.createMojoBindingKey( mojoBinding, false ) );
+ }
+
+ public BuildPlan copy( final List newTasks )
+ {
+ return new BuildPlan( bindings, forks, lateBoundMojos, directInvocationBindings, newTasks );
+ }
+
+ public void resetExecutionProgress()
+ {
+ renderedLifecycleMojos = new ArrayList();
+ }
+
+ public List renderExecutionPlan( final Stack executionStack )
+ throws NoSuchPhaseException
+ {
+ List plan = new ArrayList();
+
+ for ( Iterator it = tasks.iterator(); it.hasNext(); )
+ {
+ String task = (String) it.next();
+
+ if ( LifecycleUtils.isValidPhaseName( task ) )
+ {
+ // find the lifecyle that this task belongs in...
+ LifecycleBinding binding = LifecycleUtils.findLifecycleBindingForPhase( task, bindings );
+
+ // get the list of mojo bindings before or at the specified phase in the lifecycle
+ List bindingsToAdd = LifecycleUtils.getMojoBindingListForLifecycle( task, binding );
+
+ // backup copy for rendered tracking...
+ List newRendered = new ArrayList( bindingsToAdd );
+
+ // if we've already executed part of the lifecycle, just continue with the new bindings.
+ if ( ( renderedLifecycleMojos != null ) && ( renderedLifecycleMojos.size() < bindingsToAdd.size() ) )
+ {
+ bindingsToAdd = bindingsToAdd.subList( renderedLifecycleMojos.size(), bindingsToAdd.size() );
+ }
+
+ // save the current binding list for tracking progress through the lifecycle.
+ renderedLifecycleMojos = newRendered;
+
+ for ( Iterator itMojos = bindingsToAdd.iterator(); itMojos.hasNext(); )
+ {
+ MojoBinding mojoBinding = (MojoBinding) itMojos.next();
+ String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, false );
+ if ( !executionStack.contains( key ) )
+ {
+ addResolverIfLateBound( mojoBinding, plan );
+ plan.addAll( findForkedBindings( mojoBinding, executionStack ) );
+ }
+ }
+ }
+ else
+ {
+ MojoBinding mojoBinding = (MojoBinding) directInvocationBindings.get( task );
+ String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, false );
+ if ( !executionStack.contains( key ) )
+ {
+ addResolverIfLateBound( mojoBinding, plan );
+ plan.addAll( findForkedBindings( mojoBinding, executionStack ) );
+ }
+ }
+ }
+
+ return plan;
+ }
+
+ private void addResolverIfLateBound( final MojoBinding mojoBinding, final List plan )
+ {
+ String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, false );
+ if ( lateBoundMojos.contains( key ) )
+ {
+ MojoBinding resolveBinding = StateManagementUtils.createResolveLateBoundMojoBinding( mojoBinding );
+ plan.add( resolveBinding );
+ }
+ }
+
+ private List findForkedBindings( final MojoBinding mojoBinding, final Stack executionStack )
+ throws NoSuchPhaseException
+ {
+ List bindings = new ArrayList();
+
+ String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, false );
+
+ // let's see if we have any forks...
+ Object fork = forks.get( key );
+
+ executionStack.push( key );
+ try
+ {
+ if ( fork != null )
+ {
+ List forkedBindings = new ArrayList();
+
+ // if the fork is a build plan, recurse into it and retrieve the execution plan.
+ if ( fork instanceof BuildPlan )
+ {
+ forkedBindings = ( (BuildPlan) fork ).renderExecutionPlan( executionStack );
+ }
+ // leave room for new kinds of forks, and do some extra validation...
+ // if this is a list, it's a list of direct mojo invocations...we have to see if they have their own
+ // forks.
+ else if ( fork instanceof List )
+ {
+ List directInvocations = (List) fork;
+ for ( Iterator it = directInvocations.iterator(); it.hasNext(); )
+ {
+ MojoBinding invocation = (MojoBinding) it.next();
+
+ String invocationKey = MojoBindingUtils.createMojoBindingKey( invocation, false );
+
+ if ( executionStack.contains( invocationKey ) )
+ {
+ continue;
+ }
+
+ executionStack.push( MojoBindingUtils.createMojoBindingKey( mojoBinding, false ) );
+
+ try
+ {
+ addResolverIfLateBound( invocation, forkedBindings );
+ forkedBindings.addAll( findForkedBindings( invocation, executionStack ) );
+ }
+ finally
+ {
+ executionStack.pop();
+ }
+ }
+ }
+
+ if ( !forkedBindings.isEmpty() )
+ {
+ bindings.add( StateManagementUtils.createStartForkedExecutionMojoBinding() );
+ bindings.addAll( forkedBindings );
+ bindings.add( StateManagementUtils.createClearForkedExecutionMojoBinding() );
+ }
+
+ bindings.add( mojoBinding );
+
+ if ( !forkedBindings.isEmpty() )
+ {
+ bindings.add( StateManagementUtils.createEndForkedExecutionMojoBinding() );
+ }
+ }
+ else
+ {
+ bindings.add( mojoBinding );
+ }
+ }
+ finally
+ {
+ executionStack.pop();
+ }
+
+ return bindings;
+ }
+
+}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanIfc.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanIfc.java
deleted file mode 100644
index 501eddf97a..0000000000
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanIfc.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-import org.apache.maven.lifecycle.LifecycleLoaderException;
-import org.apache.maven.lifecycle.LifecycleSpecificationException;
-import org.apache.maven.lifecycle.binding.LifecycleBindingManager;
-import org.apache.maven.project.MavenProject;
-
-import java.util.List;
-
-public interface BuildPlanIfc
- extends ModifiablePlanElement
-{
-
- List getPlanMojoBindings(MavenProject project, LifecycleBindingManager bindingManager)
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException;
-
- List getTasks();
-
-}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanModifier.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanModifier.java
deleted file mode 100644
index 7a08bdfe48..0000000000
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanModifier.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-import org.apache.maven.lifecycle.model.LifecycleBindings;
-
-/**
- * Modifies an existing set of lifecycle mojo bindings, in order to inject extra behavior, such as
- * forked executions, reporting, etc.
- */
-public interface BuildPlanModifier extends ModifiablePlanElement
-{
-
- /**
- * Inject any modifications into the given LifecycleBindings provided by the build plan. In some
- * cases, it may be necessary to regenerate the LifecycleBindings instance, so the altered instance
- * is returned separately.
- */
- LifecycleBindings modifyBindings( LifecycleBindings bindings )
- throws LifecyclePlannerException;
-
-}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanUtils.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanUtils.java
index 95a9d38ae6..cc270486a4 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanUtils.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanUtils.java
@@ -1,21 +1,17 @@
package org.apache.maven.lifecycle.plan;
-import org.apache.maven.lifecycle.LifecycleLoaderException;
import org.apache.maven.lifecycle.LifecycleSpecificationException;
-import org.apache.maven.lifecycle.LifecycleUtils;
import org.apache.maven.lifecycle.MojoBindingUtils;
-import org.apache.maven.lifecycle.binding.LifecycleBindingManager;
-import org.apache.maven.lifecycle.model.LifecycleBindings;
import org.apache.maven.lifecycle.model.MojoBinding;
import org.apache.maven.lifecycle.statemgmt.StateManagementUtils;
-import org.apache.maven.project.MavenProject;
import java.util.Iterator;
import java.util.List;
+import java.util.Stack;
/**
- * Collection of static utility methods used to work with LifecycleBindings and other collections
- * of MojoBinding instances that make up a build plan.
+ * Collection of static utility methods used to work with LifecycleBindings and other collections of MojoBinding
+ * instances that make up a build plan.
*/
public final class BuildPlanUtils
{
@@ -25,55 +21,23 @@ private BuildPlanUtils()
}
/**
- * Inject a set of {@link BuildPlanModifier} instances into an existing LifecycleBindings instance.
- * This is a generalization of a piece of code present in almost all scenarios where a build
- * plan contains modifiers and is asked to produce an effective list of MojoBinding instances
- * that make up the build process. Simply iterate through the modifiers, and apply each one,
- * replacing the previous LifecycleBindings instance with the result of the current modifier.
+ * Render an entire build plan to a String. If extendedInfo == true, include each MojoBinding's configuration in the
+ * output.
*/
- public static LifecycleBindings modifyPlanBindings( LifecycleBindings bindings, List planModifiers )
- throws LifecyclePlannerException
+ public static String listBuildPlan( final BuildPlan plan, final boolean extendedInfo )
+ throws LifecycleSpecificationException, LifecyclePlannerException
{
- LifecycleBindings result;
+ List mojos = plan.renderExecutionPlan( new Stack() );
+ plan.resetExecutionProgress();
- // if the bindings are completely empty, passing in null avoids an extra instance creation
- // for the purposes of cloning...
- if ( bindings != null )
- {
- result = LifecycleUtils.cloneBindings( bindings );
- }
- else
- {
- result = new LifecycleBindings();
- }
-
- for ( Iterator it = planModifiers.iterator(); it.hasNext(); )
- {
- BuildPlanModifier modifier = (BuildPlanModifier) it.next();
-
- result = modifier.modifyBindings( result );
- }
-
- return result;
+ return listBuildPlan( mojos, extendedInfo );
}
/**
- * Render an entire build plan to a String.
- * If extendedInfo == true, include each MojoBinding's configuration in the output.
+ * Render a list containing the MojoBinding instances for an entire build plan to a String. If extendedInfo == true,
+ * include each MojoBinding's configuration in the output.
*/
- public static String listBuildPlan( BuildPlan plan, MavenProject project, LifecycleBindingManager lifecycleBindingManager, boolean extendedInfo )
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- List mojoBindings = plan.getPlanMojoBindings( project, lifecycleBindingManager );
-
- return listBuildPlan( mojoBindings, extendedInfo );
- }
-
- /**
- * Render a list containing the MojoBinding instances for an entire build plan to a String.
- * If extendedInfo == true, include each MojoBinding's configuration in the output.
- */
- public static String listBuildPlan( List mojoBindings, boolean extendedInfo )
+ public static String listBuildPlan( final List mojoBindings, final boolean extendedInfo )
throws LifecycleSpecificationException, LifecyclePlannerException
{
StringBuffer listing = new StringBuffer();
@@ -119,7 +83,7 @@ else if ( StateManagementUtils.isForkedExecutionEndMarker( binding ) )
{
listing.append( ' ' ).append( formatMojoListing( binding, indentLevel, extendedInfo ) );
}
-
+
indentLevel++;
}
else
@@ -135,10 +99,10 @@ else if ( StateManagementUtils.isForkedExecutionEndMarker( binding ) )
}
/**
- * Append a newline character, add the next line's number, and indent the new line to the
- * appropriate level (which tracks separate forked executions).
+ * Append a newline character, add the next line's number, and indent the new line to the appropriate level (which
+ * tracks separate forked executions).
*/
- private static void newListingLine( StringBuffer listing, int indentLevel, int counter )
+ private static void newListingLine( final StringBuffer listing, final int indentLevel, final int counter )
{
listing.append( '\n' );
@@ -155,10 +119,10 @@ private static void newListingLine( StringBuffer listing, int indentLevel, int c
}
/**
- * Format a single MojoBinding for inclusion in a build plan listing. If extendedInfo == true,
- * include the MojoBinding's configuration in the output.
+ * Format a single MojoBinding for inclusion in a build plan listing. If extendedInfo == true, include the
+ * MojoBinding's configuration in the output.
*/
- public static String formatMojoListing( MojoBinding binding, int indentLevel, boolean extendedInfo )
+ public static String formatMojoListing( final MojoBinding binding, final int indentLevel, final boolean extendedInfo )
{
StringBuffer listing = new StringBuffer();
@@ -169,7 +133,8 @@ public static String formatMojoListing( MojoBinding binding, int indentLevel, bo
{
listing.append( "\nOrigin: " ).append( binding.getOrigin() );
listing.append( "\nConfiguration:\n\t" ).append(
- String.valueOf( binding.getConfiguration() ).replaceAll( "\\n",
+ String.valueOf( binding.getConfiguration() ).replaceAll(
+ "\\n",
"\n\t" ) ).append(
'\n' );
}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java
index 7ed86dd20f..64c0ce7c6f 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlanner.java
@@ -7,14 +7,13 @@
import java.util.List;
/**
- * Responsible for creating a plan of execution for a given project and list of tasks. This build plan
- * consists of MojoBinding instances that carry all the information necessary to execute a mojo,
- * including configuration from the POM and other sources. NOTE: the build plan may be constructed
- * of a main lifecycle binding-set, plus any number of lifecycle modifiers and direct-invocation
- * modifiers, to handle cases of forked execution.
+ * Responsible for creating a plan of execution for a given project and list of tasks. This build plan consists of
+ * MojoBinding instances that carry all the information necessary to execute a mojo, including configuration from the
+ * POM and other sources. NOTE: the build plan may be constructed of a main lifecycle binding-set, plus any number of
+ * lifecycle modifiers and direct-invocation modifiers, to handle cases of forked execution.
*
* @author jdcasey
- *
+ *
*/
public interface BuildPlanner
{
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java
index 525ca6a55d..4f72cc1076 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java
@@ -8,7 +8,6 @@
import org.apache.maven.lifecycle.binding.MojoBindingFactory;
import org.apache.maven.lifecycle.model.LifecycleBindings;
import org.apache.maven.lifecycle.model.MojoBinding;
-import org.apache.maven.lifecycle.model.Phase;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.plugin.loader.PluginLoader;
@@ -17,21 +16,20 @@
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+import java.util.Stack;
/**
- * Responsible for creating a plan of execution for a given project and list of tasks. This build plan
- * consists of MojoBinding instances that carry all the information necessary to execute a mojo,
- * including configuration from the POM and other sources. NOTE: the build plan may be constructed
- * of a main lifecycle binding-set, plus any number of lifecycle modifiers and direct-invocation
- * modifiers, to handle cases of forked execution.
+ * Responsible for creating a plan of execution for a given project and list of tasks. This build plan consists of
+ * MojoBinding instances that carry all the information necessary to execute a mojo, including configuration from the
+ * POM and other sources. NOTE: the build plan may be constructed of a main lifecycle binding-set, plus any number of
+ * lifecycle modifiers and direct-invocation modifiers, to handle cases of forked execution.
*
* @author jdcasey
- *
+ *
*/
public class DefaultBuildPlanner
implements BuildPlanner, LogEnabled
@@ -48,159 +46,177 @@ public class DefaultBuildPlanner
/**
* Orchestrates construction of the build plan which will be used by the user of LifecycleExecutor.
*/
- public BuildPlan constructBuildPlan( List tasks, MavenProject project )
+ public BuildPlan constructBuildPlan( final List tasks, final MavenProject project )
throws LifecycleLoaderException, LifecycleSpecificationException, LifecyclePlannerException
{
LifecycleBindings defaultBindings = lifecycleBindingManager.getDefaultBindings( project );
LifecycleBindings packagingBindings = lifecycleBindingManager.getBindingsForPackaging( project );
LifecycleBindings projectBindings = lifecycleBindingManager.getProjectCustomBindings( project );
- LifecycleBindings merged = LifecycleUtils.mergeBindings( packagingBindings, projectBindings, defaultBindings, true, false );
+ BuildPlan plan = new BuildPlan( packagingBindings, projectBindings, defaultBindings, tasks );
- // foreach task, find the binding list from the merged lifecycle-bindings.
- // if the binding list is a super-set of a previous task, forget the previous task/binding
- // list, and use the new one.
- // if the binding list is null, treat it like a one-off mojo invocation, and parse/validate
- // that it can be called as such.
- // as binding lists accumulate, push them onto an aggregated "plan" listing...
- BuildPlan plan = new LifecycleBuildPlan( tasks, merged );
+ initializeDirectInvocations( plan, project );
// Inject forked lifecycles as plan modifiers for each mojo that has @execute in it.
- addForkedLifecycleModifiers( plan, merged, project, tasks );
- addReportingLifecycleModifiers( plan, merged, project, tasks );
+ addForkedLifecycleModifiers( plan, project );
+ addReportingLifecycleModifiers( plan, project );
// TODO: Inject relative-ordered project/plugin executions as plan modifiers.
return plan;
}
- public void enableLogging( Logger logger )
+ private void initializeDirectInvocations( final BuildPlan plan, final MavenProject project )
+ throws LifecycleSpecificationException, LifecycleLoaderException
+ {
+ List tasks = plan.getTasks();
+ for ( Iterator it = tasks.iterator(); it.hasNext(); )
+ {
+ String task = (String) it.next();
+
+ if ( !LifecycleUtils.isValidPhaseName( task ) )
+ {
+ MojoBinding binding = mojoBindingFactory.parseMojoBinding( task, project, true );
+ plan.addDirectInvocationBinding( task, binding );
+ }
+ }
+ }
+
+ public void enableLogging( final Logger logger )
{
this.logger = logger;
}
/**
- * Traverses all MojoBinding instances discovered from the POM and its packaging-mappings, and
- * orchestrates the process of injecting any modifiers that are necessary to accommodate forked
- * execution.
+ * Traverses all MojoBinding instances discovered from the POM and its packaging-mappings, and orchestrates the
+ * process of injecting any modifiers that are necessary to accommodate forked execution.
*/
- private void addForkedLifecycleModifiers( ModifiablePlanElement planElement, LifecycleBindings lifecycleBindings,
- MavenProject project, List tasks )
+ private void addForkedLifecycleModifiers( final BuildPlan plan, final MavenProject project )
throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException
{
- List planBindings = lifecycleBindingManager.assembleMojoBindingList( tasks, lifecycleBindings, project );
+ List planBindings = plan.renderExecutionPlan( new Stack() );
+ plan.resetExecutionProgress();
for ( Iterator it = planBindings.iterator(); it.hasNext(); )
{
MojoBinding mojoBinding = (MojoBinding) it.next();
- findForkModifiers( mojoBinding, planElement, lifecycleBindings, project );
+ findForkModifiers( mojoBinding, plan, project );
}
}
- private void findForkModifiers( MojoBinding mojoBinding, ModifiablePlanElement planElement,
- LifecycleBindings lifecycleBindings, MavenProject project )
+ private void findForkModifiers( final MojoBinding mojoBinding, final BuildPlan plan, final MavenProject project )
throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException
{
- PluginDescriptor pluginDescriptor;
+ PluginDescriptor pluginDescriptor = null;
try
{
pluginDescriptor = pluginLoader.loadPlugin( mojoBinding, project );
}
catch ( PluginLoaderException e )
{
- throw new LifecyclePlannerException( e.getMessage(), e );
+ String message =
+ "Failed to load plugin: " + MojoBindingUtils.createPluginKey( mojoBinding )
+ + ". Adding to late-bound plugins list.\nReason: " + e.getMessage();
+
+ if ( logger.isDebugEnabled() )
+ {
+ logger.debug( message, e );
+ }
+ else
+ {
+ logger.warn( message );
+ }
+
+ plan.addLateBoundMojo( mojoBinding );
+ }
+
+ if ( pluginDescriptor == null )
+ {
+ return;
}
MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( mojoBinding.getGoal() );
if ( mojoDescriptor == null )
{
throw new LifecyclePlannerException( "Mojo: " + mojoBinding.getGoal() + " does not exist in plugin: "
- + pluginDescriptor.getId() + "." );
+ + pluginDescriptor.getId() + "." );
}
- findForkModifiers( mojoBinding, pluginDescriptor, planElement, lifecycleBindings, project, new LinkedList() );
+ findForkModifiers( mojoBinding, pluginDescriptor, plan, project );
}
/**
- * Traverses all MojoBinding instances discovered from the POM and its packaging-mappings, and
- * orchestrates the process of injecting any modifiers that are necessary to accommodate mojos
- * that require access to the project's configured reports.
+ * Traverses all MojoBinding instances discovered from the POM and its packaging-mappings, and orchestrates the
+ * process of injecting any modifiers that are necessary to accommodate mojos that require access to the project's
+ * configured reports.
*/
- private void addReportingLifecycleModifiers( ModifiablePlanElement planElement, LifecycleBindings lifecycleBindings,
- MavenProject project, List tasks )
+ private void addReportingLifecycleModifiers( final BuildPlan plan, final MavenProject project )
throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException
{
- List planBindings = lifecycleBindingManager.assembleMojoBindingList( tasks, lifecycleBindings, project );
+ List planBindings = plan.renderExecutionPlan( new Stack() );
+ plan.resetExecutionProgress();
for ( Iterator it = planBindings.iterator(); it.hasNext(); )
{
MojoBinding mojoBinding = (MojoBinding) it.next();
- PluginDescriptor pluginDescriptor;
+ PluginDescriptor pluginDescriptor = null;
try
{
pluginDescriptor = pluginLoader.loadPlugin( mojoBinding, project );
}
catch ( PluginLoaderException e )
{
- throw new LifecyclePlannerException( e.getMessage(), e );
+ String message =
+ "Failed to load plugin: " + MojoBindingUtils.createPluginKey( mojoBinding )
+ + ". Adding to late-bound plugins list.\nReason: " + e.getMessage();
+
+ if ( logger.isDebugEnabled() )
+ {
+ logger.debug( message, e );
+ }
+ else
+ {
+ logger.warn( message );
+ }
+
+ plan.addLateBoundMojo( mojoBinding );
+ }
+
+ if ( pluginDescriptor == null )
+ {
+ continue;
}
MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( mojoBinding.getGoal() );
if ( mojoDescriptor == null )
{
throw new LifecyclePlannerException( "Mojo: " + mojoBinding.getGoal() + " does not exist in plugin: "
- + pluginDescriptor.getId() + "." );
+ + pluginDescriptor.getId() + "." );
}
if ( mojoDescriptor.isRequiresReports() )
{
List reportBindings = lifecycleBindingManager.getReportBindings( project );
- // findForkModifiers( mojoBinding, pluginDescriptor, planElement, lifecycleBindings,
- // project, forkingBindings, tasks );
for ( Iterator reportBindingIt = reportBindings.iterator(); reportBindingIt.hasNext(); )
{
MojoBinding reportBinding = (MojoBinding) reportBindingIt.next();
-
- PluginDescriptor pd;
+
try
{
- pd = pluginLoader.loadReportPlugin( mojoBinding, project );
+ pluginLoader.loadReportPlugin( mojoBinding, project );
}
catch ( PluginLoaderException e )
{
throw new LifecyclePlannerException( "Failed to load report-plugin descriptor for: "
- + MojoBindingUtils.toString( reportBinding ) + ". Reason: " + e.getMessage(), e );
- }
-
-// findForkModifiers( reportBinding, planElement, lifecycleBindings, project );
- }
-
- Phase phase = LifecycleUtils.findPhaseForMojoBinding( mojoBinding, lifecycleBindings, true );
-
- if ( phase == null )
- {
- if ( planElement instanceof DirectInvocationOriginElement )
- {
- DirectInvocationModifier modder = new SimpleDirectInvocationModifier( mojoBinding, reportBindings );
-
- ( (DirectInvocationOriginElement) planElement ).addDirectInvocationModifier( modder );
- }
- else
- {
- throw new LifecyclePlannerException( "Cannot inject reports for direct invocation: "
- + MojoBindingUtils.toString( mojoBinding )
- + "; current plan element does not accept direct-invocation modifiers." );
+ + MojoBindingUtils.toString( reportBinding )
+ + ". Reason: " + e.getMessage(), e );
}
}
- else
- {
- BuildPlanModifier modder = new ReportingPlanModifier( mojoBinding, reportBindings );
- planElement.addModifier( modder );
- }
+ plan.addForkedExecution( mojoBinding, reportBindings );
// NOTE: the first sighting of a mojo requiring reports should satisfy this condition.
// therefore, we can break out as soon as we find one.
@@ -210,159 +226,38 @@ private void addReportingLifecycleModifiers( ModifiablePlanElement planElement,
}
/**
- * Explores a single MojoBinding, and injects any necessary plan modifiers to accommodate any
- * of the three types of forked execution, along with any new mojos/lifecycles that entails.
+ * Explores a single MojoBinding, and injects any necessary plan modifiers to accommodate any of the three types of
+ * forked execution, along with any new mojos/lifecycles that entails.
*/
- private void findForkModifiers( MojoBinding mojoBinding, PluginDescriptor pluginDescriptor,
- ModifiablePlanElement planElement, LifecycleBindings mergedBindings, MavenProject project,
- LinkedList forkingBindings )
+ private void findForkModifiers( final MojoBinding mojoBinding, final PluginDescriptor pluginDescriptor,
+ final BuildPlan plan, final MavenProject project )
throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException
{
- forkingBindings.addLast( mojoBinding );
+ String referencingGoal = mojoBinding.getGoal();
- try
+ MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( referencingGoal );
+
+ if ( mojoDescriptor.getExecuteGoal() != null )
{
- String referencingGoal = mojoBinding.getGoal();
-
- MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( referencingGoal );
-
- if ( mojoDescriptor.getExecuteGoal() != null )
- {
- recurseSingleMojoFork( mojoBinding, pluginDescriptor, planElement, mergedBindings, project, forkingBindings );
- }
- else if ( mojoDescriptor.getExecutePhase() != null )
- {
- recursePhaseMojoFork( mojoBinding, pluginDescriptor, planElement, mergedBindings, project, forkingBindings );
- }
+ recurseSingleMojoFork( mojoBinding, pluginDescriptor, plan, project );
}
- finally
+ else if ( mojoDescriptor.getExecutePhase() != null )
{
- forkingBindings.removeLast();
+ recursePhaseMojoFork( mojoBinding, pluginDescriptor, plan, project );
}
}
/**
- * Handles exploration of a single-mojo forked execution for further forkings, and also performs
- * the actual build-plan modification for that single-mojo forked execution.
- */
- private void modifyBuildPlanForForkedDirectInvocation( MojoBinding invokedBinding, MojoBinding invokedVia,
- PluginDescriptor pluginDescriptor, ModifiablePlanElement planElement,
- LifecycleBindings mergedBindings, MavenProject project,
- LinkedList forkingBindings )
- throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException
- {
- if ( planElement instanceof DirectInvocationOriginElement )
- {
- List noTasks = Collections.EMPTY_LIST;
-
- LifecycleBindings forkedBindings = new LifecycleBindings();
- LifecycleBuildPlan forkedPlan = new LifecycleBuildPlan( noTasks, forkedBindings );
-
- forkingBindings.addLast( invokedBinding );
- try
- {
- findForkModifiers( invokedBinding, pluginDescriptor, forkedPlan, forkedBindings, project, forkingBindings );
- }
- finally
- {
- forkingBindings.removeLast();
- }
-
- List forkedMojos = new ArrayList();
- forkedMojos.addAll( lifecycleBindingManager.assembleMojoBindingList( noTasks, forkedBindings, project ) );
- forkedMojos.add( invokedBinding );
-
- DirectInvocationModifier modifier = new ForkedDirectInvocationModifier( invokedVia, forkedMojos );
-
- ( (DirectInvocationOriginElement) planElement ).addDirectInvocationModifier( modifier );
- }
- else
- {
- throw new LifecyclePlannerException( "Mojo: " + MojoBindingUtils.toString( invokedVia )
- + " is not bound to the lifecycle; you cannot attach this mojo to a build-plan modifier." );
- }
- }
-
- /**
- * Handles exploration of a lifecycle-based forked execution for further forkings, and also performs
- * the actual build-plan modification for that lifecycle-based forked execution.
- */
- private void modifyBuildPlanForForkedLifecycle( MojoBinding mojoBinding, PluginDescriptor pluginDescriptor,
- ModifiablePlanElement planElement, LifecycleBindings bindings,
- MavenProject project, LinkedList forkingBindings )
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( mojoBinding.getGoal() );
- String phase = mojoDescriptor.getExecutePhase();
-
- List forkedPhaseBindingList = lifecycleBindingManager.assembleMojoBindingList( Collections.singletonList( phase ),
- bindings, project );
-
- ModifiablePlanElement mpe;
-
- // setup the ModifiablePlanElement, into which we'll recurse to find further modifications.
- if ( LifecycleUtils.findPhaseForMojoBinding( mojoBinding, bindings, true ) != null )
- {
- mpe = new ForkPlanModifier( mojoBinding, forkedPhaseBindingList );
- }
- else if ( planElement instanceof BuildPlan )
- {
- mpe = new SubLifecycleBuildPlan( phase, bindings );
- }
- else
- {
- throw new LifecyclePlannerException( "Mojo: " + MojoBindingUtils.toString( mojoBinding )
- + " is not bound to the lifecycle; you cannot attach this mojo to a build-plan modifier." );
- }
-
- // recurse, to find further modifications, using the ModifiablePlanElement from above, along
- // with the modified task list (which doesn't contain the direct-invocation task that landed
- // us here...
- for ( Iterator it = forkedPhaseBindingList.iterator(); it.hasNext(); )
- {
- MojoBinding forkedBinding = (MojoBinding) it.next();
-
- PluginDescriptor forkedPluginDescriptor;
- try
- {
- forkedPluginDescriptor = pluginLoader.loadPlugin( forkedBinding, project );
- }
- catch ( PluginLoaderException e )
- {
- throw new LifecyclePlannerException( e.getMessage(), e );
- }
-
- findForkModifiers( forkedBinding, forkedPluginDescriptor, mpe, bindings, project, forkingBindings );
- }
-
- // now that we've discovered any deeper modifications, add the current MPE to the parent MPE
- // in the appropriate location.
- if ( LifecycleUtils.findPhaseForMojoBinding( mojoBinding, bindings, true ) != null )
- {
- planElement.addModifier( (BuildPlanModifier) mpe );
- }
- else if ( planElement instanceof DirectInvocationOriginElement )
- {
- List planMojoBindings = ( (BuildPlan) mpe ).getPlanMojoBindings( project, lifecycleBindingManager );
-
- ForkedDirectInvocationModifier modifier = new ForkedDirectInvocationModifier( mojoBinding, planMojoBindings );
-
- ( (DirectInvocationOriginElement) planElement ).addDirectInvocationModifier( modifier );
- }
- }
-
- /**
- * Constructs the lifecycle bindings used to execute a particular fork, given the forking mojo
- * binding. If the mojo binding specifies a lifecycle overlay, this method will add that into
- * the forked lifecycle, and calculate the bindings to inject based on the phase in that new
- * lifecycle which should be executed.
+ * Constructs the lifecycle bindings used to execute a particular fork, given the forking mojo binding. If the mojo
+ * binding specifies a lifecycle overlay, this method will add that into the forked lifecycle, and calculate the
+ * bindings to inject based on the phase in that new lifecycle which should be executed.
*
- * Hands off to the {@link DefaultBuildPlanner#modifyBuildPlanForForkedLifecycle(MojoBinding, PluginDescriptor, ModifiablePlanElement, LifecycleBindings, MavenProject, LinkedList, List)}
+ * Hands off to the
+ * {@link DefaultBuildPlanner#modifyBuildPlanForForkedLifecycle(MojoBinding, PluginDescriptor, ModifiablePlanElement, LifecycleBindings, MavenProject, LinkedList, List)}
* method to handle the actual plan modification.
*/
- private void recursePhaseMojoFork( MojoBinding mojoBinding, PluginDescriptor pluginDescriptor,
- ModifiablePlanElement planElement, LifecycleBindings mergedBindings, MavenProject project,
- LinkedList forkingBindings )
+ private void recursePhaseMojoFork( final MojoBinding mojoBinding, final PluginDescriptor pluginDescriptor,
+ final BuildPlan plan, final MavenProject project )
throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException
{
String referencingGoal = mojoBinding.getGoal();
@@ -376,48 +271,44 @@ private void recursePhaseMojoFork( MojoBinding mojoBinding, PluginDescriptor plu
return;
}
- if ( LifecycleUtils.findLifecycleBindingForPhase( phase, mergedBindings ) == null )
+ if ( !LifecycleUtils.isValidPhaseName( phase ) )
{
throw new LifecyclePlannerException( "Cannot find lifecycle for phase: " + phase );
}
- LifecycleBindings cloned;
- if ( mojoDescriptor.getExecuteLifecycle() != null )
- {
- String executeLifecycle = mojoDescriptor.getExecuteLifecycle();
+ BuildPlan clonedPlan = plan.copy( Collections.singletonList( phase ) );
+ String executeLifecycle = mojoDescriptor.getExecuteLifecycle();
+ if ( executeLifecycle != null )
+ {
LifecycleBindings overlayBindings;
try
{
- overlayBindings = lifecycleBindingManager.getPluginLifecycleOverlay( pluginDescriptor, executeLifecycle, project );
+ overlayBindings =
+ lifecycleBindingManager.getPluginLifecycleOverlay( pluginDescriptor, executeLifecycle, project );
}
catch ( LifecycleLoaderException e )
{
- throw new LifecyclePlannerException( "Failed to load overlay lifecycle: " + executeLifecycle + ". Reason: "
- + e.getMessage(), e );
+ throw new LifecyclePlannerException( "Failed to load overlay lifecycle: " + executeLifecycle
+ + ". Reason: " + e.getMessage(), e );
}
- cloned = LifecycleUtils.cloneBindings( mergedBindings );
- cloned = LifecycleUtils.mergeBindings( overlayBindings, cloned, null, true, true );
- }
- else
- {
- cloned = LifecycleUtils.cloneBindings( mergedBindings );
+ clonedPlan.addLifecycleOverlay( overlayBindings );
}
- LifecycleUtils.removeMojoBindings( forkingBindings, cloned, false );
+ plan.addForkedExecution( mojoBinding, clonedPlan );
- modifyBuildPlanForForkedLifecycle( mojoBinding, pluginDescriptor, planElement, cloned, project, forkingBindings );
+ addForkedLifecycleModifiers( clonedPlan, project );
}
/**
- * Retrieves the information necessary to create a new MojoBinding for a single-mojo forked
- * execution, then hands off to the {@link DefaultBuildPlanner#modifyBuildPlanForForkedDirectInvocation(MojoBinding, MojoBinding, PluginDescriptor, ModifiablePlanElement, LifecycleBindings, MavenProject, LinkedList, List)}
+ * Retrieves the information necessary to create a new MojoBinding for a single-mojo forked execution, then hands
+ * off to the
+ * {@link DefaultBuildPlanner#modifyBuildPlanForForkedDirectInvocation(MojoBinding, MojoBinding, PluginDescriptor, ModifiablePlanElement, LifecycleBindings, MavenProject, LinkedList, List)}
* method to actually inject the modification.
*/
- private void recurseSingleMojoFork( MojoBinding mojoBinding, PluginDescriptor pluginDescriptor,
- ModifiablePlanElement planElement, LifecycleBindings mergedBindings,
- MavenProject project, LinkedList forkingBindings )
+ private void recurseSingleMojoFork( final MojoBinding mojoBinding, final PluginDescriptor pluginDescriptor,
+ final BuildPlan plan, final MavenProject project )
throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException
{
String referencingGoal = mojoBinding.getGoal();
@@ -435,20 +326,16 @@ private void recurseSingleMojoFork( MojoBinding mojoBinding, PluginDescriptor pl
if ( otherDescriptor == null )
{
throw new LifecyclePlannerException( "Mojo: " + executeGoal + " (referenced by: " + referencingGoal
- + ") does not exist in plugin: " + pluginDescriptor.getId() + "." );
+ + ") does not exist in plugin: " + pluginDescriptor.getId() + "." );
}
- MojoBinding binding = mojoBindingFactory.createMojoBinding( pluginDescriptor.getGroupId(),
- pluginDescriptor.getArtifactId(),
- pluginDescriptor.getVersion(), executeGoal, project );
+ MojoBinding binding =
+ mojoBindingFactory.createMojoBinding( pluginDescriptor.getGroupId(), pluginDescriptor.getArtifactId(),
+ pluginDescriptor.getVersion(), executeGoal, project );
binding.setOrigin( "Forked from " + referencingGoal );
- if ( !LifecycleUtils.isMojoBindingPresent( binding, forkingBindings, false ) )
- {
- modifyBuildPlanForForkedDirectInvocation( binding, mojoBinding, pluginDescriptor, planElement, mergedBindings,
- project, forkingBindings );
- }
+ plan.addForkedExecution( mojoBinding, Collections.singletonList( binding ) );
}
}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DirectInvocationModifier.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DirectInvocationModifier.java
deleted file mode 100644
index 23e5b622c2..0000000000
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DirectInvocationModifier.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-import org.apache.maven.lifecycle.binding.LifecycleBindingManager;
-import org.apache.maven.lifecycle.model.LifecycleBindings;
-import org.apache.maven.lifecycle.model.MojoBinding;
-import org.apache.maven.project.MavenProject;
-
-import java.util.List;
-
-/**
- * Modifier that alters a build plan to substitute a set of MojoBindings in place of a single,
- * direct-invocation MojoBinding. These bindings are not impacted by {@link BuildPlanModifier}s,
- * since they don't exist in a {@link LifecycleBindings} instance.
- *
- * @author jdcasey
- *
- */
-public interface DirectInvocationModifier
-{
-
- /**
- * The MojoBinding which should be modified.
- */
- MojoBinding getBindingToModify();
-
- /**
- * Return the list of MojoBindings which should replace the modified binding in the master
- * build plan.
- */
- List getModifiedBindings( MavenProject project, LifecycleBindingManager bindingManager );
-
-}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DirectInvocationOriginElement.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DirectInvocationOriginElement.java
deleted file mode 100644
index 761fd43e41..0000000000
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DirectInvocationOriginElement.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-/**
- * Instantiates MojoBindings for direct invocation, which may be subject to modification.
- *
- * @author jdcasey
- *
- */
-public interface DirectInvocationOriginElement
-{
-
- /**
- * Add a new direct-invocation binding modifier.
- */
- void addDirectInvocationModifier( DirectInvocationModifier modifier );
-
-}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/ForkPlanModifier.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/ForkPlanModifier.java
deleted file mode 100644
index 1156a79140..0000000000
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/ForkPlanModifier.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-import org.apache.maven.lifecycle.LifecycleUtils;
-import org.apache.maven.lifecycle.model.LifecycleBindings;
-import org.apache.maven.lifecycle.model.MojoBinding;
-import org.apache.maven.lifecycle.model.Phase;
-import org.apache.maven.lifecycle.statemgmt.StateManagementUtils;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Inject a list of forked-execution bindings at the point where the modification point is bound to
- * the supplied LifecycleBindings, bracketed by special mojo bindings to control the forked-execution
- * context.
- *
- * @author jdcasey
- *
- */
-public class ForkPlanModifier
- implements BuildPlanModifier
-{
-
- private final MojoBinding modificationPoint;
- private List planModifiers = new ArrayList();
-
- private final List mojoBindings;
-
- public ForkPlanModifier( MojoBinding modificationPoint, List mojoBindings )
- {
- this.modificationPoint = modificationPoint;
- this.mojoBindings = mojoBindings;
- }
-
- /**
- * Retrieve the MojoBinding which serves as the injection point for the forked bindings.
- */
- public MojoBinding getModificationPoint()
- {
- return modificationPoint;
- }
-
- /**
- * Modify the LifeycleBindings from a BuildPlan by locating the modification point MojoBinding,
- * and prepending the forked-execution bindings in the plan, bracketed by mojos that control the
- * forked-execution context.
- */
- public LifecycleBindings modifyBindings( LifecycleBindings bindings )
- throws LifecyclePlannerException
- {
- Phase phase = LifecycleUtils.findPhaseForMojoBinding( getModificationPoint(), bindings, true );
-
- String modificationKey = LifecycleUtils.createMojoBindingKey( getModificationPoint(), true );
-
- if ( phase == null )
- {
- throw new LifecyclePlannerException( "Failed to modify plan. No phase found containing mojoBinding: "
- + modificationKey );
- }
-
- int stopIndex = -1;
- int insertionIndex = -1;
- List phaseBindings = phase.getBindings();
-
- for ( int i = 0; i < phaseBindings.size(); i++ )
- {
- MojoBinding candidate = (MojoBinding) phaseBindings.get( i );
-
- String key = LifecycleUtils.createMojoBindingKey( candidate, true );
- if ( key.equals( modificationKey ) )
- {
- insertionIndex = i;
- stopIndex = i + 1;
- break;
- }
- }
-
- phaseBindings.add( stopIndex, StateManagementUtils.createClearForkedExecutionMojoBinding() );
-
- phaseBindings.add( insertionIndex, StateManagementUtils.createEndForkedExecutionMojoBinding() );
- phaseBindings.addAll( insertionIndex, mojoBindings );
- phaseBindings.add( insertionIndex, StateManagementUtils.createStartForkedExecutionMojoBinding() );
-
- phase.setBindings( phaseBindings );
-
- for ( Iterator it = planModifiers.iterator(); it.hasNext(); )
- {
- BuildPlanModifier modifier = (BuildPlanModifier) it.next();
-
- modifier.modifyBindings( bindings );
- }
-
- return bindings;
- }
-
- /**
- * Add a new modifier to further adjust the LifecycleBindings which are modified here.
- */
- public void addModifier( BuildPlanModifier planModifier )
- {
- planModifiers.add( planModifier );
- }
-
- /**
- * Return true if this modifier itself has modifiers.
- */
- public boolean hasModifiers()
- {
- return !planModifiers.isEmpty();
- }
-
-}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/ForkedDirectInvocationModifier.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/ForkedDirectInvocationModifier.java
deleted file mode 100644
index 9c03761d04..0000000000
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/ForkedDirectInvocationModifier.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-import org.apache.maven.lifecycle.binding.LifecycleBindingManager;
-import org.apache.maven.lifecycle.model.MojoBinding;
-import org.apache.maven.lifecycle.statemgmt.StateManagementUtils;
-import org.apache.maven.project.MavenProject;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Inject a list of MojoBindings in place of the forking binding, bracketing the forked bindings with
- * special mojos to control the forked-execution context.
- *
- * @author jdcasey
- *
- */
-public class ForkedDirectInvocationModifier
- implements DirectInvocationModifier
-{
-
- private final List forkedBindings;
- private final MojoBinding forkingBinding;
-
- public ForkedDirectInvocationModifier( MojoBinding forkingBinding, List forkedBindings )
- {
- this.forkingBinding = forkingBinding;
- this.forkedBindings = forkedBindings;
- }
-
- /**
- * Return a list containing forked-execution context control MojoBindings, the forked-execution
- * bindings themselves, and finally the binding that forked off a new execution branch.
- */
- public List getModifiedBindings( MavenProject project, LifecycleBindingManager bindingManager )
- {
- List result = new ArrayList();
-
- result.add( StateManagementUtils.createStartForkedExecutionMojoBinding() );
- result.addAll( forkedBindings );
- result.add( StateManagementUtils.createEndForkedExecutionMojoBinding() );
- result.add( forkingBinding );
- result.add( StateManagementUtils.createClearForkedExecutionMojoBinding() );
-
- return result;
- }
-
- /**
- * Return the MojoBinding that forks execution to include the bindings in this modifier.
- */
- public MojoBinding getBindingToModify()
- {
- return forkingBinding;
- }
-
-}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/LifecycleBuildPlan.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/LifecycleBuildPlan.java
deleted file mode 100644
index 869ecd31a4..0000000000
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/LifecycleBuildPlan.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-import org.apache.maven.lifecycle.LifecycleLoaderException;
-import org.apache.maven.lifecycle.LifecycleSpecificationException;
-import org.apache.maven.lifecycle.LifecycleUtils;
-import org.apache.maven.lifecycle.binding.LifecycleBindingManager;
-import org.apache.maven.lifecycle.model.LifecycleBindings;
-import org.apache.maven.project.MavenProject;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Construct a list of MojoBinding instances that accomplish all of the tasks specified. For lifecycle
- * phases, construct a list of mojos to execute up to and including the specified phase, and add them
- * to the list. For direct invocations, construct a new MojoBinding instance and add it to the list.
- *
- * All of these bindings are subject to lifecycle modifications due to forking, reporting, or other
- * factors, and also to forked-execution modification of direct invocations.
- *
- * @author jdcasey
- *
- */
-public class LifecycleBuildPlan
- implements BuildPlan, DirectInvocationOriginElement
-{
-
- private final List tasks;
-
- private final LifecycleBindings lifecycleBindings;
-
- private List planModifiers = new ArrayList();
-
- private Map directInvocationModifiers = new HashMap();
-
- public LifecycleBuildPlan( List tasks, LifecycleBindings lifecycleBindings )
- {
- this.tasks = tasks;
- this.lifecycleBindings = lifecycleBindings;
- }
-
- /**
- * Build the master execution list necessary to accomplish the specified tasks, given the
- * specified set of mojo bindings to different parts of the lifecycle.
- */
- public List getPlanMojoBindings( MavenProject project, LifecycleBindingManager bindingManager )
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- LifecycleBindings cloned = BuildPlanUtils.modifyPlanBindings( lifecycleBindings, planModifiers );
-
- return bindingManager.assembleMojoBindingList( tasks, cloned, directInvocationModifiers, project );
- }
-
- /**
- * Retrieve the set of tasks that this build plan is responsible for.
- */
- public List getTasks()
- {
- return tasks;
- }
-
- /**
- * Add a new build-plan modifier to inject reporting, forked-execution, or other altered behavior
- * into the "vanilla" lifecycle that was specified at instance construction.
- */
- public void addModifier( BuildPlanModifier planModifier )
- {
- planModifiers.add( planModifier );
- }
-
- /**
- * Return true if build-plan modifiers exist (these are lifecycle-only modifiers, not direct
- * invocation modifiers).
- */
- public boolean hasModifiers()
- {
- return !planModifiers.isEmpty();
- }
-
- /**
- * Add a new modifier for a direct-invocation MojoBinding in the build plan resulting from this
- * instance.
- */
- public void addDirectInvocationModifier( DirectInvocationModifier modifier )
- {
- directInvocationModifiers.put( LifecycleUtils.createMojoBindingKey( modifier.getBindingToModify(), true ), modifier );
- }
-
-}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/ModifiablePlanElement.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/ModifiablePlanElement.java
deleted file mode 100644
index e7c72215ca..0000000000
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/ModifiablePlanElement.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-/**
- * Any element of a build plan that contains or handles a LifecycleBindings instance which is subject
- * to modification.
- *
- * @author jdcasey
- *
- */
-public interface ModifiablePlanElement
-{
-
- /**
- * Add a new lifecycle modifier to this build-plan element.
- */
- void addModifier( BuildPlanModifier planModifier );
-
- /**
- * Return true if this element has lifecycle modifiers
- */
- boolean hasModifiers();
-
-}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/ReportingPlanModifier.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/ReportingPlanModifier.java
deleted file mode 100644
index 19050c1fe8..0000000000
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/ReportingPlanModifier.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-import org.apache.maven.lifecycle.LifecycleUtils;
-import org.apache.maven.lifecycle.model.LifecycleBindings;
-import org.apache.maven.lifecycle.model.MojoBinding;
-import org.apache.maven.lifecycle.model.Phase;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Inject the MojoBindings necessary to execute and make available the report instances that another
- * mojo in the build plan needs.
- *
- * @author jdcasey
- *
- */
-public class ReportingPlanModifier
- implements BuildPlanModifier
-{
-
- private List planModifiers = new ArrayList();
- private final MojoBinding targetMojoBinding;
- private final List reportBindings;
-
- public ReportingPlanModifier( MojoBinding mojoBinding, List reportBindings )
- {
- this.targetMojoBinding = mojoBinding;
- this.reportBindings = reportBindings;
- }
-
- /**
- * Find the mojo that requested reports, and inject the reporting MojoBinding instances just
- * ahead of it in the lifecycle bindings.
- */
- public LifecycleBindings modifyBindings( LifecycleBindings bindings )
- throws LifecyclePlannerException
- {
- Phase phase = LifecycleUtils.findPhaseForMojoBinding( targetMojoBinding, bindings, true );
-
- String modificationKey = LifecycleUtils.createMojoBindingKey( targetMojoBinding, true );
-
- if ( phase == null )
- {
- throw new LifecyclePlannerException( "Failed to modify plan. No phase found containing mojoBinding: "
- + modificationKey );
- }
-
- int insertionIndex = -1;
- List phaseBindings = phase.getBindings();
-
- for ( int i = 0; i < phaseBindings.size(); i++ )
- {
- MojoBinding candidate = (MojoBinding) phaseBindings.get( i );
-
- String key = LifecycleUtils.createMojoBindingKey( candidate, true );
- if ( key.equals( modificationKey ) )
- {
- insertionIndex = i;
- break;
- }
- }
-
- phaseBindings.addAll( insertionIndex, reportBindings );
- phase.setBindings( phaseBindings );
-
- for ( Iterator it = planModifiers.iterator(); it.hasNext(); )
- {
- BuildPlanModifier modifier = (BuildPlanModifier) it.next();
-
- modifier.modifyBindings( bindings );
- }
-
- return bindings;
- }
-
- /**
- * Add further lifecycle modifications to this report-injecting modifier.
- */
- public void addModifier( BuildPlanModifier planModifier )
- {
- planModifiers.add( planModifier );
- }
-
- /**
- * Return true if this report-injecting modifier contains further modifications for the lifecycle.
- */
- public boolean hasModifiers()
- {
- return !planModifiers.isEmpty();
- }
-
-}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/SimpleDirectInvocationModifier.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/SimpleDirectInvocationModifier.java
deleted file mode 100644
index f4acd55cfc..0000000000
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/SimpleDirectInvocationModifier.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-import org.apache.maven.lifecycle.binding.LifecycleBindingManager;
-import org.apache.maven.lifecycle.model.MojoBinding;
-import org.apache.maven.project.MavenProject;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Inject a list of MojoBindings in place of the forking binding, bracketing the forked bindings with
- * special mojos to control the forked-execution context.
- *
- * @author jdcasey
- *
- */
-public class SimpleDirectInvocationModifier
- implements DirectInvocationModifier
-{
-
- private final List reportBindings;
- private final MojoBinding targetBinding;
-
- public SimpleDirectInvocationModifier( MojoBinding targetBinding, List reportBindings )
- {
- this.targetBinding = targetBinding;
- this.reportBindings = reportBindings;
- }
-
- /**
- * Return a list containing forked-execution context control MojoBindings, the forked-execution
- * bindings themselves, and finally the binding that forked off a new execution branch.
- */
- public List getModifiedBindings( MavenProject project, LifecycleBindingManager bindingManager )
- {
- List result = new ArrayList();
-
- result.addAll( reportBindings );
- result.add( targetBinding );
-
- return result;
- }
-
- /**
- * Return the MojoBinding that forks execution to include the bindings in this modifier.
- */
- public MojoBinding getBindingToModify()
- {
- return targetBinding;
- }
-
-}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/SubLifecycleBuildPlan.java b/maven-core/src/main/java/org/apache/maven/lifecycle/plan/SubLifecycleBuildPlan.java
deleted file mode 100644
index 83738c9f74..0000000000
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/plan/SubLifecycleBuildPlan.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-import org.apache.maven.lifecycle.LifecycleLoaderException;
-import org.apache.maven.lifecycle.LifecycleSpecificationException;
-import org.apache.maven.lifecycle.binding.LifecycleBindingManager;
-import org.apache.maven.lifecycle.model.LifecycleBindings;
-import org.apache.maven.project.MavenProject;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Constructs a build plan using a LifecycleBindings instance, but only allowing one phase for that
- * lifecycle, as opposed to the parent class which allows a list of tasks (some of which may not be
- * lifecycle phases at all).
- *
- * This build plan cannot produce direct-invocation MojoBindings.
- *
- * @author jdcasey
- *
- */
-public class SubLifecycleBuildPlan
- implements BuildPlan
-{
-
- private LifecycleBuildPlan delegate;
- private final String phase;
-
- public SubLifecycleBuildPlan( String phase, LifecycleBindings bindings )
- {
- this.phase = phase;
- delegate = new LifecycleBuildPlan( Collections.singletonList( phase ), bindings );
- }
-
- /**
- * Retrieve the build plan binding list from the delegate {@link LifecycleBuildPlan} instance,
- * and return them.
- */
- public List getPlanMojoBindings(MavenProject project, LifecycleBindingManager bindingManager)
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- return delegate.getPlanMojoBindings(project, bindingManager);
- }
-
- /**
- * Return a list containing a single item: the lifecycle phase that this plan is concerned with
- * accomplishing.
- */
- public List getTasks()
- {
- return Collections.singletonList( phase );
- }
-
- /**
- * Add a build-plan modifier to the delegate {@link LifecycleBuildPlan} instance.
- */
- public void addModifier( BuildPlanModifier planModifier )
- {
- delegate.addModifier( planModifier );
- }
-
- /**
- * Return true if the delegate {@link LifecycleBuildPlan} instance contains build-plan modifiers.
- */
- public boolean hasModifiers()
- {
- return delegate.hasModifiers();
- }
-
-}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/statemgmt/ResolveLateBoundPluginMojo.java b/maven-core/src/main/java/org/apache/maven/lifecycle/statemgmt/ResolveLateBoundPluginMojo.java
new file mode 100644
index 0000000000..8f1fd0ccb2
--- /dev/null
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/statemgmt/ResolveLateBoundPluginMojo.java
@@ -0,0 +1,57 @@
+package org.apache.maven.lifecycle.statemgmt;
+
+import org.apache.maven.lifecycle.MojoBindingUtils;
+import org.apache.maven.lifecycle.binding.MojoBindingFactory;
+import org.apache.maven.lifecycle.model.MojoBinding;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugin.descriptor.MojoDescriptor;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.plugin.loader.PluginLoader;
+import org.apache.maven.plugin.loader.PluginLoaderException;
+import org.apache.maven.project.MavenProject;
+
+public class ResolveLateBoundPluginMojo extends AbstractMojo
+{
+
+ /**
+ * @component
+ */
+ private PluginLoader pluginLoader;
+
+ private String groupId;
+
+ private String artifactId;
+
+ private String version;
+
+ private String goal;
+
+ private MavenProject project;
+
+ private MojoBindingFactory bindingFactory;
+
+ public void execute() throws MojoExecutionException, MojoFailureException
+ {
+ MojoBinding binding = bindingFactory.createMojoBinding( groupId, artifactId, version, artifactId, project );
+ try
+ {
+ PluginDescriptor descriptor = pluginLoader.loadPlugin( binding, project );
+
+ MojoDescriptor mojoDescriptor = descriptor.getMojo( goal );
+
+ if ( mojoDescriptor == null )
+ {
+ throw new MojoExecutionException( "Resolved plugin: " + descriptor.getId()
+ + " does not contain a mojo called \'" + goal + "\'." );
+ }
+ }
+ catch ( PluginLoaderException e )
+ {
+ throw new MojoExecutionException( "Failed to load late-bound plugin: "
+ + MojoBindingUtils.createPluginKey( binding ) );
+ }
+ }
+
+}
diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/statemgmt/StateManagementUtils.java b/maven-core/src/main/java/org/apache/maven/lifecycle/statemgmt/StateManagementUtils.java
index e5ab8231df..0673c359b6 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/statemgmt/StateManagementUtils.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/statemgmt/StateManagementUtils.java
@@ -4,11 +4,10 @@
import org.codehaus.plexus.util.xml.Xpp3Dom;
/**
- * Constructs and matches MojoBinding instances that refer to the forked-execution context manager
- * mojos.
+ * Constructs and matches MojoBinding instances that refer to the forked-execution context manager mojos.
*
* @author jdcasey
- *
+ *
*/
public final class StateManagementUtils
{
@@ -27,6 +26,8 @@ public final class StateManagementUtils
public static final String CLEAR_FORKED_EXECUTION_GOAL = "clear-fork-context";
+ public static final String RESOLVE_LATE_BOUND_PLUGIN_GOAL = "resolve-late-bound-plugin";
+
private static int CURRENT_FORK_ID = 0;
private StateManagementUtils()
@@ -34,9 +35,8 @@ private StateManagementUtils()
}
/**
- * Create a new MojoBinding instance that refers to the internal mojo used to setup a new
- * forked-execution context. Also, set the configuration to contain the forkId for this new
- * context.
+ * Create a new MojoBinding instance that refers to the internal mojo used to setup a new forked-execution context.
+ * Also, set the configuration to contain the forkId for this new context.
*/
public static MojoBinding createStartForkedExecutionMojoBinding()
{
@@ -49,22 +49,21 @@ public static MojoBinding createStartForkedExecutionMojoBinding()
binding.setOrigin( ORIGIN );
CURRENT_FORK_ID = (int) System.currentTimeMillis();
-
+
Xpp3Dom config = new Xpp3Dom( "configuration" );
Xpp3Dom forkId = new Xpp3Dom( "forkId" );
forkId.setValue( "" + CURRENT_FORK_ID );
-
+
config.addChild( forkId );
-
+
binding.setConfiguration( config );
return binding;
}
/**
- * Create a new MojoBinding instance that refers to the internal mojo used to end a
- * forked-execution context. Also, set the configuration to contain the forkId for this new
- * context.
+ * Create a new MojoBinding instance that refers to the internal mojo used to end a forked-execution context. Also,
+ * set the configuration to contain the forkId for this new context.
*/
public static MojoBinding createEndForkedExecutionMojoBinding()
{
@@ -79,18 +78,17 @@ public static MojoBinding createEndForkedExecutionMojoBinding()
Xpp3Dom config = new Xpp3Dom( "configuration" );
Xpp3Dom forkId = new Xpp3Dom( "forkId" );
forkId.setValue( "" + CURRENT_FORK_ID );
-
+
config.addChild( forkId );
-
+
binding.setConfiguration( config );
return binding;
}
/**
- * Create a new MojoBinding instance that refers to the internal mojo used to cleanup a completed
- * forked-execution context. Also, set the configuration to contain the forkId for this new
- * context.
+ * Create a new MojoBinding instance that refers to the internal mojo used to cleanup a completed forked-execution
+ * context. Also, set the configuration to contain the forkId for this new context.
*/
public static MojoBinding createClearForkedExecutionMojoBinding()
{
@@ -105,45 +103,99 @@ public static MojoBinding createClearForkedExecutionMojoBinding()
Xpp3Dom config = new Xpp3Dom( "configuration" );
Xpp3Dom forkId = new Xpp3Dom( "forkId" );
forkId.setValue( "" + CURRENT_FORK_ID );
-
+
config.addChild( forkId );
-
+
binding.setConfiguration( config );
return binding;
}
-
+
/**
- * Return true if the specified MojoBinding refers to the internal mojo used to setup a new
- * forked-execution context. This is useful for formatting when listing the build plan, when
- * expression of these actual mojo names isn't necessarily useful, and can be confusing.
+ * Return true if the specified MojoBinding refers to the internal mojo used to setup a new forked-execution
+ * context. This is useful for formatting when listing the build plan, when expression of these actual mojo names
+ * isn't necessarily useful, and can be confusing.
*/
- public static boolean isForkedExecutionStartMarker( MojoBinding binding )
+ public static boolean isForkedExecutionStartMarker( final MojoBinding binding )
{
return GROUP_ID.equals( binding.getGroupId() ) && ARTIFACT_ID.equals( binding.getArtifactId() )
- && START_FORKED_EXECUTION_GOAL.equals( binding.getGoal() );
+ && START_FORKED_EXECUTION_GOAL.equals( binding.getGoal() );
}
/**
- * Return true if the specified MojoBinding refers to the internal mojo used to end a
- * forked-execution context. This is useful for formatting when listing the build plan, when
- * expression of these actual mojo names isn't necessarily useful, and can be confusing.
+ * Return true if the specified MojoBinding refers to the internal mojo used to end a forked-execution context. This
+ * is useful for formatting when listing the build plan, when expression of these actual mojo names isn't
+ * necessarily useful, and can be confusing.
*/
- public static boolean isForkedExecutionEndMarker( MojoBinding binding )
+ public static boolean isForkedExecutionEndMarker( final MojoBinding binding )
{
return GROUP_ID.equals( binding.getGroupId() ) && ARTIFACT_ID.equals( binding.getArtifactId() )
- && END_FORKED_EXECUTION_GOAL.equals( binding.getGoal() );
+ && END_FORKED_EXECUTION_GOAL.equals( binding.getGoal() );
}
/**
* Return true if the specified MojoBinding refers to the internal mojo used to clean up a completed
- * forked-execution context. This is useful for formatting when listing the build plan, when
- * expression of these actual mojo names isn't necessarily useful, and can be confusing.
+ * forked-execution context. This is useful for formatting when listing the build plan, when expression of these
+ * actual mojo names isn't necessarily useful, and can be confusing.
*/
- public static boolean isForkedExecutionClearMarker( MojoBinding binding )
+ public static boolean isForkedExecutionClearMarker( final MojoBinding binding )
{
return GROUP_ID.equals( binding.getGroupId() ) && ARTIFACT_ID.equals( binding.getArtifactId() )
- && CLEAR_FORKED_EXECUTION_GOAL.equals( binding.getGoal() );
+ && CLEAR_FORKED_EXECUTION_GOAL.equals( binding.getGoal() );
+ }
+
+ /**
+ * Create a new MojoBinding instance that refers to the internal mojo used to resolve a late-bound plugin just
+ * before it is to be used. Also, set the configuration to contain the parameters necessary for this resolution.
+ */
+ public static MojoBinding createResolveLateBoundMojoBinding( final MojoBinding lateBound )
+ {
+ MojoBinding binding = new MojoBinding();
+
+ binding.setGroupId( GROUP_ID );
+ binding.setArtifactId( ARTIFACT_ID );
+ binding.setVersion( VERSION );
+ binding.setGoal( RESOLVE_LATE_BOUND_PLUGIN_GOAL );
+ binding.setOrigin( ORIGIN );
+
+ Xpp3Dom config = new Xpp3Dom( "configuration" );
+ Xpp3Dom param = new Xpp3Dom( "groupId" );
+ param.setValue( lateBound.getGroupId() );
+
+ config.addChild( param );
+
+ param = new Xpp3Dom( "artifactId" );
+ param.setValue( lateBound.getArtifactId() );
+
+ config.addChild( param );
+
+ if ( lateBound.getVersion() != null )
+ {
+ param = new Xpp3Dom( "version" );
+ param.setValue( lateBound.getVersion() );
+
+ config.addChild( param );
+ }
+
+ param = new Xpp3Dom( "goal" );
+ param.setValue( lateBound.getGoal() );
+
+ config.addChild( param );
+
+ binding.setConfiguration( config );
+
+ return binding;
+ }
+
+ /**
+ * Return true if the specified MojoBinding refers to the internal mojo used to resolve a late-bound mojo. This is
+ * useful for formatting when listing the build plan, when expression of these actual mojo names isn't necessarily
+ * useful, and can be confusing.
+ */
+ public static boolean isResolveLateBoundMojoBinding( final MojoBinding binding )
+ {
+ return GROUP_ID.equals( binding.getGroupId() ) && ARTIFACT_ID.equals( binding.getArtifactId() )
+ && RESOLVE_LATE_BOUND_PLUGIN_GOAL.equals( binding.getGoal() );
}
}
diff --git a/maven-core/src/main/resources/META-INF/maven/plugin.xml b/maven-core/src/main/resources/META-INF/maven/plugin.xml
index e3b26656e2..c5455e6271 100644
--- a/maven-core/src/main/resources/META-INF/maven/plugin.xml
+++ b/maven-core/src/main/resources/META-INF/maven/plugin.xml
@@ -113,5 +113,73 @@
${forkId}
+
+ resolve-plugin
+ Resolve a late-bound plugin during a build, right before it is to be used.
+ false
+ true
+ false
+ false
+ false
+ true
+ org.apache.maven.lifecycle.statemgmt.ResolveLateBoundPluginMojo
+ java
+ per-lookup
+ once-per-session
+
+
+ project
+ org.apache.maven.project.MavenProject
+ true
+ false
+ The current MavenProject instance, for building a new MojoBinding instance.
+
+
+ groupId
+ java.lang.String
+ true
+ true
+ The plugin's groupId.
+
+
+ artifactId
+ java.lang.String
+ true
+ true
+ The plugin's artifactId.
+
+
+ version
+ java.lang.String
+ false
+ true
+ The plugin's version.
+
+
+ gaol
+ java.lang.String
+ true
+ true
+ The mojo's goal that we're looking for, as an extra validation step.
+
+
+
+
+ ${groupId}
+ ${artifactId}
+ ${version}
+ ${goal}
+
+
+
+ org.apache.maven.plugin.loader.PluginLoader
+ pluginLoader
+
+
+ org.apache.maven.lifecycle.binding.MojoBindingFactory
+ bindingFactory
+
+
+
\ No newline at end of file
diff --git a/maven-core/src/main/resources/META-INF/plexus/components.xml b/maven-core/src/main/resources/META-INF/plexus/components.xml
index c6f5bb3dcc..4a7245baea 100644
--- a/maven-core/src/main/resources/META-INF/plexus/components.xml
+++ b/maven-core/src/main/resources/META-INF/plexus/components.xml
@@ -266,9 +266,6 @@ under the License.
org.apache.maven.context.BuildContextManager
-
- org.apache.maven.lifecycle.binding.LifecycleBindingManager
-
org.apache.maven.plugin.loader.PluginLoader
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManagerTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManagerTest.java
index 920e6ad1a9..0882ab2c05 100644
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManagerTest.java
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/binding/DefaultLifecycleBindingManagerTest.java
@@ -4,7 +4,6 @@
import org.apache.maven.lifecycle.LifecycleSpecificationException;
import org.apache.maven.lifecycle.model.LifecycleBindings;
import org.apache.maven.lifecycle.model.MojoBinding;
-import org.apache.maven.lifecycle.plan.LifecyclePlannerException;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
@@ -14,24 +13,21 @@
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.util.xml.Xpp3Dom;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
-public class DefaultLifecycleBindingManagerTest
- extends PlexusTestCase
+public class DefaultLifecycleBindingManagerTest extends PlexusTestCase
{
private LifecycleBindingManager mgr;
- public void setUp()
- throws Exception
+ public void setUp() throws Exception
{
super.setUp();
- this.mgr = (LifecycleBindingManager) lookup( LifecycleBindingManager.ROLE, "default" );
+ mgr = (LifecycleBindingManager) lookup( LifecycleBindingManager.ROLE, "default" );
}
public void testLookup()
@@ -92,7 +88,7 @@ public void testGetBindingsForPackaging_TestMergePluginManagementConfigToBinding
Build build = new Build();
model.setBuild( build );
-
+
PluginManagement plugMgmt = new PluginManagement();
build.setPluginManagement( plugMgmt );
@@ -182,7 +178,7 @@ public void testGetProjectCustomBindings_ExecutionConfigShouldOverridePluginConf
assertEquals( "other-value", config.getChild( "test2" ).getValue() );
}
- private Object createConfiguration( Properties configProperties )
+ private Object createConfiguration( final Properties configProperties )
{
Xpp3Dom config = new Xpp3Dom( "configuration" );
for ( Iterator it = configProperties.keySet().iterator(); it.hasNext(); )
@@ -199,164 +195,4 @@ private Object createConfiguration( Properties configProperties )
return config;
}
- public void testAssembleMojoBindingList_ReturnBindingsUpToStopPhaseForSinglePhaseTaskList()
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- LifecycleBindings bindings = new LifecycleBindings();
- bindings.getCleanBinding().getPreClean().addBinding( newMojoBinding( "goal", "artifact", "pre-clean" ) );
- bindings.getCleanBinding().getClean().addBinding( newMojoBinding( "goal", "artifact", "clean" ) );
- bindings.getCleanBinding().getPostClean().addBinding( newMojoBinding( "goal", "artifact", "post-clean" ) );
-
- List result = mgr.assembleMojoBindingList( Collections.singletonList( "clean" ), bindings, new MavenProject( new Model() ) );
-
- assertEquals( 2, result.size() );
-
- MojoBinding binding = (MojoBinding) result.get( 0 );
-
- assertEquals( "goal", binding.getGroupId() );
- assertEquals( "artifact", binding.getArtifactId() );
- assertEquals( "pre-clean", binding.getGoal() );
-
- binding = (MojoBinding) result.get( 1 );
-
- assertEquals( "goal", binding.getGroupId() );
- assertEquals( "artifact", binding.getArtifactId() );
- assertEquals( "clean", binding.getGoal() );
- }
-
- public void testAssembleMojoBindingList_CombinePreviousBindingsWhenSubsetOfNextBindingsForTwoPhaseTaskList()
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- LifecycleBindings bindings = new LifecycleBindings();
- bindings.getCleanBinding().getPreClean().addBinding( newMojoBinding( "goal", "artifact", "pre-clean" ) );
- bindings.getCleanBinding().getClean().addBinding( newMojoBinding( "goal", "artifact", "clean" ) );
- bindings.getCleanBinding().getClean().addBinding( newMojoBinding( "goal", "artifact", "post-clean" ) );
-
- List tasks = new ArrayList( 2 );
- tasks.add( "clean" );
- tasks.add( "post-clean" );
-
- List result = mgr.assembleMojoBindingList( tasks, bindings, new MavenProject( new Model() ) );
-
- assertEquals( 3, result.size() );
-
- MojoBinding binding = (MojoBinding) result.get( 0 );
-
- assertEquals( "goal", binding.getGroupId() );
- assertEquals( "artifact", binding.getArtifactId() );
- assertEquals( "pre-clean", binding.getGoal() );
-
- binding = (MojoBinding) result.get( 1 );
-
- assertEquals( "goal", binding.getGroupId() );
- assertEquals( "artifact", binding.getArtifactId() );
- assertEquals( "clean", binding.getGoal() );
-
- binding = (MojoBinding) result.get( 2 );
-
- assertEquals( "goal", binding.getGroupId() );
- assertEquals( "artifact", binding.getArtifactId() );
- assertEquals( "post-clean", binding.getGoal() );
- }
-
- public void testAssembleMojoBindingList_IgnoreSuccessiveBindingsWhenSameAsPreviousOnesForTwoPhaseTaskList()
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- LifecycleBindings bindings = new LifecycleBindings();
- bindings.getCleanBinding().getPreClean().addBinding( newMojoBinding( "goal", "artifact", "pre-clean" ) );
- bindings.getCleanBinding().getClean().addBinding( newMojoBinding( "goal", "artifact", "clean" ) );
-
- List tasks = new ArrayList( 2 );
- tasks.add( "clean" );
- tasks.add( "post-clean" );
-
- List result = mgr.assembleMojoBindingList( tasks, bindings, new MavenProject( new Model() ) );
-
- assertEquals( 2, result.size() );
-
- MojoBinding binding = (MojoBinding) result.get( 0 );
-
- assertEquals( "goal", binding.getGroupId() );
- assertEquals( "artifact", binding.getArtifactId() );
- assertEquals( "pre-clean", binding.getGoal() );
-
- binding = (MojoBinding) result.get( 1 );
-
- assertEquals( "goal", binding.getGroupId() );
- assertEquals( "artifact", binding.getArtifactId() );
- assertEquals( "clean", binding.getGoal() );
- }
-
- public void testAssembleMojoBindingList_ReturnBindingsUpToStopPhasesForTwoPhaseTaskList()
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- LifecycleBindings bindings = new LifecycleBindings();
-
- bindings.getCleanBinding().getPreClean().addBinding( newMojoBinding( "goal", "artifact", "pre-clean" ) );
- bindings.getCleanBinding().getClean().addBinding( newMojoBinding( "goal", "artifact", "clean" ) );
- bindings.getCleanBinding().getPostClean().addBinding( newMojoBinding( "goal", "artifact", "post-clean" ) );
-
- bindings.getBuildBinding().getInitialize().addBinding( newMojoBinding( "goal", "artifact", "initialize" ) );
- bindings.getBuildBinding().getCompile().addBinding( newMojoBinding( "goal", "artifact", "compile" ) );
- bindings.getBuildBinding().getCreatePackage().addBinding( newMojoBinding( "goal", "artifact", "package" ) );
-
- List tasks = new ArrayList( 2 );
- tasks.add( "clean" );
- tasks.add( "compile" );
-
- List result = mgr.assembleMojoBindingList( tasks, bindings, new MavenProject( new Model() ) );
-
- assertEquals( 4, result.size() );
-
- MojoBinding binding = (MojoBinding) result.get( 0 );
-
- assertEquals( "goal", binding.getGroupId() );
- assertEquals( "artifact", binding.getArtifactId() );
- assertEquals( "pre-clean", binding.getGoal() );
-
- binding = (MojoBinding) result.get( 1 );
-
- assertEquals( "goal", binding.getGroupId() );
- assertEquals( "artifact", binding.getArtifactId() );
- assertEquals( "clean", binding.getGoal() );
-
- binding = (MojoBinding) result.get( 2 );
-
- assertEquals( "goal", binding.getGroupId() );
- assertEquals( "artifact", binding.getArtifactId() );
- assertEquals( "initialize", binding.getGoal() );
-
- binding = (MojoBinding) result.get( 3 );
-
- assertEquals( "goal", binding.getGroupId() );
- assertEquals( "artifact", binding.getArtifactId() );
- assertEquals( "compile", binding.getGoal() );
-
- }
-
- public void testAssembleMojoBindingList_ThrowErrorForInvalidPhaseNameAsSingletonTaskList()
- throws LifecyclePlannerException, LifecycleLoaderException
- {
- try
- {
- mgr.assembleMojoBindingList( Collections.singletonList( "dud" ), new LifecycleBindings(),
- new MavenProject( new Model() ) );
-
- fail( "Should fail with LifecycleSpecificationException due to invalid phase/direct mojo reference." );
- }
- catch ( LifecycleSpecificationException e )
- {
- // expected.
- }
- }
-
- private MojoBinding newMojoBinding( String groupId, String artifactId, String goal )
- {
- MojoBinding binding = new MojoBinding();
- binding.setGroupId( groupId );
- binding.setArtifactId( artifactId );
- binding.setGoal( goal );
-
- return binding;
- }
}
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java
new file mode 100644
index 0000000000..5744176421
--- /dev/null
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java
@@ -0,0 +1,98 @@
+package org.apache.maven.lifecycle.plan;
+
+import org.apache.maven.lifecycle.LifecycleLoaderException;
+import org.apache.maven.lifecycle.LifecycleSpecificationException;
+import org.apache.maven.lifecycle.MojoBindingUtils;
+import org.apache.maven.lifecycle.model.BuildBinding;
+import org.apache.maven.lifecycle.model.LifecycleBindings;
+import org.apache.maven.lifecycle.model.MojoBinding;
+import org.apache.maven.lifecycle.statemgmt.StateManagementUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Stack;
+
+import junit.framework.TestCase;
+
+public class BuildPlanTest
+ extends TestCase
+{
+
+ public void testRender_OneDirectInvocationWithForkedPhase_NoLifecycleOverlay()
+ throws LifecycleSpecificationException, LifecycleLoaderException
+ {
+ List check = new ArrayList();
+
+ check.add( StateManagementUtils.createStartForkedExecutionMojoBinding() );
+
+ MojoBinding mb = new MojoBinding();
+ mb.setGroupId( "test" );
+ mb.setArtifactId( "test-plugin" );
+ mb.setVersion( "1" );
+ mb.setGoal( "validate" );
+
+ check.add( mb );
+
+ BuildBinding binding = new BuildBinding();
+ binding.getValidate().addBinding( mb );
+
+ mb = new MojoBinding();
+ mb.setGroupId( "test" );
+ mb.setArtifactId( "test-plugin" );
+ mb.setVersion( "1" );
+ mb.setGoal( "generate-sources" );
+
+ check.add( mb );
+
+ check.add( StateManagementUtils.createClearForkedExecutionMojoBinding() );
+
+ binding.getGenerateSources().addBinding( mb );
+
+ LifecycleBindings bindings = new LifecycleBindings();
+ bindings.setBuildBinding( binding );
+
+ List tasks = Collections.singletonList( "eclipse:eclipse" );
+
+ MojoBinding eclipseBinding = new MojoBinding();
+ eclipseBinding.setGroupId( "org.apache.maven.plugins" );
+ eclipseBinding.setArtifactId( "maven-eclipse-plugin" );
+ eclipseBinding.setVersion( "2.3" );
+ eclipseBinding.setGoal( "eclipse" );
+
+ check.add( eclipseBinding );
+
+ check.add( StateManagementUtils.createEndForkedExecutionMojoBinding() );
+
+ BuildPlan plan = new BuildPlan( new LifecycleBindings(), tasks );
+
+ plan.addDirectInvocationBinding( "eclipse:eclipse", eclipseBinding );
+
+ plan.addForkedExecution( eclipseBinding, new BuildPlan( bindings,
+ Collections.singletonList( "generate-sources" ) ) );
+
+ List executionPlan = plan.renderExecutionPlan( new Stack() );
+
+ assertBindings( check, executionPlan );
+ }
+
+ private void assertBindings( final List check, final List executionPlan )
+ {
+ assertNotNull( executionPlan );
+
+ System.out.println( "Expected execution plan:\n" + String.valueOf( check ).replace( ',', '\n' ) );
+ System.out.println( "\nActual execution plan:\n" + String.valueOf( executionPlan ).replace( ',', '\n' ) );
+
+ assertEquals( "Execution plan does not contain the expected number of mojo bindings.", check.size(),
+ executionPlan.size() );
+ for ( int i = 0; i < check.size(); i++ )
+ {
+ MojoBinding checkBinding = (MojoBinding) check.get( i );
+ MojoBinding realBinding = (MojoBinding) executionPlan.get( i );
+
+ assertEquals( "Expected mojo binding does not match execution plan.",
+ MojoBindingUtils.createMojoBindingKey( checkBinding, true ),
+ MojoBindingUtils.createMojoBindingKey( realBinding, true ) );
+ }
+ }
+}
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/plan/ForkPlanModifierTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/plan/ForkPlanModifierTest.java
deleted file mode 100644
index a96f4df3cd..0000000000
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/plan/ForkPlanModifierTest.java
+++ /dev/null
@@ -1,197 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-import org.apache.maven.lifecycle.model.LifecycleBindings;
-import org.apache.maven.lifecycle.model.MojoBinding;
-import org.apache.maven.lifecycle.statemgmt.StateManagementUtils;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-public class ForkPlanModifierTest
- extends TestCase
-{
-
- public void testModifyBindings_AddTwoMojosAheadOfCompileMojo()
- throws LifecyclePlannerException
- {
- MojoBinding mojo = newMojo( "org.apache.maven.plugins", "maven-compiler-plugin", "compile" );
-
- List additions = new ArrayList();
- additions.add( newMojo( "group", "artifact", "clean" ) );
- additions.add( newMojo( "group", "artifact", "compile" ) );
-
- LifecycleBindings target = new LifecycleBindings();
-
- assertEquals( 0, target.getBuildBinding().getCompile().getBindings().size() );
-
- target.getBuildBinding().getCompile().addBinding( mojo );
-
- assertEquals( 1, target.getBuildBinding().getCompile().getBindings().size() );
-
- target = new ForkPlanModifier( mojo, additions ).modifyBindings( target );
-
- assertEquals( 6, target.getBuildBinding().getCompile().getBindings().size() );
-
- Iterator it = target.getBuildBinding().getCompile().getBindings().iterator();
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.START_FORKED_EXECUTION_GOAL,
- (MojoBinding) it.next() );
-
- assertMojo( "group", "artifact", "clean", (MojoBinding) it.next() );
-
- assertMojo( "group", "artifact", "compile", (MojoBinding) it.next() );
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.END_FORKED_EXECUTION_GOAL,
- (MojoBinding) it.next() );
-
- assertMojo( mojo.getGroupId(), mojo.getArtifactId(), mojo.getGoal(),
- (MojoBinding) it.next() );
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.CLEAR_FORKED_EXECUTION_GOAL, (MojoBinding) it.next() );
-
- }
-
- public void testModifyBindings_AddTwoMojosBetweenTwoExistingCompileMojos()
- throws LifecyclePlannerException
- {
- MojoBinding mojo = newMojo( "org.apache.maven.plugins", "maven-compiler-plugin", "compile" );
- MojoBinding mojo2 = newMojo( "org.apache.maven.plugins", "maven-compiler-plugin", "compile2" );
-
- List additions = new ArrayList();
- additions.add( newMojo( "group", "artifact", "clean" ) );
- additions.add( newMojo( "group", "artifact", "compile" ) );
-
- LifecycleBindings target = new LifecycleBindings();
-
- assertEquals( 0, target.getBuildBinding().getCompile().getBindings().size() );
-
- target.getBuildBinding().getCompile().addBinding( mojo );
- target.getBuildBinding().getCompile().addBinding( mojo2 );
-
- assertEquals( 2, target.getBuildBinding().getCompile().getBindings().size() );
-
- target = new ForkPlanModifier( mojo2, additions ).modifyBindings( target );
-
- assertEquals( 7, target.getBuildBinding().getCompile().getBindings().size() );
-
- Iterator it = target.getBuildBinding().getCompile().getBindings().iterator();
-
- assertMojo( mojo.getGroupId(), mojo.getArtifactId(), mojo.getGoal(),
- (MojoBinding) it.next() );
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.START_FORKED_EXECUTION_GOAL,
- (MojoBinding) it.next() );
-
- assertMojo( "group", "artifact", "clean", (MojoBinding) it.next() );
-
- assertMojo( "group", "artifact", "compile", (MojoBinding) it.next() );
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.END_FORKED_EXECUTION_GOAL,
- (MojoBinding) it.next() );
-
- assertMojo( mojo2.getGroupId(), mojo2.getArtifactId(), mojo2.getGoal(),
- (MojoBinding) it.next() );
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.CLEAR_FORKED_EXECUTION_GOAL, (MojoBinding) it.next() );
-
- }
-
- public void testModifyBindings_AddTwoNormalPlusTwoModifierModifiedMojosWithTwoExistingCompileMojos()
- throws LifecyclePlannerException
- {
- MojoBinding mojo = newMojo( "org.apache.maven.plugins", "maven-compiler-plugin", "compile" );
- MojoBinding mojo2 = newMojo( "org.apache.maven.plugins", "maven-compiler-plugin", "compile2" );
-
- List modAdditions = new ArrayList();
- modAdditions.add( newMojo( "group2", "artifact", "clean" ) );
- modAdditions.add( newMojo( "group2", "artifact", "compile" ) );
-
- MojoBinding mojo3 = newMojo( "group", "artifact", "clean" );
-
- List additions = new ArrayList();
- additions.add( mojo3 );
- additions.add( newMojo( "group", "artifact", "compile" ) );
-
- LifecycleBindings target = new LifecycleBindings();
-
- assertEquals( 0, target.getBuildBinding().getCompile().getBindings().size() );
-
- target.getBuildBinding().getCompile().addBinding( mojo );
- target.getBuildBinding().getCompile().addBinding( mojo2 );
-
- assertEquals( 2, target.getBuildBinding().getCompile().getBindings().size() );
-
- BuildPlanModifier modder = new ForkPlanModifier( mojo, additions );
- modder.addModifier( new ForkPlanModifier( mojo3, modAdditions ) );
-
- target = modder.modifyBindings( target );
-
- assertEquals( 12, target.getBuildBinding().getCompile().getBindings().size() );
-
- Iterator it = target.getBuildBinding().getCompile().getBindings().iterator();
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.START_FORKED_EXECUTION_GOAL,
- (MojoBinding) it.next() );
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.START_FORKED_EXECUTION_GOAL,
- (MojoBinding) it.next() );
-
- assertMojo( "group2", "artifact", "clean", (MojoBinding) it.next() );
-
- assertMojo( "group2", "artifact", "compile", (MojoBinding) it.next() );
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.END_FORKED_EXECUTION_GOAL,
- (MojoBinding) it.next() );
-
- assertMojo( mojo3.getGroupId(), mojo3.getArtifactId(), mojo3.getGoal(),
- (MojoBinding) it.next() );
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.CLEAR_FORKED_EXECUTION_GOAL, (MojoBinding) it.next() );
-
- assertMojo( "group", "artifact", "compile", (MojoBinding) it.next() );
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.END_FORKED_EXECUTION_GOAL,
- (MojoBinding) it.next() );
-
- assertMojo( mojo.getGroupId(), mojo.getArtifactId(), mojo.getGoal(),
- (MojoBinding) it.next() );
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.CLEAR_FORKED_EXECUTION_GOAL, (MojoBinding) it.next() );
-
- assertMojo( mojo2.getGroupId(), mojo2.getArtifactId(), mojo2.getGoal(),
- (MojoBinding) it.next() );
-
- }
-
- private void assertMojo( String groupId, String artifactId, String goal, MojoBinding binding )
- {
- assertEquals( groupId, binding.getGroupId() );
- assertEquals( artifactId, binding.getArtifactId() );
- assertEquals( goal, binding.getGoal() );
- }
-
- private MojoBinding newMojo( String groupId, String artifactId, String goal )
- {
- MojoBinding binding = new MojoBinding();
- binding.setGroupId( groupId );
- binding.setArtifactId( artifactId );
- binding.setGoal( goal );
-
- return binding;
- }
-}
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/plan/LifecycleBuildPlanTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/plan/LifecycleBuildPlanTest.java
deleted file mode 100644
index b38976683b..0000000000
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/plan/LifecycleBuildPlanTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-import org.apache.maven.lifecycle.LifecycleLoaderException;
-import org.apache.maven.lifecycle.LifecycleSpecificationException;
-import org.apache.maven.lifecycle.binding.LifecycleBindingManager;
-import org.apache.maven.lifecycle.model.LifecycleBindings;
-import org.apache.maven.lifecycle.model.MojoBinding;
-import org.apache.maven.lifecycle.statemgmt.StateManagementUtils;
-import org.codehaus.plexus.PlexusTestCase;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-public class LifecycleBuildPlanTest
- extends PlexusTestCase
-{
-
- private LifecycleBindingManager bindingManager;
-
- public void setUp()
- throws Exception
- {
- super.setUp();
-
- bindingManager = (LifecycleBindingManager) lookup( LifecycleBindingManager.ROLE, "default" );
- }
-
- public void testSingleTask_TwoMojoBindings()
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- LifecycleBindings bindings = new LifecycleBindings();
- bindings.getCleanBinding().getPreClean().addBinding( newMojo( "group", "artifact", "pre-clean" ) );
- bindings.getCleanBinding().getClean().addBinding( newMojo( "group", "artifact", "clean" ) );
-
- List plan = new LifecycleBuildPlan( Collections.singletonList( "clean" ), bindings ).getPlanMojoBindings( null,
- bindingManager );
-
- assertEquals( 2, plan.size() );
- assertMojo( "group", "artifact", "pre-clean", (MojoBinding) plan.get( 0 ) );
- assertMojo( "group", "artifact", "clean", (MojoBinding) plan.get( 1 ) );
- }
-
- public void testTwoAdditiveTasksInOrder_ThreeMojoBindings_NoDupes()
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- LifecycleBindings bindings = new LifecycleBindings();
- bindings.getCleanBinding().getPreClean().addBinding( newMojo( "group", "artifact", "pre-clean" ) );
- bindings.getCleanBinding().getClean().addBinding( newMojo( "group", "artifact", "clean" ) );
- bindings.getCleanBinding().getClean().addBinding( newMojo( "group", "artifact", "post-clean" ) );
-
- List tasks = new ArrayList();
- tasks.add( "clean" );
- tasks.add( "post-clean" );
-
- List plan = new LifecycleBuildPlan( tasks, bindings ).getPlanMojoBindings( null, bindingManager );
-
- assertEquals( 3, plan.size() );
- assertMojo( "group", "artifact", "pre-clean", (MojoBinding) plan.get( 0 ) );
- assertMojo( "group", "artifact", "clean", (MojoBinding) plan.get( 1 ) );
- assertMojo( "group", "artifact", "post-clean", (MojoBinding) plan.get( 2 ) );
- }
-
- public void testTwoAdditiveTasksInOrder_TwoMojoBindings_OneMojoModifierInsertedBetween_NoDupes()
- throws LifecycleSpecificationException, LifecyclePlannerException, LifecycleLoaderException
- {
- MojoBinding clean = newMojo( "group", "artifact", "clean" );
-
- List mods = Collections.singletonList( newMojo( "group", "artifact", "pre-clean" ) );
-
- BuildPlanModifier modder = new ForkPlanModifier( clean, mods );
-
- LifecycleBindings bindings = new LifecycleBindings();
- bindings.getCleanBinding().getPreClean().addBinding( clean );
- bindings.getCleanBinding().getClean().addBinding( newMojo( "group", "artifact", "post-clean" ) );
-
- List tasks = new ArrayList();
- tasks.add( "clean" );
- tasks.add( "post-clean" );
-
- BuildPlan lifecyclePlan = new LifecycleBuildPlan( tasks, bindings );
- lifecyclePlan.addModifier( modder );
-
- List plan = lifecyclePlan.getPlanMojoBindings( null, bindingManager );
-
- assertEquals( 6, plan.size() );
- Iterator it = plan.iterator();
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.START_FORKED_EXECUTION_GOAL, (MojoBinding) it.next() );
-
- assertMojo( "group", "artifact", "pre-clean", (MojoBinding) it.next() );
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.END_FORKED_EXECUTION_GOAL, (MojoBinding) it.next() );
-
- assertMojo( "group", "artifact", "clean", (MojoBinding) it.next() );
-
- assertMojo( StateManagementUtils.GROUP_ID, StateManagementUtils.ARTIFACT_ID,
- StateManagementUtils.CLEAR_FORKED_EXECUTION_GOAL, (MojoBinding) it.next() );
-
- assertMojo( "group", "artifact", "post-clean", (MojoBinding) it.next() );
- }
-
- private void assertMojo( String groupId, String artifactId, String goal, MojoBinding binding )
- {
- assertEquals( groupId, binding.getGroupId() );
- assertEquals( artifactId, binding.getArtifactId() );
- assertEquals( goal, binding.getGoal() );
- }
-
- private MojoBinding newMojo( String groupId, String artifactId, String goal )
- {
- MojoBinding binding = new MojoBinding();
- binding.setGroupId( groupId );
- binding.setArtifactId( artifactId );
- binding.setGoal( goal );
-
- return binding;
- }
-}
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/plan/ReportingPlanModifierTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/plan/ReportingPlanModifierTest.java
deleted file mode 100644
index 26b0f772ed..0000000000
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/plan/ReportingPlanModifierTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-package org.apache.maven.lifecycle.plan;
-
-import org.apache.maven.lifecycle.model.LifecycleBindings;
-import org.apache.maven.lifecycle.model.MojoBinding;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-public class ReportingPlanModifierTest
- extends TestCase
-{
-
- public void testModifyBindings_AddTwoMojosAheadOfCompileMojo()
- throws LifecyclePlannerException
- {
- MojoBinding mojo = newMojo( "org.apache.maven.plugins", "maven-compiler-plugin", "compile" );
-
- List additions = new ArrayList();
- additions.add( newMojo( "group", "artifact", "clean" ) );
- additions.add( newMojo( "group", "artifact", "compile" ) );
-
- LifecycleBindings target = new LifecycleBindings();
-
- assertEquals( 0, target.getBuildBinding().getCompile().getBindings().size() );
-
- target.getBuildBinding().getCompile().addBinding( mojo );
-
- assertEquals( 1, target.getBuildBinding().getCompile().getBindings().size() );
-
- target = new ReportingPlanModifier( mojo, additions ).modifyBindings( target );
-
- assertEquals( 3, target.getBuildBinding().getCompile().getBindings().size() );
-
- Iterator it = target.getBuildBinding().getCompile().getBindings().iterator();
-
- assertMojo( "group", "artifact", "clean", (MojoBinding) it.next() );
-
- assertMojo( "group", "artifact", "compile", (MojoBinding) it.next() );
-
- assertMojo( mojo.getGroupId(), mojo.getArtifactId(), mojo.getGoal(), (MojoBinding) it.next() );
- }
-
- public void testModifyBindings_AddTwoMojosBetweenTwoExistingCompileMojos()
- throws LifecyclePlannerException
- {
- MojoBinding mojo = newMojo( "org.apache.maven.plugins", "maven-compiler-plugin", "compile" );
- MojoBinding mojo2 = newMojo( "org.apache.maven.plugins", "maven-compiler-plugin", "compile2" );
-
- List additions = new ArrayList();
- additions.add( newMojo( "group", "artifact", "clean" ) );
- additions.add( newMojo( "group", "artifact", "compile" ) );
-
- LifecycleBindings target = new LifecycleBindings();
-
- assertEquals( 0, target.getBuildBinding().getCompile().getBindings().size() );
-
- target.getBuildBinding().getCompile().addBinding( mojo );
- target.getBuildBinding().getCompile().addBinding( mojo2 );
-
- assertEquals( 2, target.getBuildBinding().getCompile().getBindings().size() );
-
- target = new ReportingPlanModifier( mojo2, additions ).modifyBindings( target );
-
- assertEquals( 4, target.getBuildBinding().getCompile().getBindings().size() );
-
- Iterator it = target.getBuildBinding().getCompile().getBindings().iterator();
-
- assertMojo( mojo.getGroupId(), mojo.getArtifactId(), mojo.getGoal(), (MojoBinding) it.next() );
-
- assertMojo( "group", "artifact", "clean", (MojoBinding) it.next() );
-
- assertMojo( "group", "artifact", "compile", (MojoBinding) it.next() );
-
- assertMojo( mojo2.getGroupId(), mojo2.getArtifactId(), mojo2.getGoal(), (MojoBinding) it.next() );
-
- }
-
- public void testModifyBindings_AddTwoNormalPlusTwoModifierModifiedMojosWithTwoExistingCompileMojos()
- throws LifecyclePlannerException
- {
- MojoBinding mojo = newMojo( "org.apache.maven.plugins", "maven-compiler-plugin", "compile" );
- MojoBinding mojo2 = newMojo( "org.apache.maven.plugins", "maven-compiler-plugin", "compile2" );
-
- List modAdditions = new ArrayList();
- modAdditions.add( newMojo( "group2", "artifact", "clean" ) );
- modAdditions.add( newMojo( "group2", "artifact", "compile" ) );
-
- MojoBinding mojo3 = newMojo( "group", "artifact", "clean" );
-
- List additions = new ArrayList();
- additions.add( mojo3 );
- additions.add( newMojo( "group", "artifact", "compile" ) );
-
- LifecycleBindings target = new LifecycleBindings();
-
- assertEquals( 0, target.getBuildBinding().getCompile().getBindings().size() );
-
- target.getBuildBinding().getCompile().addBinding( mojo );
- target.getBuildBinding().getCompile().addBinding( mojo2 );
-
- assertEquals( 2, target.getBuildBinding().getCompile().getBindings().size() );
-
- BuildPlanModifier modder = new ReportingPlanModifier( mojo, additions );
- modder.addModifier( new ReportingPlanModifier( mojo3, modAdditions ) );
-
- target = modder.modifyBindings( target );
-
- assertEquals( 6, target.getBuildBinding().getCompile().getBindings().size() );
-
- Iterator it = target.getBuildBinding().getCompile().getBindings().iterator();
-
- assertMojo( "group2", "artifact", "clean", (MojoBinding) it.next() );
-
- assertMojo( "group2", "artifact", "compile", (MojoBinding) it.next() );
-
- assertMojo( mojo3.getGroupId(), mojo3.getArtifactId(), mojo3.getGoal(), (MojoBinding) it.next() );
-
- assertMojo( "group", "artifact", "compile", (MojoBinding) it.next() );
-
- assertMojo( mojo.getGroupId(), mojo.getArtifactId(), mojo.getGoal(), (MojoBinding) it.next() );
-
- assertMojo( mojo2.getGroupId(), mojo2.getArtifactId(), mojo2.getGoal(), (MojoBinding) it.next() );
-
- }
-
- private void assertMojo( String groupId, String artifactId, String goal, MojoBinding binding )
- {
- assertEquals( groupId, binding.getGroupId() );
- assertEquals( artifactId, binding.getArtifactId() );
- assertEquals( goal, binding.getGoal() );
- }
-
- private MojoBinding newMojo( String groupId, String artifactId, String goal )
- {
- MojoBinding binding = new MojoBinding();
- binding.setGroupId( groupId );
- binding.setArtifactId( artifactId );
- binding.setGoal( goal );
-
- return binding;
- }
-
-}
diff --git a/maven-embedder/pom.xml b/maven-embedder/pom.xml
index 9951385d4a..563cd4a539 100644
--- a/maven-embedder/pom.xml
+++ b/maven-embedder/pom.xml
@@ -42,7 +42,7 @@ under the License.
maven-assembly-plugin
- 2.1
+ 2.2-beta-1
src/main/assembly/bin.xml
maven-${version}
@@ -51,7 +51,7 @@ under the License.
install
- attached
+ single
diff --git a/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/LifecycleUtils.java b/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/LifecycleUtils.java
index d5eef58ece..689371aea6 100644
--- a/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/LifecycleUtils.java
+++ b/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/LifecycleUtils.java
@@ -22,7 +22,7 @@ private LifecycleUtils()
{
}
- public static void setOrigin( LifecycleBindings bindings, String origin )
+ public static void setOrigin( final LifecycleBindings bindings, final String origin )
{
for ( Iterator bindingIt = bindings.getBindingList().iterator(); bindingIt.hasNext(); )
{
@@ -52,7 +52,7 @@ public static void setOrigin( LifecycleBindings bindings, String origin )
}
}
- public static List getMojoBindingListForLifecycle( String stopPhase, LifecycleBindings bindings )
+ public static List getMojoBindingListForLifecycle( final String stopPhase, final LifecycleBindings bindings )
throws NoSuchPhaseException
{
LifecycleBinding binding = findLifecycleBindingForPhase( stopPhase, bindings );
@@ -65,7 +65,7 @@ public static List getMojoBindingListForLifecycle( String stopPhase, LifecycleBi
return getMojoBindingListForLifecycle( stopPhase, binding );
}
- public static List getMojoBindingListForLifecycle( String stopPhase, LifecycleBinding lifecycle )
+ public static List getMojoBindingListForLifecycle( final String stopPhase, final LifecycleBinding lifecycle )
throws NoSuchPhaseException
{
List phaseNames = lifecycle.getPhaseNamesInOrder();
@@ -85,7 +85,7 @@ public static List getMojoBindingListForLifecycle( String stopPhase, LifecycleBi
Phase phase = (Phase) phases.get( i );
List phaseBindings = phase.getBindings();
- if ( phaseBindings != null && !phaseBindings.isEmpty() )
+ if ( ( phaseBindings != null ) && !phaseBindings.isEmpty() )
{
bindings.addAll( phaseBindings );
}
@@ -97,7 +97,8 @@ public static List getMojoBindingListForLifecycle( String stopPhase, LifecycleBi
/**
* @return null if the phase is not contained in any of the lifecycles.
*/
- public static LifecycleBinding findLifecycleBindingForPhase( String phaseName, LifecycleBindings lifecycles )
+ public static LifecycleBinding findLifecycleBindingForPhase( final String phaseName,
+ final LifecycleBindings lifecycles )
{
List lifecyclesAvailable = lifecycles.getBindingList();
@@ -114,8 +115,8 @@ public static LifecycleBinding findLifecycleBindingForPhase( String phaseName, L
return null;
}
- public static void removeMojoBinding( String phaseName, MojoBinding mojoBinding, LifecycleBinding lifecycleBinding,
- boolean considerExecutionId )
+ public static void removeMojoBinding( final String phaseName, final MojoBinding mojoBinding,
+ final LifecycleBinding lifecycleBinding, final boolean considerExecutionId )
throws NoSuchPhaseException
{
List phaseNames = lifecycleBinding.getPhaseNamesInOrder();
@@ -125,7 +126,7 @@ public static void removeMojoBinding( String phaseName, MojoBinding mojoBinding,
if ( idx < 0 )
{
throw new NoSuchPhaseException( phaseName, "Phase: " + phaseName + " not found in lifecycle: "
- + lifecycleBinding.getId() );
+ + lifecycleBinding.getId() );
}
List phases = lifecycleBinding.getPhasesInOrder();
@@ -136,13 +137,13 @@ public static void removeMojoBinding( String phaseName, MojoBinding mojoBinding,
{
List mojoBindings = phase.getBindings();
- String targetKey = createMojoBindingKey( mojoBinding, considerExecutionId );
+ String targetKey = MojoBindingUtils.createMojoBindingKey( mojoBinding, considerExecutionId );
for ( Iterator it = mojoBindings.iterator(); it.hasNext(); )
{
MojoBinding candidate = (MojoBinding) it.next();
- String candidateKey = createMojoBindingKey( candidate, considerExecutionId );
+ String candidateKey = MojoBindingUtils.createMojoBindingKey( candidate, considerExecutionId );
if ( candidateKey.equals( targetKey ) )
{
it.remove();
@@ -153,8 +154,8 @@ public static void removeMojoBinding( String phaseName, MojoBinding mojoBinding,
}
}
- public static void addMojoBinding( String phaseName, MojoBinding mojoBinding, LifecycleBinding lifecycleBinding )
- throws NoSuchPhaseException
+ public static void addMojoBinding( final String phaseName, final MojoBinding mojoBinding,
+ final LifecycleBinding lifecycleBinding ) throws NoSuchPhaseException
{
List phaseNames = lifecycleBinding.getPhaseNamesInOrder();
@@ -163,7 +164,7 @@ public static void addMojoBinding( String phaseName, MojoBinding mojoBinding, Li
if ( idx < 0 )
{
throw new NoSuchPhaseException( phaseName, "Phase: " + phaseName + " not found in lifecycle: "
- + lifecycleBinding.getId() );
+ + lifecycleBinding.getId() );
}
List phases = lifecycleBinding.getPhasesInOrder();
@@ -172,7 +173,7 @@ public static void addMojoBinding( String phaseName, MojoBinding mojoBinding, Li
phase.addBinding( mojoBinding );
}
- public static void addMojoBinding( String phaseName, MojoBinding mojo, LifecycleBindings bindings )
+ public static void addMojoBinding( final String phaseName, final MojoBinding mojo, final LifecycleBindings bindings )
throws LifecycleSpecificationException
{
LifecycleBinding binding = findLifecycleBindingForPhase( phaseName, bindings );
@@ -185,21 +186,25 @@ public static void addMojoBinding( String phaseName, MojoBinding mojo, Lifecycle
addMojoBinding( phaseName, mojo, binding );
}
- public static LifecycleBindings mergeBindings( LifecycleBindings existingBindings, LifecycleBindings newBindings,
- LifecycleBindings defaultBindings, boolean mergeConfigIfExecutionIdMatches )
+ public static LifecycleBindings mergeBindings( final LifecycleBindings existingBindings,
+ final LifecycleBindings newBindings,
+ final LifecycleBindings defaultBindings,
+ final boolean mergeConfigIfExecutionIdMatches )
{
return mergeBindings( existingBindings, newBindings, defaultBindings, mergeConfigIfExecutionIdMatches, false );
}
- public static LifecycleBindings mergeBindings( LifecycleBindings existingBindings, LifecycleBindings newBindings,
- LifecycleBindings defaultBindings, boolean mergeConfigIfExecutionIdMatches,
- boolean reverseConfigMergeDirection )
+ public static LifecycleBindings mergeBindings( final LifecycleBindings existingBindings,
+ final LifecycleBindings newBindings,
+ final LifecycleBindings defaultBindings,
+ final boolean mergeConfigIfExecutionIdMatches,
+ final boolean reverseConfigMergeDirection )
{
LifecycleBindings result = new LifecycleBindings();
result.setPackaging( newBindings.getPackaging() );
CleanBinding cb = (CleanBinding) cloneBinding( existingBindings.getCleanBinding() );
- if ( defaultBindings != null && isNullOrEmpty( cb ) )
+ if ( ( defaultBindings != null ) && isNullOrEmpty( cb ) )
{
cb = (CleanBinding) cloneBinding( defaultBindings.getCleanBinding() );
}
@@ -212,7 +217,7 @@ public static LifecycleBindings mergeBindings( LifecycleBindings existingBinding
result.setCleanBinding( cb );
BuildBinding bb = (BuildBinding) cloneBinding( existingBindings.getBuildBinding() );
- if ( defaultBindings != null && isNullOrEmpty( bb ) )
+ if ( ( defaultBindings != null ) && isNullOrEmpty( bb ) )
{
bb = (BuildBinding) cloneBinding( defaultBindings.getBuildBinding() );
}
@@ -225,7 +230,7 @@ public static LifecycleBindings mergeBindings( LifecycleBindings existingBinding
result.setBuildBinding( bb );
SiteBinding sb = (SiteBinding) cloneBinding( existingBindings.getSiteBinding() );
- if ( defaultBindings != null && isNullOrEmpty( sb ) )
+ if ( ( defaultBindings != null ) && isNullOrEmpty( sb ) )
{
sb = (SiteBinding) cloneBinding( defaultBindings.getSiteBinding() );
}
@@ -251,7 +256,7 @@ public static LifecycleBindings mergeBindings( LifecycleBindings existingBinding
Phase phase = (Phase) phases.get( i );
String name = (String) phaseNames.get( i );
- if ( phase != null && phase.getBindings() != null && !phase.getBindings().isEmpty() )
+ if ( ( phase != null ) && ( phase.getBindings() != null ) && !phase.getBindings().isEmpty() )
{
for ( Iterator phaseIt = phase.getBindings().iterator(); phaseIt.hasNext(); )
{
@@ -261,40 +266,46 @@ public static LifecycleBindings mergeBindings( LifecycleBindings existingBinding
if ( mergeConfigIfExecutionIdMatches )
{
- MojoBinding matchingBinding = findMatchingMojoBinding( mojoBinding, existingBindings, true );
+ MojoBinding matchingBinding =
+ findMatchingMojoBinding( mojoBinding, existingBindings, true );
if ( matchingBinding != null )
{
Xpp3Dom existingConfig = new Xpp3Dom( (Xpp3Dom) matchingBinding.getConfiguration() );
-
+
Xpp3Dom configuration;
if ( reverseConfigMergeDirection )
{
- configuration = Xpp3Dom.mergeXpp3Dom( existingConfig, (Xpp3Dom) mojoBinding.getConfiguration() );
+ configuration =
+ Xpp3Dom.mergeXpp3Dom( existingConfig,
+ (Xpp3Dom) mojoBinding.getConfiguration() );
}
else
{
- configuration = Xpp3Dom.mergeXpp3Dom( (Xpp3Dom) mojoBinding.getConfiguration(), existingConfig );
+ configuration =
+ Xpp3Dom.mergeXpp3Dom( (Xpp3Dom) mojoBinding.getConfiguration(),
+ existingConfig );
}
mojoBinding.setConfiguration( configuration );
-
- if ( mojoBinding.getOrigin() == null && matchingBinding.getOrigin() != null )
+
+ if ( ( mojoBinding.getOrigin() == null ) && ( matchingBinding.getOrigin() != null ) )
{
mojoBinding.setOrigin( matchingBinding.getOrigin() );
}
-
+
LifecycleBinding resultBinding = findLifecycleBindingForPhase( name, result );
-
+
try
{
removeMojoBinding( name, matchingBinding, resultBinding, true );
}
catch ( NoSuchPhaseException e )
{
- IllegalStateException error = new IllegalStateException(
- e.getMessage()
- + "\nSomething strange is going on. Merging should not encounter such inconsistencies." );
+ IllegalStateException error =
+ new IllegalStateException(
+ e.getMessage()
+ + "\nSomething strange is going on. Merging should not encounter such inconsistencies." );
error.initCause( e );
@@ -311,9 +322,9 @@ public static LifecycleBindings mergeBindings( LifecycleBindings existingBinding
{
// NOTE: this shouldn't happen as long as normal components are used
// to create/read these LifecycleBindings instances.
- IllegalArgumentException error = new IllegalArgumentException(
- "Project bindings are invalid. Reason: "
- + e.getMessage() );
+ IllegalArgumentException error =
+ new IllegalArgumentException( "Project bindings are invalid. Reason: "
+ + e.getMessage() );
error.initCause( e );
@@ -328,35 +339,36 @@ public static LifecycleBindings mergeBindings( LifecycleBindings existingBinding
return result;
}
- private static boolean isNullOrEmpty( LifecycleBinding binding )
+ private static boolean isNullOrEmpty( final LifecycleBinding binding )
{
if ( binding == null )
{
return true;
}
-
+
for ( Iterator it = binding.getPhasesInOrder().iterator(); it.hasNext(); )
{
Phase phase = (Phase) it.next();
-
+
if ( !phase.getBindings().isEmpty() )
{
return false;
}
}
-
+
return true;
}
- public static MojoBinding findMatchingMojoBinding( MojoBinding mojoBinding, LifecycleBindings inBindings,
- boolean considerExecutionId )
+ public static MojoBinding findMatchingMojoBinding( final MojoBinding mojoBinding,
+ final LifecycleBindings inBindings,
+ final boolean considerExecutionId )
{
- String key = createMojoBindingKey( mojoBinding, considerExecutionId );
+ String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, considerExecutionId );
return (MojoBinding) mapMojoBindingsByKey( inBindings, considerExecutionId ).get( key );
}
- private static Map mapMojoBindingsByKey( LifecycleBindings bindings, boolean considerExecutionId )
+ private static Map mapMojoBindingsByKey( final LifecycleBindings bindings, final boolean considerExecutionId )
{
Map byKey = new HashMap();
@@ -376,7 +388,8 @@ private static Map mapMojoBindingsByKey( LifecycleBindings bindings, boolean con
{
MojoBinding mojoBinding = (MojoBinding) mojoIt.next();
- byKey.put( createMojoBindingKey( mojoBinding, considerExecutionId ), mojoBinding );
+ byKey.put( MojoBindingUtils.createMojoBindingKey( mojoBinding, considerExecutionId ),
+ mojoBinding );
}
}
}
@@ -386,8 +399,8 @@ private static Map mapMojoBindingsByKey( LifecycleBindings bindings, boolean con
return byKey;
}
- public static void removeMojoBindings( List toRemove, LifecycleBindings bindings, boolean considerExecutionId )
- throws NoSuchPhaseException
+ public static void removeMojoBindings( final List toRemove, final LifecycleBindings bindings,
+ final boolean considerExecutionId ) throws NoSuchPhaseException
{
if ( bindings.getCleanBinding() != null )
{
@@ -405,8 +418,8 @@ public static void removeMojoBindings( List toRemove, LifecycleBindings bindings
}
}
- public static void removeMojoBindings( List toRemove, LifecycleBinding removeFrom, boolean considerExecutionId )
- throws NoSuchPhaseException
+ public static void removeMojoBindings( final List toRemove, final LifecycleBinding removeFrom,
+ final boolean considerExecutionId ) throws NoSuchPhaseException
{
// remove where gid:aid:goal matches.
List targets = new ArrayList();
@@ -414,7 +427,7 @@ public static void removeMojoBindings( List toRemove, LifecycleBinding removeFro
{
MojoBinding binding = (MojoBinding) it.next();
- targets.add( createMojoBindingKey( binding, considerExecutionId ) );
+ targets.add( MojoBindingUtils.createMojoBindingKey( binding, considerExecutionId ) );
}
List phases = removeFrom.getPhasesInOrder();
@@ -427,7 +440,7 @@ public static void removeMojoBindings( List toRemove, LifecycleBinding removeFro
for ( Iterator mojoIt = phaseBindings.iterator(); mojoIt.hasNext(); )
{
MojoBinding binding = (MojoBinding) mojoIt.next();
- String key = createMojoBindingKey( binding, considerExecutionId );
+ String key = MojoBindingUtils.createMojoBindingKey( binding, considerExecutionId );
if ( targets.contains( key ) )
{
mojoIt.remove();
@@ -438,19 +451,7 @@ public static void removeMojoBindings( List toRemove, LifecycleBinding removeFro
}
}
- public static String createMojoBindingKey( MojoBinding mojoBinding, boolean considerExecutionId )
- {
- String key = mojoBinding.getGroupId() + ":" + mojoBinding.getArtifactId() + ":" + mojoBinding.getGoal();
-
- if ( considerExecutionId )
- {
- key += ":" + mojoBinding.getExecutionId();
- }
-
- return key;
- }
-
- public static LifecycleBindings cloneBindings( LifecycleBindings bindings )
+ public static LifecycleBindings cloneBindings( final LifecycleBindings bindings )
{
LifecycleBindings result = new LifecycleBindings();
@@ -472,7 +473,7 @@ public static LifecycleBindings cloneBindings( LifecycleBindings bindings )
return result;
}
- public static LifecycleBinding cloneBinding( LifecycleBinding binding )
+ public static LifecycleBinding cloneBinding( final LifecycleBinding binding )
{
if ( binding == null )
{
@@ -495,7 +496,7 @@ else if ( binding instanceof BuildBinding )
else
{
throw new IllegalArgumentException( "Unrecognized LifecycleBinding type: " + binding.getClass().getName()
- + "; cannot clone." );
+ + "; cannot clone." );
}
List phases = binding.getPhasesInOrder();
@@ -518,8 +519,10 @@ else if ( binding instanceof BuildBinding )
}
catch ( NoSuchPhaseException e )
{
- IllegalStateException error = new IllegalStateException( e.getMessage()
- + "\nSomething strange is going on. Cloning should not encounter such inconsistencies." );
+ IllegalStateException error =
+ new IllegalStateException(
+ e.getMessage()
+ + "\nSomething strange is going on. Cloning should not encounter such inconsistencies." );
error.initCause( e );
@@ -531,7 +534,7 @@ else if ( binding instanceof BuildBinding )
return result;
}
- public static MojoBinding cloneMojoBinding( MojoBinding binding )
+ public static MojoBinding cloneMojoBinding( final MojoBinding binding )
{
MojoBinding result = new MojoBinding();
@@ -546,10 +549,11 @@ public static MojoBinding cloneMojoBinding( MojoBinding binding )
return result;
}
- public static Phase findPhaseForMojoBinding( MojoBinding mojoBinding, LifecycleBindings lifecycleBindings,
- boolean considerExecutionId )
+ public static Phase findPhaseForMojoBinding( final MojoBinding mojoBinding,
+ final LifecycleBindings lifecycleBindings,
+ final boolean considerExecutionId )
{
- String targetKey = createMojoBindingKey( mojoBinding, considerExecutionId );
+ String targetKey = MojoBindingUtils.createMojoBindingKey( mojoBinding, considerExecutionId );
for ( Iterator lifecycleIt = lifecycleBindings.getBindingList().iterator(); lifecycleIt.hasNext(); )
{
@@ -562,7 +566,7 @@ public static Phase findPhaseForMojoBinding( MojoBinding mojoBinding, LifecycleB
for ( Iterator mojoIt = phase.getBindings().iterator(); mojoIt.hasNext(); )
{
MojoBinding candidate = (MojoBinding) mojoIt.next();
- String key = createMojoBindingKey( candidate, considerExecutionId );
+ String key = MojoBindingUtils.createMojoBindingKey( candidate, considerExecutionId );
if ( key.equals( targetKey ) )
{
return phase;
@@ -574,15 +578,16 @@ public static Phase findPhaseForMojoBinding( MojoBinding mojoBinding, LifecycleB
return null;
}
- public static boolean isMojoBindingPresent( MojoBinding binding, List candidates, boolean considerExecutionId )
+ public static boolean isMojoBindingPresent( final MojoBinding binding, final List candidates,
+ final boolean considerExecutionId )
{
- String key = createMojoBindingKey( binding, considerExecutionId );
+ String key = MojoBindingUtils.createMojoBindingKey( binding, considerExecutionId );
for ( Iterator it = candidates.iterator(); it.hasNext(); )
{
MojoBinding candidate = (MojoBinding) it.next();
- String candidateKey = createMojoBindingKey( candidate, considerExecutionId );
+ String candidateKey = MojoBindingUtils.createMojoBindingKey( candidate, considerExecutionId );
if ( candidateKey.equals( key ) )
{
@@ -593,79 +598,87 @@ public static boolean isMojoBindingPresent( MojoBinding binding, List candidates
return false;
}
- public static boolean isValidPhaseName( String phaseName )
+ public static boolean isValidPhaseName( final String phaseName )
{
LifecycleBindings test = new LifecycleBindings();
for ( Iterator it = test.getBindingList().iterator(); it.hasNext(); )
{
LifecycleBinding binding = (LifecycleBinding) it.next();
-
+
if ( binding.getPhaseNamesInOrder().contains( phaseName ) )
{
return true;
}
}
-
+
return false;
}
public static List getValidPhaseNames()
{
List phaseNames = new ArrayList();
-
+
LifecycleBindings bindings = new LifecycleBindings();
for ( Iterator bindingIt = bindings.getBindingList().iterator(); bindingIt.hasNext(); )
{
LifecycleBinding binding = (LifecycleBinding) bindingIt.next();
-
+
for ( Iterator phaseNameIt = binding.getPhaseNamesInOrder().iterator(); phaseNameIt.hasNext(); )
{
phaseNames.add( phaseNameIt.next() );
}
}
-
+
return phaseNames;
}
public static List getValidBuildPhaseNames()
{
List phaseNames = new ArrayList();
-
+
LifecycleBinding binding = new BuildBinding();
-
+
for ( Iterator phaseNameIt = binding.getPhaseNamesInOrder().iterator(); phaseNameIt.hasNext(); )
{
phaseNames.add( phaseNameIt.next() );
}
-
+
return phaseNames;
}
public static List getValidCleanPhaseNames()
{
List phaseNames = new ArrayList();
-
+
LifecycleBinding binding = new CleanBinding();
-
+
for ( Iterator phaseNameIt = binding.getPhaseNamesInOrder().iterator(); phaseNameIt.hasNext(); )
{
phaseNames.add( phaseNameIt.next() );
}
-
+
return phaseNames;
}
public static List getValidSitePhaseNames()
{
List phaseNames = new ArrayList();
-
+
LifecycleBinding binding = new SiteBinding();
-
+
for ( Iterator phaseNameIt = binding.getPhaseNamesInOrder().iterator(); phaseNameIt.hasNext(); )
{
phaseNames.add( phaseNameIt.next() );
}
-
+
return phaseNames;
}
+
+ /**
+ * @deprecated Use {@link MojoBindingUtils#createMojoBindingKey(MojoBinding, boolean)} instead.
+ */
+ public static String createMojoBindingKey( final MojoBinding mojoBinding, final boolean considerExecutionId )
+ {
+ return MojoBindingUtils.createMojoBindingKey( mojoBinding, considerExecutionId );
+ }
}
diff --git a/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/MojoBindingUtils.java b/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/MojoBindingUtils.java
index 5c39bac65a..1e1e7beec0 100644
--- a/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/MojoBindingUtils.java
+++ b/maven-lifecycle/src/main/java/org/apache/maven/lifecycle/MojoBindingUtils.java
@@ -9,10 +9,35 @@ private MojoBindingUtils()
{
}
- public static String toString( MojoBinding mojoBinding )
+ public static String toString( final MojoBinding mojoBinding )
{
return mojoBinding.getGroupId() + ":" + mojoBinding.getArtifactId() + ":"
- + ( mojoBinding.getVersion() == null ? "" : mojoBinding.getVersion() + ":" ) + mojoBinding.getGoal();
+ + ( mojoBinding.getVersion() == null ? "" : mojoBinding.getVersion() + ":" )
+ + mojoBinding.getGoal();
+ }
+
+ public static String createMojoBindingKey( final MojoBinding mojoBinding, final boolean considerExecutionId )
+ {
+ String key = mojoBinding.getGroupId() + ":" + mojoBinding.getArtifactId() + ":" + mojoBinding.getGoal();
+
+ if ( considerExecutionId )
+ {
+ key += ":" + mojoBinding.getExecutionId();
+ }
+
+ return key;
+ }
+
+ public static String createPluginKey( final MojoBinding binding )
+ {
+ String result = binding.getGroupId() + ":" + binding.getArtifactId();
+
+ if ( binding.getVersion() != null )
+ {
+ result += ":" + binding.getVersion();
+ }
+
+ return result;
}
}
diff --git a/maven-lifecycle/src/main/mdo/maven-lifecycle.mdo b/maven-lifecycle/src/main/mdo/maven-lifecycle.mdo
index a2adb708f3..87ff3a7383 100644
--- a/maven-lifecycle/src/main/mdo/maven-lifecycle.mdo
+++ b/maven-lifecycle/src/main/mdo/maven-lifecycle.mdo
@@ -615,6 +615,18 @@
boolean
+
+
+ 1.0.0
+
+
+
diff --git a/pom.xml b/pom.xml
index b4dab2c799..a1d46522fd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,5 +1,4 @@
-
-
-
+-->
4.0.0
org.apache.maven