Author: jdcasey Date: Tue Apr 21 22:55:41 2009 New Revision: 767325 URL: http://svn.apache.org/viewvc?rev=767325&view=rev Log: [MNG-4140] Replace <version>.+</version> string search with xpath-based search for interpolator, to determine which sections of the POM to transform for install/deploy. This should leave plugin configurations that specify <version>${project.version}</version> intact.
Added: maven/components/branches/maven-2.1.x/maven-project/src/test/resources/version-expressions/alternative-encoding-pom.xml (with props) Modified: 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 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=767325&r1=767324&r2=767325&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 Apr 21 22:55:41 2009 @@ -37,27 +37,90 @@ 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.SimpleRecursionInterceptor; import org.codehaus.plexus.interpolation.ValueSource; +import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.ReaderFactory; import org.codehaus.plexus.util.WriterFactory; +import org.codehaus.plexus.util.xml.XmlStreamReader; +import org.codehaus.plexus.util.xml.XmlStreamWriter; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.Reader; +import java.io.StringReader; +import java.io.UnsupportedEncodingException; import java.io.Writer; import java.util.ArrayList; -import java.util.Iterator; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; public class VersionExpressionTransformation extends StringSearchModelInterpolator implements Initializable, ArtifactTransformation { + private static final List<String> VERSION_INTERPOLATION_TARGET_XPATHS; + + static + { + List<String> targets = new ArrayList<String>(); + + targets.add( "/project/parent/version/text()" ); + targets.add( "/project/version/text()" ); + + targets.add( "/project/dependencies/dependency/version/text()" ); + targets.add( "/project/dependencyManagement/dependencies/dependency/version/text()" ); + + targets.add( "/project/build/plugins/plugin/version/text()" ); + targets.add( "/project/build/pluginManagement/plugins/plugin/version/text()" ); + targets.add( "/project/build/plugins/plugin/dependencies/dependency/version/text()" ); + targets.add( "/project/build/pluginManagement/plugins/plugin/dependencies/dependency/version/text()" ); + + targets.add( "/project/reporting/plugins/plugin/version/text()" ); + + targets.add( "/project/profiles/profile/dependencies/dependency/version/text()" ); + targets.add( "/project/profiles/profile/dependencyManagement/dependencies/dependency/version/text()" ); + + targets.add( "/project/profiles/profile/build/plugins/plugin/version/text()" ); + targets.add( "/project/profiles/profile/build/pluginManagement/plugins/plugin/version/text()" ); + targets.add( "/project/profiles/profile/build/plugins/plugin/dependencies/dependency/version/text()" ); + targets.add( "/project/profiles/profile/build/pluginManagement/plugins/plugin/dependencies/dependency/version/text()" ); + + targets.add( "/project/profiles/profile/reporting/plugins/plugin/version/text()" ); + + targets = Collections.unmodifiableList( targets ); + + VERSION_INTERPOLATION_TARGET_XPATHS = targets; + } + public void transformForDeployment( Artifact artifact, ArtifactRepository remoteRepository, ArtifactRepository localRepository ) throws ArtifactDeploymentException @@ -74,12 +137,12 @@ pomFile = artifact.getFile(); pomArtifact = true; } - // FIXME: We can't be this smart (yet) since the deployment step transforms from the + // FIXME: We can't be this smart (yet) since the deployment step transforms from the // original POM once again and re-installs over the top of the install step. -// else if ( metadata == null || metadata.isVersionExpressionsResolved() ) -// { -// return; -// } + // else if ( metadata == null || metadata.isVersionExpressionsResolved() ) + // { + // return; + // } else if ( metadata != null ) { pomFile = metadata.getFile(); @@ -92,10 +155,11 @@ try { File outFile = transformVersions( pomFile, artifact, localRepository ); - + if ( pomArtifact ) { - // FIXME: We need a way to mark a POM artifact as resolved WRT version expressions, so we don't reprocess... + // FIXME: We need a way to mark a POM artifact as resolved WRT version expressions, so we don't + // reprocess... artifact.setFile( outFile ); } else @@ -117,7 +181,8 @@ public void transformForInstall( Artifact artifact, ArtifactRepository localRepository ) throws ArtifactInstallationException { - ProjectArtifactMetadata metadata = (ProjectArtifactMetadata) artifact.getMetadata( ProjectArtifactMetadata.class ); + ProjectArtifactMetadata metadata = + (ProjectArtifactMetadata) artifact.getMetadata( ProjectArtifactMetadata.class ); File pomFile; boolean pomArtifact = false; if ( "pom".equals( artifact.getType() ) ) @@ -129,12 +194,12 @@ pomFile = artifact.getFile(); pomArtifact = true; } - // FIXME: We can't be this smart (yet) since the deployment step transforms from the + // FIXME: We can't be this smart (yet) since the deployment step transforms from the // original POM once again and re-installs over the top of the install step. -// else if ( metadata == null || metadata.isVersionExpressionsResolved() ) -// { -// return; -// } + // else if ( metadata == null || metadata.isVersionExpressionsResolved() ) + // { + // return; + // } else if ( metadata != null ) { pomFile = metadata.getFile(); @@ -147,10 +212,11 @@ try { File outFile = transformVersions( pomFile, artifact, localRepository ); - + if ( pomArtifact ) { - // FIXME: We need a way to mark a POM artifact as resolved WRT version expressions, so we don't reprocess... + // FIXME: We need a way to mark a POM artifact as resolved WRT version expressions, so we don't + // reprocess... artifact.setFile( outFile ); } else @@ -169,7 +235,8 @@ } } - public void transformForResolve( Artifact artifact, List remoteRepositories, ArtifactRepository localRepository ) + public void transformForResolve( Artifact artifact, List<ArtifactRepository> remoteRepositories, + ArtifactRepository localRepository ) throws ArtifactResolutionException, ArtifactNotFoundException { return; @@ -194,11 +261,12 @@ if ( getLogger().isDebugEnabled() ) { getLogger().debug( - "WARNING: Artifact: " + artifact - + " does not have project-builder metadata (ProjectBuilderConfiguration) associated with it.\n" - + "Cannot access CLI properties for version transformation." ); + "WARNING: Artifact: " + + artifact + + " does not have project-builder metadata (ProjectBuilderConfiguration) associated with it.\n" + + "Cannot access CLI properties for version transformation." ); } - + pbConfig = new DefaultProjectBuilderConfiguration().setLocalRepository( localRepository ); projectDir = pomFile.getAbsoluteFile().getParentFile(); outputFile = new File( projectDir, "target/pom-transformed.xml" ); @@ -210,17 +278,18 @@ { reader = ReaderFactory.newXmlReader( pomFile ); model = new MavenXpp3Reader().read( reader ); - + interpolateVersions( pomFile, outputFile, model, projectDir, pbConfig ); } catch ( XmlPullParserException e ) { String message = "Failed to parse POM for version transformation. Proceeding with original (non-interpolated) POM file."; - - String detail = "\n\nNOTE: Error was in file: " + pomFile + ", at line: " - + e.getLineNumber() + ", column: " + e.getColumnNumber(); - + + String detail = + "\n\nNOTE: Error was in file: " + pomFile + ", at line: " + e.getLineNumber() + ", column: " + + e.getColumnNumber(); + if ( getLogger().isDebugEnabled() ) { getLogger().debug( message + detail, e ); @@ -229,18 +298,20 @@ { getLogger().warn( message + " See debug output for details." ); } - + outputFile = pomFile; } finally { IOUtil.close( reader ); } - + return outputFile; } - protected void interpolateVersions( File pomFile, File outputFile, Model model, File projectDir, ProjectBuilderConfiguration config ) + @SuppressWarnings("unchecked") + protected void interpolateVersions( File pomFile, File outputFile, Model model, File projectDir, + ProjectBuilderConfiguration config ) throws ModelInterpolationException { boolean debugEnabled = getLogger().isDebugEnabled(); @@ -249,60 +320,54 @@ // 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>" ); - + XPathInterpolator interpolator = new XPathInterpolator( getLogger() ); + // 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 ); + List<ValueSource> valueSources = createValueSources( model, projectDir, config ); + List<InterpolationPostProcessor> postProcessors = createPostProcessors( model, projectDir, config ); synchronized ( this ) { - for ( Iterator it = valueSources.iterator(); it.hasNext(); ) + for ( ValueSource vs : valueSources ) { - ValueSource vs = (ValueSource) it.next(); secondaryInterpolator.addValueSource( vs ); } - for ( Iterator it = postProcessors.iterator(); it.hasNext(); ) + for ( InterpolationPostProcessor postProcessor : postProcessors ) { - InterpolationPostProcessor postProcessor = (InterpolationPostProcessor) it.next(); - secondaryInterpolator.addPostProcessor( postProcessor ); } String pomContents; try { - Reader reader = null; + XmlStreamReader reader = null; try { reader = ReaderFactory.newXmlReader( pomFile ); pomContents = IOUtil.toString( reader ); + interpolator.setEncoding( reader.getEncoding() ); } catch ( IOException e ) { - throw new ModelInterpolationException( "Error reading POM for version-expression interpolation: " + e.getMessage(), e ); + throw new ModelInterpolationException( "Error reading POM for version-expression interpolation: " + + e.getMessage(), e ); } finally { IOUtil.close( reader ); } - + try { pomContents = interpolator.interpolate( pomContents ); @@ -314,16 +379,14 @@ if ( debugEnabled ) { - List feedback = interpolator.getFeedback(); + List<Object> feedback = (List<Object>) interpolator.getFeedback(); if ( feedback != null && !feedback.isEmpty() ) { getLogger().debug( "Maven encountered the following problems while transforming POM versions:" ); Object last = null; - for ( Iterator it = feedback.iterator(); it.hasNext(); ) + for ( Object next : feedback ) { - Object next = it.next(); - if ( next instanceof Throwable ) { if ( last == null ) @@ -357,40 +420,39 @@ } finally { - for ( Iterator iterator = valueSources.iterator(); iterator.hasNext(); ) + for ( ValueSource vs : valueSources ) { - ValueSource vs = (ValueSource) iterator.next(); secondaryInterpolator.removeValuesSource( vs ); } - for ( Iterator iterator = postProcessors.iterator(); iterator.hasNext(); ) + for ( InterpolationPostProcessor postProcessor : postProcessors ) { - InterpolationPostProcessor postProcessor = (InterpolationPostProcessor) iterator.next(); secondaryInterpolator.removePostProcessor( postProcessor ); } getInterpolator().clearAnswers(); } - + Writer writer = null; try { outputFile.getParentFile().mkdirs(); - + writer = WriterFactory.newXmlWriter( outputFile ); - + IOUtil.copy( pomContents, writer ); } catch ( IOException e ) { - throw new ModelInterpolationException( "Failed to write transformed POM: " + outputFile.getAbsolutePath(), e ); + throw new ModelInterpolationException( "Failed to write transformed POM: " + + outputFile.getAbsolutePath(), e ); } finally { IOUtil.close( writer ); } } - + // if ( error != null ) // { // throw error; @@ -400,11 +462,13 @@ private static final class SecondaryInterpolationValueSource implements ValueSource { - + private Interpolator secondary; + private final RecursionInterceptor recursionInterceptor; - private List localFeedback = new ArrayList(); - + + private List<Object> localFeedback = new ArrayList<Object>(); + public SecondaryInterpolationValueSource( Interpolator secondary, RecursionInterceptor recursionInterceptor ) { this.secondary = secondary; @@ -416,6 +480,7 @@ secondary.clearFeedback(); } + @SuppressWarnings("unchecked") public List getFeedback() { List result = secondary.getFeedback(); @@ -423,9 +488,9 @@ { result = new ArrayList( result ); } - + result.addAll( localFeedback ); - + return result; } @@ -440,20 +505,243 @@ localFeedback.add( "Error during version expression interpolation." ); localFeedback.add( e ); } - + return null; } } - - private static final class VersionRestoringPostProcessor - implements InterpolationPostProcessor + + private static final class XPathInterpolator + implements Interpolator { - public Object execute( String expression, Object value ) + private List<InterpolationPostProcessor> postProcessors = new ArrayList<InterpolationPostProcessor>(); + + private List<ValueSource> valueSources = new ArrayList<ValueSource>(); + + private Map<String, Object> answers = new HashMap<String, Object>(); + + private List<Object> feedback = new ArrayList<Object>(); + + private final Logger logger; + + private String encoding; + + public XPathInterpolator( Logger logger ) + { + this.logger = logger; + } + + public void setEncoding( String encoding ) + { + this.encoding = encoding; + } + + public String interpolate( String input, RecursionInterceptor recursionInterceptor ) + throws InterpolationException + { + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + TransformerFactory txFactory = TransformerFactory.newInstance(); + XPathFactory xpFactory = XPathFactory.newInstance(); + + DocumentBuilder builder; + Transformer transformer; + XPath xpath; + try + { + builder = dbFactory.newDocumentBuilder(); + transformer = txFactory.newTransformer(); + xpath = xpFactory.newXPath(); + } + catch ( ParserConfigurationException e ) + { + throw new InterpolationException( "Failed to construct XML DocumentBuilder: " + e.getMessage(), "-NONE-", e ); + } + catch ( TransformerConfigurationException e ) + { + throw new InterpolationException( "Failed to construct XML Transformer: " + e.getMessage(), "-NONE-", e ); + } + + Document document; + try + { + document = builder.parse( new InputSource( new StringReader( input ) ) ); + } + catch ( SAXException e ) + { + throw new InterpolationException( "Failed to parse XML: " + e.getMessage(), "-NONE-", e ); + } + catch ( IOException e ) + { + throw new InterpolationException( "Failed to parse XML: " + e.getMessage(), "-NONE-", e ); + } + + inteprolateInternal( document, xpath ); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + XmlStreamWriter writer; + try + { + writer = WriterFactory.newXmlWriter( baos ); + } + catch ( IOException e ) + { + throw new InterpolationException( "Failed to get XML writer: " + e.getMessage(), "-NONE-", e ); + } + + StreamResult r = new StreamResult( writer ); + DOMSource s = new DOMSource( document ); + + try + { + if ( encoding != null ) + { + logger.info( "Writing transformed POM using encoding: " + encoding ); + transformer.setOutputProperty( OutputKeys.ENCODING, encoding ); + } + else + { + logger.info( "Writing transformed POM using default encoding" ); + } + + transformer.transform( s, r ); + } + catch ( TransformerException e ) + { + throw new InterpolationException( "Failed to render interpolated XML: " + e.getMessage(), "-NONE-", e ); + } + + try + { + return baos.toString( writer.getEncoding() ); + } + catch ( UnsupportedEncodingException e ) + { + throw new InterpolationException( "Failed to render interpolated XML: " + e.getMessage(), "-NONE-", e ); + } + } + + private void inteprolateInternal( Document document, XPath xp ) + throws InterpolationException + { + for ( String expr : VERSION_INTERPOLATION_TARGET_XPATHS ) + { + NodeList nodes; + try + { + XPathExpression xpath = xp.compile( expr ); + nodes = (NodeList) xpath.evaluate( document, XPathConstants.NODESET ); + } + catch ( XPathExpressionException e ) + { + throw new InterpolationException( "Failed to evaluate XPath: " + expr + " (" + e.getMessage() + ")", "-NONE-", e ); + } + + if ( nodes != null ) + { + for( int idx = 0; idx < nodes.getLength(); idx++ ) + { + Node node = nodes.item( idx ); + Object value = node.getNodeValue(); + if ( value == null ) + { + continue; + } + + for ( ValueSource vs : valueSources ) + { + if ( vs != null ) + { + value = vs.getValue( value.toString() ); + if ( value != null && !value.equals( node.getNodeValue() ) ) + { + break; + } + else if ( value == null ) + { + value = node.getNodeValue(); + } + } + } + + if ( value != null && !value.equals( node.getNodeValue() ) ) + { + for ( InterpolationPostProcessor postProcessor : postProcessors ) + { + if ( postProcessor != null ) + { + value = postProcessor.execute( node.getNodeValue(), value ); + } + } + + node.setNodeValue( String.valueOf( value ) ); + } + } + } + } + } + + public void addPostProcessor( InterpolationPostProcessor postProcessor ) + { + postProcessors.add( postProcessor ); + } + + public void addValueSource( ValueSource valueSource ) + { + valueSources.add( valueSource ); + } + + public void clearAnswers() + { + answers.clear(); + } + + public void clearFeedback() + { + feedback.clear(); + } + + @SuppressWarnings( "unchecked" ) + public List getFeedback() + { + return feedback; + } + + public String interpolate( String input ) + throws InterpolationException + { + return interpolate( input, new SimpleRecursionInterceptor() ); + } + + public String interpolate( String input, String thisPrefixPattern ) + throws InterpolationException + { + return interpolate( input, new SimpleRecursionInterceptor() ); + } + + public String interpolate( String input, String thisPrefixPattern, RecursionInterceptor recursionInterceptor ) + throws InterpolationException + { + return interpolate( input, recursionInterceptor ); + } + + public boolean isCacheAnswers() + { + return true; + } + + public void removePostProcessor( InterpolationPostProcessor postProcessor ) + { + postProcessors.remove( postProcessor ); + } + + public void removeValuesSource( ValueSource valueSource ) + { + valueSources.remove( valueSource ); + } + + public void setCacheAnswers( boolean cacheAnswers ) { - 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=767325&r1=767324&r2=767325&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 Apr 21 22:55:41 2009 @@ -37,6 +37,7 @@ import org.apache.maven.model.Model; import org.apache.maven.model.Plugin; import org.apache.maven.model.PluginManagement; +import org.apache.maven.model.Profile; import org.apache.maven.model.ReportPlugin; import org.apache.maven.model.Reporting; import org.apache.maven.model.Scm; @@ -63,7 +64,6 @@ import java.net.URL; import java.util.Collections; import java.util.HashSet; -import java.util.Iterator; import java.util.Properties; import java.util.Set; @@ -75,13 +75,15 @@ private VersionExpressionTransformation transformation; - private Set toDelete = new HashSet(); + private Set<File> toDelete = new HashSet<File>(); public void setUp() throws Exception { super.setUp(); + // getContainer().getLoggerManager().setThreshold( Logger.LEVEL_DEBUG ); + transformation = (VersionExpressionTransformation) lookup( ArtifactTransformation.class.getName(), "version-expression" ); } @@ -93,10 +95,8 @@ if ( toDelete != null && !toDelete.isEmpty() ) { - for ( Iterator it = toDelete.iterator(); it.hasNext(); ) + for ( File f : toDelete ) { - File f = (File) it.next(); - try { FileUtils.forceDelete( f ); @@ -115,7 +115,7 @@ { String pomResource = "version-expressions/invalid-pom.xml"; File pomFile = getPom( pomResource ); - + File projectDir; if ( pomFile != null ) { @@ -131,7 +131,7 @@ File newPomFile = new File( projectDir, "pom.xml" ); FileUtils.copyFile( pomFile, newPomFile ); - + pomFile = newPomFile; } @@ -142,8 +142,8 @@ toDelete.add( repoDir ); Artifact a = - new DefaultArtifact( "groupId", "artifactId", VersionRange.createFromVersion( "1" ), - null, "jar", null, new DefaultArtifactHandler( "jar" ) ); + new DefaultArtifact( "groupId", "artifactId", VersionRange.createFromVersion( "1" ), null, "jar", null, + new DefaultArtifactHandler( "jar" ) ); ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile ); a.addMetadata( pam ); @@ -152,10 +152,60 @@ new DefaultArtifactRepository( "local", repoDir.getAbsolutePath(), new DefaultRepositoryLayout() ); transformation.transformVersions( pomFile, a, localRepository ); - + assertEquals( pomFile, pam.getFile() ); } + public void testTransform_MaintainEncoding() + throws URISyntaxException, IOException, XmlPullParserException, ModelInterpolationException + { + String pomResource = "version-expressions/alternative-encoding-pom.xml"; + File pomFile = getPom( pomResource ); + + File projectDir; + if ( pomFile != null ) + { + projectDir = pomFile.getParentFile(); + } + else + { + projectDir = File.createTempFile( "VersionExpressionTransformationTest.project.", ".tmp.dir" ); + projectDir.delete(); + projectDir.mkdirs(); + + toDelete.add( projectDir ); + + File newPomFile = new File( projectDir, "pom.xml" ); + FileUtils.copyFile( pomFile, newPomFile ); + + pomFile = newPomFile; + } + + File repoDir = File.createTempFile( "VersionExpressionTransformationTest.repo.", ".tmp.dir" ); + repoDir.delete(); + repoDir.mkdirs(); + + toDelete.add( repoDir ); + + Artifact a = + new DefaultArtifact( "groupId", "artifactId", VersionRange.createFromVersion( "1" ), null, "jar", null, + new DefaultArtifactHandler( "jar" ) ); + + ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile ); + a.addMetadata( pam ); + + ArtifactRepository localRepository = + new DefaultArtifactRepository( "local", repoDir.getAbsolutePath(), new DefaultRepositoryLayout() ); + + File result = transformation.transformVersions( pomFile, a, localRepository ); + + String xml = FileUtils.fileRead( result ); + + System.out.println( xml ); + + assertTrue( xml.indexOf( "encoding=\"ISO-8859-1\"" ) > -1 ); + } + public void testTransformForInstall_PreserveComments() throws URISyntaxException, IOException, XmlPullParserException, ModelInterpolationException { @@ -338,8 +388,8 @@ StringWriter swriter = new StringWriter(); IOUtil.copy( reader, swriter ); -// System.out.println( "Transformed POM:\n\n\n" + swriter.toString() ); -// System.out.flush(); + // System.out.println( "Transformed POM:\n\n\n" + swriter.toString() ); + // System.out.flush(); model = new MavenXpp3Reader().read( new StringReader( swriter.toString() ) ); } @@ -839,6 +889,38 @@ // /project/reporting/plugins/plugin/version ReportPlugin rplugin = (ReportPlugin) model.getReporting().getPlugins().get( 0 ); assertEquals( VERSION, rplugin.getVersion() ); + + // --- + + Profile profile = (Profile) model.getProfiles().get( 0 ); + + // /project/profiles/profile/dependencies/dependency/version + dep = (Dependency) profile.getDependencies().get( 0 ); + assertEquals( VERSION, dep.getVersion() ); + + // /project/profiles/profile/dependencyManagement/dependencies/dependency/version + dep = (Dependency) profile.getDependencyManagement().getDependencies().get( 0 ); + assertEquals( VERSION, dep.getVersion() ); + + // /project/profiles/profile/build/plugins/plugin/version + plugin = (Plugin) profile.getBuild().getPlugins().get( 0 ); + assertEquals( VERSION, plugin.getVersion() ); + + // /project/profiles/profile/build/plugins/plugin/dependencies/dependency/version + dep = (Dependency) profile.getDependencies().get( 0 ); + assertEquals( VERSION, dep.getVersion() ); + + // /project/profiles/profile/build/pluginManagement/plugins/plugin/version + plugin = (Plugin) profile.getBuild().getPluginManagement().getPlugins().get( 0 ); + assertEquals( VERSION, plugin.getVersion() ); + + // /project/profiles/profile/build/pluginManagement/plugins/plugin/dependencies/dependency/version + dep = (Dependency) profile.getDependencies().get( 0 ); + assertEquals( VERSION, dep.getVersion() ); + + // /project/profiles/profile/reporting/plugins/plugin/version + rplugin = (ReportPlugin) profile.getReporting().getPlugins().get( 0 ); + assertEquals( VERSION, rplugin.getVersion() ); } public void testInterpolate_ShouldInterpolateAllVersionsUsingCLIProperties() @@ -962,6 +1044,70 @@ model.setReporting( reporting ); + Profile profile = new Profile(); + profile.setId( "profile" ); + + model.addProfile( profile ); + + dep = new Dependency(); + dep.setGroupId( "profile.group.id" ); + dep.setArtifactId( "profile-artifact-id" ); + dep.setVersion( expression ); + + profile.addDependency( dep ); + + dep = new Dependency(); + dep.setGroupId( "profile.managed.group.id" ); + dep.setArtifactId( "profile-managed-artifact-id" ); + dep.setVersion( expression ); + + dmgmt = new DependencyManagement(); + dmgmt.addDependency( dep ); + + profile.setDependencyManagement( dmgmt ); + + build = new Build(); + profile.setBuild( build ); + + plugin = new Plugin(); + plugin.setGroupId( "profile.plugin.group" ); + plugin.setArtifactId( "profile-plugin-artifact" ); + plugin.setVersion( expression ); + + dep = new Dependency(); + dep.setGroupId( "profile.plugin.dep.group" ); + dep.setArtifactId( "profile-plugin-dep-artifact" ); + dep.setVersion( expression ); + plugin.addDependency( dep ); + + build.addPlugin( plugin ); + + plugin = new Plugin(); + plugin.setGroupId( "profile.plugin.other.group" ); + plugin.setArtifactId( "profile-plugin-other-artifact" ); + plugin.setVersion( expression ); + + dep = new Dependency(); + dep.setGroupId( "profile.plugin.dep.other.group" ); + dep.setArtifactId( "profile.plugin-dep-other-artifact" ); + dep.setVersion( expression ); + plugin.addDependency( dep ); + + pmgmt = new PluginManagement(); + pmgmt.addPlugin( plugin ); + + build.setPluginManagement( pmgmt ); + + rplugin = new ReportPlugin(); + rplugin.setGroupId( "profile.report.group" ); + rplugin.setArtifactId( "profile-report-artifact" ); + rplugin.setVersion( expression ); + + reporting = new Reporting(); + reporting.addPlugin( rplugin ); + + profile.setReporting( reporting ); + return model; } Added: maven/components/branches/maven-2.1.x/maven-project/src/test/resources/version-expressions/alternative-encoding-pom.xml URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.1.x/maven-project/src/test/resources/version-expressions/alternative-encoding-pom.xml?rev=767325&view=auto ============================================================================== --- maven/components/branches/maven-2.1.x/maven-project/src/test/resources/version-expressions/alternative-encoding-pom.xml (added) +++ maven/components/branches/maven-2.1.x/maven-project/src/test/resources/version-expressions/alternative-encoding-pom.xml Tue Apr 21 22:55:41 2009 @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="ISO-8859-1"?> +<!-- 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>1</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/alternative-encoding-pom.xml ------------------------------------------------------------------------------ svn:eol-style = native