View Javadoc

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