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
17
18
19
20
21
22
23
24
25
26
27
28
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
59
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
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
109
110 archetype.createArchetype( request, remoteRepository );
111
112
113
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
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
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
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
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
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 }