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
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
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
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
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
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 }