1 package org.apache.maven.archetype.generator;
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.archetype.ArchetypeGenerationRequest;
23 import org.apache.maven.archetype.ArchetypeGenerationResult;
24 import org.apache.maven.artifact.repository.ArtifactRepository;
25 import org.apache.maven.artifact.repository.DefaultArtifactRepository;
26 import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
27 import org.apache.maven.model.Dependency;
28 import org.apache.maven.model.Model;
29 import org.apache.maven.model.Plugin;
30 import org.apache.maven.model.ReportPlugin;
31 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
32 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
33 import org.codehaus.plexus.util.FileUtils;
34 import org.codehaus.plexus.util.IOUtil;
35 import org.codehaus.plexus.util.ReaderFactory;
36 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
37
38 import java.io.File;
39 import java.io.FileInputStream;
40 import java.io.FileNotFoundException;
41 import java.io.IOException;
42 import java.io.InputStream;
43 import java.io.Reader;
44 import java.util.Properties;
45
46 public class DefaultArchetypeGeneratorTest
47 extends AbstractMojoTestCase
48 {
49
50 private final static Archetype ARCHETYPE_BASIC = new Archetype( "archetypes", "basic", "1.0" );
51
52 private final static Archetype ARCHETYPE_PARTIAL = new Archetype( "archetypes", "partial", "1.0" );
53
54 private final static Archetype ARCHETYPE_SITE = new Archetype( "archetypes", "site", "1.0" );
55
56 private final static Archetype ARCHETYPE_FILESET = new Archetype( "archetypes", "fileset", "1.0" );
57
58 private final static Archetype ARCHETYPE_OLD = new Archetype( "archetypes", "old", "1.0" );
59
60 private final static Properties ADDITIONAL_PROPERTIES = new Properties();
61 static
62 {
63 ADDITIONAL_PROPERTIES.setProperty( "property-without-default-1", "file-value" );
64 ADDITIONAL_PROPERTIES.setProperty( "property-without-default-2", "file-value" );
65 ADDITIONAL_PROPERTIES.setProperty( "property-without-default-3", "file-value" );
66 ADDITIONAL_PROPERTIES.setProperty( "property-without-default-4", "file-value" );
67 ADDITIONAL_PROPERTIES.setProperty( "property-with-default-1", "file-value" );
68 ADDITIONAL_PROPERTIES.setProperty( "property-with-default-2", "file-value" );
69 ADDITIONAL_PROPERTIES.setProperty( "property-with-default-3", "file-value" );
70 ADDITIONAL_PROPERTIES.setProperty( "property-with-default-4", "file-value" );
71 }
72
73 ArtifactRepository localRepository;
74
75 String remoteRepository;
76
77 ArchetypeGenerator generator;
78
79 String outputDirectory;
80
81 File projectDirectory;
82
83 private void generateProjectFromArchetype( ArchetypeGenerationRequest request )
84 throws Exception
85 {
86 ArchetypeGenerationResult result = new ArchetypeGenerationResult();
87
88 generator.generateArchetype( request, result );
89
90 if ( result.getCause() != null )
91 {
92 throw result.getCause();
93 }
94 }
95
96 private ArchetypeGenerationResult generateProjectFromArchetypeWithFailure( ArchetypeGenerationRequest request )
97 throws Exception
98 {
99 ArchetypeGenerationResult result = new ArchetypeGenerationResult();
100
101 generator.generateArchetype( request, result );
102
103 if ( result.getCause() == null )
104 {
105 fail( "Exception must be thrown." );
106 }
107
108 return result;
109 }
110
111 public void testArchetypeNotDefined()
112 throws Exception
113 {
114 System.out.println( "testArchetypeNotDefined" );
115
116 Archetype archetype = new Archetype( "archetypes", null, "1.0" );
117
118 ArchetypeGenerationRequest request = createArchetypeGenerationRequest( "generate-2", archetype );
119
120 ArchetypeGenerationResult result = generateProjectFromArchetypeWithFailure( request );
121
122 assertEquals( "Exception not correct", "The archetype is not defined", result.getCause().getMessage() );
123 }
124
125 public void testGenerateArchetypeCompleteWithoutParent()
126 throws Exception
127 {
128 System.out.println( "testGenerateArchetypeCompleteWithoutParent" );
129
130 ArchetypeGenerationRequest request = createArchetypeGenerationRequest( "generate-4", ARCHETYPE_BASIC );
131
132 FileUtils.forceDelete( projectDirectory );
133
134 generateProjectFromArchetype( request );
135
136 assertTemplateContent( "src/main/java/file/value/package/App.java" );
137 assertTemplateContent( "src/main/java/file/value/package/inner/package/App2.java" );
138 assertTemplateContent( "src/main/c/file/value/package/App.c" );
139 assertTemplateContent( "src/test/java/file/value/package/AppTest.java" );
140 assertTemplateContent( "src/test/c/file/value/package/AppTest.c" );
141 assertTemplateContent( "src/main/resources/App.properties" );
142 assertTemplateContent( "src/main/resources/inner/dir/App2.properties" );
143 assertTemplateContent( "src/main/mdo/App.mdo" );
144 assertTemplateContent( "src/test/resources/AppTest.properties" );
145 assertTemplateContent( "src/test/mdo/AppTest.mdo" );
146
147 Model model = readPom( new File( projectDirectory, "pom.xml" ) );
148 assertNull( model.getParent() );
149 assertEquals( "file-value", model.getGroupId() );
150 assertEquals( "file-value", model.getArtifactId() );
151 assertEquals( "file-value", model.getVersion() );
152 }
153
154 public void testGenerateArchetypeCompleteWithParent()
155 throws Exception
156 {
157 System.out.println( "testGenerateArchetypeCompleteWithParent" );
158
159 ArchetypeGenerationRequest request = createArchetypeGenerationRequest( "generate-5", ARCHETYPE_BASIC );
160
161 File projectFile = getProjectFile();
162 File projectFileSample = getProjectSampleFile();
163 copy( projectFileSample, projectFile );
164
165 FileUtils.forceDelete( projectDirectory );
166
167 generateProjectFromArchetype( request );
168
169 Model model = readPom( new File( projectDirectory, "pom.xml" ) );
170 assertEquals( "org.apache.maven.archetype", model.getParent().getGroupId() );
171 assertEquals( "test-generate-5-parent", model.getParent().getArtifactId() );
172 assertEquals( "1.0-SNAPSHOT", model.getParent().getVersion() );
173 assertEquals( "file-value", model.getGroupId() );
174 assertEquals( "file-value", model.getArtifactId() );
175 assertEquals( "file-value", model.getVersion() );
176
177 Model parentModel = readPom( projectFile );
178 assertTrue( parentModel.getModules().contains( "file-value" ) );
179 }
180
181 public void testGenerateArchetypePartialOnChild()
182 throws Exception
183 {
184 System.out.println( "testGenerateArchetypePartialOnChild" );
185
186 ArchetypeGenerationRequest request = createArchetypeGenerationRequest( "generate-8", ARCHETYPE_PARTIAL );
187
188 File parentProjectFile = getProjectFile();
189 File parentProjectFileSample = getProjectSampleFile();
190 copy( parentProjectFileSample, parentProjectFile );
191
192 File projectFile = new File( projectDirectory, "pom.xml" );
193 File projectFileSample = new File( projectDirectory, "pom.xml.sample" );
194 copy( projectFileSample, projectFile );
195
196 FileUtils.forceDelete( new File( projectDirectory, "src" ) );
197
198 generateProjectFromArchetype( request );
199
200 Model model = readPom( projectFile );
201 assertNotNull( model.getParent() );
202 assertEquals( "org.apache.maven.archetype", model.getGroupId() );
203 assertEquals( "file-value", model.getArtifactId() );
204 assertEquals( "1.0-SNAPSHOT", model.getVersion() );
205 assertTrue( model.getModules().isEmpty() );
206 assertFalse( model.getDependencies().isEmpty() );
207 assertFalse( model.getBuild().getPlugins().isEmpty() );
208 assertFalse( model.getReporting().getPlugins().isEmpty() );
209 }
210
211 public void testGenerateArchetypePartialOnChildDontOverride()
212 throws Exception
213 {
214 System.out.println( "testGenerateArchetypePartialOnChildDontOverride" );
215
216 ArchetypeGenerationRequest request = createArchetypeGenerationRequest( "generate-9", ARCHETYPE_PARTIAL );
217
218 File projectFile = new File( projectDirectory, "pom.xml" );
219 File projectFileSample = new File( projectDirectory, "pom.xml.sample" );
220 copy( projectFileSample, projectFile );
221
222 FileUtils.forceDelete( new File( projectDirectory, "src" ) );
223
224 generateProjectFromArchetype( request );
225
226 Model model = readPom( projectFile );
227 assertNotNull( model.getParent() );
228 assertEquals( "org.apache.maven.archetype", model.getGroupId() );
229 assertEquals( "file-value", model.getArtifactId() );
230 assertEquals( "1.0-SNAPSHOT", model.getVersion() );
231 assertTrue( model.getModules().isEmpty() );
232 assertFalse( model.getDependencies().isEmpty() );
233 assertEquals( "1.0", ( (Dependency) model.getDependencies().get( 0 ) ).getVersion() );
234 assertFalse( model.getBuild().getPlugins().isEmpty() );
235 assertEquals( "1.0", ( (Plugin) model.getBuild().getPlugins().get( 0 ) ).getVersion() );
236 assertFalse( model.getReporting().getPlugins().isEmpty() );
237 assertEquals( "1.0", ( (ReportPlugin) model.getReporting().getPlugins().get( 0 ) ).getVersion() );
238 }
239
240 public void testGenerateArchetypePartialOnParent()
241 throws Exception
242 {
243 System.out.println( "testGenerateArchetypePartialOnParent" );
244
245 ArchetypeGenerationRequest request = createArchetypeGenerationRequest( "generate-7", ARCHETYPE_PARTIAL );
246
247 File projectFile = new File( outputDirectory, "pom.xml" );
248 File projectFileSample = new File( outputDirectory, "pom.xml.sample" );
249 copy( projectFileSample, projectFile );
250
251 FileUtils.forceDelete( new File( outputDirectory, "src" ) );
252
253 generateProjectFromArchetype( request );
254
255 Model model = readPom( getProjectFile() );
256 assertNull( model.getParent() );
257 assertEquals( "org.apache.maven.archetype", model.getGroupId() );
258 assertEquals( "test-generate-7", model.getArtifactId() );
259 assertEquals( "1.0-SNAPSHOT", model.getVersion() );
260 assertTrue( model.getModules().isEmpty() );
261 assertFalse( model.getBuild().getPlugins().isEmpty() );
262 }
263
264 public void testGenerateArchetypePartialWithoutPoms()
265 throws Exception
266 {
267 System.out.println( "testGenerateArchetypePartialWithoutPoms" );
268
269 ArchetypeGenerationRequest request = createArchetypeGenerationRequest( "generate-6", ARCHETYPE_PARTIAL );
270
271 File projectFile = new File( projectDirectory, "pom.xml" );
272
273 FileUtils.forceDelete( projectDirectory );
274
275 generateProjectFromArchetype( request );
276
277 Model model = readPom( projectFile );
278 assertNull( model.getParent() );
279 assertEquals( "file-value", model.getGroupId() );
280 assertEquals( "file-value", model.getArtifactId() );
281 assertEquals( "file-value", model.getVersion() );
282 }
283
284 public void testGenerateArchetypeSite()
285 throws Exception
286 {
287 System.out.println( "testGenerateArchetypeSite" );
288
289 ArchetypeGenerationRequest request = createArchetypeGenerationRequest( "generate-10", ARCHETYPE_SITE );
290
291 File projectFile = new File( projectDirectory, "pom.xml" );
292
293 FileUtils.forceDelete( projectDirectory );
294
295 generateProjectFromArchetype( request );
296
297 assertTemplateContent( "src/site/site.xml" );
298 assertTemplateContent( "src/site/apt/test.apt" );
299
300 Model model = readPom( projectFile );
301 assertNull( model.getParent() );
302 assertEquals( "file-value", model.getGroupId() );
303 assertEquals( "file-value", model.getArtifactId() );
304 assertEquals( "file-value", model.getVersion() );
305 }
306
307 public void testGenerateFileSetArchetype()
308 throws Exception
309 {
310 System.out.println( "testGenerateFileSetArchetype" );
311
312 ArchetypeGenerationRequest request = createArchetypeGenerationRequest( "generate-12", ARCHETYPE_FILESET );
313
314 File projectFile = new File( projectDirectory, "pom.xml" );
315
316 FileUtils.forceDelete( projectDirectory );
317
318 generateProjectFromArchetype( request );
319
320 assertTemplateContentGeneratedWithFileSetArchetype( "src/main/java/file/value/package/App.java", "file-value" );
321 assertTemplateContentGeneratedWithFileSetArchetype( "src/main/java/file/value/package/inner/package/App2.java",
322 "file-value" );
323
324 assertTemplateCopiedWithFileSetArchetype( "src/main/java/file/value/package/App.ogg" );
325
326 assertTemplateContentGeneratedWithFileSetArchetype( "src/main/resources/App.properties",
327 "file-value" );
328 assertTemplateContentGeneratedWithFileSetArchetype( "src/main/resources/file-value/touch.txt", "file-value" );
329 assertTemplateContentGeneratedWithFileSetArchetype( "src/main/resources/file-value/touch_root.txt",
330 "file-value" );
331
332 assertTemplateCopiedWithFileSetArchetype( "src/main/resources/some-dir/App.png" );
333
334 assertTemplateContentGeneratedWithFileSetArchetype( "src/site/site.xml", "file-value" );
335 assertTemplateContentGeneratedWithFileSetArchetype( "src/site/apt/usage.apt", "file-value" );
336 assertTemplateContentGeneratedWithFileSetArchetype( ".classpath", "file-value" );
337 assertTemplateContentGeneratedWithFileSetArchetype( "profiles.xml", "file-value" );
338
339 Model model = readPom( projectFile );
340 assertNull( model.getParent() );
341 assertEquals( "file-value", model.getGroupId() );
342 assertEquals( "file-value", model.getArtifactId() );
343 assertEquals( "file-value", model.getVersion() );
344
345 assertTemplateContentGeneratedWithFileSetArchetype( "subproject/src/main/java/file/value/package/App.java",
346 "subproject" );
347
348 model = readPom( new File( projectDirectory, "subproject/pom.xml" ) );
349 assertNotNull( model.getParent() );
350 assertEquals( "file-value", model.getParent().getGroupId() );
351 assertEquals( "file-value", model.getParent().getArtifactId() );
352 assertEquals( "file-value", model.getParent().getVersion() );
353 assertEquals( "file-value", model.getGroupId() );
354 assertEquals( "subproject", model.getArtifactId() );
355 assertEquals( "file-value", model.getVersion() );
356
357 assertTemplateContentGeneratedWithFileSetArchetype( "subproject/subsubproject/src/main/java/file/value/package/App.java",
358 "subsubproject" );
359
360 assertTemplateContentGeneratedWithFileSetArchetype( "subproject/subsubproject/src/main/java/file/value/package/"
361 + "file-value/inner/subsubproject/innest/Somefile-valueClasssubsubproject.java",
362 "subsubproject" );
363
364 assertTemplateContentGeneratedWithFileSetArchetype( "subproject/subsubproject/src/main/java/file/value/package/"
365
366 + "ArbitraryProperty-file-value.java", "subsubproject" );
367
368
369 assertTemplateContentGeneratedWithFileSetArchetype( "subproject/subsubproject/src/main/java/file/value/package/"
370
371 + "SkipsUndefinedProperty-__undefined-property__-file-value.java",
372 "subsubproject" );
373
374 model = readPom( new File( projectDirectory, "subproject/subsubproject/pom.xml" ) );
375 assertNotNull( model.getParent() );
376 assertEquals( "file-value", model.getParent().getGroupId() );
377 assertEquals( "subproject", model.getParent().getArtifactId() );
378 assertEquals( "file-value", model.getParent().getVersion() );
379 assertEquals( "file-value", model.getGroupId() );
380 assertEquals( "subsubproject", model.getArtifactId() );
381 assertEquals( "file-value", model.getVersion() );
382 }
383
384 public void testGenerateOldArchetype()
385 throws Exception
386 {
387 System.out.println( "testGenerateOldArchetype" );
388
389 ArchetypeGenerationRequest request = createArchetypeGenerationRequest( "generate-11", ARCHETYPE_OLD );
390
391 File projectFile = new File( projectDirectory, "pom.xml" );
392
393 FileUtils.forceDelete( projectDirectory );
394
395 generateProjectFromArchetype( request );
396
397 assertTemplateContentGeneratedWithOldArchetype( "src/main/java/file/value/package/App.java" );
398 assertTemplateContentGeneratedWithOldArchetype( "src/main/resources/App.properties" );
399 assertTemplateContentGeneratedWithOldArchetype( "src/site/site.xml" );
400
401 Model model = readPom( projectFile );
402 assertNull( model.getParent() );
403 assertEquals( "file-value", model.getGroupId() );
404 assertEquals( "file-value", model.getArtifactId() );
405 assertEquals( "file-value", model.getVersion() );
406 }
407
408 public void testPropertiesNotDefined()
409 throws Exception
410 {
411 System.out.println( "testPropertiesNotDefined" );
412
413 ArchetypeGenerationRequest request = createArchetypeGenerationRequest( "generate-3", ARCHETYPE_BASIC );
414
415 request.setProperties( new Properties() );
416
417 ArchetypeGenerationResult result = generateProjectFromArchetypeWithFailure( request );
418
419 assertTrue( "Exception not correct",
420 result.getCause().getMessage().startsWith( "Archetype archetypes:basic:1.0 is not configured" )
421 && result.getCause().getMessage().endsWith( "Property property-without-default-4 is missing." ) );
422 }
423
424 protected void tearDown()
425 throws Exception
426 {
427 super.tearDown();
428
429 outputDirectory = null;
430 }
431
432 protected void setUp()
433 throws Exception
434 {
435 super.setUp();
436
437 String repositories = new File( getBasedir(), "target/test-classes/repositories" ).toURI().toString();
438
439 localRepository =
440 new DefaultArtifactRepository( "local", repositories + "/local", new DefaultRepositoryLayout() );
441
442 remoteRepository = repositories + "/central";
443
444 generator = (ArchetypeGenerator) lookup( ArchetypeGenerator.ROLE );
445 assertNotNull( generator );
446 assertNotNull( getVariableValueFromObject( generator, "archetypeArtifactManager" ) );
447 assertNotNull( getVariableValueFromObject( generator, "oldArchetype" ) );
448 assertNotNull( getVariableValueFromObject( generator, "filesetGenerator" ) );
449 }
450
451 private ArchetypeGenerationRequest createArchetypeGenerationRequest( String project, Archetype archetype )
452 {
453 outputDirectory = getBasedir() + "/target/test-classes/projects/" + project;
454
455 projectDirectory = new File( outputDirectory, "file-value" );
456
457 ArchetypeGenerationRequest request = new ArchetypeGenerationRequest();
458 request.setLocalRepository( localRepository );
459 request.setArchetypeRepository( remoteRepository );
460 request.setOutputDirectory( outputDirectory );
461
462 request.setArchetypeGroupId( archetype.groupId );
463 request.setArchetypeArtifactId( archetype.artifactId );
464 request.setArchetypeVersion( archetype.version );
465
466 request.setGroupId( "file-value" );
467 request.setArtifactId( "file-value" );
468 request.setVersion( "file-value" );
469 request.setPackage( "file.value.package" );
470
471 request.setProperties( ADDITIONAL_PROPERTIES );
472
473 return request;
474 }
475
476 private void assertTemplateContent( final String template )
477 throws IOException
478 {
479 Properties properties = loadProperties( template );
480 assertEquals( "file-value", properties.getProperty( "groupId" ) );
481 assertEquals( "file-value", properties.getProperty( "artifactId" ) );
482 assertEquals( "file-value", properties.getProperty( "version" ) );
483 assertEquals( "file.value.package", properties.getProperty( "package" ) );
484 assertEquals( "file-value", properties.getProperty( "property-with-default-1" ) );
485 assertEquals( "file-value", properties.getProperty( "property-with-default-2" ) );
486 assertEquals( "file-value", properties.getProperty( "property-with-default-3" ) );
487 assertEquals( "file-value", properties.getProperty( "property-with-default-4" ) );
488 assertEquals( "file-value", properties.getProperty( "property-without-default-1" ) );
489 assertEquals( "file-value", properties.getProperty( "property-without-default-2" ) );
490 assertEquals( "file-value", properties.getProperty( "property-without-default-3" ) );
491 assertEquals( "file-value", properties.getProperty( "property-without-default-4" ) );
492 }
493
494 private void assertTemplateContentGeneratedWithFileSetArchetype( String template, String artifactId )
495 throws IOException
496 {
497 Properties properties = loadProperties( template );
498 assertEquals( "file-value", properties.getProperty( "groupId" ) );
499 assertEquals( artifactId, properties.getProperty( "artifactId" ) );
500 assertEquals( "file-value", properties.getProperty( "version" ) );
501 assertEquals( "file.value.package", properties.getProperty( "package" ) );
502 assertEquals( "file/value/package", properties.getProperty( "packageInPathFormat" ) );
503 }
504
505 private void assertTemplateContentGeneratedWithOldArchetype( final String template )
506 throws IOException
507 {
508 Properties properties = loadProperties( template );
509 assertEquals( "file-value", properties.getProperty( "groupId" ) );
510 assertEquals( "file-value", properties.getProperty( "artifactId" ) );
511 assertEquals( "file-value", properties.getProperty( "version" ) );
512 assertEquals( "file.value.package", properties.getProperty( "package" ) );
513 }
514
515 private void assertTemplateCopiedWithFileSetArchetype( String template )
516 throws IOException
517 {
518 Properties properties = loadProperties( template );
519 assertEquals( "${groupId}", properties.getProperty( "groupId" ) );
520 assertEquals( "${artifactId}", properties.getProperty( "artifactId" ) );
521 assertEquals( "${version}", properties.getProperty( "version" ) );
522 assertEquals( "${package}", properties.getProperty( "package" ) );
523 assertEquals( "${packageInPathFormat}", properties.getProperty( "packageInPathFormat" ) );
524 }
525
526 private void copy( final File in, final File out )
527 throws IOException, FileNotFoundException
528 {
529 assertTrue( !out.exists() || out.delete() );
530 assertFalse( out.exists() );
531
532 FileUtils.copyFile( in, out );
533
534 assertTrue( out.exists() );
535 assertTrue( in.exists() );
536 }
537
538 private Properties loadProperties( File propertyFile )
539 throws IOException, FileNotFoundException
540 {
541 Properties properties = new Properties();
542 InputStream in = new FileInputStream( propertyFile );
543 try
544 {
545 properties.load( in );
546 return properties;
547 }
548 finally
549 {
550 IOUtil.close( in );
551 }
552 }
553
554 private Properties loadProperties( final String template )
555 throws IOException
556 {
557 File templateFile = new File( projectDirectory, template );
558 if ( !templateFile.exists() )
559 {
560 fail( "Missing File: " + templateFile );
561 }
562
563 Properties properties = loadProperties( templateFile );
564 return properties;
565 }
566
567 private File getProjectFile()
568 {
569 return new File( outputDirectory, "/pom.xml" );
570 }
571
572 private File getProjectSampleFile()
573 {
574 return new File( outputDirectory, "/pom.xml.sample" );
575 }
576
577 private File getPropertiesFile()
578 {
579 return new File( outputDirectory, "/archetype.properties" );
580 }
581
582 private File getPropertiesSampleFile()
583 {
584 return new File( outputDirectory, "/archetype.properties.sample" );
585 }
586
587 private Model readPom( final File pomFile )
588 throws IOException, XmlPullParserException
589 {
590 Reader pomReader = null;
591 try
592 {
593 pomReader = ReaderFactory.newXmlReader( pomFile );
594
595 MavenXpp3Reader reader = new MavenXpp3Reader();
596
597 return reader.read( pomReader );
598 }
599 finally
600 {
601 IOUtil.close( pomReader );
602 }
603 }
604
605 private static class Archetype
606 {
607 public final String groupId;
608 public final String artifactId;
609 public final String version;
610
611 public Archetype( String groupId, String artifactId, String version )
612 {
613 this.groupId = groupId;
614 this.artifactId = artifactId;
615 this.version = version;
616 }
617 }
618 }