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
176         {
177             FileReader pomReader = new FileReader( pomFile );
178 
179             MavenXpp3Reader reader = new MavenXpp3Reader();
180 
181             generatedModel = reader.read( pomReader );
182         }
183         catch ( IOException e )
184         {
185             throw new ArchetypeTemplateProcessingException( "Error reading generated POM", e );
186         }
187         catch ( XmlPullParserException e )
188         {
189             throw new ArchetypeTemplateProcessingException( "Error reading generated POM", e );
190         }
191         assertEquals( "Generated POM ArtifactId is not equivalent to expected result.", generatedModel.getArtifactId(),
192                       templateModel.getArtifactId() );
193         assertEquals( "Generated POM GroupId is not equivalent to expected result.", generatedModel.getGroupId(),
194                       templateModel.getGroupId() );
195         assertEquals( "Generated POM Id is not equivalent to expected result.", generatedModel.getId(),
196                       templateModel.getId() );
197         assertEquals( "Generated POM Version is not equivalent to expected result.", generatedModel.getVersion(),
198                       templateModel.getVersion() );
199         assertEquals( "Generated POM Packaging is not equivalent to expected result.", generatedModel.getPackaging(),
200                       templateModel.getPackaging() );
201         assertEquals( "Generated POM Developers is not equivalent to expected result.", generatedModel.getDevelopers(),
202                       templateModel.getDevelopers() );
203         assertEquals( "Generated POM Scm is not equivalent to expected result.", generatedModel.getScm(),
204                       templateModel.getScm() );
205     }
206 
207     // Gets the classloader for this artifact's file.
208     private ClassLoader getContextClassloader( Artifact archetypeArtifact, ArtifactRepository localRepository,
209                                                List<ArtifactRepository> remoteRepositories )
210         throws Exception
211     {
212         ArtifactResolver artifactResolver = (ArtifactResolver) lookup( ArtifactResolver.class.getName() );
213         try
214         {
215             artifactResolver.resolve( archetypeArtifact, remoteRepositories, localRepository );
216         }
217         catch ( ArtifactResolutionException e )
218         {
219             throw new ArchetypeDescriptorException( "Error attempting to download archetype: " + e.getMessage(), e );
220         }
221         catch ( ArtifactNotFoundException e )
222         {
223             throw new ArchetypeNotFoundException( "OldArchetype does not exist: " + e.getMessage(), e );
224         }
225 
226         URLClassLoader archetypeJarLoader;
227         try
228         {
229             URL[] urls = new URL[1];
230 
231             urls[0] = archetypeArtifact.getFile().toURI().toURL();
232 
233             archetypeJarLoader = new URLClassLoader( urls );
234         }
235         catch ( IOException e )
236         {
237             throw new ArchetypeDescriptorException(
238                 "Error reading the " + OldArchetype.ARCHETYPE_DESCRIPTOR + " descriptor.", e );
239         }
240 
241         return archetypeJarLoader;
242     }
243 
244     public void testAddModuleToParentPOM()
245         throws Exception
246     {
247         String pom = "<project>\n"
248             + "  <packaging>pom</packaging>\n"
249             + "</project>";
250 
251         StringWriter out = new StringWriter();
252         assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId1", new StringReader( pom ), out ) );
253 
254         assertThat( out.toString(), isIdenticalTo( "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
255                 + "<project>\n"
256                 + "  <packaging>pom</packaging>\n"
257                 + "  <modules>\n"
258                 + "    <module>myArtifactId1</module>\n"
259                 + "  </modules>\n"
260                 + "</project>" ).normalizeWhitespace() );
261 
262         pom = "<project>\n"
263             + "  <modelVersion>4.0.0</modelVersion>\n"
264             + "  <packaging>pom</packaging>\n"
265             + "</project>";
266 
267         out = new StringWriter();
268         assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId2", new StringReader( pom ), out ) );
269 
270         assertThat( out.toString(), isIdenticalTo( "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
271                 + "<project>\n"
272                 + "  <modelVersion>4.0.0</modelVersion>\n"
273                 + "  <packaging>pom</packaging>\n"
274                 + "  <modules>\n"
275                 + "    <module>myArtifactId2</module>\n"
276                 + "  </modules>\n"
277                 + "</project>" ).normalizeWhitespace() );
278 
279         pom = "<project><modelVersion>4.0.0</modelVersion>\n"
280             + "  <packaging>pom</packaging>\n"
281             + "  <modules>\n"
282             + "  </modules>\n"
283             + "</project>";
284 
285         out = new StringWriter();
286         assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId3", new StringReader( pom ), out ) );
287 
288         assertThat( out.toString(), isIdenticalTo("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
289                 + "<project><modelVersion>4.0.0</modelVersion>\n"
290                 + "  <packaging>pom</packaging>\n"
291                 + "  <modules>\n"
292                 + "    <module>myArtifactId3</module>\n"
293                 + "  </modules>\n"
294                 + "</project>" ).normalizeWhitespace() );
295 
296         pom = "<project><modelVersion>4.0.0</modelVersion>\n"
297             + "  <packaging>pom</packaging>\n"
298             + "  <modules>\n"
299             + "    <module>myArtifactId3</module>\n"
300             + "  </modules>\n"
301             + "</project>";
302 
303         out = new StringWriter();
304         assertTrue( DefaultOldArchetype.addModuleToParentPom( "myArtifactId4", new StringReader( pom ), out ) );
305 
306         assertThat( out.toString(), isIdenticalTo("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
307                 + "<project><modelVersion>4.0.0</modelVersion>\n"
308                 + "  <packaging>pom</packaging>\n"
309                 + "  <modules>\n"
310                 + "    <module>myArtifactId3</module>\n"
311                 + "    <module>myArtifactId4</module>\n"
312                 + "  </modules>\n"
313                 + "</project>" ).normalizeWhitespace() );
314 
315         pom = "<project><modelVersion>4.0.0</modelVersion>\n"
316             + "  <packaging>pom</packaging>\n"
317             + "  <modules>\n"
318             + "    <module>myArtifactId3</module>\n"
319             + "  </modules>\n"
320             + "</project>";
321 
322         out = new StringWriter();
323         assertFalse( DefaultOldArchetype.addModuleToParentPom( "myArtifactId3", new StringReader( pom ), out ) );
324 
325         // empty means unchanged
326         assertEquals( "", out.toString().trim() );
327     }
328 
329     public void testAddModuleToParentPOMNoPackaging()
330         throws Exception
331     {
332         try
333         {
334             String pom = "<project>\n</project>";
335             DefaultOldArchetype.addModuleToParentPom( "myArtifactId1", new StringReader( pom ), new StringWriter() );
336             fail( "Should fail to add a module to a JAR packaged project" );
337         }
338         catch ( InvalidPackaging e )
339         {
340             // great!
341             assertEquals( "Unable to add module to the current project as it is not of packaging type 'pom'",
342                     e.getLocalizedMessage() );
343         }
344     }
345 
346     public void testAddModuleToParentPOMJarPackaging()
347         throws Exception
348     {
349         try
350         {
351             String pom = "<project>\n  <packaging>jar</packaging>\n</project>";
352             DefaultOldArchetype.addModuleToParentPom( "myArtifactId1", new StringReader( pom ), new StringWriter() );
353             fail( "Should fail to add a module to a JAR packaged project" );
354         }
355         catch ( InvalidPackaging e )
356         {
357             // great!
358             assertEquals( "Unable to add module to the current project as it is not of packaging type 'pom'",
359                     e.getLocalizedMessage() );
360         }
361     }
362 
363     @Override
364     protected void setUp()
365         throws Exception
366     {
367         super.setUp();
368         archetype = (OldArchetype) lookup( OldArchetype.ROLE );
369     }
370 }