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
This commit is contained in:
Brett Leslie Porter 2005-06-18 13:01:26 +00:00
parent dedfacf69a
commit a9f174c834
15 changed files with 543 additions and 800 deletions

View File

@ -19,6 +19,11 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-core-it-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<goals>
<goal>
<id>touch</id>
</goal>
</goals>
</plugin>
</plugins>
</build>

View File

@ -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 <a href="mailto:jason@maven.org">Jason van Zyl </a>
* @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
* @author <a href="mailto:brett@apache.org">Brett Porter</a>
* @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 );
}
}
}

View File

@ -32,5 +32,4 @@ public interface LifecycleExecutor
MavenExecutionResponse execute( List tasks, MavenSession session )
throws LifecycleExecutionException;
List getPhases();
}

View File

@ -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 );

View File

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

View File

@ -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 <a href="mailto:brett@apache.org">Brett Porter</a>
* @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;
}
}

View File

@ -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 );

View File

@ -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

View File

@ -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 <a href="mailto:jason@maven.org">Jason van Zyl</a>
* @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() );
}
}

View File

@ -624,6 +624,14 @@
</association>
<comment>These should ultimately only be compile time dependencies when transitive dependencies come into play.</comment>
</field>
<field>
<name>reports</name>
<version>4.0.0</version>
<description><![CDATA[
NOT A VALID ELEMENT. LISTED TO ALLOW LEGACY REPOSITORY POMs TO PARSE.
]]></description>
<type>DOM</type>
</field>
<field>
<name>reporting</name>
<version>4.0.0</version>
@ -2013,7 +2021,7 @@
</codeSegment>
</codeSegments>
</class>
<!--@todo find better solution for managment of site deployments -->
<!--@todo find better solution for management of site deployments -->
<class>
<name>Site</name>
<version>4.0.0</version>
@ -2049,40 +2057,8 @@
</fields>
</class>
<!--
A sketch of what a plugin configuration might look like where
we have plugin wide parameters that apply to all goals/mojos
and goal/mojo specific parameters that will override any
of the plugin wide definitions.
At first the configuration element will be a flat set of properties
but i would like the configuration to actually be an arbiitrary
data model or a simple DOM like structure so that mojos can
be arbitrarily configured in the same fashion plexus plugins
are configured.
<plugins>
<plugin>
<id>plexus</id>
<configuration>
<key>value</key>
</configuration>
<goals>
<goal>
<id></id>
<configuration>
<key>value</key>
</configuration>
</goal>
</goals>
</plugin>
</plugins>
-->
<class>
<name>GoalContainer</name>
<name>ConfigurationContainer</name>
<version>4.0.0</version>
<fields>
<field>
@ -2095,20 +2071,11 @@
<name>configuration</name>
<type>DOM</type>
</field>
<field>
<name>goals</name>
<version>4.0.0</version>
<association>
<type>Goal</type>
<multiplicity>*</multiplicity>
</association>
</field>
</fields>
<codeSegments>
<codeSegment>
<version>4.0.0</version>
<code><![CDATA[
private Map goalMap = null;
private boolean inheritanceApplied = true;
public void unsetInheritanceApplied()
@ -2120,28 +2087,6 @@
{
return inheritanceApplied;
}
public void flushGoalMap()
{
this.goalMap = null;
}
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;
}
]]></code>
</codeSegment>
</codeSegments>
@ -2149,7 +2094,7 @@
<class>
<name>Plugin</name>
<version>4.0.0</version>
<superClass>GoalContainer</superClass>
<superClass>ConfigurationContainer</superClass>
<fields>
<field>
<name>groupId</name>
@ -2179,6 +2124,15 @@
<multiplicity>*</multiplicity>
</association>
</field>
<!-- TODO: this is deprecated -->
<field>
<name>goals</name>
<version>4.0.0</version>
<association>
<type>Goal</type>
<multiplicity>*</multiplicity>
</association>
</field>
</fields>
<codeSegments>
<codeSegment>
@ -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;
}
]]></code>
</codeSegment>
</codeSegments>
@ -2225,7 +2205,7 @@
<class>
<name>PluginExecution</name>
<version>4.0.0</version>
<superClass>GoalContainer</superClass>
<superClass>ConfigurationContainer</superClass>
<fields>
<field>
<name>id</name>
@ -2233,8 +2213,22 @@
<required>true</required>
<type>String</type>
</field>
<field>
<name>phase</name>
<version>4.0.0</version>
<type>String</type>
</field>
<field>
<name>goals</name>
<version>4.0.0</version>
<association>
<type>String</type>
<multiplicity>*</multiplicity>
</association>
</field>
</fields>
</class>
<!-- TODO: deprecated -->
<class>
<name>Goal</name>
<version>4.0.0</version>
@ -2244,34 +2238,11 @@
<version>4.0.0</version>
<type>String</type>
</field>
<field>
<name>inherited</name>
<version>4.0.0</version>
<description><![CDATA[Whether this goal configuration should be propagated to child POMs.]]></description>
<type>String</type>
</field>
<field>
<name>configuration</name>
<type>DOM</type>
</field>
</fields>
<codeSegments>
<codeSegment>
<code><![CDATA[
private boolean inheritanceApplied = true;
public void unsetInheritanceApplied()
{
this.inheritanceApplied = false;
}
public boolean isInheritanceApplied()
{
return inheritanceApplied;
}
]]></code>
</codeSegment>
</codeSegments>
</class>
<class>
<name>DependencyManagement</name>

View File

@ -20,8 +20,7 @@
<plugin>
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-maven-plugin</artifactId>
<version>1.0-alpha-2</version>
<!-- version>1.0-alpha-3-SNAPSHOT</version -->
<version>1.0-alpha-3-SNAPSHOT</version>
<configuration>
<version>4.0.0</version>
<model>maven.mdo</model>

View File

@ -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 <a href="mailto:jason@maven.org">Jason van Zyl</a>
@ -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;
}
}

View File

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

View File

@ -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 <execution/>
ModelUtils.mergeGoalContainerDefinitions( child, parent, handleAsInheritance );
ModelUtils.mergeGoalContainerDefinitions( child, parent );
// from here to the end of the method is dealing with merging of the <executions/> 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 );
}
}

View File

@ -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 )
{