Author: jdcasey Date: Tue Feb 24 17:06:19 2009 New Revision: 747440 URL: http://svn.apache.org/viewvc?rev=747440&view=rev Log: [MNG-3057] Switch from model-object interpolation to String-based selective interpolation of the POM XML contents, to avoid problems reading/writing XML that contains comments (due to XPP3 model reader/writer). New approach uses two-stage interpolation, where first isolates XML version elements and hands off to second stage, which interpolates the value. Finally, bumping wagon version to 1.0-beta-5 to reflect this release.
Added: maven/components/branches/maven-2.1.x/maven-project/src/test/resources/version-expressions/ maven/components/branches/maven-2.1.x/maven-project/src/test/resources/version-expressions/pom-with-comments.xml (with props) Modified: maven/components/branches/maven-2.1.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java maven/components/branches/maven-2.1.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/installer/DefaultArtifactInstaller.java maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/artifact/VersionExpressionTransformation.java maven/components/branches/maven-2.1.x/maven-project/src/test/java/org/apache/maven/project/artifact/VersionExpressionTransformationTest.java maven/components/branches/maven-2.1.x/pom.xml Modified: maven/components/branches/maven-2.1.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java?rev=747440&r1=747439&r2=747440&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java (original) +++ maven/components/branches/maven-2.1.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/deployer/DefaultArtifactDeployer.java Tue Feb 24 17:06:19 2009 @@ -74,13 +74,10 @@ // Here, we also set a flag indicating that the POM has been shunted through the Artifact, // and to expect the transformed version to be available in the Artifact afterwards... boolean useArtifactFile = false; + File oldArtifactFile = artifact.getFile(); if ( "pom".equals( artifact.getType() ) ) { - if ( artifact.getFile() == null ) - { - artifact.setFile( source ); - } - + artifact.setFile( source ); useArtifactFile = true; } @@ -94,6 +91,7 @@ if ( useArtifactFile ) { source = artifact.getFile(); + artifact.setFile( oldArtifactFile ); } // FIXME: Why oh why are we re-installing the artifact in the local repository? Isn't this Modified: maven/components/branches/maven-2.1.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/installer/DefaultArtifactInstaller.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/installer/DefaultArtifactInstaller.java?rev=747440&r1=747439&r2=747440&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/installer/DefaultArtifactInstaller.java (original) +++ maven/components/branches/maven-2.1.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/installer/DefaultArtifactInstaller.java Tue Feb 24 17:06:19 2009 @@ -64,13 +64,10 @@ // Here, we also set a flag indicating that the POM has been shunted through the Artifact, // and to expect the transformed version to be available in the Artifact afterwards... boolean useArtifactFile = false; + File oldArtifactFile = artifact.getFile(); if ( "pom".equals( artifact.getType() ) ) { - if ( artifact.getFile() == null ) - { - artifact.setFile( source ); - } - + artifact.setFile( source ); useArtifactFile = true; } @@ -84,6 +81,7 @@ if ( useArtifactFile ) { source = artifact.getFile(); + artifact.setFile( oldArtifactFile ); } String localPath = localRepository.pathOf( artifact ); Modified: maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/artifact/VersionExpressionTransformation.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/artifact/VersionExpressionTransformation.java?rev=747440&r1=747439&r2=747440&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/artifact/VersionExpressionTransformation.java (original) +++ maven/components/branches/maven-2.1.x/maven-project/src/main/java/org/apache/maven/project/artifact/VersionExpressionTransformation.java Tue Feb 24 17:06:19 2009 @@ -26,12 +26,8 @@ import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.transform.ArtifactTransformation; -import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; -import org.apache.maven.model.Plugin; -import org.apache.maven.model.ReportPlugin; 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.MavenProject; import org.apache.maven.project.ProjectBuilderConfiguration; @@ -40,10 +36,10 @@ import org.codehaus.plexus.interpolation.InterpolationException; import org.codehaus.plexus.interpolation.InterpolationPostProcessor; import org.codehaus.plexus.interpolation.Interpolator; +import org.codehaus.plexus.interpolation.RecursionInterceptor; +import org.codehaus.plexus.interpolation.StringSearchInterpolator; import org.codehaus.plexus.interpolation.ValueSource; -import org.codehaus.plexus.interpolation.object.FieldBasedObjectInterpolator; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; @@ -52,37 +48,18 @@ import java.io.FileWriter; import java.io.IOException; import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; import java.io.Writer; -import java.lang.reflect.Field; import java.util.ArrayList; -import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Set; public class VersionExpressionTransformation extends StringSearchModelInterpolator implements Initializable, ArtifactTransformation { - private static Set BLACKLISTED_FIELD_NAMES; - - private static final Set WHITELISTED_FIELD_NAMES; - - static - { - Set whitelist = new HashSet(); - - whitelist.add( "version" ); - whitelist.add( "dependencies" ); - whitelist.add( "build" ); - whitelist.add( "plugins" ); - whitelist.add( "reporting" ); - whitelist.add( "parent" ); - - WHITELISTED_FIELD_NAMES = whitelist; - } - public void transformForDeployment( Artifact artifact, ArtifactRepository remoteRepository, ArtifactRepository localRepository ) throws ArtifactDeploymentException @@ -246,31 +223,37 @@ IOUtil.close( reader ); } - interpolateVersions( model, projectDir, pbConfig ); - - Writer writer = null; - try - { - outputFile.getParentFile().mkdirs(); - - writer = new FileWriter( outputFile ); - - new MavenXpp3Writer().write( writer, model ); - } - finally - { - IOUtil.close( writer ); - } + interpolateVersions( pomFile, outputFile, model, projectDir, pbConfig ); return outputFile; } - protected void interpolateVersions( Model model, File projectDir, ProjectBuilderConfiguration config ) + protected void interpolateVersions( File pomFile, File outputFile, Model model, File projectDir, ProjectBuilderConfiguration config ) throws ModelInterpolationException { boolean debugEnabled = getLogger().isDebugEnabled(); - Interpolator interpolator = getInterpolator(); + // NOTE: We want to interpolate version expressions ONLY, and want to do so without requiring the + // use of the XPP3 Model reader/writers, which have a tendency to lose XML comments and such. + // SOOO, we're using a two-stage string interpolation here. The first stage selects all XML 'version' + // elements, and subjects their values to interpolation in the second stage. + Interpolator interpolator = new StringSearchInterpolator( "<version>", "</version>" ); + + // The second-stage interpolator is the 'normal' one used in all Model interpolation throughout + // maven-project. + Interpolator secondaryInterpolator = getInterpolator(); + + // We'll just reuse the recursion interceptor...not sure it makes any difference. + RecursionInterceptor recursionInterceptor = getRecursionInterceptor(); + + // This is a ValueSource implementation that simply delegates to the second-stage "real" interpolator + // once we've isolated the version elements from the input XML. + interpolator.addValueSource( new SecondaryInterpolationValueSource( secondaryInterpolator, recursionInterceptor ) ); + + // The primary interpolator is searching for version XML elements, and interpolating their values. Since + // '<version>' and '</version>' are the delimiters for this, the interpolator will remove these tokens + // from the result. So, we need to put them back before including the interpolated result. + interpolator.addPostProcessor( new VersionRestoringPostProcessor() ); List valueSources = createValueSources( model, projectDir, config ); List postProcessors = createPostProcessors( model, projectDir, config ); @@ -280,25 +263,40 @@ for ( Iterator it = valueSources.iterator(); it.hasNext(); ) { ValueSource vs = (ValueSource) it.next(); - interpolator.addValueSource( vs ); + secondaryInterpolator.addValueSource( vs ); } for ( Iterator it = postProcessors.iterator(); it.hasNext(); ) { InterpolationPostProcessor postProcessor = (InterpolationPostProcessor) it.next(); - interpolator.addPostProcessor( postProcessor ); + secondaryInterpolator.addPostProcessor( postProcessor ); } + String pomContents; try { - FieldBasedObjectInterpolator objInterpolator = - new FieldBasedObjectInterpolator( BLACKLISTED_FIELD_NAMES, - FieldBasedObjectInterpolator.DEFAULT_BLACKLISTED_PACKAGE_PREFIXES ); - + FileReader reader = null; + try + { + reader = new FileReader( pomFile ); + StringWriter writer = new StringWriter(); + IOUtil.copy( reader, writer ); + + pomContents = writer.toString(); + } + catch ( IOException e ) + { + throw new ModelInterpolationException( "Error reading POM for version-expression interpolation: " + e.getMessage(), e ); + } + finally + { + IOUtil.close( reader ); + } + try { - objInterpolator.interpolate( model, getInterpolator(), getRecursionInterceptor() ); + pomContents = interpolator.interpolate( pomContents ); } catch ( InterpolationException e ) { @@ -307,18 +305,7 @@ if ( debugEnabled ) { - List feedback = new ArrayList(); - if ( objInterpolator.hasWarnings() ) - { - feedback.addAll( objInterpolator.getWarnings() ); - } - - List internalFeedback = interpolator.getFeedback(); - if ( internalFeedback != null && !internalFeedback.isEmpty() ) - { - feedback.addAll( internalFeedback ); - } - + List feedback = interpolator.getFeedback(); if ( feedback != null && !feedback.isEmpty() ) { getLogger().debug( "Maven encountered the following problems while transforming POM versions:" ); @@ -364,52 +351,100 @@ for ( Iterator iterator = valueSources.iterator(); iterator.hasNext(); ) { ValueSource vs = (ValueSource) iterator.next(); - interpolator.removeValuesSource( vs ); + secondaryInterpolator.removeValuesSource( vs ); } for ( Iterator iterator = postProcessors.iterator(); iterator.hasNext(); ) { InterpolationPostProcessor postProcessor = (InterpolationPostProcessor) iterator.next(); - interpolator.removePostProcessor( postProcessor ); + secondaryInterpolator.removePostProcessor( postProcessor ); } getInterpolator().clearAnswers(); } + + Writer writer = null; + try + { + outputFile.getParentFile().mkdirs(); + + writer = new FileWriter( outputFile ); + + IOUtil.copy( new StringReader( pomContents ), writer ); + } + catch ( IOException e ) + { + throw new ModelInterpolationException( "Failed to write transformed POM: " + outputFile.getAbsolutePath(), e ); + } + finally + { + IOUtil.close( writer ); + } } - + // if ( error != null ) // { // throw error; // } } - public void initialize() - throws InitializationException + private static final class SecondaryInterpolationValueSource + implements ValueSource { - super.initialize(); - synchronized ( VersionExpressionTransformation.class ) + private Interpolator secondary; + private final RecursionInterceptor recursionInterceptor; + private List localFeedback = new ArrayList(); + + public SecondaryInterpolationValueSource( Interpolator secondary, RecursionInterceptor recursionInterceptor ) { - if ( BLACKLISTED_FIELD_NAMES == null ) - { - Set fieldNames = new HashSet(); + this.secondary = secondary; + this.recursionInterceptor = recursionInterceptor; + } - Class[] classes = { Model.class, Dependency.class, Plugin.class, ReportPlugin.class }; - for ( int i = 0; i < classes.length; i++ ) - { - Field[] fields = classes[i].getDeclaredFields(); - for ( int j = 0; j < fields.length; j++ ) - { - if ( !WHITELISTED_FIELD_NAMES.contains( fields[j].getName() ) ) - { - fieldNames.add( fields[j].getName() ); - } - } - } + public void clearFeedback() + { + secondary.clearFeedback(); + } + + public List getFeedback() + { + List result = secondary.getFeedback(); + if ( result != null ) + { + result = new ArrayList( result ); + } + + result.addAll( localFeedback ); + + return result; + } - BLACKLISTED_FIELD_NAMES = fieldNames; + public Object getValue( String expression ) + { + try + { + return secondary.interpolate( expression, recursionInterceptor ); } + catch ( InterpolationException e ) + { + localFeedback.add( "Error during version expression interpolation." ); + localFeedback.add( e ); + } + + return null; } } + + private static final class VersionRestoringPostProcessor + implements InterpolationPostProcessor + { + + public Object execute( String expression, Object value ) + { + return "<version>" + value + "</version>"; + } + + } } Modified: maven/components/branches/maven-2.1.x/maven-project/src/test/java/org/apache/maven/project/artifact/VersionExpressionTransformationTest.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-project/src/test/java/org/apache/maven/project/artifact/VersionExpressionTransformationTest.java?rev=747440&r1=747439&r2=747440&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/maven-project/src/test/java/org/apache/maven/project/artifact/VersionExpressionTransformationTest.java (original) +++ maven/components/branches/maven-2.1.x/maven-project/src/test/java/org/apache/maven/project/artifact/VersionExpressionTransformationTest.java Tue Feb 24 17:06:19 2009 @@ -55,8 +55,17 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.io.StringWriter; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; import java.util.Properties; +import java.util.Set; public class VersionExpressionTransformationTest extends PlexusTestCase @@ -65,6 +74,8 @@ private static final String VERSION = "blah"; private VersionExpressionTransformation transformation; + + private Set toDelete = new HashSet(); public void setUp() throws Exception @@ -74,6 +85,114 @@ transformation = (VersionExpressionTransformation) lookup( ArtifactTransformation.class.getName(), "version-expression" ); } + + public void tearDown() + throws Exception + { + super.tearDown(); + + if ( toDelete != null && !toDelete.isEmpty() ) + { + for ( Iterator it = toDelete.iterator(); it.hasNext(); ) + { + File f = (File) it.next(); + + try + { + FileUtils.forceDelete( f ); + } + catch ( IOException e ) + { + System.out.println( "Failed to delete temp file: '" + f.getAbsolutePath() + "'." ); + e.printStackTrace(); + } + } + } + } + + public void testTransformForInstall_PreserveComments() + throws URISyntaxException, IOException, XmlPullParserException, ModelInterpolationException + { + String pomResource = "version-expressions/pom-with-comments.xml"; + File pomFile = getPom( pomResource ); + + Model model; + Reader reader = null; + try + { + reader = new FileReader( pomFile ); + + model = new MavenXpp3Reader().read( reader ); + } + finally + { + IOUtil.close( reader ); + } + + File newPom = runTransformVersion_VanillaArtifact( model, pomFile ); + + StringWriter writer = new StringWriter(); + reader = null; + try + { + reader = new FileReader( newPom ); + IOUtil.copy( reader, writer ); + } + finally + { + IOUtil.close( reader ); + } + + assertTrue( "XML comment not found.", writer.toString().indexOf( "This is a comment." ) > -1 ); + + reader = new StringReader( writer.toString() ); + try + { + model = new MavenXpp3Reader().read( reader ); + } + finally + { + IOUtil.close( reader ); + } + + assertEquals( "1.0", model.getVersion() ); + + assertNotNull( model.getProperties() ); + + assertNotNull( model.getProperties().getProperty( "other.version" ) ); + assertEquals( "${testVersion}", model.getProperties().getProperty( "other.version" ) ); + + assertNotNull( model.getScm() ); + + assertNotNull( model.getScm().getConnection() ); + assertEquals( "${testVersion}", model.getScm().getConnection() ); + + assertNotNull( model.getScm().getUrl() ); + assertEquals( "${testVersion}", model.getScm().getUrl() ); + } + + private File getPom( String pom ) + throws URISyntaxException, IOException + { + ClassLoader cloader = Thread.currentThread().getContextClassLoader(); + URL resource = cloader.getResource( pom ); + + if ( resource == null ) + { + fail( "POM classpath resource not found: '" + pom + "'." ); + } + + File tempDir = File.createTempFile( "VersionExpressionTransformationTest.", ".dir.tmp" ); + tempDir.delete(); + tempDir.mkdirs(); + + toDelete.add( tempDir ); + + File pomFile = new File( tempDir, "pom.xml" ); + FileUtils.copyFile( new File( new URI( resource.toExternalForm() ).normalize() ), pomFile ); + + return pomFile; + } public void testTransformForResolve_DoNothing() throws IOException, XmlPullParserException, ArtifactResolutionException, ArtifactNotFoundException @@ -83,53 +202,48 @@ File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" ); pomDir.delete(); pomDir.mkdirs(); + + toDelete.add( pomDir ); + + File pomFile = new File( pomDir, "pom.xml" ); + + FileWriter writer = null; try { - File pomFile = new File( pomDir, "pom.xml" ); - pomFile.deleteOnExit(); - - FileWriter writer = null; - try - { - writer = new FileWriter( pomFile ); - new MavenXpp3Writer().write( writer, model ); - } - finally - { - IOUtil.close( writer ); - } - - Artifact a = - new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar", null, - new DefaultArtifactHandler( "jar" ), false ); - ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile ); + writer = new FileWriter( pomFile ); + new MavenXpp3Writer().write( writer, model ); + } + finally + { + IOUtil.close( writer ); + } - a.addMetadata( pam ); + Artifact a = + new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar", null, + new DefaultArtifactHandler( "jar" ), false ); + ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile ); - transformation.transformForResolve( a, Collections.EMPTY_LIST, null ); + a.addMetadata( pam ); - assertFalse( pam.isVersionExpressionsResolved() ); - assertEquals( pomFile, pam.getFile() ); + transformation.transformForResolve( a, Collections.EMPTY_LIST, null ); - assertFalse( new File( pomDir, "target/pom-transformed.xml" ).exists() ); + assertFalse( pam.isVersionExpressionsResolved() ); + assertEquals( pomFile, pam.getFile() ); - FileReader reader = null; - try - { - reader = new FileReader( pomFile ); - model = new MavenXpp3Reader().read( reader ); - } - finally - { - IOUtil.close( reader ); - } + assertFalse( new File( pomDir, "target/pom-transformed.xml" ).exists() ); - assertEquals( "${testVersion}", model.getVersion() ); + FileReader reader = null; + try + { + reader = new FileReader( pomFile ); + model = new MavenXpp3Reader().read( reader ); } finally { - FileUtils.forceDelete( pomDir ); + IOUtil.close( reader ); } + + assertEquals( "${testVersion}", model.getVersion() ); } public void testTransformForInstall_TransformBasedOnModelProperties() @@ -140,54 +254,55 @@ File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" ); pomDir.delete(); pomDir.mkdirs(); + + toDelete.add( pomDir ); + + File pomFile = new File( pomDir, "pom.xml" ); + + FileWriter writer = null; try { - File pomFile = new File( pomDir, "pom.xml" ); - pomFile.deleteOnExit(); - - FileWriter writer = null; - try - { - writer = new FileWriter( pomFile ); - new MavenXpp3Writer().write( writer, model ); - } - finally - { - IOUtil.close( writer ); - } - - Artifact a = - new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar", null, - new DefaultArtifactHandler( "jar" ), false ); + writer = new FileWriter( pomFile ); + new MavenXpp3Writer().write( writer, model ); + } + finally + { + IOUtil.close( writer ); + } - ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile ); + Artifact a = + new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar", null, + new DefaultArtifactHandler( "jar" ), false ); - a.addMetadata( pam ); + ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile ); - transformation.transformForInstall( a, null ); + a.addMetadata( pam ); - File transformedFile = new File( pomDir, "target/pom-transformed.xml" ); + transformation.transformForInstall( a, null ); - assertTrue( transformedFile.exists() ); - assertEquals( transformedFile, pam.getFile() ); + File transformedFile = new File( pomDir, "target/pom-transformed.xml" ); - FileReader reader = null; - try - { - reader = new FileReader( pam.getFile() ); - model = new MavenXpp3Reader().read( reader ); - } - finally - { - IOUtil.close( reader ); - } + assertTrue( transformedFile.exists() ); + assertEquals( transformedFile, pam.getFile() ); - assertTransformedVersions( model ); + FileReader reader = null; + try + { + reader = new FileReader( pam.getFile() ); + StringWriter swriter = new StringWriter(); + IOUtil.copy( reader, swriter ); + + System.out.println( "Transformed POM:\n\n\n" + swriter.toString() ); + System.out.flush(); + + model = new MavenXpp3Reader().read( new StringReader( swriter.toString() ) ); } finally { - FileUtils.forceDelete( pomDir ); + IOUtil.close( reader ); } + + assertTransformedVersions( model ); } public void testTransformForDeploy_TransformBasedOnModelProperties() @@ -198,54 +313,49 @@ File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" ); pomDir.delete(); pomDir.mkdirs(); + + toDelete.add( pomDir ); + + File pomFile = new File( pomDir, "pom.xml" ); + + FileWriter writer = null; try { - File pomFile = new File( pomDir, "pom.xml" ); - pomFile.deleteOnExit(); - - FileWriter writer = null; - try - { - writer = new FileWriter( pomFile ); - new MavenXpp3Writer().write( writer, model ); - } - finally - { - IOUtil.close( writer ); - } - - Artifact a = - new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar", null, - new DefaultArtifactHandler( "jar" ), false ); + writer = new FileWriter( pomFile ); + new MavenXpp3Writer().write( writer, model ); + } + finally + { + IOUtil.close( writer ); + } - ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile ); + Artifact a = + new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar", null, + new DefaultArtifactHandler( "jar" ), false ); - a.addMetadata( pam ); + ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile ); - transformation.transformForDeployment( a, null, null ); + a.addMetadata( pam ); - File transformedFile = new File( pomDir, "target/pom-transformed.xml" ); + transformation.transformForDeployment( a, null, null ); - assertTrue( transformedFile.exists() ); - assertEquals( transformedFile, pam.getFile() ); + File transformedFile = new File( pomDir, "target/pom-transformed.xml" ); - FileReader reader = null; - try - { - reader = new FileReader( pam.getFile() ); - model = new MavenXpp3Reader().read( reader ); - } - finally - { - IOUtil.close( reader ); - } + assertTrue( transformedFile.exists() ); + assertEquals( transformedFile, pam.getFile() ); - assertTransformedVersions( model ); + FileReader reader = null; + try + { + reader = new FileReader( pam.getFile() ); + model = new MavenXpp3Reader().read( reader ); } finally { - FileUtils.forceDelete( pomDir ); + IOUtil.close( reader ); } + + assertTransformedVersions( model ); } // FIXME: We can't be this smart (yet) since the deployment step transforms from the @@ -371,7 +481,19 @@ { Model model = buildTestModel(); - model = runTransformVersion_VanillaArtifact( model ); + File newPom = runTransformVersion_VanillaArtifact( model, null ); + + FileReader reader = null; + try + { + reader = new FileReader( newPom ); + + model = new MavenXpp3Reader().read( reader ); + } + finally + { + IOUtil.close( reader ); + } assertTransformedVersions( model ); } @@ -381,7 +503,19 @@ { Model model = buildTestModel(); - model = runTransformVersion_ArtifactWithProject( model, new DefaultProjectBuilderConfiguration() ); + File newPom = runTransformVersion_ArtifactWithProject( model, new DefaultProjectBuilderConfiguration(), null ); + + FileReader reader = null; + try + { + reader = new FileReader( newPom ); + + model = new MavenXpp3Reader().read( reader ); + } + finally + { + IOUtil.close( reader ); + } assertTransformedVersions( model ); } @@ -394,28 +528,43 @@ Properties props = model.getProperties(); model.setProperties( new Properties() ); - model = - runTransformVersion_ArtifactWithProject( + File newPom = runTransformVersion_ArtifactWithProject( model, - new DefaultProjectBuilderConfiguration().setExecutionProperties( props ) ); + new DefaultProjectBuilderConfiguration().setExecutionProperties( props ), null ); + + FileReader reader = null; + try + { + reader = new FileReader( newPom ); + + model = new MavenXpp3Reader().read( reader ); + } + finally + { + IOUtil.close( reader ); + } assertTransformedVersions( model ); } - private Model runTransformVersion_VanillaArtifact( Model model ) + private File runTransformVersion_VanillaArtifact( Model model, File pomFile ) throws IOException, XmlPullParserException, ModelInterpolationException { - File projectDir = File.createTempFile( "VersionExpressionTransformationTest.project.", ".tmp.dir" ); - projectDir.delete(); - projectDir.mkdirs(); - - File repoDir = File.createTempFile( "VersionExpressionTransformationTest.repo.", ".tmp.dir" ); - repoDir.delete(); - repoDir.mkdirs(); - - try + File projectDir; + if ( pomFile != null ) + { + projectDir = pomFile.getParentFile(); + } + else { - File pomFile = new File( projectDir, "pom.xml" ); + projectDir = File.createTempFile( "VersionExpressionTransformationTest.project.", ".tmp.dir" ); + projectDir.delete(); + projectDir.mkdirs(); + + toDelete.add( projectDir ); + + pomFile = new File( projectDir, "pom.xml" ); + FileWriter writer = null; try { @@ -426,53 +575,56 @@ { IOUtil.close( writer ); } + } - model.getBuild().setOutputDirectory( new File( projectDir, "target" ).getAbsolutePath() ); - - Artifact a = - new DefaultArtifact( model.getGroupId(), model.getArtifactId(), VersionRange.createFromVersion( "1" ), - null, "jar", null, new DefaultArtifactHandler( "jar" ) ); + File repoDir = File.createTempFile( "VersionExpressionTransformationTest.repo.", ".tmp.dir" ); + repoDir.delete(); + repoDir.mkdirs(); + + toDelete.add( repoDir ); - ArtifactRepository localRepository = - new DefaultArtifactRepository( "local", repoDir.getAbsolutePath(), new DefaultRepositoryLayout() ); + File dir = new File( projectDir, "target" ); + dir.mkdirs(); + + if ( model.getBuild() == null ) + { + model.setBuild( new Build() ); + } + + model.getBuild().setDirectory( dir.getAbsolutePath() ); - transformation.transformVersions( pomFile, a, localRepository ); + Artifact a = + new DefaultArtifact( model.getGroupId(), model.getArtifactId(), VersionRange.createFromVersion( "1" ), + null, "jar", null, new DefaultArtifactHandler( "jar" ) ); + + a.addMetadata( new ProjectArtifactMetadata( a, pomFile ) ); - FileReader reader = null; - try - { - reader = new FileReader( new File( projectDir, "target/pom-transformed.xml" ) ); + ArtifactRepository localRepository = + new DefaultArtifactRepository( "local", repoDir.getAbsolutePath(), new DefaultRepositoryLayout() ); - model = new MavenXpp3Reader().read( reader ); - } - finally - { - IOUtil.close( reader ); - } - } - finally - { - FileUtils.forceDelete( projectDir ); - FileUtils.forceDelete( repoDir ); - } + transformation.transformVersions( pomFile, a, localRepository ); - return model; + return new File( projectDir, "target/pom-transformed.xml" ); } - private Model runTransformVersion_ArtifactWithProject( Model model, ProjectBuilderConfiguration pbConfig ) + private File runTransformVersion_ArtifactWithProject( Model model, ProjectBuilderConfiguration pbConfig, File pomFile ) throws IOException, XmlPullParserException, ModelInterpolationException { - File projectDir = File.createTempFile( "VersionExpressionTransformationTest.project.", ".tmp.dir" ); - projectDir.delete(); - projectDir.mkdirs(); - - File repoDir = File.createTempFile( "VersionExpressionTransformationTest.repo.", ".tmp.dir" ); - repoDir.delete(); - repoDir.mkdirs(); - - try + File projectDir; + if ( pomFile != null ) + { + projectDir = pomFile.getParentFile(); + } + else { - File pomFile = new File( projectDir, "pom.xml" ); + projectDir = File.createTempFile( "VersionExpressionTransformationTest.project.", ".tmp.dir" ); + projectDir.delete(); + projectDir.mkdirs(); + + toDelete.add( projectDir ); + + pomFile = new File( projectDir, "pom.xml" ); + FileWriter writer = null; try { @@ -483,45 +635,44 @@ { IOUtil.close( writer ); } + } - model.getBuild().setDirectory( new File( projectDir, "target" ).getAbsolutePath() ); - - MavenProject project = new MavenProject( model ); - project.setFile( pomFile ); - project.setBasedir( projectDir ); - project.setProjectBuilderConfiguration( pbConfig ); + File repoDir = File.createTempFile( "VersionExpressionTransformationTest.repo.", ".tmp.dir" ); + repoDir.delete(); + repoDir.mkdirs(); + + toDelete.add( repoDir ); - ArtifactWithProject a = - new ArtifactWithProject( project, "jar", null, new DefaultArtifactHandler( "jar" ), false ); + File dir = new File( projectDir, "target" ); + dir.mkdirs(); + + if ( model.getBuild() == null ) + { + model.setBuild( new Build() ); + } + + model.getBuild().setDirectory( dir.getAbsolutePath() ); - ArtifactRepository localRepository = - new DefaultArtifactRepository( "local", repoDir.getAbsolutePath(), new DefaultRepositoryLayout() ); + MavenProject project = new MavenProject( model ); + project.setFile( pomFile ); + project.setBasedir( projectDir ); + project.setProjectBuilderConfiguration( pbConfig ); - transformation.transformVersions( pomFile, a, localRepository ); + ArtifactWithProject a = + new ArtifactWithProject( project, "jar", null, new DefaultArtifactHandler( "jar" ), false ); - FileReader reader = null; - try - { - reader = new FileReader( new File( project.getBuild().getDirectory(), "pom-transformed.xml" ) ); + a.addMetadata( new ProjectArtifactMetadata( a, pomFile ) ); + + ArtifactRepository localRepository = + new DefaultArtifactRepository( "local", repoDir.getAbsolutePath(), new DefaultRepositoryLayout() ); - model = new MavenXpp3Reader().read( reader ); - } - finally - { - IOUtil.close( reader ); - } - } - finally - { - FileUtils.forceDelete( projectDir ); - FileUtils.forceDelete( repoDir ); - } + transformation.transformVersions( pomFile, a, localRepository ); - return model; + return new File( project.getBuild().getDirectory(), "pom-transformed.xml" ); } public void testInterpolate_ShouldNotInterpolateNonVersionFields() - throws ModelInterpolationException + throws ModelInterpolationException, IOException, XmlPullParserException { Model model = buildTestModel(); @@ -530,21 +681,79 @@ model.setScm( scm ); - File projectDir = new File( "." ).getAbsoluteFile(); + File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" ); + pomDir.delete(); + pomDir.mkdirs(); + + toDelete.add( pomDir ); + File pomFile = new File( pomDir, "pom.xml" ); + + FileWriter writer = null; + try + { + writer = new FileWriter( pomFile ); + new MavenXpp3Writer().write( writer, model ); + } + finally + { + IOUtil.close( writer ); + } - transformation.interpolateVersions( model, projectDir, new DefaultProjectBuilderConfiguration() ); + File output = new File( pomDir, "output.xml" ); + + transformation.interpolateVersions( pomFile, output, model, pomDir, new DefaultProjectBuilderConfiguration() ); + + FileReader reader = null; + try + { + reader = new FileReader( output ); + model = new MavenXpp3Reader().read( reader ); + } + finally + { + IOUtil.close( reader ); + } // /project/scm/url assertFalse( model.getScm().getUrl().indexOf( VERSION ) > -1 ); } public void testInterpolate_ShouldInterpolateAllVersionsUsingPOMProperties() - throws ModelInterpolationException + throws ModelInterpolationException, IOException, XmlPullParserException { Model model = buildTestModel(); - File projectDir = new File( "." ).getAbsoluteFile(); + File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" ); + pomDir.delete(); + pomDir.mkdirs(); + + toDelete.add( pomDir ); + File pomFile = new File( pomDir, "pom.xml" ); + + FileWriter writer = null; + try + { + writer = new FileWriter( pomFile ); + new MavenXpp3Writer().write( writer, model ); + } + finally + { + IOUtil.close( writer ); + } - transformation.interpolateVersions( model, projectDir, new DefaultProjectBuilderConfiguration() ); + File output = new File( pomDir, "output.xml" ); + + transformation.interpolateVersions( pomFile, output, model, pomDir, new DefaultProjectBuilderConfiguration() ); + + FileReader reader = null; + try + { + reader = new FileReader( output ); + model = new MavenXpp3Reader().read( reader ); + } + finally + { + IOUtil.close( reader ); + } assertTransformedVersions( model ); } @@ -584,16 +793,46 @@ } public void testInterpolate_ShouldInterpolateAllVersionsUsingCLIProperties() - throws ModelInterpolationException + throws ModelInterpolationException, IOException, XmlPullParserException { Model model = buildTestModel(); - File projectDir = new File( "." ).getAbsoluteFile(); + File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" ); + pomDir.delete(); + pomDir.mkdirs(); + + toDelete.add( pomDir ); + + File pomFile = new File( pomDir, "pom.xml" ); + + FileWriter writer = null; + try + { + writer = new FileWriter( pomFile ); + new MavenXpp3Writer().write( writer, model ); + } + finally + { + IOUtil.close( writer ); + } Properties props = model.getProperties(); model.setProperties( new Properties() ); - transformation.interpolateVersions( model, projectDir, + File output = new File( pomDir, "output.xml" ); + + transformation.interpolateVersions( pomFile, output, model, pomDir, new DefaultProjectBuilderConfiguration().setExecutionProperties( props ) ); + + FileReader reader = null; + try + { + reader = new FileReader( output ); + model = new MavenXpp3Reader().read( reader ); + } + finally + { + IOUtil.close( reader ); + } assertTransformedVersions( model ); } Added: maven/components/branches/maven-2.1.x/maven-project/src/test/resources/version-expressions/pom-with-comments.xml URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-project/src/test/resources/version-expressions/pom-with-comments.xml?rev=747440&view=auto ============================================================================== --- maven/components/branches/maven-2.1.x/maven-project/src/test/resources/version-expressions/pom-with-comments.xml (added) +++ maven/components/branches/maven-2.1.x/maven-project/src/test/resources/version-expressions/pom-with-comments.xml Tue Feb 24 17:06:19 2009 @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- This is a comment. --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.test</groupId> + <artifactId>pom-with-comments</artifactId> + <version>${testVersion}</version> + <packaging>pom</packaging> + + <scm> + <connection>${testVersion}</connection> + <url>${testVersion}</url> + </scm> + + <properties> + <testVersion>1.0</testVersion> + <other.version>${testVersion}</other.version> + </properties> + +</project> Propchange: maven/components/branches/maven-2.1.x/maven-project/src/test/resources/version-expressions/pom-with-comments.xml ------------------------------------------------------------------------------ svn:eol-style = native Modified: maven/components/branches/maven-2.1.x/pom.xml URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/pom.xml?rev=747440&r1=747439&r2=747440&view=diff ============================================================================== --- maven/components/branches/maven-2.1.x/pom.xml (original) +++ maven/components/branches/maven-2.1.x/pom.xml Tue Feb 24 17:06:19 2009 @@ -261,7 +261,7 @@ <properties> <mavenVersion>2.1.0-SNAPSHOT</mavenVersion> - <wagonVersion>1.0-beta-5-SNAPSHOT</wagonVersion> + <wagonVersion>1.0-beta-5</wagonVersion> </properties> <!--start--> @@ -384,7 +384,7 @@ <dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-interpolation</artifactId> - <version>1.7</version> + <version>1.8.1</version> </dependency> <dependency> <groupId>org.codehaus.plexus</groupId>