From a9f174c8347f4a66fc218fc6855ce2ff60fb4976 Mon Sep 17 00:00:00 2001 From: Brett Leslie Porter Date: Sat, 18 Jun 2005 13:01:26 +0000 Subject: [PATCH] Clean up of the lifecycle executor, simplify configuration and push back into the plugin manager. This fixed a couple of bugs along the way. One change that this has brought to bear from the document is you now must specify a goal for it to be bound to the LC (see it0008) git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@191285 13f79535-47bb-0310-9956-ffa450edef68 --- maven-core-it/it0008/pom.xml | 5 + .../lifecycle/DefaultLifecycleExecutor.java | 672 +++++++----------- .../maven/lifecycle/LifecycleExecutor.java | 1 - .../maven/plugin/DefaultPluginManager.java | 16 +- .../org/apache/maven/plugin/GoalInstance.java | 205 ------ .../apache/maven/plugin/MojoExecution.java | 54 ++ .../apache/maven/plugin/PluginManager.java | 2 +- .../version/DefaultPluginVersionManager.java | 7 +- .../lifecycle/LifecycleExecutorTest.java | 40 -- maven-model/maven.mdo | 151 ++-- maven-model/pom.xml | 3 +- .../plugin/descriptor/PluginDescriptor.java | 30 +- .../apache/maven/project/MavenProject.java | 66 ++ .../org/apache/maven/project/ModelUtils.java | 75 +- .../DefaultModelInheritanceAssembler.java | 16 +- 15 files changed, 543 insertions(+), 800 deletions(-) delete mode 100644 maven-core/src/main/java/org/apache/maven/plugin/GoalInstance.java create mode 100644 maven-core/src/main/java/org/apache/maven/plugin/MojoExecution.java delete mode 100644 maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java diff --git a/maven-core-it/it0008/pom.xml b/maven-core-it/it0008/pom.xml index 84497f174f..2cc6628beb 100644 --- a/maven-core-it/it0008/pom.xml +++ b/maven-core-it/it0008/pom.xml @@ -19,6 +19,11 @@ org.apache.maven.plugins maven-core-it-plugin 1.0-SNAPSHOT + + + touch + + 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 436a5bf4ae..86325a13a0 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 @@ -16,6 +16,7 @@ package org.apache.maven.lifecycle; * limitations under the License. */ +import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.execution.MavenExecutionResponse; import org.apache.maven.execution.MavenSession; @@ -24,7 +25,7 @@ import org.apache.maven.model.Goal; import org.apache.maven.model.Plugin; import org.apache.maven.model.PluginExecution; import org.apache.maven.model.PluginManagement; -import org.apache.maven.plugin.GoalInstance; +import org.apache.maven.plugin.MojoExecution; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.PluginManager; import org.apache.maven.plugin.PluginManagerException; @@ -48,11 +49,10 @@ import java.util.Map; import java.util.StringTokenizer; /** - * @author Jason van Zyl + * @author Jason van Zyl + * @author Brett Porter * @version $Id: DefaultLifecycleExecutor.java,v 1.16 2005/03/04 09:04:25 * jdcasey Exp $ - * @todo this is structured somewhat confusingly. Attempt to "flatten out" to reduce the number of paths through by - * compiling the list of plugins/tasks first. */ public class DefaultLifecycleExecutor extends AbstractLogEnabled @@ -75,7 +75,7 @@ public class DefaultLifecycleExecutor // ---------------------------------------------------------------------- /** - * Execute a list of tasks. Each task may be a phase in the lifecycle or the + * Execute a task. Each task may be a phase in the lifecycle or the * execution of a mojo. * * @param tasks @@ -90,7 +90,11 @@ public class DefaultLifecycleExecutor try { - processGoals( session, tasks ); + for ( Iterator i = tasks.iterator(); i.hasNext(); ) + { + String task = (String) i.next(); + executeGoal( task, session ); + } } catch ( MojoExecutionException e ) { @@ -108,14 +112,12 @@ public class DefaultLifecycleExecutor return response; } - private void processGoals( MavenSession session, List tasks ) - throws LifecycleExecutionException, PluginNotFoundException, MojoExecutionException, - ArtifactResolutionException + private void executeGoal( String task, MavenSession session ) + throws LifecycleExecutionException, PluginNotFoundException, MojoExecutionException, ArtifactResolutionException { Map phaseMap = new HashMap(); - Map goalInstanceMap = new HashMap(); - String maxPhase = null; + String selectedPhase = null; for ( Iterator i = phases.iterator(); i.hasNext(); ) { @@ -124,192 +126,111 @@ public class DefaultLifecycleExecutor // Make a copy of the phase as we will modify it phaseMap.put( p, new ArrayList() ); - if ( tasks.contains( p ) ) + if ( task.equals( p ) ) { - maxPhase = p; + selectedPhase = p; } } - MavenProject project = session.getProject(); + List goals; - if ( maxPhase != null ) - { - Map mappings; - try - { - LifecycleMapping m = (LifecycleMapping) session.lookup( LifecycleMapping.ROLE, project.getPackaging() ); - mappings = m.getPhases(); - } - catch ( ComponentLookupException e ) - { - getLogger().error( "No lifecycle mapping for type '" + project.getPackaging() + "': using defaults" ); - mappings = defaultPhases; - } - - for ( Iterator i = phases.iterator(); i.hasNext(); ) - { - String phase = (String) i.next(); - - String phaseTasks = (String) mappings.get( phase ); - - if ( phaseTasks != null ) - { - for ( StringTokenizer tok = new StringTokenizer( phaseTasks, "," ); tok.hasMoreTokens(); ) - { - String task = tok.nextToken().trim(); - - MojoDescriptor mojoDescriptor = configureMojo( task, session, phaseMap ); - - addToPhaseMap( phaseMap, phase, mojoDescriptor ); - - List matchingGoalInstances = findMatchingGoalInstances( mojoDescriptor, project ); - - for ( Iterator instanceIterator = matchingGoalInstances.iterator(); instanceIterator.hasNext(); ) - { - GoalInstance goalInstance = (GoalInstance) instanceIterator.next(); - - addToGoalInstanceMap( goalInstanceMap, goalInstance ); - } - } - } - - if ( phase.equals( maxPhase ) ) - { - break; - } - } - } - - processPluginConfiguration( project, session, phaseMap, goalInstanceMap ); - - for ( Iterator i = tasks.iterator(); i.hasNext(); ) - { - String task = (String) i.next(); - - // verify that all loose-leaf goals have had GoalInstance(s) configured for them... - // we only need to do this if the current task is not a phase name. - if ( !phaseMap.containsKey( task ) ) - { - MojoDescriptor mojoDescriptor = getMojoDescriptor( task, session ); - - if ( mojoDescriptor != null && !goalInstanceMap.containsKey( mojoDescriptor ) ) - { - List matchingGoalInstances = findMatchingGoalInstances( mojoDescriptor, project ); - - for ( Iterator instanceIterator = matchingGoalInstances.iterator(); instanceIterator.hasNext(); ) - { - GoalInstance goalInstance = (GoalInstance) instanceIterator.next(); - - addToGoalInstanceMap( goalInstanceMap, goalInstance ); - } - } - } - - // now we can proceed to actually load up the list of goals we're interested in. - List goals = processGoalChain( task, session, phaseMap ); - - for ( Iterator j = goals.iterator(); j.hasNext(); ) - { - MojoDescriptor mojoDescriptor = (MojoDescriptor) j.next(); - - List instances = (List) goalInstanceMap.get( mojoDescriptor ); - - if ( instances != null ) - { - for ( Iterator instanceIterator = instances.iterator(); instanceIterator.hasNext(); ) - { - GoalInstance instance = (GoalInstance) instanceIterator.next(); - - String executePhase = mojoDescriptor.getExecutePhase(); - - if ( executePhase != null ) - { - // TODO: is this too broad to execute? - execute( Collections.singletonList( executePhase ), session ); - } - - try - { - pluginManager.executeMojo( session, instance ); - } - catch ( PluginManagerException e ) - { - throw new LifecycleExecutionException( "Internal error in the plugin manager", e ); - } - } - } - else - { - throw new LifecycleExecutionException( "This goal has not been configured: " - + mojoDescriptor.getGoal() ); - } - } - } - } - - private void addToGoalInstanceMap( Map goalInstanceMap, GoalInstance goalInstance ) - { - MojoDescriptor mojoDescriptor = goalInstance.getMojoDescriptor(); - - List instances = (List) goalInstanceMap.get( mojoDescriptor ); - - if ( instances == null ) - { - instances = new ArrayList(); - - goalInstanceMap.put( mojoDescriptor, instances ); - } - - int idx = instances.indexOf( goalInstance ); - - if ( idx > -1 ) - { - GoalInstance cached = (GoalInstance) instances.get( idx ); - - cached.incorporate( goalInstance ); - } - else - { - instances.add( goalInstance ); - } - } - - private void injectHandlerPluginConfiguration( MavenProject project, String groupId, String artifactId, - String version ) - { - String key = Plugin.constructKey( groupId, artifactId ); - Plugin plugin = (Plugin) project.getBuild().getPluginsAsMap().get( key ); - - if ( plugin == null ) - { - plugin = new Plugin(); - plugin.setGroupId( groupId ); - plugin.setArtifactId( artifactId ); - plugin.setVersion( version ); - - PluginManagement pluginManagement = project.getPluginManagement(); - if ( pluginManagement != null ) - { - Plugin def = (Plugin) pluginManagement.getPluginsAsMap().get( key ); - if ( def != null ) - { - modelDefaultsInjector.mergePluginWithDefaults( plugin, def ); - } - } - - project.addPlugin( plugin ); - } - } - - private void processPluginConfiguration( MavenProject project, MavenSession mavenSession, Map phaseMap, - Map goalInstanceMap ) - throws LifecycleExecutionException, ArtifactResolutionException - { - for ( Iterator i = project.getBuildPlugins().iterator(); i.hasNext(); ) + // Need to verify all the plugins up front, as standalone goals should use the version from the POM. + for ( Iterator i = session.getProject().getBuildPlugins().iterator(); i.hasNext(); ) { Plugin plugin = (Plugin) i.next(); - processPluginPhases( plugin, mavenSession, phaseMap, goalInstanceMap ); + verifyPlugin( plugin, session ); + } + + if ( selectedPhase != null ) + { + // we have a lifecycle phase, so lets bind all the necessary goals + constructLifecyclePhaseMap( session, phaseMap, selectedPhase ); + + goals = processGoalChain( selectedPhase, phaseMap ); + } + else + { + MojoDescriptor mojoDescriptor = getMojoDescriptor( task, session ); + goals = Collections.singletonList( new MojoExecution( mojoDescriptor ) ); + } + + for ( Iterator i = goals.iterator(); i.hasNext(); ) + { + MojoExecution mojoExecution = (MojoExecution) i.next(); + + String executePhase = mojoExecution.getMojoDescriptor().getExecutePhase(); + + if ( executePhase != null ) + { + // TODO: with introduction of cloned lifecyle, we want to avoid reconstructing some things - narrow + executeGoal( executePhase, session ); + } + + try + { + pluginManager.executeMojo( mojoExecution, session ); + } + catch ( PluginManagerException e ) + { + throw new LifecycleExecutionException( "Internal error in the plugin manager", e ); + } + } + } + + private void constructLifecyclePhaseMap( MavenSession session, Map phaseMap, String selectedPhase ) + throws ArtifactResolutionException, LifecycleExecutionException + { + // first, bind those associated with the packaging + bindLifecycleForPackaging( session, phaseMap, selectedPhase ); + + // next, loop over plugins and for any that have a phase, bind it + for ( Iterator i = session.getProject().getBuildPlugins().iterator(); i.hasNext(); ) + { + Plugin plugin = (Plugin) i.next(); + + bindPluginToLifecycle( plugin, session, phaseMap ); + } + } + + private void bindLifecycleForPackaging( MavenSession session, Map phaseMap, String selectedPhase ) + throws ArtifactResolutionException, LifecycleExecutionException + { + Map mappings; + String packaging = session.getProject().getPackaging(); + try + { + LifecycleMapping m = (LifecycleMapping) session.lookup( LifecycleMapping.ROLE, packaging ); + mappings = m.getPhases(); + } + catch ( ComponentLookupException e ) + { + getLogger().error( "No lifecycle mapping for type '" + packaging + "': using defaults" ); + mappings = defaultPhases; + } + + boolean finished = false; + for ( Iterator i = phases.iterator(); i.hasNext() && !finished; ) + { + String phase = (String) i.next(); + + String phaseTasks = (String) mappings.get( phase ); + + if ( phaseTasks != null ) + { + for ( StringTokenizer tok = new StringTokenizer( phaseTasks, "," ); tok.hasMoreTokens(); ) + { + String goal = tok.nextToken().trim(); + + MojoDescriptor mojoDescriptor = getMojoDescriptor( goal, session ); + addToPhaseMap( phaseMap, phase, new MojoExecution( mojoDescriptor ), session.getSettings() ); + } + } + + if ( phase.equals( selectedPhase ) ) + { + finished = true; + } } } @@ -319,10 +240,45 @@ public class DefaultLifecycleExecutor * to execute for that given phase. * * @param session - * @param goalInstanceMap */ - private void processPluginPhases( Plugin plugin, MavenSession session, Map phaseMap, Map goalInstanceMap ) + private void bindPluginToLifecycle( Plugin plugin, MavenSession session, Map phaseMap ) throws LifecycleExecutionException, ArtifactResolutionException + { + if ( plugin.getGoals() != null && !plugin.getGoals().isEmpty() ) + { + getLogger().warn( + "DEPRECATED: goal definitions for plugin '" + plugin.getKey() + "' must be in an executions element" ); + } + + PluginDescriptor pluginDescriptor; + Settings settings = session.getSettings(); + + pluginDescriptor = verifyPlugin( plugin, session ); + + if ( pluginDescriptor.getMojos() != null && !pluginDescriptor.getMojos().isEmpty() ) + { + // use the plugin if inherit was true in a base class, or it is in the current POM, otherwise use the default inheritence setting + if ( plugin.isInheritanceApplied() || pluginDescriptor.isInheritedByDefault() ) + { + bindGoalMapToLifecycle( pluginDescriptor, plugin.getGoalsAsMap(), phaseMap, settings ); + + List executions = plugin.getExecutions(); + + if ( executions != null ) + { + for ( Iterator it = executions.iterator(); it.hasNext(); ) + { + PluginExecution execution = (PluginExecution) it.next(); + + bindExecutionToLifecycle( pluginDescriptor, phaseMap, execution, settings ); + } + } + } + } + } + + private PluginDescriptor verifyPlugin( Plugin plugin, MavenSession session ) + throws ArtifactResolutionException, LifecycleExecutionException { String groupId = plugin.getGroupId(); @@ -333,8 +289,10 @@ public class DefaultLifecycleExecutor PluginDescriptor pluginDescriptor; try { - pluginDescriptor = pluginManager.verifyPlugin( groupId, artifactId, version, session.getProject(), session - .getSettings(), session.getLocalRepository() ); + MavenProject project = session.getProject(); + ArtifactRepository localRepository = session.getLocalRepository(); + pluginDescriptor = pluginManager.verifyPlugin( groupId, artifactId, version, project, session.getSettings(), + localRepository ); } catch ( PluginManagerException e ) { @@ -344,87 +302,80 @@ public class DefaultLifecycleExecutor { throw new LifecycleExecutionException( "Error resolving plugin version", e ); } - - if ( plugin.isInheritanceApplied() || pluginDescriptor.isInheritedByDefault() ) - { - processGoalContainerPhases( plugin, null, pluginDescriptor, session, plugin.getGoalsAsMap(), phaseMap, - goalInstanceMap ); - - List executions = plugin.getExecutions(); - - if ( executions != null ) - { - for ( Iterator it = executions.iterator(); it.hasNext(); ) - { - PluginExecution execution = (PluginExecution) it.next(); - - if ( execution.isInheritanceApplied() ) - { - processGoalContainerPhases( plugin, execution, pluginDescriptor, session, execution - .getGoalsAsMap(), phaseMap, goalInstanceMap ); - } - } - } - } - } - - private void processGoalContainerPhases( Plugin plugin, PluginExecution execution, - PluginDescriptor pluginDescriptor, MavenSession session, Map goalMap, - Map phaseMap, Map goalInstanceMap ) - throws LifecycleExecutionException - { - // ---------------------------------------------------------------------- - // Look to see if the plugin configuration specifies particular mojos - // within the plugin. If this is the case then simply configure the - // mojos the user has specified and ignore the rest. - // ---------------------------------------------------------------------- - - if ( pluginDescriptor.getMojos() != null ) - { - for ( Iterator j = pluginDescriptor.getMojos().iterator(); j.hasNext(); ) - { - MojoDescriptor mojoDescriptor = (MojoDescriptor) j.next(); - - // TODO: remove later - if ( mojoDescriptor.getGoal() == null ) - { - throw new LifecycleExecutionException( "The plugin " + pluginDescriptor.getId() - + " was built with an older version of Maven" ); - } - - Goal goal = (Goal) goalMap.get( mojoDescriptor.getGoal() ); - - if ( goalMap.isEmpty() ) - { - configureMojoPhaseBinding( mojoDescriptor, phaseMap, session.getSettings() ); - - addToGoalInstanceMap( goalInstanceMap, new GoalInstance( plugin, execution, goal, mojoDescriptor ) ); - } - else if ( goal != null ) - { - // We have to check to see that the inheritance rules have been applied before binding this mojo. - if ( goal.isInheritanceApplied() || mojoDescriptor.isInheritedByDefault() ) - { - configureMojoPhaseBinding( mojoDescriptor, phaseMap, session.getSettings() ); - - addToGoalInstanceMap( goalInstanceMap, new GoalInstance( plugin, execution, goal, - mojoDescriptor ) ); - } - } - } - } + return pluginDescriptor; } /** - * Take a look at a mojo contained within a plugin, look to see whether it contributes to a - * phase in the lifecycle and if it does place it at the end of the list of goals - * to execute for the stated phase. - * - * @param mojoDescriptor + * @deprecated */ - private void configureMojoPhaseBinding( MojoDescriptor mojoDescriptor, Map phaseMap, Settings settings ) + private void bindGoalMapToLifecycle( PluginDescriptor pluginDescriptor, Map goalMap, Map phaseMap, + Settings settings ) throws LifecycleExecutionException { + for ( Iterator i = pluginDescriptor.getMojos().iterator(); i.hasNext(); ) + { + MojoDescriptor mojoDescriptor = (MojoDescriptor) i.next(); + + Goal goal = (Goal) goalMap.get( mojoDescriptor.getGoal() ); + + if ( goal != null ) + { + // We have to check to see that the inheritance rules have been applied before binding this mojo. + if ( mojoDescriptor.isInheritedByDefault() ) + { + if ( mojoDescriptor.getPhase() != null ) + { + MojoExecution mojoExecution = new MojoExecution( mojoDescriptor ); + addToPhaseMap( phaseMap, mojoDescriptor.getPhase(), mojoExecution, settings ); + } + } + } + } + } + + private void bindExecutionToLifecycle( PluginDescriptor pluginDescriptor, Map phaseMap, PluginExecution execution, + Settings settings ) + throws LifecycleExecutionException + { + for ( Iterator i = execution.getGoals().iterator(); i.hasNext(); ) + { + String goal = (String) i.next(); + + MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( goal ); + if ( mojoDescriptor == null ) + { + throw new LifecycleExecutionException( "Goal from the POM '" + goal + "' was not found in the plugin" ); + } + + // We have to check to see that the inheritance rules have been applied before binding this mojo. + if ( execution.isInheritanceApplied() || mojoDescriptor.isInheritedByDefault() ) + { + MojoExecution mojoExecution = new MojoExecution( mojoDescriptor, execution.getId() ); + if ( execution.getPhase() != null ) + { + addToPhaseMap( phaseMap, execution.getPhase(), mojoExecution, settings ); + } + else if ( mojoDescriptor.getPhase() != null ) + { + // if the phase was not in the configuration, use the phase in the descriptor + addToPhaseMap( phaseMap, mojoDescriptor.getPhase(), mojoExecution, settings ); + } + } + } + } + + private void addToPhaseMap( Map phaseMap, String phase, MojoExecution mojoExecution, Settings settings ) + throws LifecycleExecutionException + { + List goals = (List) phaseMap.get( phase ); + + if ( goals == null ) + { + String message = "Required phase '" + phase + "' not found"; + throw new LifecycleExecutionException( message ); + } + + MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor(); if ( settings.isOffline() && mojoDescriptor.isOnlineRequired() ) { String goal = mojoDescriptor.getGoal(); @@ -432,130 +383,31 @@ public class DefaultLifecycleExecutor } else { - if ( mojoDescriptor.getPhase() != null ) - { - addToPhaseMap( phaseMap, mojoDescriptor.getPhase(), mojoDescriptor ); - } + goals.add( mojoExecution ); } } - private void addToPhaseMap( Map phaseMap, String phase, MojoDescriptor mojoDescriptor ) - throws LifecycleExecutionException - { - if ( phase != null ) - { - List goals = (List) phaseMap.get( phase ); - - if ( goals == null ) - { - String message = "Required phase '" + phase + "' not found"; - throw new LifecycleExecutionException( message ); - } - - if ( !goals.contains( mojoDescriptor ) ) - { - goals.add( mojoDescriptor ); - } - } - } - - private List processGoalChain( String task, MavenSession session, Map phaseMap ) - throws LifecycleExecutionException, ArtifactResolutionException + private List processGoalChain( String task, Map phaseMap ) { List goals = new ArrayList(); - if ( phaseMap.containsKey( task ) ) + // only execute up to the given phase + int index = phases.indexOf( task ); + + for ( int i = 0; i <= index; i++ ) { - // only execute up to the given phase - int index = phases.indexOf( task ); + String p = (String) phases.get( i ); - for ( int j = 0; j <= index; j++ ) + List phaseGoals = (List) phaseMap.get( p ); + + if ( phaseGoals != null ) { - String p = (String) phases.get( j ); - - List phaseGoals = (List) phaseMap.get( p ); - - if ( phaseGoals != null ) - { - goals.addAll( phaseGoals ); - } + goals.addAll( phaseGoals ); } } - else - { - MojoDescriptor mojoDescriptor = configureMojo( task, session, phaseMap ); - - goals.add( mojoDescriptor ); - } - return goals; } - private MojoDescriptor configureMojo( String task, MavenSession session, Map phaseMap ) - throws LifecycleExecutionException, ArtifactResolutionException - { - MojoDescriptor mojoDescriptor = getMojoDescriptor( task, session ); - - configureMojoPhaseBinding( mojoDescriptor, phaseMap, session.getSettings() ); - - return mojoDescriptor; - } - - private List findMatchingGoalInstances( MojoDescriptor mojoDescriptor, MavenProject project ) - { - PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor(); - - List plugins = project.getBuildPlugins(); - - List matchingSteps = new ArrayList(); - - Plugin plugin = null; - - for ( Iterator it = plugins.iterator(); it.hasNext(); ) - { - plugin = (Plugin) it.next(); - - if ( pluginDescriptor.getPluginLookupKey().equals( plugin.getKey() ) ) - { - String mojoGoal = mojoDescriptor.getGoal(); - - Goal unattached = (Goal) plugin.getGoalsAsMap().get( mojoDescriptor.getGoal() ); - - if ( unattached != null ) - { - matchingSteps.add( new GoalInstance( plugin, unattached, mojoDescriptor ) ); - } - - List executions = plugin.getExecutions(); - - if ( executions != null ) - { - for ( Iterator executionIterator = executions.iterator(); executionIterator.hasNext(); ) - { - PluginExecution execution = (PluginExecution) executionIterator.next(); - - Goal attached = (Goal) execution.getGoalsAsMap().get( mojoDescriptor.getGoal() ); - - if ( attached != null ) - { - matchingSteps.add( new GoalInstance( plugin, execution, attached, mojoDescriptor ) ); - } - } - } - - break; - } - } - - // if nothing is configured, then we need to add a "fully detached" step... - if ( matchingSteps.isEmpty() ) - { - matchingSteps.add( new GoalInstance( mojoDescriptor ) ); - } - - return matchingSteps; - } - private MojoDescriptor getMojoDescriptor( String task, MavenSession session ) throws ArtifactResolutionException, LifecycleExecutionException { @@ -590,18 +442,17 @@ public class DefaultLifecycleExecutor } else { - 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 LifecycleExecutionException( message ); } + MavenProject project = session.getProject(); if ( pluginDescriptor == null ) { try { - injectHandlerPluginConfiguration( session.getProject(), groupId, artifactId, version ); - - pluginDescriptor = pluginManager.verifyPlugin( groupId, artifactId, version, session.getProject(), + pluginDescriptor = pluginManager.verifyPlugin( groupId, artifactId, version, project, session.getSettings(), session.getLocalRepository() ); } catch ( PluginManagerException e ) @@ -613,33 +464,11 @@ public class DefaultLifecycleExecutor throw new LifecycleExecutionException( "Error resolving plugin version", e ); } } - else - { - injectHandlerPluginConfiguration( session.getProject(), pluginDescriptor.getGroupId(), pluginDescriptor - .getArtifactId(), pluginDescriptor.getVersion() ); - } - MojoDescriptor mojoDescriptor = null; - - if ( pluginDescriptor.getMojos() != null ) - { - // TODO: should be able to create a Map from this - for ( Iterator i = pluginDescriptor.getMojos().iterator(); i.hasNext() && mojoDescriptor == null; ) - { - MojoDescriptor desc = (MojoDescriptor) i.next(); - if ( desc.getGoal().equals( goal ) ) - { - mojoDescriptor = desc; - } - } - } - else - { - throw new LifecycleExecutionException( "The plugin " + pluginDescriptor.getGroupId() + ":" - + pluginDescriptor.getArtifactId() + ":" + pluginDescriptor.getVersion() - + " doesn't contain any mojo. Check if it isn't corrupted." ); - } + injectHandlerPluginConfiguration( project, pluginDescriptor.getGroupId(), pluginDescriptor.getArtifactId(), + pluginDescriptor.getVersion() ); + MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( goal ); if ( mojoDescriptor == null ) { throw new LifecycleExecutionException( "Required goal not found: " + task ); @@ -648,9 +477,30 @@ public class DefaultLifecycleExecutor return mojoDescriptor; } - public List getPhases() + private void injectHandlerPluginConfiguration( MavenProject project, String groupId, String artifactId, + String version ) { - return phases; - } + String key = Plugin.constructKey( groupId, artifactId ); + Plugin plugin = (Plugin) project.getBuild().getPluginsAsMap().get( key ); + if ( plugin == null ) + { + plugin = new Plugin(); + plugin.setGroupId( groupId ); + plugin.setArtifactId( artifactId ); + plugin.setVersion( version ); + + PluginManagement pluginManagement = project.getPluginManagement(); + if ( pluginManagement != null ) + { + Plugin def = (Plugin) pluginManagement.getPluginsAsMap().get( key ); + if ( def != null ) + { + modelDefaultsInjector.mergePluginWithDefaults( plugin, def ); + } + } + + project.addPlugin( plugin ); + } + } } diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java b/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java index 6c31bfeb8f..5647cdb59b 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java @@ -32,5 +32,4 @@ public interface LifecycleExecutor MavenExecutionResponse execute( List tasks, MavenSession session ) throws LifecycleExecutionException; - List getPhases(); } diff --git a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java index 0e038655b9..c9d7ab83c9 100644 --- a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java +++ b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java @@ -346,12 +346,12 @@ public class DefaultPluginManager // Mojo execution // ---------------------------------------------------------------------- - public void executeMojo( MavenSession session, GoalInstance goalInstance ) + public void executeMojo( MojoExecution mojoExecution, MavenSession session ) throws ArtifactResolutionException, PluginManagerException, MojoExecutionException { PlexusContainer pluginContainer = null; - MojoDescriptor mojoDescriptor = goalInstance.getMojoDescriptor(); + MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor(); if ( mojoDescriptor.isDependencyResolutionRequired() != null ) { @@ -409,11 +409,13 @@ public class DefaultPluginManager plugin = (Mojo) pluginContainer.lookup( Mojo.ROLE, mojoDescriptor.getRoleHint() ); plugin.setLog( mojoLogger ); - String goalId = goalInstance.getGoalId(); - PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor(); - Xpp3Dom dom = goalInstance.getCalculatedConfiguration(); + String goalId = mojoDescriptor.getGoal(); + String groupId = pluginDescriptor.getGroupId(); + String artifactId = pluginDescriptor.getArtifactId(); + String executionId = mojoExecution.getExecutionId(); + Xpp3Dom dom = session.getProject().getGoalConfiguration( groupId, artifactId, executionId, goalId ); PlexusConfiguration pomConfiguration; if ( dom == null ) @@ -451,9 +453,9 @@ public class DefaultPluginManager String goalExecId = goalName; - if ( goalInstance.getExecutionId() != null ) + if ( mojoExecution.getExecutionId() != null ) { - goalExecId += " {execution: " + goalInstance.getExecutionId() + "}"; + goalExecId += " {execution: " + mojoExecution.getExecutionId() + "}"; } dispatcher.dispatchStart( event, goalExecId ); diff --git a/maven-core/src/main/java/org/apache/maven/plugin/GoalInstance.java b/maven-core/src/main/java/org/apache/maven/plugin/GoalInstance.java deleted file mode 100644 index a1786cb35b..0000000000 --- a/maven-core/src/main/java/org/apache/maven/plugin/GoalInstance.java +++ /dev/null @@ -1,205 +0,0 @@ -package org.apache.maven.plugin; - -import org.apache.maven.model.Goal; -import org.apache.maven.model.Plugin; -import org.apache.maven.model.PluginExecution; -import org.apache.maven.plugin.descriptor.MojoDescriptor; -import org.codehaus.plexus.util.xml.Xpp3Dom; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -public class GoalInstance -{ - - private final MojoDescriptor mojoDescriptor; - - private String pluginKey; - - private String executionId; - - private Xpp3Dom calculatedConfiguration; - - public GoalInstance( Plugin plugin, PluginExecution pluginExecution, Goal goal, MojoDescriptor mojoDescriptor ) - { - if ( plugin != null ) - { - this.pluginKey = plugin.getKey(); - } - - if ( pluginExecution != null ) - { - this.executionId = pluginExecution.getId(); - } - - this.mojoDescriptor = mojoDescriptor; - - calculateConfiguration( plugin, pluginExecution, goal ); - } - - public GoalInstance( Plugin plugin, Goal goal, MojoDescriptor mojoDescriptor ) - { - this( plugin, null, goal, mojoDescriptor ); - } - - public GoalInstance( MojoDescriptor mojoDescriptor ) - { - this( null, null, null, mojoDescriptor ); - } - - public MojoDescriptor getMojoDescriptor() - { - return mojoDescriptor; - } - - public String getMojoExecutePhase() - { - return mojoDescriptor.getExecutePhase(); - } - - public String getPluginKey() - { - return pluginKey; - } - - public String getExecutionId() - { - return executionId; - } - - public String getGoalId() - { - return mojoDescriptor.getGoal(); - } - - public Xpp3Dom calculateConfiguration( Plugin plugin, PluginExecution pluginExecution, Goal goal ) - { - calculatedConfiguration = new Xpp3Dom( "configuration" ); - - if ( plugin != null ) - { - Xpp3Dom pluginConfig = (Xpp3Dom) plugin.getConfiguration(); - - if ( pluginConfig != null ) - { - calculatedConfiguration = Xpp3Dom.mergeXpp3Dom( pluginConfig, calculatedConfiguration ); - } - } - - if ( pluginExecution != null ) - { - Xpp3Dom executionConfig = (Xpp3Dom) pluginExecution.getConfiguration(); - - if ( executionConfig != null ) - { - calculatedConfiguration = Xpp3Dom.mergeXpp3Dom( executionConfig, calculatedConfiguration ); - } - } - - if ( goal != null ) - { - Xpp3Dom goalConfig = (Xpp3Dom) goal.getConfiguration(); - - if ( goalConfig != null ) - { - calculatedConfiguration = Xpp3Dom.mergeXpp3Dom( goalConfig, calculatedConfiguration ); - } - } - - calculatedConfiguration = new Xpp3Dom( calculatedConfiguration ); - - return calculatedConfiguration; - } - - public boolean equals( Object object ) - { - if ( object == this ) - { - return true; - } - - if ( object instanceof GoalInstance ) - { - GoalInstance other = (GoalInstance) object; - - if ( !getMojoDescriptor().equals( other.getMojoDescriptor() ) ) - { - return false; - } - - String execId = getExecutionId(); - - String otherExecId = other.getExecutionId(); - - if ( execId == otherExecId ) - { - return true; - } - - if ( execId == null && otherExecId != null ) - { - return false; - } - - if ( execId != null && otherExecId == null ) - { - return false; - } - - return execId.equals( otherExecId ); - } - - return false; - } - - public int hashCode() - { - int result = 2; - - // this should NEVER be null... - result += getMojoDescriptor().hashCode(); - - String execId = getExecutionId(); - - if ( execId != null ) - { - result -= execId.hashCode(); - } - - return result; - } - - public String toString() - { - return "goal instance {goal: " + getGoalId() + ", execution-id: " + getExecutionId() + "}"; - } - - public Xpp3Dom getCalculatedConfiguration() - { - return new Xpp3Dom( calculatedConfiguration ); - } - - public void incorporate( GoalInstance other ) - { - Xpp3Dom otherConfig = (Xpp3Dom) other.getCalculatedConfiguration(); - - if ( otherConfig != null ) - { - calculatedConfiguration = new Xpp3Dom( Xpp3Dom.mergeXpp3Dom( otherConfig, calculatedConfiguration ) ); - } - } - -} diff --git a/maven-core/src/main/java/org/apache/maven/plugin/MojoExecution.java b/maven-core/src/main/java/org/apache/maven/plugin/MojoExecution.java new file mode 100644 index 0000000000..6277d02a8f --- /dev/null +++ b/maven-core/src/main/java/org/apache/maven/plugin/MojoExecution.java @@ -0,0 +1,54 @@ +package org.apache.maven.plugin; + +/* + * Copyright 2001-2005 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.apache.maven.plugin.descriptor.MojoDescriptor; + +/** + * Describes a single mojo invocation. + * + * @author Brett Porter + * @version $Id$ + */ +public class MojoExecution +{ + private final String executionId; + + private final MojoDescriptor mojoDescriptor; + + public MojoExecution( MojoDescriptor mojoDescriptor ) + { + this.mojoDescriptor = mojoDescriptor; + this.executionId = null; + } + + public MojoExecution( MojoDescriptor mojoDescriptor, String executionId ) + { + this.mojoDescriptor = mojoDescriptor; + this.executionId = executionId; + } + + public String getExecutionId() + { + return executionId; + } + + public MojoDescriptor getMojoDescriptor() + { + return mojoDescriptor; + } +} diff --git a/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java b/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java index dc2be7e048..29eb2ee92f 100644 --- a/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java +++ b/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java @@ -32,7 +32,7 @@ public interface PluginManager { String ROLE = PluginManager.class.getName(); - void executeMojo( MavenSession session, GoalInstance buildStep ) + void executeMojo( MojoExecution execution, MavenSession session ) throws MojoExecutionException, PluginManagerException, ArtifactResolutionException; PluginDescriptor verifyPlugin( String prefix ); diff --git a/maven-core/src/main/java/org/apache/maven/plugin/version/DefaultPluginVersionManager.java b/maven-core/src/main/java/org/apache/maven/plugin/version/DefaultPluginVersionManager.java index 31b2662638..f704f01d66 100644 --- a/maven-core/src/main/java/org/apache/maven/plugin/version/DefaultPluginVersionManager.java +++ b/maven-core/src/main/java/org/apache/maven/plugin/version/DefaultPluginVersionManager.java @@ -145,7 +145,12 @@ public class DefaultPluginVersionManager // determines what should be done if we're in non-interactive mode. // if true, then just update the registry with the new versions. - boolean autoUpdate = Boolean.valueOf( pluginRegistry.getAutoUpdate() ).booleanValue(); + String s = getPluginRegistry( groupId, artifactId ).getAutoUpdate(); + boolean autoUpdate = true; + if ( s != null ) + { + autoUpdate = Boolean.valueOf( s ).booleanValue(); + } // We should persist by default if: // 1. we detected a change in the plugin version from what was in the registry, or diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java deleted file mode 100644 index c6b645839a..0000000000 --- a/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.apache.maven.lifecycle; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.plexus.PlexusTestCase; -import org.apache.maven.lifecycle.mapping.LifecycleMapping; - -/** - * @author Jason van Zyl - * @version $Id$ - */ -public class LifecycleExecutorTest - extends PlexusTestCase -{ - public void testLifecycleExecutor() - throws Exception - { - LifecycleExecutor le = (LifecycleExecutor) lookup( LifecycleExecutor.ROLE ); - - LifecycleMapping m = (LifecycleMapping) lookup( LifecycleMapping.ROLE, "pom" ); - - assertEquals( 18, le.getPhases().size() ); - - //le.execute( "test", createGoalExecutionContext().getSession() ); - } -} diff --git a/maven-model/maven.mdo b/maven-model/maven.mdo index 7f1b1527b1..078ff4f395 100644 --- a/maven-model/maven.mdo +++ b/maven-model/maven.mdo @@ -624,6 +624,14 @@ These should ultimately only be compile time dependencies when transitive dependencies come into play. + + reports + 4.0.0 + + DOM + reporting 4.0.0 @@ -2013,7 +2021,7 @@ - + Site 4.0.0 @@ -2049,40 +2057,8 @@ - - - GoalContainer + ConfigurationContainer 4.0.0 @@ -2095,20 +2071,11 @@ configuration DOM - - goals - 4.0.0 - - Goal - * - - 4.0.0 @@ -2149,7 +2094,7 @@ Plugin 4.0.0 - GoalContainer + ConfigurationContainer groupId @@ -2179,6 +2124,15 @@ * + + + goals + 4.0.0 + + Goal + * + + @@ -2218,6 +2172,32 @@ { return groupId + ":" + artifactId; } + + /** @deprecated */ + private Map goalMap = null; + /** @deprecated */ + public void flushGoalMap() + { + this.goalMap = null; + } + + /** @deprecated */ + public Map getGoalsAsMap() + { + if ( goalMap == null ) + { + goalMap = new HashMap(); + if ( goals != null ) + { + for ( Iterator i = goals.iterator(); i.hasNext(); ) + { + Goal g = (Goal) i.next(); + goalMap.put( g.getId(), g ); + } + } + } + return goalMap; + } ]]> @@ -2225,7 +2205,7 @@ PluginExecution 4.0.0 - GoalContainer + ConfigurationContainer id @@ -2233,8 +2213,22 @@ true String + + phase + 4.0.0 + String + + + goals + 4.0.0 + + String + * + + + Goal 4.0.0 @@ -2244,34 +2238,11 @@ 4.0.0 String - - inherited - 4.0.0 - - String - configuration DOM - - - - - DependencyManagement diff --git a/maven-model/pom.xml b/maven-model/pom.xml index 64a7385008..85d2fe5877 100644 --- a/maven-model/pom.xml +++ b/maven-model/pom.xml @@ -20,8 +20,7 @@ org.codehaus.modello modello-maven-plugin - 1.0-alpha-2 - + 1.0-alpha-3-SNAPSHOT 4.0.0 maven.mdo diff --git a/maven-plugin-descriptor/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java b/maven-plugin-descriptor/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java index e1d85373c1..e9790d867f 100644 --- a/maven-plugin-descriptor/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java +++ b/maven-plugin-descriptor/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java @@ -19,6 +19,7 @@ package org.apache.maven.plugin.descriptor; import org.codehaus.plexus.component.repository.ComponentSetDescriptor; import java.util.List; +import java.util.Iterator; /** * @author Jason van Zyl @@ -40,7 +41,7 @@ public class PluginDescriptor private String source; private boolean inheritedByDefault = true; - + private List artifacts; // ---------------------------------------------------------------------- @@ -55,7 +56,8 @@ public class PluginDescriptor public void addMojo( MojoDescriptor mojoDescriptor ) throws DuplicateMojoDescriptorException { - // this relies heavily on the equals() and hashCode() for ComponentDescriptor, + MojoDescriptor existing = null; + // this relies heavily on the equals() and hashCode() for ComponentDescriptor, // which uses role:roleHint for identity...and roleHint == goalPrefix:goal. // role does not vary for Mojos. List mojos = getComponents(); @@ -64,8 +66,11 @@ public class PluginDescriptor { int indexOf = mojos.indexOf( mojoDescriptor ); - MojoDescriptor existing = (MojoDescriptor) mojos.get( indexOf ); + existing = (MojoDescriptor) mojos.get( indexOf ); + } + if ( existing != null ) + { throw new DuplicateMojoDescriptorException( getGoalPrefix(), mojoDescriptor.getGoal(), existing .getImplementation(), mojoDescriptor.getImplementation() ); } @@ -191,7 +196,7 @@ public class PluginDescriptor { this.inheritedByDefault = inheritedByDefault; } - + public List getArtifacts() { return artifacts; @@ -216,4 +221,21 @@ public class PluginDescriptor { return 10 + getId().hashCode(); } + + public MojoDescriptor getMojo( String goal ) + { + // TODO: could we use a map? Maybe if the parent did that for components too, as this is too vulnerable to + // changes above not being propogated to the map + + MojoDescriptor mojoDescriptor = null; + for ( Iterator i = getMojos().iterator(); i.hasNext() && mojoDescriptor == null; ) + { + MojoDescriptor desc = (MojoDescriptor) i.next(); + if ( goal.equals( desc.getGoal() ) ) + { + mojoDescriptor = desc; + } + } + return mojoDescriptor; + } } diff --git a/maven-project/src/main/java/org/apache/maven/project/MavenProject.java b/maven-project/src/main/java/org/apache/maven/project/MavenProject.java index 8d6cb28ab9..f1227e2a6c 100644 --- a/maven-project/src/main/java/org/apache/maven/project/MavenProject.java +++ b/maven-project/src/main/java/org/apache/maven/project/MavenProject.java @@ -27,6 +27,7 @@ import org.apache.maven.model.Dependency; import org.apache.maven.model.DependencyManagement; import org.apache.maven.model.Developer; import org.apache.maven.model.DistributionManagement; +import org.apache.maven.model.Goal; import org.apache.maven.model.IssueManagement; import org.apache.maven.model.License; import org.apache.maven.model.MailingList; @@ -36,6 +37,8 @@ import org.apache.maven.model.Plugin; import org.apache.maven.model.PluginManagement; import org.apache.maven.model.Reporting; import org.apache.maven.model.Scm; +import org.apache.maven.model.PluginExecution; +import org.codehaus.plexus.util.xml.Xpp3Dom; import java.io.File; import java.util.ArrayList; @@ -878,4 +881,67 @@ public class MavenProject } return attachedArtifacts; } + + public Xpp3Dom getGoalConfiguration( String pluginGroupId, String pluginArtifactId, String executionId, + String goalId ) + { + Xpp3Dom dom = null; + + // ---------------------------------------------------------------------- + // I would like to be able to lookup the Mojo object using a key but + // we have a limitation in modello that will be remedied shortly. So + // for now I have to iterate through and see what we have. + // ---------------------------------------------------------------------- + + if ( getBuildPlugins() != null ) + { + for ( Iterator iterator = getBuildPlugins().iterator(); iterator.hasNext(); ) + { + Plugin plugin = (Plugin) iterator.next(); + + if ( pluginGroupId.equals( plugin.getGroupId() ) && pluginArtifactId.equals( plugin.getArtifactId() ) ) + { + dom = (Xpp3Dom) plugin.getConfiguration(); + + // TODO: this part is deprecated + if ( goalId != null ) + { + Goal goal = (Goal) plugin.getGoalsAsMap().get( goalId ); + if ( goal != null ) + { + Xpp3Dom goalConfiguration = (Xpp3Dom) goal.getConfiguration(); + if ( goalConfiguration != null ) + { + Xpp3Dom newDom = new Xpp3Dom( goalConfiguration ); + dom = Xpp3Dom.mergeXpp3Dom( newDom, dom ); + } + } + } + + if ( executionId != null ) + { + PluginExecution execution = (PluginExecution) plugin.getExecutionsAsMap().get( executionId ); + if ( execution != null ) + { + Xpp3Dom executionConfiguration = (Xpp3Dom) execution.getConfiguration(); + if ( executionConfiguration != null ) + { + Xpp3Dom newDom = new Xpp3Dom( executionConfiguration ); + dom = Xpp3Dom.mergeXpp3Dom( newDom, dom ); + } + } + } + break; + } + } + } + + if ( dom != null ) + { + // make a copy so the original in the POM doesn't get messed with + dom = new Xpp3Dom( dom ); + } + + return dom; + } } diff --git a/maven-project/src/main/java/org/apache/maven/project/ModelUtils.java b/maven-project/src/main/java/org/apache/maven/project/ModelUtils.java index be7cd98368..c2aa0c8abb 100644 --- a/maven-project/src/main/java/org/apache/maven/project/ModelUtils.java +++ b/maven-project/src/main/java/org/apache/maven/project/ModelUtils.java @@ -1,7 +1,6 @@ package org.apache.maven.project; import org.apache.maven.model.Goal; -import org.apache.maven.model.GoalContainer; import org.apache.maven.model.Plugin; import org.apache.maven.model.PluginContainer; import org.apache.maven.model.PluginExecution; @@ -31,9 +30,8 @@ import java.util.TreeMap; public final class ModelUtils { - public static void mergePluginLists( PluginContainer childContainer, PluginContainer parentContainer, - boolean handleAsInheritance ) + boolean handleAsInheritance ) { if ( childContainer == null || parentContainer == null ) { @@ -55,8 +53,8 @@ public final class ModelUtils String parentInherited = parentPlugin.getInherited(); - if ( !handleAsInheritance || parentInherited == null - || Boolean.valueOf( parentInherited ).booleanValue() ) + if ( !handleAsInheritance || parentInherited == null || + Boolean.valueOf( parentInherited ).booleanValue() ) { Plugin assembledPlugin = parentPlugin; @@ -109,7 +107,7 @@ public final class ModelUtils } // merge the lists of goals that are not attached to an - ModelUtils.mergeGoalContainerDefinitions( child, parent, handleAsInheritance ); + ModelUtils.mergeGoalContainerDefinitions( child, parent ); // from here to the end of the method is dealing with merging of the section. String parentInherited = parent.getInherited(); @@ -136,7 +134,7 @@ public final class ModelUtils if ( childExecution != null ) { - ModelUtils.mergeGoalContainerDefinitions( childExecution, parentExecution, handleAsInheritance ); + ModelUtils.mergePluginExecutionDefinitions( childExecution, parentExecution ); assembled = childExecution; } @@ -168,8 +166,12 @@ public final class ModelUtils } - private static void mergeGoalContainerDefinitions( GoalContainer child, GoalContainer parent, - boolean handleAsInheritance ) + /** + * @param child + * @param parent + * @deprecated + */ + private static void mergeGoalContainerDefinitions( Plugin child, Plugin parent ) { List parentGoals = parent.getGoals(); @@ -186,33 +188,23 @@ public final class ModelUtils { Goal parentGoal = (Goal) it.next(); - String parentInherited = parentGoal.getInherited(); + Goal assembledGoal = parentGoal; - if ( !handleAsInheritance || parentInherited == null - || Boolean.valueOf( parentInherited ).booleanValue() ) + Goal childGoal = (Goal) childGoals.get( parentGoal.getId() ); + + if ( childGoal != null ) { - Goal assembledGoal = parentGoal; + Xpp3Dom childGoalConfig = (Xpp3Dom) childGoal.getConfiguration(); + Xpp3Dom parentGoalConfig = (Xpp3Dom) parentGoal.getConfiguration(); - Goal childGoal = (Goal) childGoals.get( parentGoal.getId() ); + childGoalConfig = Xpp3Dom.mergeXpp3Dom( childGoalConfig, parentGoalConfig ); - if ( childGoal != null ) - { - Xpp3Dom childGoalConfig = (Xpp3Dom) childGoal.getConfiguration(); - Xpp3Dom parentGoalConfig = (Xpp3Dom) parentGoal.getConfiguration(); + childGoal.setConfiguration( childGoalConfig ); - childGoalConfig = Xpp3Dom.mergeXpp3Dom( childGoalConfig, parentGoalConfig ); - - childGoal.setConfiguration( childGoalConfig ); - - assembledGoal = childGoal; - } - else if ( handleAsInheritance && parentInherited == null ) - { - assembledGoal.unsetInheritanceApplied(); - } - - assembledGoals.put( assembledGoal.getId(), assembledGoal ); + assembledGoal = childGoal; } + + assembledGoals.put( assembledGoal.getId(), assembledGoal ); } for ( Iterator it = childGoals.entrySet().iterator(); it.hasNext(); ) @@ -242,4 +234,27 @@ public final class ModelUtils child.setConfiguration( childConfiguration ); } + private static void mergePluginExecutionDefinitions( PluginExecution child, PluginExecution parent ) + { + List parentGoals = parent.getGoals(); + + // if the supplemental goals are non-existent, then nothing related to goals changes. + if ( parentGoals != null && !parentGoals.isEmpty() ) + { + List goals = new ArrayList( parentGoals ); + if ( child.getGoals() != null ) + { + goals.addAll( child.getGoals() ); + } + + child.setGoals( goals ); + } + + Xpp3Dom childConfiguration = (Xpp3Dom) child.getConfiguration(); + Xpp3Dom parentConfiguration = (Xpp3Dom) parent.getConfiguration(); + + childConfiguration = Xpp3Dom.mergeXpp3Dom( childConfiguration, parentConfiguration ); + + child.setConfiguration( childConfiguration ); + } } diff --git a/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java b/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java index e006e72535..35236c7a53 100644 --- a/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java +++ b/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java @@ -57,7 +57,7 @@ public class DefaultModelInheritanceAssembler { return; } - + // Group id if ( child.getGroupId() == null ) { @@ -156,7 +156,7 @@ public class DefaultModelInheritanceAssembler public void mergeProfileWithModel( Model model, Profile profile ) { assembleModelBaseInheritance( model, profile ); - + assembleBuildBaseInheritance( model.getBuild(), profile.getBuild() ); } @@ -262,10 +262,10 @@ public class DefaultModelInheritanceAssembler } childReporting.setPlugins( new ArrayList( mergedReportPlugins.values() ) ); - + childReporting.flushReportPluginMap(); } - + assembleDependencyManagementInheritance( child, parent ); } @@ -352,7 +352,7 @@ public class DefaultModelInheritanceAssembler } dominant.setReportSets( new ArrayList( mergedReportSets.values() ) ); - + dominant.flushReportSetMap(); } @@ -398,7 +398,7 @@ public class DefaultModelInheritanceAssembler { return; } - + Build childBuild = child.getBuild(); if ( parentBuild != null ) @@ -408,9 +408,9 @@ public class DefaultModelInheritanceAssembler childBuild = new Build(); child.setBuild( childBuild ); } + // The build has been set but we want to step in here and fill in - // values - // that have not been set by the child. + // values that have not been set by the child. if ( childBuild.getDirectory() == null ) {