1   package org.apache.maven.project.artifact;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.maven.artifact.Artifact;
23  import org.apache.maven.artifact.DefaultArtifact;
24  import org.apache.maven.artifact.deployer.ArtifactDeploymentException;
25  import org.apache.maven.artifact.handler.DefaultArtifactHandler;
26  import org.apache.maven.artifact.installer.ArtifactInstallationException;
27  import org.apache.maven.artifact.repository.ArtifactRepository;
28  import org.apache.maven.artifact.repository.DefaultArtifactRepository;
29  import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
30  import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
31  import org.apache.maven.artifact.resolver.ArtifactResolutionException;
32  import org.apache.maven.artifact.transform.ArtifactTransformation;
33  import org.apache.maven.artifact.versioning.VersionRange;
34  import org.apache.maven.model.Build;
35  import org.apache.maven.model.Dependency;
36  import org.apache.maven.model.DependencyManagement;
37  import org.apache.maven.model.Model;
38  import org.apache.maven.model.Plugin;
39  import org.apache.maven.model.PluginManagement;
40  import org.apache.maven.model.ReportPlugin;
41  import org.apache.maven.model.Reporting;
42  import org.apache.maven.model.Scm;
43  import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
44  import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
45  import org.apache.maven.project.DefaultProjectBuilderConfiguration;
46  import org.apache.maven.project.MavenProject;
47  import org.apache.maven.project.ProjectBuilderConfiguration;
48  import org.apache.maven.project.interpolation.ModelInterpolationException;
49  import org.codehaus.plexus.PlexusTestCase;
50  import org.codehaus.plexus.util.FileUtils;
51  import org.codehaus.plexus.util.IOUtil;
52  import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
53  
54  import java.io.File;
55  import java.io.FileReader;
56  import java.io.FileWriter;
57  import java.io.IOException;
58  import java.io.Reader;
59  import java.io.StringReader;
60  import java.io.StringWriter;
61  import java.net.URI;
62  import java.net.URISyntaxException;
63  import java.net.URL;
64  import java.util.Collections;
65  import java.util.HashSet;
66  import java.util.Iterator;
67  import java.util.Properties;
68  import java.util.Set;
69  
70  public class VersionExpressionTransformationTest
71      extends PlexusTestCase
72  {
73  
74      private static final String VERSION = "blah";
75  
76      private VersionExpressionTransformation transformation;
77  
78      private Set toDelete = new HashSet();
79  
80      public void setUp()
81          throws Exception
82      {
83          super.setUp();
84  
85          transformation =
86              (VersionExpressionTransformation) lookup( ArtifactTransformation.class.getName(), "version-expression" );
87      }
88  
89      public void tearDown()
90          throws Exception
91      {
92          super.tearDown();
93  
94          if ( toDelete != null && !toDelete.isEmpty() )
95          {
96              for ( Iterator it = toDelete.iterator(); it.hasNext(); )
97              {
98                  File f = (File) it.next();
99  
100                 try
101                 {
102                     FileUtils.forceDelete( f );
103                 }
104                 catch ( IOException e )
105                 {
106                     System.out.println( "Failed to delete temp file: '" + f.getAbsolutePath() + "'." );
107                     e.printStackTrace();
108                 }
109             }
110         }
111     }
112 
113     public void testTransformForInstall_AbortOnInvalidPOM()
114         throws URISyntaxException, IOException, XmlPullParserException, ModelInterpolationException
115     {
116         String pomResource = "version-expressions/invalid-pom.xml";
117         File pomFile = getPom( pomResource );
118         
119         File projectDir;
120         if ( pomFile != null )
121         {
122             projectDir = pomFile.getParentFile();
123         }
124         else
125         {
126             projectDir = File.createTempFile( "VersionExpressionTransformationTest.project.", ".tmp.dir" );
127             projectDir.delete();
128             projectDir.mkdirs();
129 
130             toDelete.add( projectDir );
131 
132             File newPomFile = new File( projectDir, "pom.xml" );
133             FileUtils.copyFile( pomFile, newPomFile );
134             
135             pomFile = newPomFile;
136         }
137 
138         File repoDir = File.createTempFile( "VersionExpressionTransformationTest.repo.", ".tmp.dir" );
139         repoDir.delete();
140         repoDir.mkdirs();
141 
142         toDelete.add( repoDir );
143 
144         Artifact a =
145             new DefaultArtifact( "groupId", "artifactId", VersionRange.createFromVersion( "1" ),
146                                  null, "jar", null, new DefaultArtifactHandler( "jar" ) );
147 
148         ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile );
149         a.addMetadata( pam );
150 
151         ArtifactRepository localRepository =
152             new DefaultArtifactRepository( "local", repoDir.getAbsolutePath(), new DefaultRepositoryLayout() );
153 
154         transformation.transformVersions( pomFile, a, localRepository );
155         
156         assertEquals( pomFile, pam.getFile() );
157     }
158 
159     public void testTransformForInstall_PreserveComments()
160         throws URISyntaxException, IOException, XmlPullParserException, ModelInterpolationException
161     {
162         String pomResource = "version-expressions/pom-with-comments.xml";
163         File pomFile = getPom( pomResource );
164 
165         Model model;
166         Reader reader = null;
167         try
168         {
169             reader = new FileReader( pomFile );
170 
171             model = new MavenXpp3Reader().read( reader );
172         }
173         finally
174         {
175             IOUtil.close( reader );
176         }
177 
178         File newPom = runTransformVersion_VanillaArtifact( model, pomFile );
179 
180         StringWriter writer = new StringWriter();
181         reader = null;
182         try
183         {
184             reader = new FileReader( newPom );
185             IOUtil.copy( reader, writer );
186         }
187         finally
188         {
189             IOUtil.close( reader );
190         }
191 
192         assertTrue( "XML comment not found.", writer.toString().indexOf( "This is a comment." ) > -1 );
193 
194         reader = new StringReader( writer.toString() );
195         try
196         {
197             model = new MavenXpp3Reader().read( reader );
198         }
199         finally
200         {
201             IOUtil.close( reader );
202         }
203 
204         assertEquals( "1.0", model.getVersion() );
205 
206         assertNotNull( model.getProperties() );
207 
208         assertNotNull( model.getProperties().getProperty( "other.version" ) );
209         assertEquals( "${testVersion}", model.getProperties().getProperty( "other.version" ) );
210 
211         assertNotNull( model.getScm() );
212 
213         assertNotNull( model.getScm().getConnection() );
214         assertEquals( "${testVersion}", model.getScm().getConnection() );
215 
216         assertNotNull( model.getScm().getUrl() );
217         assertEquals( "${testVersion}", model.getScm().getUrl() );
218     }
219 
220     private File getPom( String pom )
221         throws URISyntaxException, IOException
222     {
223         ClassLoader cloader = Thread.currentThread().getContextClassLoader();
224         URL resource = cloader.getResource( pom );
225 
226         if ( resource == null )
227         {
228             fail( "POM classpath resource not found: '" + pom + "'." );
229         }
230 
231         File tempDir = File.createTempFile( "VersionExpressionTransformationTest.", ".dir.tmp" );
232         tempDir.delete();
233         tempDir.mkdirs();
234 
235         toDelete.add( tempDir );
236 
237         File pomFile = new File( tempDir, "pom.xml" );
238         FileUtils.copyFile( new File( new URI( resource.toExternalForm() ).normalize() ), pomFile );
239 
240         return pomFile;
241     }
242 
243     public void testTransformForResolve_DoNothing()
244         throws IOException, XmlPullParserException, ArtifactResolutionException, ArtifactNotFoundException
245     {
246         Model model = buildTestModel();
247 
248         File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" );
249         pomDir.delete();
250         pomDir.mkdirs();
251 
252         toDelete.add( pomDir );
253 
254         File pomFile = new File( pomDir, "pom.xml" );
255 
256         FileWriter writer = null;
257         try
258         {
259             writer = new FileWriter( pomFile );
260             new MavenXpp3Writer().write( writer, model );
261         }
262         finally
263         {
264             IOUtil.close( writer );
265         }
266 
267         Artifact a =
268             new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar", null,
269                                  new DefaultArtifactHandler( "jar" ), false );
270         ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile );
271 
272         a.addMetadata( pam );
273 
274         transformation.transformForResolve( a, Collections.EMPTY_LIST, null );
275 
276         assertFalse( pam.isVersionExpressionsResolved() );
277         assertEquals( pomFile, pam.getFile() );
278 
279         assertFalse( new File( pomDir, "target/pom-transformed.xml" ).exists() );
280 
281         FileReader reader = null;
282         try
283         {
284             reader = new FileReader( pomFile );
285             model = new MavenXpp3Reader().read( reader );
286         }
287         finally
288         {
289             IOUtil.close( reader );
290         }
291 
292         assertEquals( "${testVersion}", model.getVersion() );
293     }
294 
295     public void testTransformForInstall_TransformBasedOnModelProperties()
296         throws IOException, ArtifactInstallationException, XmlPullParserException
297     {
298         Model model = buildTestModel();
299 
300         File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" );
301         pomDir.delete();
302         pomDir.mkdirs();
303 
304         toDelete.add( pomDir );
305 
306         File pomFile = new File( pomDir, "pom.xml" );
307 
308         FileWriter writer = null;
309         try
310         {
311             writer = new FileWriter( pomFile );
312             new MavenXpp3Writer().write( writer, model );
313         }
314         finally
315         {
316             IOUtil.close( writer );
317         }
318 
319         Artifact a =
320             new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar", null,
321                                  new DefaultArtifactHandler( "jar" ), false );
322 
323         ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile );
324 
325         a.addMetadata( pam );
326 
327         transformation.transformForInstall( a, null );
328 
329         File transformedFile = new File( pomDir, "target/pom-transformed.xml" );
330 
331         assertTrue( transformedFile.exists() );
332         assertEquals( transformedFile, pam.getFile() );
333 
334         FileReader reader = null;
335         try
336         {
337             reader = new FileReader( pam.getFile() );
338             StringWriter swriter = new StringWriter();
339             IOUtil.copy( reader, swriter );
340 
341 //            System.out.println( "Transformed POM:\n\n\n" + swriter.toString() );
342 //            System.out.flush();
343 
344             model = new MavenXpp3Reader().read( new StringReader( swriter.toString() ) );
345         }
346         finally
347         {
348             IOUtil.close( reader );
349         }
350 
351         assertTransformedVersions( model );
352     }
353 
354     public void testTransformForDeploy_TransformBasedOnModelProperties()
355         throws IOException, XmlPullParserException, ArtifactDeploymentException
356     {
357         Model model = buildTestModel();
358 
359         File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" );
360         pomDir.delete();
361         pomDir.mkdirs();
362 
363         toDelete.add( pomDir );
364 
365         File pomFile = new File( pomDir, "pom.xml" );
366 
367         FileWriter writer = null;
368         try
369         {
370             writer = new FileWriter( pomFile );
371             new MavenXpp3Writer().write( writer, model );
372         }
373         finally
374         {
375             IOUtil.close( writer );
376         }
377 
378         Artifact a =
379             new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar", null,
380                                  new DefaultArtifactHandler( "jar" ), false );
381 
382         ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile );
383 
384         a.addMetadata( pam );
385 
386         transformation.transformForDeployment( a, null, null );
387 
388         File transformedFile = new File( pomDir, "target/pom-transformed.xml" );
389 
390         assertTrue( transformedFile.exists() );
391         assertEquals( transformedFile, pam.getFile() );
392 
393         FileReader reader = null;
394         try
395         {
396             reader = new FileReader( pam.getFile() );
397             model = new MavenXpp3Reader().read( reader );
398         }
399         finally
400         {
401             IOUtil.close( reader );
402         }
403 
404         assertTransformedVersions( model );
405     }
406 
407     // FIXME: We can't be this smart (yet) since the deployment step transforms from the
408     // original POM once again and re-installs over the top of the install step.
409     // public void testTransformForInstall_SkipIfProjectArtifactMetadataResolvedFlagIsSet()
410     // throws IOException, ArtifactInstallationException, XmlPullParserException
411     // {
412     // Model model = buildTestModel();
413     //
414     // File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" );
415     // pomDir.delete();
416     // pomDir.mkdirs();
417     // try
418     // {
419     // File pomFile = new File( pomDir, "pom.xml" );
420     // pomFile.deleteOnExit();
421     //
422     // FileWriter writer = null;
423     // try
424     // {
425     // writer = new FileWriter( pomFile );
426     // new MavenXpp3Writer().write( writer, model );
427     // }
428     // finally
429     // {
430     // IOUtil.close( writer );
431     // }
432     //
433     // Artifact a =
434     // new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar", null,
435     // new DefaultArtifactHandler( "jar" ), false );
436     // ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile );
437     // pam.setVersionExpressionsResolved( true );
438     //
439     // a.addMetadata( pam );
440     //
441     // transformation.transformForInstall( a, null );
442     //
443     // assertEquals( pomFile, pam.getFile() );
444     //
445     // assertFalse( new File( pomDir, "target/pom-transformed.xml" ).exists() );
446     //
447     // FileReader reader = null;
448     // try
449     // {
450     // reader = new FileReader( pomFile );
451     // model = new MavenXpp3Reader().read( reader );
452     // }
453     // finally
454     // {
455     // IOUtil.close( reader );
456     // }
457     //
458     // assertEquals( "${testVersion}", model.getVersion() );
459     // }
460     // finally
461     // {
462     // FileUtils.forceDelete( pomDir );
463     // }
464     // }
465 
466     // FIXME: We can't be this smart (yet) since the deployment step transforms from the
467     // original POM once again and re-installs over the top of the install step.
468     // public void testTransformForDeploy_SkipIfProjectArtifactMetadataResolvedFlagIsSet()
469     // throws IOException, XmlPullParserException, ArtifactDeploymentException
470     // {
471     // Model model = buildTestModel();
472     //
473     // File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" );
474     // pomDir.delete();
475     // pomDir.mkdirs();
476     // try
477     // {
478     // File pomFile = new File( pomDir, "pom.xml" );
479     // pomFile.deleteOnExit();
480     //
481     // FileWriter writer = null;
482     // try
483     // {
484     // writer = new FileWriter( pomFile );
485     // new MavenXpp3Writer().write( writer, model );
486     // }
487     // finally
488     // {
489     // IOUtil.close( writer );
490     // }
491     //
492     // Artifact a =
493     // new DefaultArtifact( "group", "artifact", VersionRange.createFromVersion( "1" ), null, "jar", null,
494     // new DefaultArtifactHandler( "jar" ), false );
495     // ProjectArtifactMetadata pam = new ProjectArtifactMetadata( a, pomFile );
496     // pam.setVersionExpressionsResolved( true );
497     //
498     // a.addMetadata( pam );
499     //
500     // transformation.transformForDeployment( a, null, null );
501     //
502     // assertEquals( pomFile, pam.getFile() );
503     //
504     // assertFalse( new File( pomDir, "target/pom-transformed.xml" ).exists() );
505     //
506     // FileReader reader = null;
507     // try
508     // {
509     // reader = new FileReader( pomFile );
510     // model = new MavenXpp3Reader().read( reader );
511     // }
512     // finally
513     // {
514     // IOUtil.close( reader );
515     // }
516     //
517     // assertEquals( "${testVersion}", model.getVersion() );
518     // }
519     // finally
520     // {
521     // FileUtils.forceDelete( pomDir );
522     // }
523     // }
524 
525     public void testTransformVersion_ShouldInterpolate_VanillaArtifact_ModelProperties()
526         throws IOException, XmlPullParserException, ModelInterpolationException
527     {
528         Model model = buildTestModel();
529 
530         File newPom = runTransformVersion_VanillaArtifact( model, null );
531 
532         FileReader reader = null;
533         try
534         {
535             reader = new FileReader( newPom );
536 
537             model = new MavenXpp3Reader().read( reader );
538         }
539         finally
540         {
541             IOUtil.close( reader );
542         }
543 
544         assertTransformedVersions( model );
545     }
546 
547     public void testTransformVersion_ShouldInterpolate_ArtifactWithProject_ModelProperties()
548         throws IOException, XmlPullParserException, ModelInterpolationException
549     {
550         Model model = buildTestModel();
551 
552         File newPom = runTransformVersion_ArtifactWithProject( model, new DefaultProjectBuilderConfiguration(), null );
553 
554         FileReader reader = null;
555         try
556         {
557             reader = new FileReader( newPom );
558 
559             model = new MavenXpp3Reader().read( reader );
560         }
561         finally
562         {
563             IOUtil.close( reader );
564         }
565 
566         assertTransformedVersions( model );
567     }
568 
569     public void testTransformVersion_ShouldInterpolate_ArtifactWithProject_CLIProperties()
570         throws IOException, XmlPullParserException, ModelInterpolationException
571     {
572         Model model = buildTestModel();
573 
574         Properties props = model.getProperties();
575         model.setProperties( new Properties() );
576 
577         File newPom =
578             runTransformVersion_ArtifactWithProject(
579                                                      model,
580                                                      new DefaultProjectBuilderConfiguration().setExecutionProperties( props ),
581                                                      null );
582 
583         FileReader reader = null;
584         try
585         {
586             reader = new FileReader( newPom );
587 
588             model = new MavenXpp3Reader().read( reader );
589         }
590         finally
591         {
592             IOUtil.close( reader );
593         }
594 
595         assertTransformedVersions( model );
596     }
597 
598     private File runTransformVersion_VanillaArtifact( Model model, File pomFile )
599         throws IOException, XmlPullParserException, ModelInterpolationException
600     {
601         File projectDir;
602         if ( pomFile != null )
603         {
604             projectDir = pomFile.getParentFile();
605         }
606         else
607         {
608             projectDir = File.createTempFile( "VersionExpressionTransformationTest.project.", ".tmp.dir" );
609             projectDir.delete();
610             projectDir.mkdirs();
611 
612             toDelete.add( projectDir );
613 
614             pomFile = new File( projectDir, "pom.xml" );
615 
616             FileWriter writer = null;
617             try
618             {
619                 writer = new FileWriter( pomFile );
620                 new MavenXpp3Writer().write( writer, model );
621             }
622             finally
623             {
624                 IOUtil.close( writer );
625             }
626         }
627 
628         File repoDir = File.createTempFile( "VersionExpressionTransformationTest.repo.", ".tmp.dir" );
629         repoDir.delete();
630         repoDir.mkdirs();
631 
632         toDelete.add( repoDir );
633 
634         File dir = new File( projectDir, "target" );
635         dir.mkdirs();
636 
637         if ( model.getBuild() == null )
638         {
639             model.setBuild( new Build() );
640         }
641 
642         model.getBuild().setDirectory( dir.getAbsolutePath() );
643 
644         Artifact a =
645             new DefaultArtifact( model.getGroupId(), model.getArtifactId(), VersionRange.createFromVersion( "1" ),
646                                  null, "jar", null, new DefaultArtifactHandler( "jar" ) );
647 
648         a.addMetadata( new ProjectArtifactMetadata( a, pomFile ) );
649 
650         ArtifactRepository localRepository =
651             new DefaultArtifactRepository( "local", repoDir.getAbsolutePath(), new DefaultRepositoryLayout() );
652 
653         transformation.transformVersions( pomFile, a, localRepository );
654 
655         return new File( projectDir, "target/pom-transformed.xml" );
656     }
657 
658     private File runTransformVersion_ArtifactWithProject( Model model, ProjectBuilderConfiguration pbConfig,
659                                                           File pomFile )
660         throws IOException, XmlPullParserException, ModelInterpolationException
661     {
662         File projectDir;
663         if ( pomFile != null )
664         {
665             projectDir = pomFile.getParentFile();
666         }
667         else
668         {
669             projectDir = File.createTempFile( "VersionExpressionTransformationTest.project.", ".tmp.dir" );
670             projectDir.delete();
671             projectDir.mkdirs();
672 
673             toDelete.add( projectDir );
674 
675             pomFile = new File( projectDir, "pom.xml" );
676 
677             FileWriter writer = null;
678             try
679             {
680                 writer = new FileWriter( pomFile );
681                 new MavenXpp3Writer().write( writer, model );
682             }
683             finally
684             {
685                 IOUtil.close( writer );
686             }
687         }
688 
689         File repoDir = File.createTempFile( "VersionExpressionTransformationTest.repo.", ".tmp.dir" );
690         repoDir.delete();
691         repoDir.mkdirs();
692 
693         toDelete.add( repoDir );
694 
695         File dir = new File( projectDir, "target" );
696         dir.mkdirs();
697 
698         if ( model.getBuild() == null )
699         {
700             model.setBuild( new Build() );
701         }
702 
703         model.getBuild().setDirectory( dir.getAbsolutePath() );
704 
705         MavenProject project = new MavenProject( model );
706         project.setFile( pomFile );
707         project.setBasedir( projectDir );
708         project.setProjectBuilderConfiguration( pbConfig );
709 
710         ArtifactWithProject a =
711             new ArtifactWithProject( project, "jar", null, new DefaultArtifactHandler( "jar" ), false );
712 
713         a.addMetadata( new ProjectArtifactMetadata( a, pomFile ) );
714 
715         ArtifactRepository localRepository =
716             new DefaultArtifactRepository( "local", repoDir.getAbsolutePath(), new DefaultRepositoryLayout() );
717 
718         transformation.transformVersions( pomFile, a, localRepository );
719 
720         return new File( project.getBuild().getDirectory(), "pom-transformed.xml" );
721     }
722 
723     public void testInterpolate_ShouldNotInterpolateNonVersionFields()
724         throws ModelInterpolationException, IOException, XmlPullParserException
725     {
726         Model model = buildTestModel();
727 
728         Scm scm = new Scm();
729         scm.setUrl( "http://${testVersion}" );
730 
731         model.setScm( scm );
732 
733         File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" );
734         pomDir.delete();
735         pomDir.mkdirs();
736 
737         toDelete.add( pomDir );
738         File pomFile = new File( pomDir, "pom.xml" );
739 
740         FileWriter writer = null;
741         try
742         {
743             writer = new FileWriter( pomFile );
744             new MavenXpp3Writer().write( writer, model );
745         }
746         finally
747         {
748             IOUtil.close( writer );
749         }
750 
751         File output = new File( pomDir, "output.xml" );
752 
753         transformation.interpolateVersions( pomFile, output, model, pomDir, new DefaultProjectBuilderConfiguration() );
754 
755         FileReader reader = null;
756         try
757         {
758             reader = new FileReader( output );
759             model = new MavenXpp3Reader().read( reader );
760         }
761         finally
762         {
763             IOUtil.close( reader );
764         }
765 
766         // /project/scm/url
767         assertFalse( model.getScm().getUrl().indexOf( VERSION ) > -1 );
768     }
769 
770     public void testInterpolate_ShouldInterpolateAllVersionsUsingPOMProperties()
771         throws ModelInterpolationException, IOException, XmlPullParserException
772     {
773         Model model = buildTestModel();
774         File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" );
775         pomDir.delete();
776         pomDir.mkdirs();
777 
778         toDelete.add( pomDir );
779         File pomFile = new File( pomDir, "pom.xml" );
780 
781         FileWriter writer = null;
782         try
783         {
784             writer = new FileWriter( pomFile );
785             new MavenXpp3Writer().write( writer, model );
786         }
787         finally
788         {
789             IOUtil.close( writer );
790         }
791 
792         File output = new File( pomDir, "output.xml" );
793 
794         transformation.interpolateVersions( pomFile, output, model, pomDir, new DefaultProjectBuilderConfiguration() );
795 
796         FileReader reader = null;
797         try
798         {
799             reader = new FileReader( output );
800             model = new MavenXpp3Reader().read( reader );
801         }
802         finally
803         {
804             IOUtil.close( reader );
805         }
806 
807         assertTransformedVersions( model );
808     }
809 
810     private void assertTransformedVersions( Model model )
811     {
812         // /project/version
813         assertEquals( VERSION, model.getVersion() );
814 
815         // /project/dependenices/dependency/version
816         Dependency dep = (Dependency) model.getDependencies().get( 0 );
817         assertEquals( VERSION, dep.getVersion() );
818 
819         // /project/dependencyManagement/dependenices/dependency/version
820         dep = (Dependency) model.getDependencyManagement().getDependencies().get( 0 );
821         assertEquals( VERSION, dep.getVersion() );
822 
823         // /project/build/plugins/plugin/version
824         Plugin plugin = (Plugin) model.getBuild().getPlugins().get( 0 );
825         assertEquals( VERSION, plugin.getVersion() );
826 
827         // /project/build/plugins/plugin/dependencies/dependency/version
828         dep = (Dependency) plugin.getDependencies().get( 0 );
829         assertEquals( VERSION, dep.getVersion() );
830 
831         // /project/build/pluginManagement/plugins/plugin/version
832         plugin = (Plugin) model.getBuild().getPluginManagement().getPlugins().get( 0 );
833         assertEquals( VERSION, plugin.getVersion() );
834 
835         // /project/build/pluginManagement/plugins/plugin/dependencies/dependency/version
836         dep = (Dependency) plugin.getDependencies().get( 0 );
837         assertEquals( VERSION, dep.getVersion() );
838 
839         // /project/reporting/plugins/plugin/version
840         ReportPlugin rplugin = (ReportPlugin) model.getReporting().getPlugins().get( 0 );
841         assertEquals( VERSION, rplugin.getVersion() );
842     }
843 
844     public void testInterpolate_ShouldInterpolateAllVersionsUsingCLIProperties()
845         throws ModelInterpolationException, IOException, XmlPullParserException
846     {
847         Model model = buildTestModel();
848         File pomDir = File.createTempFile( "VersionExpressionTransformationTest.", ".tmp.dir" );
849         pomDir.delete();
850         pomDir.mkdirs();
851 
852         toDelete.add( pomDir );
853 
854         File pomFile = new File( pomDir, "pom.xml" );
855 
856         FileWriter writer = null;
857         try
858         {
859             writer = new FileWriter( pomFile );
860             new MavenXpp3Writer().write( writer, model );
861         }
862         finally
863         {
864             IOUtil.close( writer );
865         }
866 
867         Properties props = model.getProperties();
868         model.setProperties( new Properties() );
869 
870         File output = new File( pomDir, "output.xml" );
871 
872         transformation.interpolateVersions( pomFile, output, model, pomDir,
873                                             new DefaultProjectBuilderConfiguration().setExecutionProperties( props ) );
874 
875         FileReader reader = null;
876         try
877         {
878             reader = new FileReader( output );
879             model = new MavenXpp3Reader().read( reader );
880         }
881         finally
882         {
883             IOUtil.close( reader );
884         }
885 
886         assertTransformedVersions( model );
887     }
888 
889     public Model buildTestModel()
890     {
891         Model model = new Model();
892 
893         model.setGroupId( "group.id" );
894         model.setArtifactId( "artifact-id" );
895         model.setPackaging( "jar" );
896 
897         String expression = "${testVersion}";
898 
899         Properties props = new Properties();
900         props.setProperty( "testVersion", VERSION );
901 
902         model.setProperties( props );
903 
904         model.setVersion( expression );
905 
906         Dependency dep = new Dependency();
907         dep.setGroupId( "group.id" );
908         dep.setArtifactId( "artifact-id" );
909         dep.setVersion( expression );
910 
911         model.addDependency( dep );
912 
913         dep = new Dependency();
914         dep.setGroupId( "managed.group.id" );
915         dep.setArtifactId( "managed-artifact-id" );
916         dep.setVersion( expression );
917 
918         DependencyManagement dmgmt = new DependencyManagement();
919         dmgmt.addDependency( dep );
920 
921         model.setDependencyManagement( dmgmt );
922 
923         Build build = new Build();
924         model.setBuild( build );
925 
926         Plugin plugin = new Plugin();
927         plugin.setGroupId( "plugin.group" );
928         plugin.setArtifactId( "plugin-artifact" );
929         plugin.setVersion( expression );
930 
931         dep = new Dependency();
932         dep.setGroupId( "plugin.dep.group" );
933         dep.setArtifactId( "plugin-dep-artifact" );
934         dep.setVersion( expression );
935         plugin.addDependency( dep );
936 
937         build.addPlugin( plugin );
938 
939         plugin = new Plugin();
940         plugin.setGroupId( "plugin.other.group" );
941         plugin.setArtifactId( "plugin-other-artifact" );
942         plugin.setVersion( expression );
943 
944         dep = new Dependency();
945         dep.setGroupId( "plugin.dep.other.group" );
946         dep.setArtifactId( "plugin-dep-other-artifact" );
947         dep.setVersion( expression );
948         plugin.addDependency( dep );
949 
950         PluginManagement pmgmt = new PluginManagement();
951         pmgmt.addPlugin( plugin );
952 
953         build.setPluginManagement( pmgmt );
954 
955         ReportPlugin rplugin = new ReportPlugin();
956         rplugin.setGroupId( "report.group" );
957         rplugin.setArtifactId( "report-artifact" );
958         rplugin.setVersion( expression );
959 
960         Reporting reporting = new Reporting();
961         reporting.addPlugin( rplugin );
962 
963         model.setReporting( reporting );
964 
965         return model;
966     }
967 
968 }