Adding -V|--show-version, and cleaning up interpolation to correspond with recent refactoriing in 2.0.x branch. Also, changing super-POM to use basedir/build.directory expressions in build paths, to enable paths to respond to changes in other, more basic paths (like outputDirectory responding to a change in build.directory). This is in preparation for merging over the dynamicBuild behavior.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@671936 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
John Dennis Casey 2008-06-26 16:34:27 +00:00
parent 179ce1a925
commit cd2602d9e6
14 changed files with 161 additions and 129 deletions

View File

@ -743,6 +743,7 @@ public class DefaultMavenExecutionRequest
projectBuildingConfiguration.setExecutionProperties( getProperties() );
projectBuildingConfiguration.setGlobalProfileManager( getProfileManager() );
projectBuildingConfiguration.setUserProperties( getUserProperties() );
projectBuildingConfiguration.setBuildStartTime( getStartTime() );
}
return projectBuildingConfiguration;

View File

@ -25,6 +25,7 @@ import org.apache.maven.monitor.event.EventDispatcher;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuilderConfiguration;
import org.apache.maven.realm.MavenRealmManager;
import org.apache.maven.reporting.MavenReport;
import org.apache.maven.settings.Settings;
@ -276,4 +277,9 @@ public class MavenSession
return buildPlans;
}
public ProjectBuilderConfiguration getProjectBuilderConfiguration()
{
return request.getProjectBuildingConfiguration();
}
}

View File

@ -162,7 +162,7 @@ public class DefaultBuildExtensionScanner
inheritedInterpolationValues = new HashMap();
}
model = modelInterpolator.interpolate( model, inheritedInterpolationValues, request.getUserProperties(), false );
model = modelInterpolator.interpolate( model, modelPom.getParentFile(), request.getProjectBuildingConfiguration(), getLogger().isDebugEnabled() );
grabManagedPluginsWithExtensionsFlagTurnedOn( model, managedPluginsWithExtensionsFlag );

View File

@ -56,6 +56,8 @@ public class CLIManager
public static final char VERSION = 'v';
public static final char SHOW_VERSION = 'V';
public static final char NON_RECURSIVE = 'N';
public static final char UPDATE_SNAPSHOTS = 'U';
@ -161,6 +163,10 @@ public class CLIManager
options.addOption( OptionBuilder.withLongOpt( "log-file" ).hasArg().withDescription(
"Log file to where all build output will go." ).create( LOG_FILE ) );
options.addOption(
OptionBuilder.withLongOpt( "show-version" ).withDescription( "Display version information WITHOUT stopping build" ).create(
SHOW_VERSION ) );
}
public CommandLine parse( String[] args )

View File

@ -128,7 +128,7 @@ public class MavenCli
return 0;
}
else if ( debug )
else if ( debug || commandLine.hasOption( CLIManager.SHOW_VERSION ) )
{
CLIReportingUtils.showVersion();
}

View File

