1 package org.apache.maven.archetype.mojos;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.archetype.ArchetypeCreationRequest;
23 import org.apache.maven.archetype.ArchetypeCreationResult;
24 import org.apache.maven.archetype.ArchetypeManager;
25 import org.apache.maven.archetype.common.Constants;
26 import org.apache.maven.archetype.ui.creation.ArchetypeCreationConfigurator;
27 import org.apache.maven.artifact.repository.ArtifactRepository;
28 import org.apache.maven.execution.MavenSession;
29 import org.apache.maven.plugin.AbstractMojo;
30 import org.apache.maven.plugin.MojoExecutionException;
31 import org.apache.maven.plugin.MojoFailureException;
32 import org.apache.maven.plugins.annotations.Component;
33 import org.apache.maven.plugins.annotations.Execute;
34 import org.apache.maven.plugins.annotations.LifecyclePhase;
35 import org.apache.maven.plugins.annotations.Mojo;
36 import org.apache.maven.plugins.annotations.Parameter;
37 import org.apache.maven.project.MavenProject;
38 import org.codehaus.plexus.util.PropertyUtils;
39 import org.codehaus.plexus.util.StringUtils;
40
41 import java.io.File;
42 import java.io.IOException;
43 import java.util.ArrayList;
44 import java.util.Arrays;
45 import java.util.List;
46 import java.util.Properties;
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 @Mojo( name = "create-from-project", requiresProject = true, aggregator = true )
102 @Execute( phase = LifecyclePhase.GENERATE_SOURCES )
103 public class CreateArchetypeFromProjectMojo
104 extends AbstractMojo
105 {
106
107 @Component
108 private ArchetypeCreationConfigurator configurator;
109
110
111
112
113 @Parameter( property = "interactive", defaultValue = "false" )
114 private boolean interactive;
115
116 @Component
117 private ArchetypeManager manager;
118
119
120
121
122 @Parameter( property = "archetype.filteredExtentions" )
123 private String archetypeFilteredExtentions;
124
125
126
127
128 @Parameter( property = "archetype.languages" )
129 private String archetypeLanguages;
130
131
132
133
134 @Parameter( property = "archetype.encoding", defaultValue = "UTF-8" )
135 private String defaultEncoding;
136
137
138
139
140 @Parameter( property = "archetype.partialArchetype" )
141 private boolean partialArchetype = false;
142
143
144
145
146
147 @Parameter( property = "archetype.preserveCData" )
148 private boolean preserveCData = false;
149
150 @Parameter( defaultValue = "${localRepository}", readonly = true )
151 private ArtifactRepository localRepository;
152
153
154
155
156
157 @Parameter( property = "archetype.keepParent" )
158 private boolean keepParent = true;
159
160
161
162
163 @Parameter( defaultValue = "${project}", readonly = true, required = true )
164 private MavenProject project;
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 @Parameter( defaultValue = "archetype.properties", property = "archetype.properties" )
201 private File propertyFile;
202
203
204
205
206
207 @Parameter( property = "archetype.postPhase", defaultValue = "package" )
208 private String archetypePostPhase;
209
210
211
212
213 @Parameter( defaultValue = "${project.build.directory}/generated-sources/archetype" )
214 private File outputDirectory;
215
216 @Parameter( property = "testMode" )
217 private boolean testMode;
218
219
220
221
222
223 @Parameter( property = "packageName" )
224 private String packageName;
225
226 @Parameter( defaultValue = "${session}", readonly = true, required = true )
227 private MavenSession session;
228
229
230
231
232 @Override
233 public void execute()
234 throws MojoExecutionException, MojoFailureException
235 {
236 Properties executionProperties = session.getExecutionProperties();
237 try
238 {
239 if ( propertyFile != null )
240 {
241 propertyFile.getParentFile().mkdirs();
242 }
243
244 List<String> languages = getLanguages( archetypeLanguages, propertyFile );
245
246 Properties properties =
247 configurator.configureArchetypeCreation( project, Boolean.valueOf( interactive ), executionProperties,
248 propertyFile, languages );
249
250 List<String> filtereds = getFilteredExtensions( archetypeFilteredExtentions, propertyFile );
251
252 ArchetypeCreationRequest request =
253 new ArchetypeCreationRequest().setDefaultEncoding( defaultEncoding ).setProject( project )
254 .setProperties( properties ).setLanguages( languages )
255 .setFiltereds( filtereds )
256 .setPreserveCData( preserveCData ).setKeepParent(
257 keepParent ).setPartialArchetype( partialArchetype )
258 .setLocalRepository( localRepository ).setProjectBuildingRequest( session.getProjectBuildingRequest() )
259 .setPackageName( packageName ).setPostPhase(
260 archetypePostPhase ).setOutputDirectory( outputDirectory ).setSettingsFile( session.getRequest().getUserSettingsFile() );
261
262 ArchetypeCreationResult result = manager.createArchetypeFromProject( request );
263
264 if ( result.getCause() != null )
265 {
266 throw new MojoFailureException( result.getCause(), result.getCause().getMessage(),
267 result.getCause().getMessage() );
268 }
269
270 getLog().info( "Archetype project created in " + outputDirectory );
271
272 if ( testMode )
273 {
274
275
276
277
278
279
280
281
282
283 }
284
285 }
286 catch ( MojoFailureException ex )
287 {
288 throw ex;
289 }
290 catch ( Exception ex )
291 {
292 throw new MojoFailureException( ex, ex.getMessage(), ex.getMessage() );
293 }
294 }
295
296 private List<String> getFilteredExtensions( String archetypeFilteredExtentions, File propertyFile ) throws IOException
297 {
298 List<String> filteredExtensions = new ArrayList<>();
299
300 if ( StringUtils.isNotEmpty( archetypeFilteredExtentions ) )
301 {
302 filteredExtensions.addAll( Arrays.asList( StringUtils.split( archetypeFilteredExtentions, "," ) ) );
303
304 getLog().debug( "Found in command line extensions = " + filteredExtensions );
305 }
306
307 if ( filteredExtensions.isEmpty() && propertyFile != null && propertyFile.exists() )
308 {
309 Properties properties = PropertyUtils.loadProperties( propertyFile );
310
311 String extensions = properties.getProperty( Constants.ARCHETYPE_FILTERED_EXTENSIONS );
312 if ( StringUtils.isNotEmpty( extensions ) )
313 {
314 filteredExtensions.addAll( Arrays.asList( StringUtils.split( extensions, "," ) ) );
315 }
316
317 getLog().debug( "Found in propertyFile " + propertyFile.getName() + " extensions = " + filteredExtensions );
318 }
319
320 if ( filteredExtensions.isEmpty() )
321 {
322 filteredExtensions.addAll( Constants.DEFAULT_FILTERED_EXTENSIONS );
323
324 getLog().debug( "Using default extensions = " + filteredExtensions );
325 }
326
327 return filteredExtensions;
328 }
329
330 private List<String> getLanguages( String archetypeLanguages, File propertyFile ) throws IOException
331 {
332 List<String> resultingLanguages = new ArrayList<>();
333
334 if ( StringUtils.isNotEmpty( archetypeLanguages ) )
335 {
336 resultingLanguages.addAll( Arrays.asList( StringUtils.split( archetypeLanguages, "," ) ) );
337
338 getLog().debug( "Found in command line languages = " + resultingLanguages );
339 }
340
341 if ( resultingLanguages.isEmpty() && propertyFile != null && propertyFile.exists() )
342 {
343 Properties properties = PropertyUtils.loadProperties( propertyFile );
344
345 String languages = properties.getProperty( Constants.ARCHETYPE_LANGUAGES );
346 if ( StringUtils.isNotEmpty( languages ) )
347 {
348 resultingLanguages.addAll( Arrays.asList( StringUtils.split( languages, "," ) ) );
349 }
350
351 getLog().debug( "Found in propertyFile " + propertyFile.getName() + " languages = " + resultingLanguages );
352 }
353
354 if ( resultingLanguages.isEmpty() )
355 {
356 resultingLanguages.addAll( Constants.DEFAULT_LANGUAGES );
357
358 getLog().debug( "Using default languages = " + resultingLanguages );
359 }
360
361 return resultingLanguages;
362 }
363 }