1   package org.apache.maven.project.interpolation;
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  import org.apache.maven.model.Build;
23  import org.apache.maven.model.Dependency;
24  import org.apache.maven.model.Model;
25  import org.apache.maven.model.Organization;
26  import org.apache.maven.model.Repository;
27  import org.apache.maven.model.Resource;
28  import org.apache.maven.model.Scm;
29  import org.apache.maven.project.DefaultProjectBuilderConfiguration;
30  import org.apache.maven.project.path.DefaultPathTranslator;
31  import org.apache.maven.project.path.PathTranslator;
32  import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
33  
34  import java.io.File;
35  import java.io.IOException;
36  import java.text.SimpleDateFormat;
37  import java.util.Calendar;
38  import java.util.Collections;
39  import java.util.Date;
40  import java.util.HashMap;
41  import java.util.Iterator;
42  import java.util.List;
43  import java.util.Map;
44  import java.util.Properties;
45  
46  import junit.framework.TestCase;
47  
48  
49  
50  
51  
52  public abstract class AbstractModelInterpolatorTest
53      extends TestCase
54  {
55      private Map context;
56      
57      protected void setUp()
58          throws Exception
59      {
60          super.setUp();
61  
62          context = new HashMap();
63          context.put( "basedir", "myBasedir" );
64          context.put( "project.baseUri", "myBaseUri" );
65      }
66      
67      public void testDefaultBuildTimestampFormatShouldParseTimeIn24HourFormat()
68      {
69          Calendar cal = Calendar.getInstance();
70          cal.set( Calendar.HOUR, 12 );
71          cal.set( Calendar.AM_PM, Calendar.AM );
72          
73          
74          cal.set( Calendar.HOUR_OF_DAY, 0 );
75          cal.set( Calendar.MINUTE, 16 );
76          cal.set( Calendar.YEAR, 1976 );
77          cal.set( Calendar.MONTH, Calendar.NOVEMBER );
78          cal.set( Calendar.DATE, 11 );
79          
80          Date firstTestDate = cal.getTime();
81          
82          cal.set( Calendar.HOUR, 11 );
83          cal.set( Calendar.AM_PM, Calendar.PM );
84          
85          
86          cal.set( Calendar.HOUR_OF_DAY, 23 );
87          
88          Date secondTestDate = cal.getTime();
89          
90          SimpleDateFormat format = new SimpleDateFormat( ModelInterpolator.DEFAULT_BUILD_TIMESTAMP_FORMAT );
91          assertEquals( "19761111-0016", format.format( firstTestDate ) );
92          assertEquals( "19761111-2316", format.format( secondTestDate ) );
93      }
94  
95      public void testShouldNotThrowExceptionOnReferenceToNonExistentValue()
96          throws Exception
97      {
98          Model model = new Model();
99  
100         Scm scm = new Scm();
101         scm.setConnection( "${test}/somepath" );
102 
103         model.setScm( scm );
104 
105         ModelInterpolator interpolator = createInterpolator();
106         
107         Model out = interpolator.interpolate( model, context );
108 
109         assertEquals( "${test}/somepath", out.getScm().getConnection() );
110     }
111 
112     public void testShouldThrowExceptionOnRecursiveScmConnectionReference()
113         throws Exception
114     {
115         Model model = new Model();
116 
117         Scm scm = new Scm();
118         scm.setConnection( "${project.scm.connection}/somepath" );
119 
120         model.setScm( scm );
121 
122         try
123         {
124             ModelInterpolator interpolator = createInterpolator();
125             
126             interpolator.interpolate( model, context );
127 
128             fail( "The interpolator should not allow self-referencing expressions in POM." );
129         }
130         catch ( ModelInterpolationException e )
131         {
132 
133         }
134     }
135 
136     public void testShouldNotThrowExceptionOnReferenceToValueContainingNakedExpression()
137         throws Exception
138     {
139         Model model = new Model();
140 
141         Scm scm = new Scm();
142         scm.setConnection( "${test}/somepath" );
143 
144         model.setScm( scm );
145 
146         model.addProperty( "test", "test" );
147 
148         ModelInterpolator interpolator = createInterpolator();
149         
150         Model out = interpolator.interpolate( model, context );
151         
152         assertEquals( "test/somepath", out.getScm().getConnection() );
153     }
154 
155     public void testShouldInterpolateOrganizationNameCorrectly()
156         throws Exception
157     {
158         String orgName = "MyCo";
159 
160         Model model = new Model();
161         model.setName( "${pom.organization.name} Tools" );
162 
163         Organization org = new Organization();
164         org.setName( orgName );
165 
166         model.setOrganization( org );
167 
168         ModelInterpolator interpolator = createInterpolator();
169         
170         Model out = interpolator.interpolate( model, context );
171         
172         assertEquals( orgName + " Tools", out.getName() );
173     }
174 
175     public void testShouldInterpolateDependencyVersionToSetSameAsProjectVersion()
176         throws Exception
177     {
178         Model model = new Model();
179         model.setVersion( "3.8.1" );
180 
181         Dependency dep = new Dependency();
182         dep.setVersion( "${version}" );
183 
184         model.addDependency( dep );
185 
186         ModelInterpolator interpolator = createInterpolator();
187         
188         Model out = interpolator.interpolate( model, context );
189         
190         assertEquals( "3.8.1", ( (Dependency) out.getDependencies().get( 0 ) ).getVersion() );
191     }
192 
193     public void testShouldNotInterpolateDependencyVersionWithInvalidReference()
194         throws Exception
195     {
196         Model model = new Model();
197         model.setVersion( "3.8.1" );
198 
199         Dependency dep = new Dependency();
200         dep.setVersion( "${something}" );
201 
202         model.addDependency( dep );
203 
204         
205 
206 
207 
208 
209 
210 
211 
212 
213 
214 
215 
216 
217 
218 
219         ModelInterpolator interpolator = createInterpolator();
220         
221         Model out = interpolator.interpolate( model, context );
222         
223         assertEquals( "${something}", ( (Dependency) out.getDependencies().get( 0 ) ).getVersion() );
224     }
225 
226     public void testTwoReferences()
227         throws Exception
228     {
229         Model model = new Model();
230         model.setVersion( "3.8.1" );
231         model.setArtifactId( "foo" );
232 
233         Dependency dep = new Dependency();
234         dep.setVersion( "${artifactId}-${version}" );
235 
236         model.addDependency( dep );
237 
238         ModelInterpolator interpolator = createInterpolator();
239         
240         Model out = interpolator.interpolate( model, context );
241         
242         assertEquals( "foo-3.8.1", ( (Dependency) out.getDependencies().get( 0 ) ).getVersion() );
243     }
244 
245     public void testBasedir()
246         throws Exception
247     {
248         Model model = new Model();
249         model.setVersion( "3.8.1" );
250         model.setArtifactId( "foo" );
251 
252         Repository repository = new Repository();
253 
254         repository.setUrl( "file://localhost/${basedir}/temp-repo" );
255 
256         model.addRepository( repository );
257 
258         ModelInterpolator interpolator = createInterpolator();
259         
260         Model out = interpolator.interpolate( model, context );
261         
262         assertEquals( "file://localhost/myBasedir/temp-repo", ( (Repository) out.getRepositories().get( 0 ) ).getUrl() );
263     }
264 
265     public void testBaseUri()
266         throws Exception
267     {
268         Model model = new Model();
269         model.setVersion( "3.8.1" );
270         model.setArtifactId( "foo" );
271 
272         Repository repository = new Repository();
273 
274         repository.setUrl( "${project.baseUri}/temp-repo" );
275 
276         model.addRepository( repository );
277 
278         ModelInterpolator interpolator = createInterpolator();
279 
280         Model out = interpolator.interpolate( model, context );
281 
282         assertEquals( "myBaseUri/temp-repo", ( (Repository) out.getRepositories().get( 0 ) ).getUrl() );
283     }
284 
285     public void testEnvars()
286         throws Exception
287     {
288         Map context = new HashMap();
289 
290         context.put( "env.HOME", "/path/to/home" );
291 
292         Model model = new Model();
293 
294         Properties modelProperties = new Properties();
295 
296         modelProperties.setProperty( "outputDirectory", "${env.HOME}" );
297 
298         model.setProperties( modelProperties );
299 
300         ModelInterpolator interpolator = createInterpolator();
301         
302         Model out = interpolator.interpolate( model, context );
303         
304         assertEquals( "/path/to/home", out.getProperties().getProperty( "outputDirectory" ) );
305     }
306 
307     public void testEnvarExpressionThatEvaluatesToNullReturnsTheLiteralString()
308         throws Exception
309     {
310         Properties envars = new Properties();
311 
312         Model model = new Model();
313 
314         Properties modelProperties = new Properties();
315 
316         modelProperties.setProperty( "outputDirectory", "${env.DOES_NOT_EXIST}" );
317 
318         model.setProperties( modelProperties );
319 
320         ModelInterpolator interpolator = createInterpolator();
321         
322         Model out = interpolator.interpolate( model, context );
323 
324         assertEquals( out.getProperties().getProperty( "outputDirectory" ), "${env.DOES_NOT_EXIST}" );
325     }
326 
327     public void testExpressionThatEvaluatesToNullReturnsTheLiteralString()
328         throws Exception
329     {
330         Model model = new Model();
331 
332         Properties modelProperties = new Properties();
333 
334         modelProperties.setProperty( "outputDirectory", "${DOES_NOT_EXIST}" );
335 
336         model.setProperties( modelProperties );
337 
338         ModelInterpolator interpolator = createInterpolator();
339         
340         Model out = interpolator.interpolate( model, context );
341         
342         assertEquals( out.getProperties().getProperty( "outputDirectory" ), "${DOES_NOT_EXIST}" );
343     }
344 
345     public void testShouldInterpolateSourceDirectoryReferencedFromResourceDirectoryCorrectly()
346         throws Exception
347     {
348         Model model = new Model();
349 
350         Build build = new Build();
351         build.setSourceDirectory( "correct" );
352 
353         Resource res = new Resource();
354         res.setDirectory( "${project.build.sourceDirectory}" );
355 
356         build.addResource( res );
357 
358         Resource res2 = new Resource();
359         res2.setDirectory( "${pom.build.sourceDirectory}" );
360 
361         build.addResource( res2 );
362 
363         Resource res3 = new Resource();
364         res3.setDirectory( "${build.sourceDirectory}" );
365 
366         build.addResource( res3 );
367 
368         model.setBuild( build );
369 
370         ModelInterpolator interpolator = createInterpolator();
371         
372         Model out = interpolator.interpolate( model, context );
373         
374         List outResources = out.getBuild().getResources();
375         Iterator resIt = outResources.iterator();
376 
377         assertEquals( build.getSourceDirectory(), ( (Resource) resIt.next() ).getDirectory() );
378         assertEquals( build.getSourceDirectory(), ( (Resource) resIt.next() ).getDirectory() );
379         assertEquals( build.getSourceDirectory(), ( (Resource) resIt.next() ).getDirectory() );
380     }
381 
382     public void testShouldInterpolateUnprefixedBasedirExpression()
383         throws Exception
384     {
385         File basedir = new File( "/test/path" );
386         Model model = new Model();
387         Dependency dep = new Dependency();
388         dep.setSystemPath( "${basedir}/artifact.jar" );
389 
390         model.addDependency( dep );
391 
392         ModelInterpolator interpolator = createInterpolator();
393         
394         Model result = interpolator.interpolate( model, basedir, new DefaultProjectBuilderConfiguration(), true );
395 
396         List rDeps = result.getDependencies();
397         assertNotNull( rDeps );
398         assertEquals( 1, rDeps.size() );
399         assertEquals( new File( basedir, "artifact.jar" ).getAbsolutePath(), new File( ( (Dependency) rDeps.get( 0 ) )
400             .getSystemPath() ).getAbsolutePath() );
401     }
402     
403     public void testTwoLevelRecursiveBasedirAlignedExpression()
404         throws Exception
405     {
406         Model model = new Model();
407         Build build = new Build();
408         
409         model.setBuild( build );
410         
411         build.setDirectory( "${project.basedir}/target" );
412         build.setOutputDirectory( "${project.build.directory}/classes" );
413         
414         PathTranslator translator = new DefaultPathTranslator();
415         ModelInterpolator interpolator = createInterpolator( translator );
416         
417         File basedir = new File( System.getProperty( "java.io.tmpdir" ), "base" );
418         
419         String value = interpolator.interpolate( "${project.build.outputDirectory}/foo", model, basedir, new DefaultProjectBuilderConfiguration(), true );
420         value = value.replace( '/', File.separatorChar ).replace( '\\', File.separatorChar );
421         
422         String check = new File( basedir, "target/classes/foo" ).getAbsolutePath();
423         check = check.replace( '/', File.separatorChar ).replace( '\\', File.separatorChar );
424         
425         assertEquals( check, value );
426     }
427 
428     protected abstract ModelInterpolator createInterpolator( PathTranslator translator )
429         throws Exception;
430 
431     protected abstract ModelInterpolator createInterpolator()
432         throws Exception;
433 
434 
435 
436 
437 
438 
439 
440 
441 
442 
443 
444 
445 
446 
447 
448 
449 
450 
451 
452 
453 
454 
455 
456 
457 
458 
459 
460 
461 
462 
463 
464 
465 
466 
467 
468 
469 }