@ -201,6 +201,7 @@ public class DefaultMavenProjectBuilder
}
/** @deprecated */
@Deprecated
public MavenProject buildFromRepository( Artifact artifact,
List remoteArtifactRepositories,
ArtifactRepository localRepository,
@ -965,18 +966,6 @@ public class DefaultMavenProjectBuilder
List activeProfiles = project.getActiveProfiles();
// TODO: Clean this up...we're using this to 'jump' the interpolation step for model properties not expressed in XML.
// [BP] - Can this above comment be explained?
// We don't need all the project methods that are added over those in the model, but we do need basedir
// mkleint - using System.getProperties() is almost definitely bad for embedding.
Map context = new HashMap();
// [MNG-2339] ensure the system properties are still interpolated for backwards compat, but the model values must win
if ( config.getExecutionProperties() != null && !config.getExecutionProperties().isEmpty() )
{
context.putAll( config.getExecutionProperties() );
}
File projectDir = null;
if ( pomFile != null )
@ -984,13 +973,7 @@ public class DefaultMavenProjectBuilder
projectDir = pomFile.getAbsoluteFile().getParentFile();
}
Map overrideContext = new HashMap();
if ( !isSuperPom && config.getUserProperties() != null && !config.getUserProperties().isEmpty() )
{
overrideContext.putAll( config.getUserProperties() );
}
model = modelInterpolator.interpolate( model, context, overrideContext, projectDir, true );
model = modelInterpolator.interpolate( model, projectDir, config, getLogger().isDebugEnabled() );
// We must inject any imported dependencyManagement information ahead of the defaults injection.
if ( !isSuperPom )
@ -1309,6 +1292,7 @@ public class DefaultMavenProjectBuilder
* @return
* @throws ProjectBuildingException
*/
@Deprecated
protected Set createPluginArtifacts( String projectId,
List plugins, String pomLocation )
throws ProjectBuildingException
@ -1372,6 +1356,7 @@ public class DefaultMavenProjectBuilder
* @return
* @throws ProjectBuildingException
*/
@Deprecated
protected Set createReportArtifacts( String projectId,
List reports, String pomLocation )
throws ProjectBuildingException
@ -1431,6 +1416,7 @@ public class DefaultMavenProjectBuilder
* @return
* @throws ProjectBuildingException
*/
@Deprecated
protected Set createExtensionArtifacts( String projectId,
List extensions, String pomLocation )
throws ProjectBuildingException

View File

@ -3,6 +3,7 @@ package org.apache.maven.project;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.profiles.ProfileManager;
import java.util.Date;
import java.util.Properties;
public class DefaultProjectBuilderConfiguration
@ -17,6 +18,8 @@ public class DefaultProjectBuilderConfiguration
private Properties executionProperties = System.getProperties();
private Date buildStartTime;
public DefaultProjectBuilderConfiguration()
{
}
@ -70,4 +73,15 @@ public class DefaultProjectBuilderConfiguration
return this;
}
public Date getBuildStartTime()
{
return buildStartTime;
}
public ProjectBuilderConfiguration setBuildStartTime( Date buildStartTime )
{
this.buildStartTime = buildStartTime;
return this;
}
}

View File

@ -3,6 +3,7 @@ package org.apache.maven.project;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.profiles.ProfileManager;
import java.util.Date;
import java.util.Properties;
public interface ProjectBuilderConfiguration
@ -24,4 +25,8 @@ public interface ProjectBuilderConfiguration
ProjectBuilderConfiguration setExecutionProperties( Properties executionProperties );
Date getBuildStartTime();
ProjectBuilderConfiguration setBuildStartTime( Date buildStartTime );
}

View File

@ -0,0 +1,32 @@
package org.apache.maven.project.interpolation;
import org.codehaus.plexus.interpolation.ValueSource;
import java.text.SimpleDateFormat;
import java.util.Date;
public class BuildTimestampValueSource
implements ValueSource
{
private String formattedDate;
public BuildTimestampValueSource( Date startTime, String format )
{
if ( startTime != null )
{
formattedDate = new SimpleDateFormat( format ).format( startTime );
}
}
public Object getValue( String expression )
{
if ( "build.timestamp".equals( expression ) || "maven.build.timestamp".equals( expression ) )
{
return formattedDate;
}
return null;
}
}

View File

