Fix: mng3746 - Implemented proper ordering of system, user and model properties used in interpolation. this required creating a tag value, which could be used for comparing and ordering of InterpolatorProperty.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@695196 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Britton Isbell 2008-09-14 11:34:27 +00:00
parent 5d266e85ba
commit 6221dfb9e6
7 changed files with 98 additions and 32 deletions

View File

@ -36,6 +36,7 @@ import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.ProjectBuilderConfiguration; import org.apache.maven.project.ProjectBuilderConfiguration;
import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.builder.PomClassicTransformer; import org.apache.maven.project.builder.PomClassicTransformer;
import org.apache.maven.project.builder.PomInterpolatorTag;
import org.apache.maven.extension.lineage.ModelLineage; import org.apache.maven.extension.lineage.ModelLineage;
import org.apache.maven.extension.lineage.ModelLineageBuilder; import org.apache.maven.extension.lineage.ModelLineageBuilder;
import org.apache.maven.extension.lineage.ModelLineageIterator; import org.apache.maven.extension.lineage.ModelLineageIterator;
@ -163,8 +164,10 @@ public class DefaultBuildExtensionScanner
config.setExecutionProperties( execProps ); config.setExecutionProperties( execProps );
List<InterpolatorProperty> interpolatorProperties = new ArrayList<InterpolatorProperty>(); List<InterpolatorProperty> interpolatorProperties = new ArrayList<InterpolatorProperty>();
interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( config.getExecutionProperties())); interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( config.getExecutionProperties(),
interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( config.getUserProperties())); PomInterpolatorTag.SYSTEM_PROPERTIES.name()));
interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( config.getUserProperties(),
PomInterpolatorTag.USER_PROPERTIES.name()));
model = PomClassicTransformer.interpolateModel( model, interpolatorProperties, modelPom.getParentFile()); model = PomClassicTransformer.interpolateModel( model, interpolatorProperties, modelPom.getParentFile());
grabManagedPluginsWithExtensionsFlagTurnedOn( model, managedPluginsWithExtensionsFlag ); grabManagedPluginsWithExtensionsFlagTurnedOn( model, managedPluginsWithExtensionsFlag );

View File

@ -61,6 +61,7 @@ import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.ModelUtils; import org.apache.maven.project.ModelUtils;
import org.apache.maven.project.builder.PomClassicTransformer; import org.apache.maven.project.builder.PomClassicTransformer;
import org.apache.maven.project.builder.PomInterpolatorTag;
import org.apache.maven.project.artifact.InvalidDependencyVersionException; import org.apache.maven.project.artifact.InvalidDependencyVersionException;
import org.apache.maven.project.artifact.MavenMetadataSource; import org.apache.maven.project.artifact.MavenMetadataSource;
import org.apache.maven.realm.MavenRealmManager; import org.apache.maven.realm.MavenRealmManager;
@ -556,10 +557,12 @@ public class DefaultPluginManager
if ( dom != null ) if ( dom != null )
{ {
try try
{ {
List<InterpolatorProperty> interpolatorProperties = new ArrayList<InterpolatorProperty>(); List<InterpolatorProperty> interpolatorProperties = new ArrayList<InterpolatorProperty>();
interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( session.getProjectBuilderConfiguration().getExecutionProperties())); interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( session.getProjectBuilderConfiguration().getExecutionProperties(),
interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( session.getProjectBuilderConfiguration().getUserProperties())); PomInterpolatorTag.SYSTEM_PROPERTIES.name()));
interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( session.getProjectBuilderConfiguration().getUserProperties(),
PomInterpolatorTag.USER_PROPERTIES.name()));
String interpolatedDom = String interpolatedDom =
PomClassicTransformer.interpolateXmlString( String.valueOf( dom ), interpolatorProperties ); PomClassicTransformer.interpolateXmlString( String.valueOf( dom ), interpolatorProperties );
dom = Xpp3DomBuilder.build( new StringReader( interpolatedDom ) ); dom = Xpp3DomBuilder.build( new StringReader( interpolatedDom ) );

View File

