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: *
*
    - *
  1. report-set-level configuration
  2. - *
  3. reporting-level configuration
  4. - *
  5. execution-level configuration
  6. - *
  7. plugin-level configuration
  8. + *
  9. report-set-level configuration
  10. + *
  11. reporting-level configuration
  12. + *
  13. execution-level configuration
  14. + *
  15. plugin-level configuration
  16. *
*/ - 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: *
*
    - *
  1. report-set-level configuration
  2. - *
  3. reporting-level configuration
  4. - *
  5. execution-level configuration
  6. - *
  7. plugin-level configuration
  8. + *
  9. report-set-level configuration
  10. + *
  11. reporting-level configuration
  12. + *
  13. execution-level configuration
  14. + *
  15. plugin-level configuration
  16. *
*/ - 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