View Javadoc

1   package org.apache.maven.archetype.generator;
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.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      // archetypes prepared by antrun execution (see pom.xml) from src/test/archetypes 
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                                                             /* + "file-value/inner/subsubproject/innest/" + */
366                                                             + "ArbitraryProperty-file-value.java", "subsubproject" );
367 
368         // Test that undefined properties are safely ignored (and skipped)
369         assertTemplateContentGeneratedWithFileSetArchetype( "subproject/subsubproject/src/main/java/file/value/package/"
370                                                             /* + "file-value/inner/subsubproject/innest/" + */
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 }