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