mirror of https://github.com/apache/maven.git
OPEN - issue MNG-2577: Allow interpolation of Properties in settings.xml
http://jira.codehaus.org/browse/MNG-2577 Modifying to use request properties (embeddable system properties), and organizing this with the existing use of envars. NOT allowing profile-property interpolation, as these could influence profiles in a recursive manner and make their values hard to determine...besides, model-interpolation will pickup profile properties before POMs are interpolated, so the only thing this will miss is profile/properties -> servers, etc. inside the settings itself. git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@545283 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
bfce771633
commit
4626c93d3c
|
@ -55,6 +55,11 @@ under the License.
|
||||||
<artifactId>maven-model</artifactId>
|
<artifactId>maven-model</artifactId>
|
||||||
<version>2.1-SNAPSHOT</version>
|
<version>2.1-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven</groupId>
|
||||||
|
<artifactId>maven-build-context</artifactId>
|
||||||
|
<version>2.1-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.codehaus.plexus</groupId>
|
<groupId>org.codehaus.plexus</groupId>
|
||||||
<artifactId>plexus-container-default</artifactId>
|
<artifactId>plexus-container-default</artifactId>
|
||||||
|
|
|
@ -19,12 +19,16 @@ package org.apache.maven.settings;
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import org.apache.maven.context.BuildContextManager;
|
||||||
|
import org.apache.maven.context.SystemBuildContext;
|
||||||
import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader;
|
import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader;
|
||||||
|
import org.apache.maven.settings.io.xpp3.SettingsXpp3Writer;
|
||||||
import org.apache.maven.settings.validation.SettingsValidationResult;
|
import org.apache.maven.settings.validation.SettingsValidationResult;
|
||||||
import org.apache.maven.settings.validation.SettingsValidator;
|
import org.apache.maven.settings.validation.SettingsValidator;
|
||||||
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
import org.codehaus.plexus.logging.AbstractLogEnabled;
|
||||||
import org.codehaus.plexus.util.IOUtil;
|
import org.codehaus.plexus.util.IOUtil;
|
||||||
import org.codehaus.plexus.util.interpolation.EnvarBasedValueSource;
|
import org.codehaus.plexus.util.interpolation.EnvarBasedValueSource;
|
||||||
|
import org.codehaus.plexus.util.interpolation.PropertiesBasedValueSource;
|
||||||
import org.codehaus.plexus.util.interpolation.RegexBasedInterpolator;
|
import org.codehaus.plexus.util.interpolation.RegexBasedInterpolator;
|
||||||
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
||||||
|
|
||||||
|
@ -46,13 +50,15 @@ public class DefaultMavenSettingsBuilder
|
||||||
{
|
{
|
||||||
private SettingsValidator validator;
|
private SettingsValidator validator;
|
||||||
|
|
||||||
|
private BuildContextManager manager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 2.1
|
* @since 2.1
|
||||||
*/
|
*/
|
||||||
public Settings buildSettings( File userSettingsFile, File globalSettingsFile )
|
public Settings buildSettings( File userSettingsFile, File globalSettingsFile )
|
||||||
throws IOException, XmlPullParserException
|
throws IOException, XmlPullParserException
|
||||||
{
|
{
|
||||||
if ( globalSettingsFile == null && userSettingsFile == null )
|
if ( ( globalSettingsFile == null ) && ( userSettingsFile == null ) )
|
||||||
{
|
{
|
||||||
getLogger().debug(
|
getLogger().debug(
|
||||||
"No settings files provided, and default locations are disabled for this request. Returning empty Settings instance." );
|
"No settings files provided, and default locations are disabled for this request. Returning empty Settings instance." );
|
||||||
|
@ -60,7 +66,7 @@ public class DefaultMavenSettingsBuilder
|
||||||
}
|
}
|
||||||
|
|
||||||
getLogger().debug( "Reading global settings from: " + globalSettingsFile );
|
getLogger().debug( "Reading global settings from: " + globalSettingsFile );
|
||||||
|
|
||||||
Settings globalSettings = readSettings( globalSettingsFile );
|
Settings globalSettings = readSettings( globalSettingsFile );
|
||||||
|
|
||||||
if ( globalSettings == null )
|
if ( globalSettings == null )
|
||||||
|
@ -69,7 +75,7 @@ public class DefaultMavenSettingsBuilder
|
||||||
}
|
}
|
||||||
|
|
||||||
getLogger().debug( "Reading user settings from: " + userSettingsFile );
|
getLogger().debug( "Reading user settings from: " + userSettingsFile );
|
||||||
|
|
||||||
Settings userSettings = readSettings( userSettingsFile );
|
Settings userSettings = readSettings( userSettingsFile );
|
||||||
|
|
||||||
if ( userSettings == null )
|
if ( userSettings == null )
|
||||||
|
@ -85,9 +91,48 @@ public class DefaultMavenSettingsBuilder
|
||||||
|
|
||||||
activateDefaultProfiles( userSettings );
|
activateDefaultProfiles( userSettings );
|
||||||
|
|
||||||
|
userSettings = interpolate( userSettings );
|
||||||
|
|
||||||
return userSettings;
|
return userSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Settings interpolate( Settings settings )
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
List activeProfiles = settings.getActiveProfiles();
|
||||||
|
|
||||||
|
StringWriter writer = new StringWriter();
|
||||||
|
new SettingsXpp3Writer().write( writer, settings );
|
||||||
|
|
||||||
|
String serializedSettings = writer.toString();
|
||||||
|
|
||||||
|
SystemBuildContext sysContext = SystemBuildContext.getSystemBuildContext( manager, true );
|
||||||
|
|
||||||
|
RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
|
||||||
|
|
||||||
|
interpolator.addValueSource( new PropertiesBasedValueSource( sysContext.getSystemProperties() ) );
|
||||||
|
interpolator.addValueSource( new EnvarBasedValueSource() );
|
||||||
|
|
||||||
|
serializedSettings = interpolator.interpolate( serializedSettings, "settings" );
|
||||||
|
|
||||||
|
Settings result;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
result = new SettingsXpp3Reader().read( new StringReader( serializedSettings ) );
|
||||||
|
|
||||||
|
result.setActiveProfiles( activeProfiles );
|
||||||
|
}
|
||||||
|
catch ( XmlPullParserException e )
|
||||||
|
{
|
||||||
|
IOException error = new IOException( "Failed to parse interpolated settings: " + e.getMessage() );
|
||||||
|
error.initCause( e );
|
||||||
|
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
private Settings readSettings( File settingsFile )
|
private Settings readSettings( File settingsFile )
|
||||||
throws IOException, XmlPullParserException
|
throws IOException, XmlPullParserException
|
||||||
{
|
{
|
||||||
|
@ -102,39 +147,15 @@ public class DefaultMavenSettingsBuilder
|
||||||
if ( settingsFile.exists() && settingsFile.isFile() )
|
if ( settingsFile.exists() && settingsFile.isFile() )
|
||||||
{
|
{
|
||||||
getLogger().debug( "Settings file is a proper file. Reading." );
|
getLogger().debug( "Settings file is a proper file. Reading." );
|
||||||
|
|
||||||
FileReader reader = null;
|
FileReader reader = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
reader = new FileReader( settingsFile );
|
reader = new FileReader( settingsFile );
|
||||||
|
|
||||||
StringWriter sWriter = new StringWriter();
|
|
||||||
|
|
||||||
IOUtil.copy( reader, sWriter );
|
|
||||||
|
|
||||||
String rawInput = sWriter.toString();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
|
|
||||||
|
|
||||||
interpolator.addValueSource( new EnvarBasedValueSource() );
|
|
||||||
|
|
||||||
rawInput = interpolator.interpolate( rawInput, "settings" );
|
|
||||||
}
|
|
||||||
catch ( Exception e )
|
|
||||||
{
|
|
||||||
getLogger().warn(
|
|
||||||
"Failed to initialize environment variable resolver. Skipping environment substitution in settings." );
|
|
||||||
|
|
||||||
getLogger().debug( "Failed to initialize envar resolver. Skipping resolution.", e );
|
|
||||||
}
|
|
||||||
|
|
||||||
StringReader sReader = new StringReader( rawInput );
|
|
||||||
|
|
||||||
SettingsXpp3Reader modelReader = new SettingsXpp3Reader();
|
SettingsXpp3Reader modelReader = new SettingsXpp3Reader();
|
||||||
|
|
||||||
settings = modelReader.read( sReader );
|
settings = modelReader.read( reader );
|
||||||
|
|
||||||
RuntimeInfo rtInfo = new RuntimeInfo( settings );
|
RuntimeInfo rtInfo = new RuntimeInfo( settings );
|
||||||
|
|
||||||
|
@ -145,13 +166,13 @@ public class DefaultMavenSettingsBuilder
|
||||||
catch ( XmlPullParserException e )
|
catch ( XmlPullParserException e )
|
||||||
{
|
{
|
||||||
getLogger().error( "Failed to read settings from: " + settingsFile + ". Throwing XmlPullParserException..." );
|
getLogger().error( "Failed to read settings from: " + settingsFile + ". Throwing XmlPullParserException..." );
|
||||||
|
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
catch ( IOException e )
|
catch ( IOException e )
|
||||||
{
|
{
|
||||||
getLogger().error( "Failed to read settings from: " + settingsFile + ". Throwing IOException..." );
|
getLogger().error( "Failed to read settings from: " + settingsFile + ". Throwing IOException..." );
|
||||||
|
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
|
@ -170,7 +191,7 @@ public class DefaultMavenSettingsBuilder
|
||||||
for ( Iterator profiles = settings.getProfiles().iterator(); profiles.hasNext(); )
|
for ( Iterator profiles = settings.getProfiles().iterator(); profiles.hasNext(); )
|
||||||
{
|
{
|
||||||
Profile profile = (Profile) profiles.next();
|
Profile profile = (Profile) profiles.next();
|
||||||
if ( profile.getActivation() != null && profile.getActivation().isActiveByDefault()
|
if ( ( profile.getActivation() != null ) && profile.getActivation().isActiveByDefault()
|
||||||
&& !activeProfiles.contains( profile.getId() ) )
|
&& !activeProfiles.contains( profile.getId() ) )
|
||||||
{
|
{
|
||||||
settings.addActiveProfile( profile.getId() );
|
settings.addActiveProfile( profile.getId() );
|
||||||
|
|
Loading…
Reference in New Issue