You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by si...@apache.org on 2009/02/17 14:13:50 UTC
svn commit: r745040 -
/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
Author: sisbell
Date: Tue Feb 17 13:13:49 2009
New Revision: 745040
URL: http://svn.apache.org/viewvc?rev=745040&view=rev
Log:
[MNG-4035] - Removing plugin manager changes. This is breaking tycho build and also causes a hefty performance hit. Using mixins is over-generalizing this solution. Only need to cleanup config merging.
Modified:
maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java?rev=745040&r1=745039&r2=745040&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java Tue Feb 17 13:13:49 2009
@@ -557,13 +557,52 @@
downloadDependencies( project, session, artifactResolver );
}
- //
+ String goalName = mojoDescriptor.getFullGoalName();
+
+ Mojo mojo = null;
+
+ PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
+
+ Xpp3Dom dom = mojoExecution.getConfiguration();
+
+ if ( dom != null )
+ {
+ try
+ {
+ List<InterpolatorProperty> interpolatorProperties = new ArrayList<InterpolatorProperty>();
+ interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties(
+ session.getProjectBuilderConfiguration().getExecutionProperties(),
+ PomInterpolatorTag.EXECUTION_PROPERTIES.name()));
+ interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( session.getProjectBuilderConfiguration().getUserProperties(),
+ PomInterpolatorTag.USER_PROPERTIES.name()));
+ String interpolatedDom =
+ Interpolator.interpolateXmlString( String.valueOf( dom ), interpolatorProperties );
+ dom = Xpp3DomBuilder.build( new StringReader( interpolatedDom ) );
+ }
+ catch ( XmlPullParserException e )
+ {
+ throw new PluginManagerException(
+ mojoDescriptor,
+ project,
+ "Failed to calculate concrete state for configuration of: "
+ + mojoDescriptor.getHumanReadableKey(),
+ e );
+ }
+ catch ( IOException e )
+ {
+ throw new PluginManagerException(
+ mojoDescriptor,
+ project,
+ "Failed to calculate concrete state for configuration of: "
+ + mojoDescriptor.getHumanReadableKey(),
+ e );
+ }
+ }
// Event monitoring.
String event = MavenEvents.MOJO_EXECUTION;
EventDispatcher dispatcher = session.getEventDispatcher();
- String goalName = mojoDescriptor.getFullGoalName();
String goalExecId = goalName;
if ( mojoExecution.getExecutionId() != null )
{
@@ -576,12 +615,9 @@
ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
List realmActions = new ArrayList();
-
- Mojo mojo = null;
- PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
try
{
- mojo = getConfiguredMojo( session, project, false, mojoExecution, realmActions );
+ mojo = getConfiguredMojo( session, dom, project, false, mojoExecution, realmActions );
dispatcher.dispatchStart( event, goalExecId );
@@ -712,7 +748,7 @@
MavenSession session )
throws ArtifactNotFoundException, PluginConfigurationException, PluginManagerException,
ArtifactResolutionException
- { /*
+ {
MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
PluginDescriptor descriptor = mojoDescriptor.getPluginDescriptor();
Xpp3Dom dom = project.getReportConfiguration( descriptor.getGroupId(),
@@ -722,8 +758,8 @@
{
dom = Xpp3Dom.mergeXpp3Dom( dom, mojoExecution.getConfiguration() );
}
- */
- return (MavenReport) getConfiguredMojo( session, project, true, mojoExecution, new ArrayList() );
+
+ return (MavenReport) getConfiguredMojo( session, dom, project, true, mojoExecution, new ArrayList() );
}
public PluginDescriptor verifyReportPlugin( ReportPlugin reportPlugin,
@@ -755,6 +791,7 @@
}
private Mojo getConfiguredMojo( MavenSession session,
+ Xpp3Dom dom,
MavenProject project,
boolean report,
MojoExecution mojoExecution,
@@ -840,6 +877,28 @@
mojo.setLog( new DefaultLog( getLogger() ) );
+ XmlPlexusConfiguration pomConfiguration;
+
+ if ( dom == null )
+ {
+ pomConfiguration = new XmlPlexusConfiguration( "configuration" );
+ }
+ else
+ {
+ pomConfiguration = new XmlPlexusConfiguration( dom );
+ }
+
+ // Validate against non-editable (@readonly) parameters, to make sure users aren't trying to
+ // override in the POM.
+ validatePomConfiguration( mojoDescriptor, pomConfiguration );
+
+ PlexusConfiguration mergedConfiguration = mergeMojoConfiguration( pomConfiguration,
+ mojoDescriptor );
+
+ // TODO: plexus changes to make this more like the component descriptor so this can be used instead
+ // PlexusConfiguration mergedConfiguration = mergeConfiguration( pomConfiguration,
+ // mojoDescriptor.getConfiguration() );
+
ExpressionEvaluator expressionEvaluator = new PluginParameterExpressionEvaluator(
session,
mojoExecution,
@@ -847,38 +906,16 @@
getLogger(),
session.getExecutionProperties() );
- List<InterpolatorProperty> interpolatorProperties = new ArrayList<InterpolatorProperty>();
+ PlexusConfiguration extractedMojoConfiguration = extractMojoConfiguration(
+ mergedConfiguration,
+ mojoDescriptor );
- interpolatorProperties.addAll(InterpolatorProperty.toInterpolatorProperties(session.getProjectBuilderConfiguration().getExecutionProperties(),
- PomInterpolatorTag.EXECUTION_PROPERTIES.name()));
+ checkDeprecatedParameters( mojoDescriptor, pomConfiguration );
- interpolatorProperties.addAll(InterpolatorProperty.toInterpolatorProperties(session.getProjectBuilderConfiguration().getUserProperties(),
- PomInterpolatorTag.USER_PROPERTIES.name()));
-
- Plugin plugin = null;
- try {
- plugin = pluginRepository.findPluginById(pluginDescriptor.getId(), mojoDescriptor.getId());
- } catch (Exception e) {
- e.printStackTrace();
- }
-
-
- PlexusConfiguration mojoConfiguration = null;
- try {
- mojoConfiguration = ((Mixer) projectBuilder).mixPluginAndReturnConfig(plugin, mojoExecution.getConfiguration(), project.getModel(),
- interpolatorProperties);
- } catch (Exception e) {
- e.printStackTrace();
- }
- if(mojoConfiguration == null)
- {
- mojoConfiguration = new XmlPlexusConfiguration( "configuration" );
- }
+ checkRequiredParameters( mojoDescriptor, extractedMojoConfiguration, expressionEvaluator );
- checkRequiredParameters( mojoDescriptor, mojoConfiguration, expressionEvaluator );
+ populatePluginFields( mojo, mojoDescriptor, extractedMojoConfiguration, expressionEvaluator );
- populatePluginFields( mojo, mojoDescriptor, mojoConfiguration, expressionEvaluator );
-
return mojo;
} finally {
@@ -886,6 +923,63 @@
}
}
+ private void checkDeprecatedParameters( MojoDescriptor mojoDescriptor,
+ PlexusConfiguration extractedMojoConfiguration )
+ {
+ if ( ( extractedMojoConfiguration == null ) || ( extractedMojoConfiguration.getChildCount() < 1 ) )
+ {
+ return;
+ }
+
+ List parameters = mojoDescriptor.getParameters();
+ if ( ( parameters != null ) && !parameters.isEmpty() )
+ {
+ for ( Iterator it = parameters.iterator(); it.hasNext(); )
+ {
+ Parameter param = (Parameter) it.next();
+
+ if ( param.getDeprecated() != null )
+ {
+ boolean warnOfDeprecation = false;
+ PlexusConfiguration child = extractedMojoConfiguration.getChild( param.getName() );
+ try
+ {
+ if ( ( child != null ) && ( child.getValue() != null ) )
+ {
+ warnOfDeprecation = true;
+ }
+ else if ( param.getAlias() != null)
+ {
+ child = extractedMojoConfiguration.getChild( param.getAlias() );
+ if ( ( child != null ) && ( child.getValue() != null ) )
+ {
+ warnOfDeprecation = true;
+ }
+ }
+ }
+ catch ( PlexusConfigurationException e )
+ {
+ // forget it, this is just for deprecation checking, after all...
+ }
+
+ if ( warnOfDeprecation )
+ {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append( "In mojo: " ).append( mojoDescriptor.getGoal() ).append( ", parameter: " ).append( param.getName() );
+
+ if ( param.getAlias() != null )
+ {
+ buffer.append( " (alias: " ).append( param.getAlias() ).append( ")" );
+ }
+
+ buffer.append( " is deprecated:" ).append( "\n\n" ).append( param.getDeprecated() ).append( "\n" );
+
+ getLogger().warn( buffer.toString() );
+ }
+ }
+ }
+ }
+ }
private void setDescriptorClassAndArtifactInfo( PluginDescriptor pluginDescriptor,
MavenProject project,
@@ -928,6 +1022,40 @@
pluginDescriptor.setArtifacts( realmManager.getPluginArtifacts( plugin ) );
}
+ private PlexusConfiguration extractMojoConfiguration( PlexusConfiguration mergedConfiguration,
+ MojoDescriptor mojoDescriptor )
+ {
+ Map parameterMap = mojoDescriptor.getParameterMap();
+
+ PlexusConfiguration[] mergedChildren = mergedConfiguration.getChildren();
+
+ XmlPlexusConfiguration extractedConfiguration = new XmlPlexusConfiguration( "configuration" );
+
+ for ( int i = 0; i < mergedChildren.length; i++ )
+ {
+ PlexusConfiguration child = mergedChildren[i];
+
+ if ( parameterMap.containsKey( child.getName() ) )
+ {
+ extractedConfiguration.addChild( copyConfiguration( child ) );
+ }
+ else
+ {
+ // TODO: I defy anyone to find these messages in the '-X' output! Do we need a new log level?
+ // ideally, this would be elevated above the true debug output, but below the default INFO level...
+ // [BP] (2004-07-18): need to understand the context more but would prefer this could be either WARN or
+ // removed - shouldn't need DEBUG to diagnose a problem most of the time.
+ getLogger().debug(
+ "*** WARNING: Configuration \'" + child.getName()
+ + "\' is not used in goal \'"
+ + mojoDescriptor.getFullGoalName()
+ + "; this may indicate a typo... ***" );
+ }
+ }
+
+ return extractedConfiguration;
+ }
+
private void checkRequiredParameters( MojoDescriptor goal,
PlexusConfiguration configuration,
ExpressionEvaluator expressionEvaluator )
@@ -952,6 +1080,7 @@
{
// the key for the configuration map we're building.
String key = parameter.getName();
+
Object fieldValue = null;
String expression = null;
PlexusConfiguration value = configuration.getChild( key, false );
@@ -1005,6 +1134,215 @@
}
}
+ private void validatePomConfiguration( MojoDescriptor goal,
+ PlexusConfiguration pomConfiguration )
+ throws PluginConfigurationException
+ {
+ List parameters = goal.getParameters();
+
+ if ( parameters == null )
+ {
+ return;
+ }
+
+ for ( int i = 0; i < parameters.size(); i++ )
+ {
+ Parameter parameter = (Parameter) parameters.get( i );
+
+ // the key for the configuration map we're building.
+ String key = parameter.getName();
+
+ PlexusConfiguration value = pomConfiguration.getChild( key, false );
+
+ if ( ( value == null ) && StringUtils.isNotEmpty( parameter.getAlias() ) )
+ {
+ key = parameter.getAlias();
+ value = pomConfiguration.getChild( key, false );
+ }
+
+ if ( value != null )
+ {
+ // Make sure the parameter is either editable/configurable, or else is NOT specified in the POM
+ if ( !parameter.isEditable() )
+ {
+ StringBuffer errorMessage = new StringBuffer().append( "ERROR: Cannot override read-only parameter: " );
+ errorMessage.append( key );
+ errorMessage.append( " in goal: " ).append( goal.getFullGoalName() );
+
+ throw new PluginConfigurationException( goal.getPluginDescriptor(),
+ errorMessage.toString() );
+ }
+
+ String deprecated = parameter.getDeprecated();
+ if ( StringUtils.isNotEmpty( deprecated ) )
+ {
+ getLogger().warn( "DEPRECATED [" + parameter.getName() + "]: " + deprecated );
+ }
+ }
+ }
+ }
+
+ private PlexusConfiguration mergeMojoConfiguration( XmlPlexusConfiguration fromPom,
+ MojoDescriptor mojoDescriptor )
+ {
+ XmlPlexusConfiguration result = new XmlPlexusConfiguration( fromPom.getName() );
+ result.setValue( fromPom.getValue( null ) );
+
+ if ( mojoDescriptor.getParameters() != null )
+ {
+ PlexusConfiguration fromMojo = mojoDescriptor.getMojoConfiguration();
+
+ for ( Iterator it = mojoDescriptor.getParameters().iterator(); it.hasNext(); )
+ {
+ Parameter parameter = (Parameter) it.next();
+
+ String paramName = parameter.getName();
+ String alias = parameter.getAlias();
+ String implementation = parameter.getImplementation();
+
+ PlexusConfiguration pomConfig = fromPom.getChild( paramName );
+ PlexusConfiguration aliased = null;
+
+ if ( alias != null )
+ {
+ aliased = fromPom.getChild( alias );
+ }
+
+ PlexusConfiguration mojoConfig = fromMojo.getChild( paramName, false );
+
+ // first we'll merge configurations from the aliased and real params.
+ // TODO: Is this the right thing to do?
+ if ( aliased != null )
+ {
+ if ( pomConfig == null )
+ {
+ pomConfig = new XmlPlexusConfiguration( paramName );
+ }
+
+ pomConfig = buildTopDownMergedConfiguration( pomConfig, aliased );
+ }
+
+ PlexusConfiguration toAdd = null;
+
+ if ( pomConfig != null )
+ {
+ pomConfig = buildTopDownMergedConfiguration( pomConfig, mojoConfig );
+
+ if ( StringUtils.isNotEmpty( pomConfig.getValue( null ) )
+ || ( pomConfig.getChildCount() > 0 ) )
+ {
+ toAdd = pomConfig;
+ }
+ }
+
+ if ( ( toAdd == null ) && ( mojoConfig != null ) )
+ {
+ toAdd = copyConfiguration( mojoConfig );
+ }
+
+ if ( toAdd != null )
+ {
+ if ( ( implementation != null )
+ && ( toAdd.getAttribute( "implementation", null ) == null ) )
+ {
+
+ XmlPlexusConfiguration implementationConf = new XmlPlexusConfiguration(
+ paramName );
+
+ implementationConf.setAttribute( "implementation",
+ parameter.getImplementation() );
+
+ toAdd = buildTopDownMergedConfiguration( toAdd, implementationConf );
+ }
+
+ result.addChild( toAdd );
+ }
+ }
+ }
+ return result;
+ }
+
+ private XmlPlexusConfiguration buildTopDownMergedConfiguration( PlexusConfiguration dominant,
+ PlexusConfiguration recessive )
+ {
+ XmlPlexusConfiguration result = new XmlPlexusConfiguration( dominant.getName() );
+
+ String value = dominant.getValue( null );
+
+ if ( StringUtils.isEmpty( value ) && ( recessive != null ) )
+ {
+ value = recessive.getValue( null );
+ }
+
+ if ( StringUtils.isNotEmpty( value ) )
+ {
+ result.setValue( value );
+ }
+
+ String[] attributeNames = dominant.getAttributeNames();
+
+ for ( int i = 0; i < attributeNames.length; i++ )
+ {
+ String attributeValue = dominant.getAttribute( attributeNames[i], null );
+
+ result.setAttribute( attributeNames[i], attributeValue );
+ }
+
+ if ( recessive != null )
+ {
+ attributeNames = recessive.getAttributeNames();
+
+ for ( int i = 0; i < attributeNames.length; i++ )
+ {
+ String attributeValue = recessive.getAttribute( attributeNames[i], null );
+ // TODO: recessive seems to be dominant here?
+ result.setAttribute( attributeNames[i], attributeValue );
+ }
+ }
+
+ PlexusConfiguration[] children = dominant.getChildren();
+
+ for ( int i = 0; i < children.length; i++ )
+ {
+ PlexusConfiguration childDom = children[i];
+ PlexusConfiguration childRec = recessive == null ? null
+ : recessive.getChild( childDom.getName(), false );
+
+ if ( childRec != null )
+ {
+ result.addChild( buildTopDownMergedConfiguration( childDom, childRec ) );
+ }
+ else
+ { // FIXME: copy, or use reference?
+ result.addChild( copyConfiguration( childDom ) );
+ }
+ }
+
+ return result;
+ }
+
+ public static PlexusConfiguration copyConfiguration( PlexusConfiguration src )
+ {
+ // TODO: shouldn't be necessary
+ XmlPlexusConfiguration dom = new XmlPlexusConfiguration( src.getName() );
+ dom.setValue( src.getValue( null ) );
+
+ String[] attributeNames = src.getAttributeNames();
+ for ( int i = 0; i < attributeNames.length; i++ )
+ {
+ String attributeName = attributeNames[i];
+ dom.setAttribute( attributeName, src.getAttribute( attributeName, null ) );
+ }
+
+ PlexusConfiguration[] children = src.getChildren();
+ for ( int i = 0; i < children.length; i++ )
+ {
+ dom.addChild( copyConfiguration( children[i] ) );
+ }
+
+ return dom;
+ }
+
// ----------------------------------------------------------------------
// Mojo Parameter Handling
// ----------------------------------------------------------------------