@ -20,6 +20,7 @@ package org.apache.maven.project.interpolation;
*/
import org.apache.maven.model.Model;
import org.apache.maven.project.ProjectBuilderConfiguration;
import java.io.File;
import java.util.Map;
@ -31,27 +32,39 @@ import java.util.Map;
*/
public interface ModelInterpolator
{
String DEFAULT_BUILD_TIMESTAMP_FORMAT = "yyyyMMdd-hhmm";
String BUILD_TIMESTAMP_FORMAT_PROPERTY = "maven.build.timestamp.format";
String ROLE = ModelInterpolator.class.getName();
/**
* @deprecated Use {@link ModelInterpolator#interpolate(Model, File, ProjectBuilderConfiguration, boolean)} instead.
*/
@Deprecated
Model interpolate( Model project,
Map context )
Map<String, ?> context )
throws ModelInterpolationException;
/**
* @deprecated Use {@link ModelInterpolator#interpolate(Model, File, ProjectBuilderConfiguration, boolean)} instead.
*/
@Deprecated
Model interpolate( Model model,
Map context,
Map<String, ?> context,
boolean strict )
throws ModelInterpolationException;
Model interpolate( Model model,
Map context,
Map overrideContext,
boolean outputDebugMessages )
File projectDir,
ProjectBuilderConfiguration config,
boolean debugEnabled )
throws ModelInterpolationException;
Model interpolate( Model model,
Map context,
Map overrideContext,
File projectDir,
boolean outputDebugMessages )
String interpolate( String src,
Model model,
File projectDir,
ProjectBuilderConfiguration config,
boolean debugEnabled )
throws ModelInterpolationException;
}

View File

