1 package org.apache.maven.archetype.test;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.commons.io.IOUtils;
23 import org.apache.maven.archetype.ArchetypeCreationRequest;
24 import org.apache.maven.archetype.ArchetypeCreationResult;
25 import org.apache.maven.archetype.ArchetypeGenerationRequest;
26 import org.apache.maven.archetype.ArchetypeGenerationResult;
27 import org.apache.maven.archetype.ArchetypeManager;
28 import org.apache.maven.archetype.catalog.Archetype;
29 import org.apache.maven.archetype.catalog.ArchetypeCatalog;
30 import org.apache.maven.archetype.catalog.io.xpp3.ArchetypeCatalogXpp3Writer;
31 import org.apache.maven.archetype.common.ArchetypeRegistryManager;
32 import org.apache.maven.artifact.manager.WagonManager;
33 import org.apache.maven.artifact.repository.ArtifactRepository;
34 import org.apache.maven.project.MavenProject;
35 import org.apache.maven.project.MavenProjectBuilder;
36 import org.codehaus.plexus.PlexusTestCase;
37 import org.codehaus.plexus.util.FileUtils;
38 import org.codehaus.plexus.util.StringUtils;
39 import org.mortbay.jetty.Server;
40 import org.mortbay.jetty.webapp.WebAppContext;
41
42 import java.io.File;
43 import java.io.FileOutputStream;
44 import java.io.FileWriter;
45 import java.io.OutputStream;
46 import java.io.Writer;
47 import java.util.Properties;
48
49
50
51
52 public class ArchetyperRoundtripWithProxyTest
53 extends PlexusTestCase
54 {
55 Server proxyServer;
56
57 int proxyPort;
58
59 Server server;
60
61 int port;
62
63 public void testArchetyper()
64 throws Exception
65 {
66 ArchetypeManager archetype = (ArchetypeManager) lookup( ArchetypeManager.ROLE );
67
68 ArchetypeRegistryManager registryManager = (ArchetypeRegistryManager) lookup( ArchetypeRegistryManager.ROLE );
69
70 MavenProjectBuilder projectBuilder = (MavenProjectBuilder) lookup( MavenProjectBuilder.ROLE );
71
72 ArtifactRepository localRepository = registryManager.createRepository( new File( getBasedir(),
73 "target" + File.separator
74 + "test-classes"
75 + File.separator
76 + "repositories"
77 + File.separator
78 + "local" ).toURI().toURL().toExternalForm(),
79 "local-repo" );
80 ArtifactRepository centralRepository = registryManager.createRepository( new File( getBasedir(),
81 "target" + File.separator
82 + "test-classes"
83 + File.separator
84 + "repositories"
85 + File.separator
86 + "central" ).toURI().toURL().toExternalForm(),
87 "central-repo" );
88
89
90
91
92
93
94
95
96
97
98
99
100
101 File workingProject = new File( getBasedir(),
102 "target" + File.separator + "test-classes" + File.separator + "projects"
103 + File.separator + "roundtrip-2-project" );
104 FileUtils.forceDelete( new File( workingProject, "target" ) );
105
106
107 File pom = new File( workingProject, "pom.xml" );
108
109 MavenProject project = projectBuilder.build( pom, localRepository, null );
110
111 ArchetypeCreationRequest acr = new ArchetypeCreationRequest().setProject( project ).
112 setLocalRepository( localRepository ).setPostPhase( "package" );
113
114 ArchetypeCreationResult creationResult = archetype.createArchetypeFromProject( acr );
115
116 if ( creationResult.getCause() != null )
117 {
118 throw creationResult.getCause();
119 }
120
121
122 File catalogDirectory = new File( getBasedir(), "target" + File.separator + "catalog" );
123
124 File catalogFile = new File( catalogDirectory, "archetype-catalog.xml" );
125
126 File catalogProperties = new File( catalogDirectory, "archetype-catalog.properties" );
127
128 catalogDirectory.mkdirs();
129
130 Properties p = new Properties();
131 p.setProperty( "sources", "catalog" );
132 p.setProperty( "catalog.file", catalogFile.getAbsolutePath() );
133 OutputStream os = new FileOutputStream( catalogProperties );
134 p.store( os, "Generated catalog properties" );
135
136
137 File generatedArchetypeDirectory = new File( project.getBasedir(),
138 "target" + File.separator + "generated-sources" + File.separator
139 + "archetype" );
140 File generatedArchetypePom = new File( generatedArchetypeDirectory, "pom.xml" );
141 MavenProject generatedArchetypeProject = projectBuilder.build( generatedArchetypePom, localRepository, null );
142
143 File archetypeDirectory =
144 new File( generatedArchetypeDirectory, "src" + File.separator + "main" + File.separator + "resources" );
145
146 File archetypeArchive = archetype.archiveArchetype( archetypeDirectory, new File(
147 generatedArchetypeProject.getBuild().getDirectory() ),
148 generatedArchetypeProject.getBuild().getFinalName() );
149
150 String baseName =
151 StringUtils.replace( generatedArchetypeProject.getGroupId(), ".", File.separator ) + File.separator
152 + generatedArchetypeProject.getArtifactId() + File.separator + generatedArchetypeProject.getVersion()
153 + File.separator + generatedArchetypeProject.getBuild().getFinalName();
154 File archetypeInRepository = new File( centralRepository.getBasedir(), baseName + ".jar" );
155 File archetypePomInRepository = new File( centralRepository.getBasedir(), baseName + ".pom" );
156 archetypeInRepository.getParentFile().mkdirs();
157 FileUtils.copyFile( archetypeArchive, archetypeInRepository );
158 FileUtils.copyFile( generatedArchetypePom, archetypePomInRepository );
159
160
161 ArchetypeCatalog catalog = new ArchetypeCatalog();
162 Archetype generatedArchetype = new Archetype();
163 generatedArchetype.setGroupId( generatedArchetypeProject.getGroupId() );
164 generatedArchetype.setArtifactId( generatedArchetypeProject.getArtifactId() );
165 generatedArchetype.setVersion( generatedArchetypeProject.getVersion() );
166 generatedArchetype.setRepository( "http://localhost:" + port + "/repo" );
167 catalog.addArchetype( generatedArchetype );
168
169 ArchetypeCatalogXpp3Writer catalogWriter = new ArchetypeCatalogXpp3Writer();
170 Writer writer = new FileWriter( catalogFile );
171 catalogWriter.write( writer, catalog );
172 IOUtils.closeQuietly( writer );
173
174
175 String outputDirectory = new File( getBasedir(),
176 "target" + File.separator + "test-classes" + File.separator + "projects"
177 + File.separator + "roundtrip-2-recreatedproject" ).getAbsolutePath();
178 FileUtils.forceDelete( outputDirectory );
179
180 WagonManager manager = (WagonManager) lookup( WagonManager.class.getName() );
181 manager.addProxy( "http", "localhost", proxyPort, null, null, null );
182
183 ArchetypeGenerationRequest agr =
184 new ArchetypeGenerationRequest().setArchetypeGroupId( generatedArchetypeProject.getGroupId() ).
185 setArchetypeArtifactId( generatedArchetypeProject.getArtifactId() ).
186 setArchetypeVersion( generatedArchetypeProject.getVersion() ).
187 setGroupId( "com.mycompany" ).setArtifactId( "myapp" ).setVersion( "1.0-SNAPSHOT" ).
188 setPackage( "com.mycompany.myapp" ).setOutputDirectory( outputDirectory ).
189 setLocalRepository( localRepository ).setArchetypeRepository( "http://localhost:" + port + "/repo" );
190 ArchetypeGenerationResult generationResult = archetype.generateProjectFromArchetype( agr );
191
192 if ( generationResult.getCause() != null )
193 {
194 throw generationResult.getCause();
195 }
196
197 }
198
199 public void setUp()
200 throws Exception
201 {
202 super.setUp();
203
204
205 System.setProperty( "org.apache.maven.archetype.repository.directory",
206 getTestPath( "target/test-classes/repositories/central" ) );
207
208 proxyServer = new Server( 0 );
209
210 WebAppContext webappProxy = new WebAppContext();
211 webappProxy.setContextPath( "/" );
212 webappProxy.setWar( "target/wars/archetype-proxy.war" );
213 proxyServer.setHandler( webappProxy );
214
215 proxyServer.start();
216
217 proxyPort = proxyServer.getConnectors()[0].getLocalPort();
218
219 server = new Server( 0 );
220
221 WebAppContext webapp = new WebAppContext();
222 webapp.setContextPath( "/repo" );
223 webapp.setWar( "target/wars/archetype-repository.war" );
224 server.setHandler( webapp );
225
226 server.start();
227
228 port = server.getConnectors()[0].getLocalPort();
229
230 }
231
232 public void tearDown()
233 throws Exception
234 {
235 super.tearDown();
236
237
238 proxyServer.stop();
239 server.stop();
240 }
241 }