View Javadoc
1   package org.apache.maven.archetype.old;
2   
3   import java.io.File;
4   import java.io.FileReader;
5   import java.io.IOException;
6   import java.io.StringReader;
7   import java.io.StringWriter;
8   import java.net.URL;
9   import java.net.URLClassLoader;
10  import java.util.ArrayList;
11  import java.util.HashMap;
12  import java.util.List;
13  import java.util.Map;
14  
15  /*
16   * Copyright 2004-2006 The Apache Software Foundation.
17   *
18   * Licensed under the Apache License, Version 2.0 (the "License");
19   * you may not use this file except in compliance with the License.
20   * You may obtain a copy of the License at
21   *
22   *      http://www.apache.org/licenses/LICENSE-2.0
23   *
24   * Unless required by applicable law or agreed to in writing, software
25   * distributed under the License is distributed on an "AS IS" BASIS,
26   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
27   * See the License for the specific language governing permissions and
28   * limitations under the License.
29   */
30  
31  import org.apache.maven.archetype.ArchetypeGenerationRequest;
32  import org.apache.maven.archetype.exception.InvalidPackaging;
33  import org.apache.maven.artifact.Artifact;
34  import org.apache.maven.artifact.factory.ArtifactFactory;
35  import org.apache.maven.artifact.repository.ArtifactRepository;
36  import org.apache.maven.artifact.repository.DefaultArtifactRepository;
37  import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
38  import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
39  import org.apache.maven.artifact.resolver.ArtifactResolutionException;
40  import org.apache.maven.artifact.resolver.ArtifactResolver;
41  import org.apache.maven.model.Model;
42  import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
43  import org.apache.maven.project.DefaultProjectBuildingRequest;
44  import org.apache.maven.project.ProjectBuildingRequest;
45  import org.apache.maven.repository.internal.MavenRepositorySystemSession;
46  import org.apache.velocity.VelocityContext;
47  import org.apache.velocity.context.Context;
48  import org.codehaus.plexus.PlexusTestCase;
49  import org.codehaus.plexus.util.FileUtils;
50  import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
51  import org.codehaus.plexus.velocity.VelocityComponent;
52  import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
53  
54  import static org.hamcrest.MatcherAssert.assertThat;
55  import static org.xmlunit.matchers.CompareMatcher.isIdenticalTo;
56  
57  /**
58   * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
59   * @version $Id$
60   */
61  public class ArchetypeTest
62      extends PlexusTestCase
63  {
64      private OldArchetype archetype;
65  
66      public void testArchetype()
67          throws Exception
68      {
69          FileUtils.deleteDirectory( getTestFile( "target/quickstart" ) );
70  
71          // ----------------------------------------------------------------------
72          // This needs to be encapsulated in a maven test case.
73          // ----------------------------------------------------------------------
74  
75          ArtifactRepositoryLayout layout =
76              (ArtifactRepositoryLayout) getContainer().lookup( ArtifactRepositoryLayout.ROLE );
77  
78          String mavenRepoLocal = getTestFile( "target/local-repository" ).toURI().toURL().toString();
79  
80          ArtifactRepository localRepository = new DefaultArtifactRepository( "local", mavenRepoLocal, layout );
81  
82          List<ArtifactRepository> remoteRepositories = new ArrayList<>();
83  
84          String mavenRepoRemote = getTestFile( "src/test/repository" ).toURI().toURL().toString();
85  
86          ArtifactRepository remoteRepository = new DefaultArtifactRepository( "remote", mavenRepoRemote, layout );
87  
88          remoteRepositories.add( remoteRepository );
89          
90          ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest();
91          buildingRequest.setRemoteRepositories( remoteRepositories );
92          MavenRepositorySystemSession repositorySession = new MavenRepositorySystemSession();
93          repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManager( localRepository.getBasedir() ) );
94          buildingRequest.setRepositorySession( repositorySession );
95  
96          ArchetypeGenerationRequest request = new ArchetypeGenerationRequest()
97              .setProjectBuildingRequest( buildingRequest )
98              .setPackage( "org.apache.maven.quickstart" )
99              .setGroupId( "maven" )
100             .setArtifactId( "quickstart" )
101             .setVersion( "1.0-alpha-1-SNAPSHOT" )
102             .setArchetypeGroupId( "org.apache.maven.archetypes" )
103             .setArchetypeArtifactId( "maven-archetype-quickstart" )
104             .setArchetypeVersion( "1.0-alpha-1-SNAPSHOT" )
105             .setLocalRepository( localRepository )
106             .setRemoteArtifactRepositories( remoteRepositories )
107             .setOutputDirectory( getTestFile( "target" ).getAbsolutePath() );
108         //parameters.put( "name", "jason" );
109 
110         archetype.createArchetype( request, remoteRepository );
111 
112         // ----------------------------------------------------------------------
113         // Set up the Velocity context
114         // ----------------------------------------------------------------------
115 
116         Map<String, Object> parameters = new HashMap<>();
117         parameters.put( "basedir", request.getOutputDirectory() );
118         parameters.put( "package", request.getPackage() );
119         parameters.put( "packageName", request.getPackage() );
120         parameters.put( "groupId", request.getGroupId() );
121         parameters.put( "artifactId", request.getArtifactId() );
122         parameters.put( "version", request.getVersion() );
123 
124         Context context = new VelocityContext();
125 
126         for ( Map.Entry<String, Object> entry : parameters.entrySet() )
127         {
128             context.put( entry.getKey(), entry.getValue() );
129         }
130 
131         // ----------------------------------------------------------------------
132         // Validate POM generation
133         // ----------------------------------------------------------------------
134 
135         ArtifactFactory artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.class.getName() );
136         Artifact archetypeArtifact = artifactFactory.createArtifact( request.getArchetypeGroupId(), request.getArchetypeArtifactId(),
137                                                                      request.getArchetypeVersion(), Artifact.SCOPE_RUNTIME, "jar" );
138 
139         StringWriter writer = new StringWriter();
140 
141         ClassLoader old = Thread.currentThread().getContextClassLoader();
142 
143         Thread.currentThread().setContextClassLoader(
144             getContextClassloader( archetypeArtifact, localRepository, remoteRepositories ) );
145 
146         try
147         {
148             VelocityComponent velocity = (VelocityComponent) lookup( VelocityComponent.class.getName() );
149 
150             velocity.getEngine().mergeTemplate( OldArchetype.ARCHETYPE_RESOURCES + "/" + OldArchetype.ARCHETYPE_POM, context,
151                                                 writer );
152         }
153         finally
154         {
155             Thread.currentThread().setContextClassLoader( old );
156         }
157 
158         Model generatedModel, templateModel;
159         try
160         {
161             StringReader strReader = new StringReader( writer.toString() );
162 
163             MavenXpp3Reader reader = new MavenXpp3Reader();
164 
165             templateModel = reader.read( strReader );
166         }
167         catch ( IOException e )
168         {
169             throw new ArchetypeTemplateProcessingException( "Error reading template POM", e );
170         }
171 
172         File artifactDir = getTestFile( "target", (String) parameters.get( "artifactId" ) );
173         File pomFile = getTestFile( artifactDir.getAbsolutePath(), OldArchetype.ARCHETYPE_POM );
174 
175         try ( FileReader pomReader = new FileReader( pomFile ) )
176         {
177             MavenXpp3Reader reader = new MavenXpp3Reader();
178 
179             generatedModel = reader.read( pomReader );
180         }
181         catch ( IOException e )
182         {
183             throw new ArchetypeTemplateProcessingException( "Error reading generated POM", e );
184         }
185         catch ( XmlPullParserException e )
186         {
187             throw new ArchetypeTemplateProcessingException( "Error reading generated POM", e );
188         }
189         assertEquals( "Generated POM ArtifactId is not equivalent to expected result.", generatedModel.getArtifactId(),
190                       templateModel.getArtifactId() );
191         assertEquals( "Generated POM GroupId is not equivalent to expected result.", generatedModel.getGroupId(),
192                       templateModel.getGroupId() );
193         assertEquals( "Generated POM Id is not equivalent to expected result.", generatedModel.getId(),
194                       templateModel.getId() );
195         assertEquals( "Generated POM Version is not equivalent to expected result.", generatedModel.getVersion(),
196                       templateModel.getVersion() );
197         assertEquals( "Generated POM Packaging is not equivalent to expected result.", generatedModel.getPackaging(),
198                       templateModel.getPackaging() );
199         assertEquals( "Generated POM Developers is not equivalent to expected result.", generatedModel.getDevelopers(),
200                       templateModel.getDevelopers() );
201         assertEquals( "Generated POM Scm is not equivalent to expected result.", generatedModel.getScm(),
202                       templateModel.getScm() );
203     }
204 
205     // Gets the classloader for this artifact's file.
206     private ClassLoader getContextClassloader( Artifact archetypeArtifact, ArtifactRepository localRepository,
207                                                List<ArtifactRepository> remoteRepositories )
208         throws Exception
209     {
210         ArtifactResolver artifactResolver = (ArtifactResolver) lookup( ArtifactResolver.class.getName() );
211         try
212         {
213             artifactResolver.resolve( archetypeArtifact, remoteRepositories, localRepository );
214         }
215         catch ( ArtifactResolutionException e )
216         {
217             throw new ArchetypeDescriptorException( "Error attempting to download archetype: " + e.getMessage(), e );
218         }
219         catch ( ArtifactNotFoundException e )
220         {
221             throw new ArchetypeNotFoundException( "OldArchetype does not exist: " + e.getMessage(), e );
222         }
223 
224         URLClassLoader archetypeJarLoader;
225         try
226         {
227             URL[] urls = new URL[1];
228 
229             urls[0] = archetypeArtifact.getFile().toURI().toURL();
230 
231             archetypeJarLoader = new URLClassLoader( urls );
232         }
233         catch ( IOException e )
234         {
235             throw new ArchetypeDescriptorException(
236                 "Error reading the " + OldArchetype.ARCHETYPE_DESCRIPTOR + " descriptor.", e );
237         }
238 
239         return archetypeJarLoader;
240     }
241 
242     public void testAddModuleToParentPOM()
243         throws Exception
244     {
245         String pom = "<project>\n"
246             + "  <packaging>pom</packaging>\n"
247             + "</project>";
248 
249         StringWriter out = new StringWriter();
250         assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId1", new StringReader( pom ), out ) );
251 
252         assertThat( out.toString(), isIdenticalTo( "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
253                 + "<project>\n"
254                 + "  <packaging>pom</packaging>\n"
255                 + "  <modules>\n"
256                 + "    <module>myArtifactId1</module>\n"
257                 + "  </modules>\n"
258                 + "</project>" ).normalizeWhitespace() );
259 
260         pom = "<project>\n"
261             + "  <modelVersion>4.0.0</modelVersion>\n"
262             + "  <packaging>pom</packaging>\n"
263             + "</project>";
264 
265         out = new StringWriter();
266         assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId2", new StringReader( pom ), out ) );
267 
268         assertThat( out.toString(), isIdenticalTo( "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
269                 + "<project>\n"
270                 + "  <modelVersion>4.0.0</modelVersion>\n"
271                 + "  <packaging>pom</packaging>\n"
272                 + "  <modules>\n"
273                 + "    <module>myArtifactId2</module>\n"
274                 + "  </modules>\n"
275                 + "</project>" ).normalizeWhitespace() );
276 
277         pom = "<project><modelVersion>4.0.0</modelVersion>\n"
278             + "  <packaging>pom</packaging>\n"
279             + "  <modules>\n"
280             + "  </modules>\n"
281             + "</project>";
282 
283         out = new StringWriter();
284         assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId3", new StringReader( pom ), out ) );
285 
286         assertThat( out.toString(), isIdenticalTo("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
287                 + "<project><modelVersion>4.0.0</modelVersion>\n"
288                 + "  <packaging>pom</packaging>\n"
289                 + "  <modules>\n"
290                 + "    <module>myArtifactId3</module>\n"
291                 + "  </modules>\n"
292                 + "</project>" ).normalizeWhitespace() );
293 
294         pom = "<project><modelVersion>4.0.0</modelVersion>\n"
295             + "  <packaging>pom</packaging>\n"
296             + "  <modules>\n"
297             + "    <module>myArtifactId3</module>\n"
298             + "  </modules>\n"
299             + "</project>";
300 
301         out = new StringWriter();
302         assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId4", new StringReader( pom ), out ) );
303 
304         assertThat( out.toString(), isIdenticalTo("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
305                 + "<project><modelVersion>4.0.0</modelVersion>\n"
306                 + "  <packaging>pom</packaging>\n"
307                 + "  <modules>\n"
308                 + "    <module>myArtifactId3</module>\n"
309                 + "    <module>myArtifactId4</module>\n"
310                 + "  </modules>\n"
311                 + "</project>" ).normalizeWhitespace() );
312 
313         pom = "<project><modelVersion>4.0.0</modelVersion>\n"
314             + "  <packaging>pom</packaging>\n"
315             + "  <modules>\n"
316             + "    <module>myArtifactId3</module>\n"
317             + "  </modules>\n"
318             + "</project>";
319 
320         out = new StringWriter();
321         assertFalse( DefaultOldArchetype.addModuleToParentPom( "myArtifactId3", new StringReader( pom ), out ) );
322 
323         // empty means unchanged
324         assertEquals( "", out.toString().trim() );
325 
326 
327         pom = "<project><modelVersion>4.0.0</modelVersion>\n"
328                 + "  <packaging>pom</packaging>\n"
329                 + "  <modules>\n"
330                 + "    <module>myArtifactId1</module>\n"
331                 + "    <module>myArtifactId2</module>\n"
332                 + "    <module>myArtifactId3</module>\n"
333                 + "  </modules>\n"
334                 + "  <profiles>\n"
335                 + "    <profile>\n"
336                 + "      <id>profile1</id>\n"
337                 + "      <modules>\n"
338                 + "        <module>module1</module>\n"
339                 + "      </modules>\n"
340                 + "    </profile>\n"
341                 + "    <profile>\n"
342                 + "      <id>profile2</id>\n"
343                 + "      <modules>\n"
344                 + "        <module>module2</module>\n"
345                 + "      </modules>\n"
346                 + "    </profile>\n"
347                 + "  </profiles>\n"
348                 + "</project>";
349 
350         out = new StringWriter();
351         assertTrue( DefaultOldArchetype.addModuleToParentPom( "module1", new StringReader( pom ), out ) );
352 
353         assertThat( out.toString(), isIdenticalTo("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
354                 + "<project><modelVersion>4.0.0</modelVersion>\n"
355                 + "  <packaging>pom</packaging>\n"
356                 + "  <modules>\n"
357                 + "    <module>myArtifactId1</module>\n"
358                 + "    <module>myArtifactId2</module>\n"
359                 + "    <module>myArtifactId3</module>\n"
360                 + "    <module>module1</module>\n"
361                 + "  </modules>\n"
362                 + "  <profiles>\n"
363                 + "    <profile>\n"
364                 + "      <id>profile1</id>\n"
365                 + "      <modules>\n"
366                 + "        <module>module1</module>\n"
367                 + "      </modules>\n"
368                 + "    </profile>\n"
369                 + "    <profile>\n"
370                 + "      <id>profile2</id>\n"
371                 + "      <modules>\n"
372                 + "        <module>module2</module>\n"
373                 + "      </modules>\n"
374                 + "    </profile>\n"
375                 + "  </profiles>\n"
376                 + "</project>" ).normalizeWhitespace() );
377     }
378 
379     public void testAddModuleToParentPOMNoPackaging()
380         throws Exception
381     {
382         try
383         {
384             String pom = "<project>\n</project>";
385             DefaultOldArchetype.addModuleToParentPom( "myArtifactId1", new StringReader( pom ), new StringWriter() );
386             fail( "Should fail to add a module to a JAR packaged project" );
387         }
388         catch ( InvalidPackaging e )
389         {
390             // great!
391             assertEquals( "Unable to add module to the current project as it is not of packaging type 'pom'",
392                     e.getLocalizedMessage() );
393         }
394     }
395 
396     public void testAddModuleToParentPOMJarPackaging()
397         throws Exception
398     {
399         try
400         {
401             String pom = "<project>\n  <packaging>jar</packaging>\n</project>";
402             DefaultOldArchetype.addModuleToParentPom( "myArtifactId1", new StringReader( pom ), new StringWriter() );
403             fail( "Should fail to add a module to a JAR packaged project" );
404         }
405         catch ( InvalidPackaging e )
406         {
407             // great!
408             assertEquals( "Unable to add module to the current project as it is not of packaging type 'pom'",
409                     e.getLocalizedMessage() );
410         }
411     }
412 
413     @Override
414     protected void setUp()
415         throws Exception
416     {
417         super.setUp();
418         archetype = (OldArchetype) lookup( OldArchetype.ROLE );
419     }
420 }