@ -44,6 +44,7 @@ import org.apache.maven.profiles.build.ProfileAdvisor;
import org.apache.maven.project.artifact.InvalidDependencyVersionException; import org.apache.maven.project.artifact.InvalidDependencyVersionException;
import org.apache.maven.project.builder.PomArtifactResolver; import org.apache.maven.project.builder.PomArtifactResolver;
import org.apache.maven.project.builder.ProjectBuilder; import org.apache.maven.project.builder.ProjectBuilder;
import org.apache.maven.project.builder.PomInterpolatorTag;
import org.apache.maven.project.validation.ModelValidationResult; import org.apache.maven.project.validation.ModelValidationResult;
import org.apache.maven.project.validation.ModelValidator; import org.apache.maven.project.validation.ModelValidator;
import org.apache.maven.project.workspace.ProjectWorkspace; import org.apache.maven.project.workspace.ProjectWorkspace;
@ -532,8 +533,10 @@ public class DefaultMavenProjectBuilder
} }
List<InterpolatorProperty> interpolatorProperties = new ArrayList<InterpolatorProperty>(); List<InterpolatorProperty> interpolatorProperties = new ArrayList<InterpolatorProperty>();
interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( config.getExecutionProperties())); interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( config.getExecutionProperties(),
interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( config.getUserProperties())); PomInterpolatorTag.SYSTEM_PROPERTIES.name()));
interpolatorProperties.addAll( InterpolatorProperty.toInterpolatorProperties( config.getUserProperties(),
PomInterpolatorTag.USER_PROPERTIES.name()));
MavenProject mavenProject; MavenProject mavenProject;
try try

View File

