View Javadoc

1   package org.apache.maven.archetype.test;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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   * @author Jason van Zyl
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          // (1) create a project from scratch
90          // (2) create an archetype from the project
91          // (3) create our own archetype catalog properties in memory
92          // (4) create our own archetype catalog describing the archetype we just created
93          // (5) deploy the archetype we just created
94          // (6) create a project form the archetype we just created
95          // ------------------------------------------------------------------------
96          //
97          // ------------------------------------------------------------------------
98          // (1) create a project from scratch
99  //        File sourceProject = new File( getBasedir(  ), "target/test-classes/projects/roundtrip-1-project" );
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         // (2) create an archetype from the project
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         // (3) create our own archetype catalog properties in memory
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         // (5) install the archetype we just created
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         // (4) create our own archetype catalog describing the archetype we just created
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         // (6) create a project form the archetype we just created
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         // Start Proxy Jetty
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         // Stop Jettys
237 
238         proxyServer.stop();
239         server.stop();
240     }
241 }