1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.report.projectinfo;
20
21 import java.io.File;
22 import java.io.IOException;
23 import java.net.MalformedURLException;
24 import java.net.URL;
25 import java.net.URLClassLoader;
26 import java.text.MessageFormat;
27 import java.util.Collection;
28 import java.util.HashMap;
29 import java.util.List;
30 import java.util.Locale;
31 import java.util.Map;
32 import java.util.MissingResourceException;
33 import java.util.ResourceBundle;
34
35 import org.apache.maven.artifact.repository.ArtifactRepository;
36 import org.apache.maven.execution.MavenSession;
37 import org.apache.maven.model.Plugin;
38 import org.apache.maven.plugins.annotations.Component;
39 import org.apache.maven.plugins.annotations.Parameter;
40 import org.apache.maven.project.MavenProject;
41 import org.apache.maven.project.ProjectBuilder;
42 import org.apache.maven.reporting.AbstractMavenReport;
43 import org.apache.maven.repository.RepositorySystem;
44 import org.apache.maven.settings.Settings;
45 import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver;
46 import org.codehaus.plexus.i18n.I18N;
47 import org.codehaus.plexus.interpolation.EnvarBasedValueSource;
48 import org.codehaus.plexus.interpolation.InterpolationException;
49 import org.codehaus.plexus.interpolation.PrefixedObjectValueSource;
50 import org.codehaus.plexus.interpolation.PropertiesBasedValueSource;
51 import org.codehaus.plexus.interpolation.RegexBasedInterpolator;
52 import org.codehaus.plexus.util.StringUtils;
53 import org.codehaus.plexus.util.xml.Xpp3Dom;
54
55
56
57
58
59
60
61 public abstract class AbstractProjectInfoReport extends AbstractMavenReport {
62
63
64
65
66
67
68
69 @Component
70 protected ArtifactResolver resolver;
71
72
73
74
75 @Component
76 RepositorySystem repositorySystem;
77
78
79
80
81 @Component
82 private I18N i18n;
83
84 @Component
85 protected ProjectBuilder projectBuilder;
86
87
88
89
90
91 @Parameter(defaultValue = "${session}", readonly = true, required = true)
92 private MavenSession session;
93
94
95
96
97
98
99 @Parameter(defaultValue = "${project.pluginArtifactRepositories}", readonly = true, required = true)
100 protected List<ArtifactRepository> pluginRepositories;
101
102
103
104
105
106
107 @Parameter(defaultValue = "${reactorProjects}", required = true, readonly = true)
108 protected List<MavenProject> reactorProjects;
109
110
111
112
113
114
115 @Parameter(defaultValue = "${settings}", readonly = true, required = true)
116 protected Settings settings;
117
118
119
120
121
122
123
124 @Parameter(defaultValue = "${project.basedir}/src/site/custom/project-info-reports.properties")
125 protected String customBundle;
126
127
128
129
130
131
132 @Parameter(property = "mpir.skip", defaultValue = "false")
133 private boolean skip;
134
135
136
137
138
139
140
141 @Parameter(defaultValue = "true")
142 protected boolean skipEmptyReport;
143
144
145
146
147
148
149 @Parameter
150 private List<LicenseMapping> licenseMappings;
151
152
153
154
155
156 @Override
157 public boolean canGenerateReport() {
158 return !skip;
159 }
160
161 @Override
162 public String getCategoryName() {
163 return CATEGORY_PROJECT_INFORMATION;
164 }
165
166
167
168
169
170 protected Map<String, String> getLicenseMappings() {
171 Map<String, String> map = new HashMap<>();
172 if (licenseMappings != null) {
173 for (LicenseMapping mapping : licenseMappings) {
174 for (String from : mapping.getFroms()) {
175 map.put(from, mapping.getTo());
176 }
177 }
178 }
179 return map;
180 }
181
182
183
184
185
186 protected boolean isEmpty(Collection<?> coll) {
187 return coll == null || coll.isEmpty();
188 }
189
190 @Override
191 protected String getOutputDirectory() {
192 return outputDirectory.getAbsolutePath();
193 }
194
195 @Override
196 public File getReportOutputDirectory() {
197 return outputDirectory;
198 }
199
200 @Override
201 public void setReportOutputDirectory(File reportOutputDirectory) {
202 this.outputDirectory = reportOutputDirectory;
203 }
204
205 @Override
206 protected MavenProject getProject() {
207 return project;
208 }
209
210 protected MavenSession getSession() {
211 return session;
212 }
213
214 protected List<MavenProject> getReactorProjects() {
215 return reactorProjects;
216 }
217
218
219
220
221
222 protected Plugin getPlugin(String pluginId) {
223 if ((getProject().getBuild() == null) || (getProject().getBuild().getPluginsAsMap() == null)) {
224 return null;
225 }
226
227 Plugin plugin = getProject().getBuild().getPluginsAsMap().get(pluginId);
228
229 if ((plugin == null)
230 && (getProject().getBuild().getPluginManagement() != null)
231 && (getProject().getBuild().getPluginManagement().getPluginsAsMap() != null)) {
232 plugin = getProject()
233 .getBuild()
234 .getPluginManagement()
235 .getPluginsAsMap()
236 .get(pluginId);
237 }
238
239 return plugin;
240 }
241
242
243
244
245
246
247 protected String getPluginParameter(String pluginId, String param) {
248 Plugin plugin = getPlugin(pluginId);
249 if (plugin != null) {
250 Xpp3Dom xpp3Dom = (Xpp3Dom) plugin.getConfiguration();
251 if (xpp3Dom != null
252 && xpp3Dom.getChild(param) != null
253 && StringUtils.isNotEmpty(xpp3Dom.getChild(param).getValue())) {
254 return xpp3Dom.getChild(param).getValue();
255 }
256 }
257
258 return null;
259 }
260
261
262
263
264
265
266 protected String getI18nString(Locale locale, String key) {
267 return getI18N(locale).getString("project-info-reports", locale, "report." + getI18Nsection() + '.' + key);
268 }
269
270
271
272
273
274 protected I18N getI18N(Locale locale) {
275 if (customBundle != null) {
276 File customBundleFile = new File(customBundle);
277 if (customBundleFile.isFile() && customBundleFile.getName().endsWith(".properties")) {
278 if (!i18n.getClass().isAssignableFrom(CustomI18N.class)
279 || !i18n.getDefaultLanguage().equals(locale.getLanguage())) {
280
281 i18n = new CustomI18N(project, settings, customBundleFile, locale, i18n);
282 }
283 }
284 }
285
286 return i18n;
287 }
288
289
290
291
292 protected abstract String getI18Nsection();
293
294
295 public String getName(Locale locale) {
296 return getI18nString(locale, "name");
297 }
298
299
300 public String getDescription(Locale locale) {
301 return getI18nString(locale, "description");
302 }
303
304 private static class CustomI18N implements I18N {
305 private final MavenProject project;
306
307 private final Settings settings;
308
309 private final String bundleName;
310
311 private final Locale locale;
312
313 private final I18N i18nOriginal;
314
315 private ResourceBundle bundle;
316
317 private static final Object[] NO_ARGS = new Object[0];
318
319 CustomI18N(MavenProject project, Settings settings, File customBundleFile, Locale locale, I18N i18nOriginal) {
320 super();
321 this.project = project;
322 this.settings = settings;
323 this.locale = locale;
324 this.i18nOriginal = i18nOriginal;
325 this.bundleName = customBundleFile
326 .getName()
327 .substring(0, customBundleFile.getName().indexOf(".properties"));
328
329 URLClassLoader classLoader = null;
330 try {
331 classLoader = new URLClassLoader(
332 new URL[] {customBundleFile.getParentFile().toURI().toURL()}, null);
333 } catch (MalformedURLException e) {
334
335 }
336
337 this.bundle = ResourceBundle.getBundle(this.bundleName, locale, classLoader);
338 if (!this.bundle.getLocale().getLanguage().equals(locale.getLanguage())) {
339 this.bundle = ResourceBundle.getBundle(this.bundleName, Locale.getDefault(), classLoader);
340 }
341 }
342
343
344 public String getDefaultLanguage() {
345 return locale.getLanguage();
346 }
347
348
349 public String getDefaultCountry() {
350 return locale.getCountry();
351 }
352
353
354 public String getDefaultBundleName() {
355 return bundleName;
356 }
357
358
359 public String[] getBundleNames() {
360 return new String[] {bundleName};
361 }
362
363
364 public ResourceBundle getBundle() {
365 return bundle;
366 }
367
368
369 public ResourceBundle getBundle(String bundleName) {
370 return bundle;
371 }
372
373
374 public ResourceBundle getBundle(String bundleName, String languageHeader) {
375 return bundle;
376 }
377
378
379 public ResourceBundle getBundle(String bundleName, Locale locale) {
380 return bundle;
381 }
382
383
384 public Locale getLocale(String languageHeader) {
385 return new Locale(languageHeader);
386 }
387
388
389 public String getString(String key) {
390 return getString(bundleName, locale, key);
391 }
392
393
394 public String getString(String key, Locale locale) {
395 return getString(bundleName, locale, key);
396 }
397
398
399 public String getString(String bundleName, Locale locale, String key) {
400 String value;
401
402 if (locale == null) {
403 locale = getLocale(null);
404 }
405
406 ResourceBundle rb = getBundle(bundleName, locale);
407 value = getStringOrNull(rb, key);
408
409 if (value == null) {
410
411 value = i18nOriginal.getString(bundleName, locale, key);
412 }
413
414 if (!value.contains("${")) {
415 return value;
416 }
417
418 final RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
419 try {
420 interpolator.addValueSource(new EnvarBasedValueSource());
421 } catch (final IOException e) {
422
423 }
424
425 interpolator.addValueSource(new PropertiesBasedValueSource(System.getProperties()));
426 interpolator.addValueSource(new PropertiesBasedValueSource(project.getProperties()));
427 interpolator.addValueSource(new PrefixedObjectValueSource("project", project));
428 interpolator.addValueSource(new PrefixedObjectValueSource("pom", project));
429 interpolator.addValueSource(new PrefixedObjectValueSource("settings", settings));
430
431 try {
432 value = interpolator.interpolate(value);
433 } catch (final InterpolationException e) {
434
435 }
436
437 return value;
438 }
439
440
441 public String format(String key, Object arg1) {
442 return format(bundleName, locale, key, new Object[] {arg1});
443 }
444
445
446 public String format(String key, Object arg1, Object arg2) {
447 return format(bundleName, locale, key, new Object[] {arg1, arg2});
448 }
449
450
451 public String format(String bundleName, Locale locale, String key, Object arg1) {
452 return format(bundleName, locale, key, new Object[] {arg1});
453 }
454
455
456 public String format(String bundleName, Locale locale, String key, Object arg1, Object arg2) {
457 return format(bundleName, locale, key, new Object[] {arg1, arg2});
458 }
459
460
461 public String format(String bundleName, Locale locale, String key, Object[] args) {
462 if (locale == null) {
463 locale = getLocale(null);
464 }
465
466 String value = getString(bundleName, locale, key);
467 if (args == null) {
468 args = NO_ARGS;
469 }
470
471 MessageFormat messageFormat = new MessageFormat("");
472 messageFormat.setLocale(locale);
473 messageFormat.applyPattern(value);
474
475 return messageFormat.format(args);
476 }
477
478 private String getStringOrNull(ResourceBundle rb, String key) {
479 if (rb != null) {
480 try {
481 return rb.getString(key);
482 } catch (MissingResourceException ignored) {
483
484 }
485 }
486 return null;
487 }
488 }
489 }