@ -29,14 +29,7 @@ import java.io.IOException;
import java.io.StringReader; import java.io.StringReader;
import java.io.File; import java.io.File;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/** /**
* Provides methods for transforming model properties into a domain model for the pom classic format and vice versa. * Provides methods for transforming model properties into a domain model for the pom classic format and vice versa.
@ -506,7 +499,7 @@ public final class PomClassicTransformer
List<InterpolatorProperty> ips = new ArrayList<InterpolatorProperty>(interpolatorProperties); List<InterpolatorProperty> ips = new ArrayList<InterpolatorProperty>(interpolatorProperties);
ips.addAll(ModelTransformerContext.createInterpolatorProperties(modelProperties, ProjectUri.baseUri, aliases, ips.addAll(ModelTransformerContext.createInterpolatorProperties(modelProperties, ProjectUri.baseUri, aliases,
false, false)); PomInterpolatorTag.PROJECT_PROPERTIES.name(), false, false));
for(ModelProperty mp : modelProperties) for(ModelProperty mp : modelProperties)
{ {
@ -593,9 +586,12 @@ public final class PomClassicTransformer
List<InterpolatorProperty> standardInterpolatorProperties = new ArrayList<InterpolatorProperty>(); List<InterpolatorProperty> standardInterpolatorProperties = new ArrayList<InterpolatorProperty>();
if(domainModel.isPomInBuild()) if(domainModel.isPomInBuild())
{ {
standardInterpolatorProperties.add(new InterpolatorProperty("${project.basedir}", basedir )); standardInterpolatorProperties.add(new InterpolatorProperty("${project.basedir}", basedir,
standardInterpolatorProperties.add(new InterpolatorProperty("${basedir}", basedir )); PomInterpolatorTag.PROJECT_PROPERTIES.name() ));
standardInterpolatorProperties.add(new InterpolatorProperty("${pom.basedir}", basedir )); standardInterpolatorProperties.add(new InterpolatorProperty("${basedir}", basedir,
PomInterpolatorTag.PROJECT_PROPERTIES.name() ));
standardInterpolatorProperties.add(new InterpolatorProperty("${pom.basedir}", basedir,
PomInterpolatorTag.PROJECT_PROPERTIES.name() ));
} }
@ -605,15 +601,21 @@ public final class PomClassicTransformer
{ {
String uri = mp.getUri(); String uri = mp.getUri();
standardInterpolatorProperties.add( new InterpolatorProperty( "${" + uri.substring( uri.lastIndexOf( "/" ) + 1, standardInterpolatorProperties.add( new InterpolatorProperty( "${" + uri.substring( uri.lastIndexOf( "/" ) + 1,
uri.length() ) + "}", mp.getValue() ) ); uri.length() ) + "}", mp.getValue(), PomInterpolatorTag.PROJECT_PROPERTIES.name() ) );
} }
} }
//FIRST PASS - Withhold using build directories as interpolator properties //FIRST PASS - Withhold using build directories as interpolator properties
List<InterpolatorProperty> ips1 = new ArrayList<InterpolatorProperty>(interpolatorProperties); List<InterpolatorProperty> ips1 = new ArrayList<InterpolatorProperty>(interpolatorProperties);
ips1.addAll(ModelTransformerContext.createInterpolatorProperties(firstPassModelProperties, ProjectUri.baseUri, aliases,
false, false));
ips1.addAll(standardInterpolatorProperties); ips1.addAll(standardInterpolatorProperties);
ips1.addAll(ModelTransformerContext.createInterpolatorProperties(firstPassModelProperties, ProjectUri.baseUri, aliases,
PomInterpolatorTag.PROJECT_PROPERTIES.name(), false, false));
Collections.sort(ips1, new Comparator<InterpolatorProperty>()
{
public int compare(InterpolatorProperty o, InterpolatorProperty o1) {
return PomInterpolatorTag.valueOf(o.getTag()).compareTo(PomInterpolatorTag.valueOf(o1.getTag()));
}
});
ModelTransformerContext.interpolateModelProperties( modelProperties, ips1 ); ModelTransformerContext.interpolateModelProperties( modelProperties, ips1 );
@ -642,9 +644,16 @@ public final class PomClassicTransformer
//THIRD PASS - Use build directories as interpolator properties //THIRD PASS - Use build directories as interpolator properties
List<InterpolatorProperty> ips2 = new ArrayList<InterpolatorProperty>(interpolatorProperties); List<InterpolatorProperty> ips2 = new ArrayList<InterpolatorProperty>(interpolatorProperties);
ips2.addAll(standardInterpolatorProperties);
ips2.addAll(ModelTransformerContext.createInterpolatorProperties(secondPassModelProperties, ProjectUri.baseUri, aliases, ips2.addAll(ModelTransformerContext.createInterpolatorProperties(secondPassModelProperties, ProjectUri.baseUri, aliases,
false, false)); PomInterpolatorTag.PROJECT_PROPERTIES.name(), false, false));
ips2.addAll(standardInterpolatorProperties); ips2.addAll(interpolatorProperties);
Collections.sort(ips2, new Comparator<InterpolatorProperty>()
{
public int compare(InterpolatorProperty o, InterpolatorProperty o1) {
return PomInterpolatorTag.valueOf(o.getTag()).compareTo(PomInterpolatorTag.valueOf(o1.getTag()));
}
});
ModelTransformerContext.interpolateModelProperties( modelProperties, ips2 ); ModelTransformerContext.interpolateModelProperties( modelProperties, ips2 );
} }

View File

@ -0,0 +1,14 @@
package org.apache.maven.project.builder;
public enum PomInterpolatorTag
{
USER_PROPERTIES,
PROJECT_PROPERTIES,
SYSTEM_PROPERTIES
}

View File

@ -36,6 +36,11 @@ public final class InterpolatorProperty
*/ */
private final String value; private final String value;
/**
* Metadata tag (general use)
*/
private String tag;
/** /**
* Constructor * Constructor
@ -44,6 +49,11 @@ public final class InterpolatorProperty
* @param value the value of the property. May not be null. * @param value the value of the property. May not be null.
*/ */
public InterpolatorProperty( String key, String value ) public InterpolatorProperty( String key, String value )
{
this(key, value, null);
}
public InterpolatorProperty( String key, String value, String tag )
{ {
if ( key == null ) if ( key == null )
{ {
@ -56,6 +66,8 @@ public final class InterpolatorProperty
} }
this.key = key; this.key = key;
this.value = value; this.value = value;
this.tag = tag;
} }
/** /**
@ -78,6 +90,16 @@ public final class InterpolatorProperty
return value; return value;
} }
public String getTag()
{
return tag;
}
public void setTag(String tag)
{
this.tag = tag;
}
/** /**
* Returns true if key values match, otherwise returns false. * Returns true if key values match, otherwise returns false.
* *
@ -121,7 +143,7 @@ public final class InterpolatorProperty
this.hashCode(); this.hashCode();
} }
public static List<InterpolatorProperty> toInterpolatorProperties( Properties properties ) public static List<InterpolatorProperty> toInterpolatorProperties( Properties properties, String tag )
{ {
if( properties == null ) if( properties == null )
{ {
@ -131,7 +153,7 @@ public final class InterpolatorProperty
List<InterpolatorProperty> interpolatorProperties = new ArrayList<InterpolatorProperty>(); List<InterpolatorProperty> interpolatorProperties = new ArrayList<InterpolatorProperty>();
for ( Map.Entry<Object, Object> e : properties.entrySet() ) for ( Map.Entry<Object, Object> e : properties.entrySet() )
{ {
interpolatorProperties.add( new InterpolatorProperty( "${" + e.getKey() +"}", (String) e.getValue()) ); interpolatorProperties.add( new InterpolatorProperty( "${" + e.getKey() +"}", (String) e.getValue(), tag) );
} }
return interpolatorProperties; return interpolatorProperties;
} }

View File

@ -78,6 +78,7 @@ public final class ModelTransformerContext
public static List<InterpolatorProperty> createInterpolatorProperties(List<ModelProperty> modelProperties, public static List<InterpolatorProperty> createInterpolatorProperties(List<ModelProperty> modelProperties,
String baseUriForModel, String baseUriForModel,
Map<String, String> aliases, Map<String, String> aliases,
String interpolatorTag,
boolean includeSystemProperties, boolean includeSystemProperties,
boolean includeEnvironmentProperties) boolean includeEnvironmentProperties)
{ {
@ -108,13 +109,14 @@ public final class ModelTransformerContext
{ {
InterpolatorProperty ip = mp.asInterpolatorProperty( baseUriForModel ); InterpolatorProperty ip = mp.asInterpolatorProperty( baseUriForModel );
if ( ip != null ) if ( ip != null )
{ { ip.setTag( interpolatorTag );
interpolatorProperties.add( ip ); interpolatorProperties.add( ip );
for ( Map.Entry<String, String> a : aliases.entrySet() ) for ( Map.Entry<String, String> a : aliases.entrySet() )
{ {
interpolatorProperties.add( new InterpolatorProperty( interpolatorProperties.add( new InterpolatorProperty(
ip.getKey().replaceAll( a.getKey(), a.getValue()), ip.getKey().replaceAll( a.getKey(), a.getValue()),
ip.getValue().replaceAll( a.getKey(), a.getValue()) ) ); ip.getValue().replaceAll( a.getKey(), a.getValue()),
interpolatorTag) );
} }
} }
} }
@ -124,6 +126,15 @@ public final class ModelTransformerContext
public static void interpolateModelProperties(List<ModelProperty> modelProperties, public static void interpolateModelProperties(List<ModelProperty> modelProperties,
List<InterpolatorProperty> interpolatorProperties ) List<InterpolatorProperty> interpolatorProperties )
{ {
if( modelProperties == null )
{
throw new IllegalArgumentException("modelProperties: null");
}
if( interpolatorProperties == null )
{
throw new IllegalArgumentException("interpolatorProperties: null");
}
List<ModelProperty> unresolvedProperties = new ArrayList<ModelProperty>(); List<ModelProperty> unresolvedProperties = new ArrayList<ModelProperty>();
for ( ModelProperty mp : modelProperties ) for ( ModelProperty mp : modelProperties )
@ -134,7 +145,10 @@ public final class ModelTransformerContext
} }
} }
for ( InterpolatorProperty ip : interpolatorProperties ) LinkedHashSet<InterpolatorProperty> ips = new LinkedHashSet<InterpolatorProperty>();
ips.addAll(interpolatorProperties);
for ( InterpolatorProperty ip : ips)
{ {
for ( ModelProperty mp : unresolvedProperties ) for ( ModelProperty mp : unresolvedProperties )
{ {
@ -142,8 +156,7 @@ public final class ModelTransformerContext
} }
} }
for ( InterpolatorProperty ip : ips )
for ( InterpolatorProperty ip : interpolatorProperties )
{ {
for ( ModelProperty mp : unresolvedProperties ) for ( ModelProperty mp : unresolvedProperties )
{ {
@ -152,7 +165,6 @@ public final class ModelTransformerContext
} }
} }
/** /**
* Transforms the specified model properties using the specified transformers. * Transforms the specified model properties using the specified transformers.
* *