1 package org.apache.maven.archetype.old;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
52
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
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
95
96 archetype.createArchetype( request, remoteRepository );
97
98
99
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
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
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
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
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
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 }