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