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.repository.ArtifactRepository;
33  import org.apache.maven.project.MavenProject;
34  import org.apache.maven.project.MavenProjectBuilder;
35  import org.codehaus.plexus.PlexusTestCase;
36  import org.codehaus.plexus.util.FileUtils;
37  import org.codehaus.plexus.util.StringUtils;
38  import org.mortbay.jetty.Server;
39  import org.mortbay.jetty.webapp.WebAppContext;
40  
41  import java.io.File;
42  import java.io.FileWriter;
43  import java.io.Writer;
44  import java.util.Properties;
45  
46  /**
47   * @author Jason van Zyl
48   */
49  public class ArchetyperRoundtripTest
50      extends PlexusTestCase
51  {
52  
53      public void testArchetyper()
54          throws Exception
55      {
56  
57          ArchetypeManager archetype = (ArchetypeManager) lookup( ArchetypeManager.ROLE );
58  
59          ArchetypeRegistryManager registryManager = (ArchetypeRegistryManager) lookup( ArchetypeRegistryManager.ROLE );
60  
61          MavenProjectBuilder projectBuilder = (MavenProjectBuilder) lookup( MavenProjectBuilder.ROLE );
62  
63          ArtifactRepository localRepository = registryManager.createRepository( new File( getBasedir(),
64                                                                                           "target" + File.separator
65                                                                                               + "test-classes"
66                                                                                               + File.separator
67                                                                                               + "repositories"
68                                                                                               + File.separator
69                                                                                               + "local" ).toURI().toURL().toExternalForm(),
70                                                                                 "local-repo" );
71  
72          ArtifactRepository centralRepository = registryManager.createRepository( new File( getBasedir(),
73                                                                                             "target" + File.separator
74                                                                                                 + "test-classes"
75                                                                                                 + File.separator
76                                                                                                 + "repositories"
77                                                                                                 + File.separator
78                                                                                                 + "central" ).toURI().toURL().toExternalForm(),
79                                                                                   "central-repo" );
80  
81          // (1) create a project from scratch
82          // (2) create an archetype from the project
83          // (3) create our own archetype catalog properties in memory
84          // (4) create our own archetype catalog describing the archetype we just created
85          // (5) deploy the archetype we just created
86          // (6) create a project form the archetype we just created
87          // ------------------------------------------------------------------------
88          //
89          // ------------------------------------------------------------------------
90          // (1) create a project from scratch
91  //        File sourceProject = new File( getBasedir(  ), "target/test-classes/projects/roundtrip-1-project" );
92  
93          File workingProject = new File( getBasedir(),
94                                          "target" + File.separator + "test-classes" + File.separator + "projects"
95                                              + File.separator + "roundtrip-1-project" );
96          FileUtils.forceDelete( new File( workingProject, "target" ) );
97  
98          // (2) create an archetype from the project
99          File pom = new File( workingProject, "pom.xml" );
100 
101         MavenProject project = projectBuilder.build( pom, localRepository, null );
102 
103         Properties properties = new Properties();
104         properties.setProperty( "someProperty", "someValue" );
105         ArchetypeCreationRequest acr = new ArchetypeCreationRequest().setProject( project ).
106             setLocalRepository( localRepository ).setProperties( properties ).setPostPhase( "package" );
107 
108         ArchetypeCreationResult creationResult = archetype.createArchetypeFromProject( acr );
109 
110         if ( creationResult.getCause() != null )
111         {
112             throw creationResult.getCause();
113         }
114 
115         // (3) create our own archetype catalog properties in memory
116         File catalogDirectory = new File( getBasedir(), "target" + File.separator + "catalog" );
117         catalogDirectory.mkdirs();
118 
119         File catalogFile = new File( catalogDirectory, "archetype-catalog.xml" );
120 
121         // (5) install the archetype we just created
122         File generatedArchetypeDirectory = new File( project.getBasedir(),
123                                                      "target" + File.separator + "generated-sources" + File.separator
124                                                          + "archetype" );
125         File generatedArchetypePom = new File( generatedArchetypeDirectory, "pom.xml" );
126         MavenProject generatedArchetypeProject = projectBuilder.build( generatedArchetypePom, localRepository, null );
127 
128         File archetypeDirectory =
129             new File( generatedArchetypeDirectory, "src" + File.separator + "main" + File.separator + "resources" );
130 
131         File archetypeArchive = archetype.archiveArchetype( archetypeDirectory, new File(
132             generatedArchetypeProject.getBuild().getDirectory() ),
133                                                             generatedArchetypeProject.getBuild().getFinalName() );
134 
135         String baseName =
136             StringUtils.replace( generatedArchetypeProject.getGroupId(), ".", File.separator ) + File.separator
137                 + generatedArchetypeProject.getArtifactId() + File.separator + generatedArchetypeProject.getVersion()
138                 + File.separator + generatedArchetypeProject.getBuild().getFinalName();
139         File archetypeInRepository = new File( centralRepository.getBasedir(), baseName + ".jar" );
140         File archetypePomInRepository = new File( centralRepository.getBasedir(), baseName + ".pom" );
141         archetypeInRepository.getParentFile().mkdirs();
142         FileUtils.copyFile( archetypeArchive, archetypeInRepository );
143         FileUtils.copyFile( generatedArchetypePom, archetypePomInRepository );
144 
145         // (4) create our own archetype catalog describing the archetype we just created
146         ArchetypeCatalog catalog = new ArchetypeCatalog();
147         Archetype generatedArchetype = new Archetype();
148         generatedArchetype.setGroupId( generatedArchetypeProject.getGroupId() );
149         generatedArchetype.setArtifactId( generatedArchetypeProject.getArtifactId() );
150         generatedArchetype.setVersion( generatedArchetypeProject.getVersion() );
151         generatedArchetype.setRepository( "http://localhost:" + port + "/repo" );
152         catalog.addArchetype( generatedArchetype );
153 
154         ArchetypeCatalogXpp3Writer catalogWriter = new ArchetypeCatalogXpp3Writer();
155         Writer writer = new FileWriter( catalogFile );
156         catalogWriter.write( writer, catalog );
157         IOUtils.closeQuietly( writer );
158 
159         // (6) create a project form the archetype we just created
160         String outputDirectory = new File( getBasedir(),
161                                            "target" + File.separator + "test-classes" + File.separator + "projects"
162                                                + File.separator + "roundtrip-1-recreatedproject" ).getAbsolutePath();
163         FileUtils.forceDelete( outputDirectory );
164 
165         ArchetypeGenerationRequest agr =
166             new ArchetypeGenerationRequest().setArchetypeGroupId( generatedArchetypeProject.getGroupId() ).
167                 setArchetypeArtifactId( generatedArchetypeProject.getArtifactId() ).
168                 setArchetypeVersion( generatedArchetypeProject.getVersion() ).
169                 setGroupId( "com.mycompany" ).setArtifactId( "myapp" ).setVersion( "1.0-SNAPSHOT" ).
170                 setPackage( "com.mycompany.myapp" ).setProperties( properties ).
171                 setOutputDirectory( outputDirectory ).setLocalRepository( localRepository ).
172                 setArchetypeRepository( "http://localhost:" + port + "/repo/" );
173         ArchetypeGenerationResult generationResult = archetype.generateProjectFromArchetype( agr );
174 
175         if ( generationResult.getCause() != null )
176         {
177             throw generationResult.getCause();
178         }
179 
180         //ASSERT symbol_pound replacement (archetype-180 archetype-183)
181         String content = FileUtils.fileRead(
182             outputDirectory + File.separator + "myapp" + File.separator + "src" + File.separator + "main"
183                 + File.separator + "java" + File.separator + "com" + File.separator + "mycompany" + File.separator
184                 + "myapp" + File.separator + "App.java" );
185         System.err.println( "content=" + content );
186         assertTrue( content.indexOf( "//A   #\\{some}" ) > 0 );
187         assertTrue( content.indexOf( "//B   #{some}" ) > 0 );
188         assertTrue( content.indexOf( "//C   #{some other}" ) > 0 );
189         assertTrue( content.indexOf( "//D   \\#{some other}" ) > 0 );
190         assertTrue( content.indexOf( "//E   #{}" ) > 0 );
191         assertTrue( content.indexOf( "//F   {some}" ) > 0 );
192         assertTrue( content.indexOf( "//G   ${someOtherProperty}" ) > 0 );
193         assertTrue( content.indexOf( "//H   ${someValue}" ) > 0 );
194         assertTrue( content.indexOf( "/*" ) > 0 );
195         assertTrue( content.indexOf( "  A   #\\{some}" ) > 0 );
196         assertTrue( content.indexOf( "  B   #{some}" ) > 0 );
197         assertTrue( content.indexOf( "  C   #{some other}" ) > 0 );
198         assertTrue( content.indexOf( "  D   \\#{some other}" ) > 0 );
199         assertTrue( content.indexOf( "  E   #{}" ) > 0 );
200         assertTrue( content.indexOf( "  F   {some}" ) > 0 );
201         assertTrue( content.indexOf( "  G   ${someOtherProperty}" ) > 0 );
202         assertTrue( content.indexOf( "  H   ${someValue}" ) > 0 );
203         //Assert symbol_dollar archetype-138
204     }
205 
206     private Server server;
207 
208     int port;
209 
210     public void setUp()
211         throws Exception
212     {
213         super.setUp();
214         // Start Jetty
215 
216         System.setProperty( "org.apache.maven.archetype.repository.directory",
217                             getTestPath( "target/test-classes/repositories/central" ) );
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 Jetty
237 
238         server.stop();
239     }
240 }