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