1 package org.apache.maven.plugins.resources;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.LinkedHashSet;
27 import java.util.List;
28 import java.util.Properties;
29
30 import org.apache.maven.execution.MavenSession;
31 import org.apache.maven.model.Resource;
32 import org.apache.maven.plugin.AbstractMojo;
33 import org.apache.maven.plugin.MojoExecutionException;
34 import org.apache.maven.plugins.annotations.Component;
35 import org.apache.maven.plugins.annotations.LifecyclePhase;
36 import org.apache.maven.plugins.annotations.Mojo;
37 import org.apache.maven.plugins.annotations.Parameter;
38 import org.apache.maven.project.MavenProject;
39 import org.apache.maven.shared.filtering.MavenFilteringException;
40 import org.apache.maven.shared.filtering.MavenResourcesExecution;
41 import org.apache.maven.shared.filtering.MavenResourcesFiltering;
42 import org.codehaus.plexus.PlexusConstants;
43 import org.codehaus.plexus.PlexusContainer;
44 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
45 import org.codehaus.plexus.context.Context;
46 import org.codehaus.plexus.context.ContextException;
47 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
48 import org.codehaus.plexus.util.ReaderFactory;
49 import org.codehaus.plexus.util.StringUtils;
50
51
52
53
54
55
56
57
58
59
60 @Mojo( name = "resources", defaultPhase = LifecyclePhase.PROCESS_RESOURCES, requiresProject = true, threadSafe = true )
61 public class ResourcesMojo
62 extends AbstractMojo
63 implements Contextualizable
64 {
65
66
67
68
69 @Parameter( defaultValue = "${project.build.sourceEncoding}" )
70 protected String encoding;
71
72
73
74
75 @Parameter( defaultValue = "${project.build.outputDirectory}", required = true )
76 private File outputDirectory;
77
78
79
80
81 @Parameter( defaultValue = "${project.resources}", required = true, readonly = true )
82 private List<Resource> resources;
83
84
85
86
87 @Parameter( defaultValue = "${project}", readonly = true, required = true )
88 protected MavenProject project;
89
90
91
92
93
94
95
96
97 @Parameter( defaultValue = "${project.build.filters}", readonly = true )
98 protected List<String> buildFilters;
99
100
101
102
103
104
105
106
107
108
109
110 @Parameter
111 protected List<String> filters;
112
113
114
115
116
117
118
119
120 @Parameter( defaultValue = "true" )
121 protected boolean useBuildFilters;
122
123
124
125
126 @Component( role = MavenResourcesFiltering.class, hint = "default" )
127 protected MavenResourcesFiltering mavenResourcesFiltering;
128
129
130
131
132 @Parameter( defaultValue = "${session}", readonly = true, required = true )
133 protected MavenSession session;
134
135
136
137
138
139
140
141
142 @Parameter
143 protected String escapeString;
144
145
146
147
148
149
150 @Parameter( defaultValue = "false" )
151 private boolean overwrite;
152
153
154
155
156
157
158 @Parameter( defaultValue = "false" )
159 protected boolean includeEmptyDirs;
160
161
162
163
164
165
166 @Parameter
167 protected List<String> nonFilteredFileExtensions;
168
169
170
171
172
173
174 @Parameter( defaultValue = "true" )
175 protected boolean escapeWindowsPaths;
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198 @Parameter
199 protected LinkedHashSet<String> delimiters;
200
201
202
203
204
205
206 @Parameter( defaultValue = "true" )
207 protected boolean useDefaultDelimiters;
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236 @Parameter( defaultValue = "true" )
237 protected boolean addDefaultExcludes;
238
239
240
241
242
243
244
245
246
247
248 @Parameter
249 private List<String> mavenFilteringHints;
250
251
252
253
254 private PlexusContainer plexusContainer;
255
256
257
258
259 private List<MavenResourcesFiltering> mavenFilteringComponents = new ArrayList<MavenResourcesFiltering>();
260
261
262
263
264
265
266 @Parameter( defaultValue = "false" )
267 private boolean supportMultiLineFiltering;
268
269
270
271
272
273
274 @Parameter( defaultValue = "false" )
275 private boolean fileNameFiltering;
276
277
278
279
280
281
282
283 @Parameter( property = "maven.resources.skip", defaultValue = "false" )
284 private boolean skip;
285
286
287 public void contextualize( Context context )
288 throws ContextException
289 {
290 plexusContainer = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
291 }
292
293
294 public void execute()
295 throws MojoExecutionException
296 {
297 if ( isSkip() )
298 {
299 getLog().info( "Skipping the execution." );
300 return;
301 }
302
303 if ( StringUtils.isEmpty( encoding ) && isFilteringEnabled( getResources() ) )
304 {
305 getLog().warn( "File encoding has not been set, using platform encoding " + ReaderFactory.FILE_ENCODING
306 + ", i.e. build is platform dependent!" );
307 }
308
309 try
310 {
311
312 List<String> combinedFilters = getCombinedFiltersList();
313
314 MavenResourcesExecution mavenResourcesExecution =
315 new MavenResourcesExecution( getResources(), getOutputDirectory(), project, encoding, combinedFilters,
316 Collections.<String>emptyList(), session );
317
318 mavenResourcesExecution.setEscapeWindowsPaths( escapeWindowsPaths );
319
320
321
322 mavenResourcesExecution.setInjectProjectBuildFilters( false );
323
324 mavenResourcesExecution.setEscapeString( escapeString );
325 mavenResourcesExecution.setOverwrite( overwrite );
326 mavenResourcesExecution.setIncludeEmptyDirs( includeEmptyDirs );
327 mavenResourcesExecution.setSupportMultiLineFiltering( supportMultiLineFiltering );
328 mavenResourcesExecution.setFilterFilenames( fileNameFiltering );
329 mavenResourcesExecution.setAddDefaultExcludes( addDefaultExcludes );
330
331
332 Properties additionalProperties = addSeveralSpecialProperties();
333 mavenResourcesExecution.setAdditionalProperties( additionalProperties );
334
335
336 mavenResourcesExecution.setDelimiters( delimiters, useDefaultDelimiters );
337
338 if ( nonFilteredFileExtensions != null )
339 {
340 mavenResourcesExecution.setNonFilteredFileExtensions( nonFilteredFileExtensions );
341 }
342 mavenResourcesFiltering.filterResources( mavenResourcesExecution );
343
344 executeUserFilterComponents( mavenResourcesExecution );
345 }
346 catch ( MavenFilteringException e )
347 {
348 throw new MojoExecutionException( e.getMessage(), e );
349 }
350 }
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366 private Properties addSeveralSpecialProperties()
367 {
368 String timeStamp = new MavenBuildTimestamp().formattedTimestamp();
369 Properties additionalProperties = new Properties();
370 additionalProperties.put( "maven.build.timestamp", timeStamp );
371 if ( project.getBasedir() != null )
372 {
373 additionalProperties.put( "project.baseUri", project.getBasedir().getAbsoluteFile().toURI().toString() );
374 }
375
376 return additionalProperties;
377 }
378
379
380
381
382
383
384
385 protected void executeUserFilterComponents( MavenResourcesExecution mavenResourcesExecution )
386 throws MojoExecutionException, MavenFilteringException
387 {
388
389 if ( mavenFilteringHints != null )
390 {
391 for ( String hint : mavenFilteringHints )
392 {
393 try
394 {
395
396 mavenFilteringComponents.add( (MavenResourcesFiltering) plexusContainer.lookup( MavenResourcesFiltering.class.getName(),
397 hint ) );
398
399 }
400 catch ( ComponentLookupException e )
401 {
402 throw new MojoExecutionException( e.getMessage(), e );
403 }
404 }
405 }
406 else
407 {
408 getLog().debug( "no use filter components" );
409 }
410
411 if ( mavenFilteringComponents != null && !mavenFilteringComponents.isEmpty() )
412 {
413 getLog().debug( "execute user filters" );
414 for ( MavenResourcesFiltering filter : mavenFilteringComponents )
415 {
416 filter.filterResources( mavenResourcesExecution );
417 }
418 }
419 }
420
421
422
423
424 protected List<String> getCombinedFiltersList()
425 {
426 if ( filters == null || filters.isEmpty() )
427 {
428 return useBuildFilters ? buildFilters : null;
429 }
430 else
431 {
432 List<String> result = new ArrayList<String>();
433
434 if ( useBuildFilters && buildFilters != null && !buildFilters.isEmpty() )
435 {
436 result.addAll( buildFilters );
437 }
438
439 result.addAll( filters );
440
441 return result;
442 }
443 }
444
445
446
447
448
449
450
451 private boolean isFilteringEnabled( Collection<Resource> theResources )
452 {
453 if ( theResources != null )
454 {
455 for ( Resource resource : theResources )
456 {
457 if ( resource.isFiltering() )
458 {
459 return true;
460 }
461 }
462 }
463 return false;
464 }
465
466
467
468
469 public List<Resource> getResources()
470 {
471 return resources;
472 }
473
474
475
476
477 public void setResources( List<Resource> resources )
478 {
479 this.resources = resources;
480 }
481
482
483
484
485 public File getOutputDirectory()
486 {
487 return outputDirectory;
488 }
489
490
491
492
493 public void setOutputDirectory( File outputDirectory )
494 {
495 this.outputDirectory = outputDirectory;
496 }
497
498
499
500
501 public boolean isOverwrite()
502 {
503 return overwrite;
504 }
505
506
507
508
509 public void setOverwrite( boolean overwrite )
510 {
511 this.overwrite = overwrite;
512 }
513
514
515
516
517 public boolean isIncludeEmptyDirs()
518 {
519 return includeEmptyDirs;
520 }
521
522
523
524
525 public void setIncludeEmptyDirs( boolean includeEmptyDirs )
526 {
527 this.includeEmptyDirs = includeEmptyDirs;
528 }
529
530
531
532
533 public List<String> getFilters()
534 {
535 return filters;
536 }
537
538
539
540
541 public void setFilters( List<String> filters )
542 {
543 this.filters = filters;
544 }
545
546
547
548
549 public LinkedHashSet<String> getDelimiters()
550 {
551 return delimiters;
552 }
553
554
555
556
557 public void setDelimiters( LinkedHashSet<String> delimiters )
558 {
559 this.delimiters = delimiters;
560 }
561
562
563
564
565 public boolean isUseDefaultDelimiters()
566 {
567 return useDefaultDelimiters;
568 }
569
570
571
572
573 public void setUseDefaultDelimiters( boolean useDefaultDelimiters )
574 {
575 this.useDefaultDelimiters = useDefaultDelimiters;
576 }
577
578
579
580
581 public boolean isSkip()
582 {
583 return skip;
584 }
585
586 }