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.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
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
82
83
84
85
86
87
88
89
90
91
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
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
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
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
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
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
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
204 }
205
206 private Server server;
207
208 int port;
209
210 public void setUp()
211 throws Exception
212 {
213 super.setUp();
214
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
237
238 server.stop();
239 }
240 }