@ -11,11 +11,11 @@ public class PathTranslatingValueSource
extends AbstractFunctionValueSourceWrapper
{
private final List unprefixedPathKeys;
private final List<String> unprefixedPathKeys;
private final File projectDir;
private final PathTranslator pathTranslator;
protected PathTranslatingValueSource( ValueSource valueSource, List unprefixedPathKeys, File projectDir, PathTranslator pathTranslator )
protected PathTranslatingValueSource( ValueSource valueSource, List<String> unprefixedPathKeys, File projectDir, PathTranslator pathTranslator )
{
super( valueSource );
this.unprefixedPathKeys = unprefixedPathKeys;
@ -23,6 +23,7 @@ public class PathTranslatingValueSource
this.pathTranslator = pathTranslator;
}
@Override
protected Object executeFunction( String expression,
Object value )
{

View File

@ -22,6 +22,8 @@ package org.apache.maven.project.interpolation;
import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
import org.apache.maven.project.DefaultProjectBuilderConfiguration;
import org.apache.maven.project.ProjectBuilderConfiguration;
import org.apache.maven.project.path.PathTranslator;
import org.codehaus.plexus.interpolation.InterpolationException;
import org.codehaus.plexus.interpolation.MapBasedValueSource;
@ -34,7 +36,6 @@ import org.codehaus.plexus.interpolation.RegexBasedInterpolator;
import org.codehaus.plexus.interpolation.ValueSource;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.File;
@ -43,12 +44,10 @@ import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Properties;
/**
* Use a regular expression search to find and resolve expressions within the POM.
@ -61,14 +60,13 @@ public class RegexBasedModelInterpolator
extends AbstractLogEnabled
implements ModelInterpolator
{
private static final Pattern EXPRESSION_PATTERN = Pattern.compile( "\\$\\{([^}]+)\\}" );
private static final List PROJECT_PREFIXES = Arrays.asList( new String[]{ "pom.", "project." } );
private static final List TRANSLATED_PATH_EXPRESSIONS;
private static final List<String> PROJECT_PREFIXES = Arrays.asList( new String[]{ "pom.", "project." } );
private static final List<String> TRANSLATED_PATH_EXPRESSIONS;
static
{
List translatedPrefixes = new ArrayList();
List<String> translatedPrefixes = new ArrayList<String>();
// MNG-1927, MNG-2124, MNG-3355:
// If the build section is present and the project directory is non-null, we should make
@ -91,25 +89,28 @@ public class RegexBasedModelInterpolator
{
}
public Model interpolate( Model model, Map context )
public Model interpolate( Model model, Map<String, ?> context )
throws ModelInterpolationException
{
return interpolate( model, context, Collections.EMPTY_MAP, null, true );
Properties props = new Properties();
props.putAll( context );
return interpolate( model,
null,
new DefaultProjectBuilderConfiguration().setExecutionProperties( props ),
true );
}
public Model interpolate( Model model, Map context, boolean strict )
public Model interpolate( Model model, Map<String, ?> context, boolean strict )
throws ModelInterpolationException
{
return interpolate( model, context, Collections.EMPTY_MAP, null, true );
}
Properties props = new Properties();
props.putAll( context );
public Model interpolate( Model model,
Map context,
Map overrideContext,
boolean strict )
throws ModelInterpolationException
{
return interpolate( model, context, Collections.EMPTY_MAP, null, true );
return interpolate( model,
null,
new DefaultProjectBuilderConfiguration().setExecutionProperties( props ),
true );
}
/**
@ -125,10 +126,10 @@ public class RegexBasedModelInterpolator
* or userProperties in the execution request.
* @param projectDir The directory from which the current model's pom was read.
* @param strict This parameter is ignored!
* @param outputDebugMessages If true, print any feedback from the interpolator out to the DEBUG log-level.
* @param debugMessages If true, print any feedback from the interpolator out to the DEBUG log-level.
* @return The resolved instance of the inbound Model. This is a different instance!
*/
public Model interpolate( Model model, Map context, Map overrideContext, File projectDir, boolean outputDebugMessages )
public Model interpolate( Model model, File projectDir, ProjectBuilderConfiguration config, boolean debugMessages )
throws ModelInterpolationException
{
StringWriter sWriter = new StringWriter();
@ -144,7 +145,7 @@ public class RegexBasedModelInterpolator
}
String serializedModel = sWriter.toString();
serializedModel = interpolateInternal( serializedModel, model, context, overrideContext, projectDir, outputDebugMessages );
serializedModel = interpolate( serializedModel, model, projectDir, config, debugMessages );
StringReader sReader = new StringReader( serializedModel );
@ -179,18 +180,25 @@ public class RegexBasedModelInterpolator
* <li>If the value is null, get it from the model properties.</li>
* <li>
* @param overrideContext
* @param outputDebugMessages
* @param debugMessages
*/
private String interpolateInternal( String src,
public String interpolate( String src,
Model model,
Map context,
Map overrideContext,
final File projectDir,
boolean outputDebugMessages )
ProjectBuilderConfiguration config,
boolean debugMessages )
throws ModelInterpolationException
{
Logger logger = getLogger();
String timestampFormat = DEFAULT_BUILD_TIMESTAMP_FORMAT;
Properties modelProperties = model.getProperties();
if ( modelProperties != null )
{
timestampFormat = modelProperties.getProperty( BUILD_TIMESTAMP_FORMAT_PROPERTY, timestampFormat );
}
ValueSource baseModelValueSource1 = new PrefixedObjectValueSource( PROJECT_PREFIXES, model, false );
ValueSource modelValueSource1 = new PathTranslatingValueSource( baseModelValueSource1,
TRANSLATED_PATH_EXPRESSIONS,
@ -218,76 +226,34 @@ public class RegexBasedModelInterpolator
// NOTE: Order counts here!
interpolator.addValueSource( basedirValueSource );
interpolator.addValueSource( new MapBasedValueSource( overrideContext ) );
interpolator.addValueSource( new BuildTimestampValueSource( config.getBuildStartTime(), timestampFormat ) );
interpolator.addValueSource( new MapBasedValueSource( config.getExecutionProperties() ) );
interpolator.addValueSource( modelValueSource1 );
interpolator.addValueSource( new PrefixedValueSourceWrapper( new MapBasedValueSource( model.getProperties() ), PROJECT_PREFIXES, true ) );
interpolator.addValueSource( new PrefixedValueSourceWrapper( new MapBasedValueSource( modelProperties ), PROJECT_PREFIXES, true ) );
interpolator.addValueSource( modelValueSource2 );
interpolator.addValueSource( new MapBasedValueSource( context ) );
interpolator.addValueSource( new MapBasedValueSource( config.getUserProperties() ) );
RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor( PROJECT_PREFIXES );
String result = src;
Matcher matcher = EXPRESSION_PATTERN.matcher( result );
while ( matcher.find() )
try
{
String wholeExpr = matcher.group( 0 );
Object value;
try
{
value = interpolator.interpolate( wholeExpr, "", recursionInterceptor );
}
catch( InterpolationException e )
{
throw new ModelInterpolationException( e.getMessage(), e );
}
if ( value == null || value.equals( wholeExpr ) )
{
continue;
}
// FIXME: Does this account for the case where ${project.build.directory} -> ${build.directory}??
if ( value != null )
{
// if the expression refers to itself, skip it.
// replace project. expressions with pom. expressions to circumvent self-referencing expressions using
// the 2 different model expressions.
if ( StringUtils.replace( value.toString(), "${project.", "${pom." ).indexOf(
StringUtils.replace( wholeExpr, "${project.", "${pom." ) ) > -1 )
{
throw new ModelInterpolationException( wholeExpr, "Expression value '" + value
+ "' references itself in '" + model.getId() + "'." );
}
result = StringUtils.replace( result, wholeExpr, value.toString() );
// could use:
// result = matcher.replaceFirst( stringValue );
// but this could result in multiple lookups of stringValue, and replaceAll is not correct behaviour
matcher.reset( result );
}
/*
// This is the desired behaviour, however there are too many crappy poms in the repo and an issue with the
// timing of executing the interpolation
else
{
throw new ModelInterpolationException(
"Expression '" + wholeExpr + "' did not evaluate to anything in the model" );
}
*/
result = interpolator.interpolate( result, "", recursionInterceptor );
}
catch( InterpolationException e )
{
throw new ModelInterpolationException( e.getMessage(), e );
}
if ( outputDebugMessages )
if ( debugMessages )
{
List feedback = interpolator.getFeedback();
List<?> feedback = interpolator.getFeedback();
if ( feedback != null && !feedback.isEmpty() )
{
logger.debug( "Maven encountered the following problems during initial POM interpolation:" );
Object last = null;
for ( Iterator it = feedback.iterator(); it.hasNext(); )
for ( Iterator<?> it = feedback.iterator(); it.hasNext(); )
{
Object next = it.next();

View File

@ -50,21 +50,21 @@ under the License.
</pluginRepositories>
<build>
<directory>target</directory>
<outputDirectory>target/classes</outputDirectory>
<directory>${project.basedir}/target</directory>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<finalName>${project.artifactId}-${project.version}</finalName>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
<sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
<pluginManagement>
@ -150,7 +150,7 @@ under the License.
</build>
<reporting>
<outputDirectory>target/site</outputDirectory>
<outputDirectory>${project.build.directory}/site</outputDirectory>
</reporting>
</project>
<!-- END SNIPPET: superpom -->

View File

@ -26,11 +26,12 @@ import org.apache.maven.model.Model;
import org.apache.maven.model.Organization;
import org.apache.maven.model.Repository;
import org.apache.maven.model.Scm;
import org.apache.maven.project.DefaultProjectBuilderConfiguration;
import org.apache.maven.project.ProjectBuilderConfiguration;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
@ -45,6 +46,7 @@ public class RegexBasedModelInterpolatorTest
{
private Map context;
@Override
protected void setUp()
throws Exception
{
@ -66,15 +68,15 @@ public class RegexBasedModelInterpolatorTest
dm.setRepository( repo );
model.setDistributionManagement( dm );
Map context = new HashMap();
String path = "path/to/project";
File basedir = new File( path ).getAbsoluteFile();
ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration();
Model out = new RegexBasedModelInterpolator().interpolate( model,
context,
Collections.EMPTY_MAP,
basedir,
config,
false );
assertEquals( "http://localhost/" + basedir.getAbsolutePath() + "/target/test-repo",