1 package org.apache.rat.mp;
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.artifact.Artifact;
23 import org.apache.maven.artifact.factory.ArtifactFactory;
24 import org.apache.maven.artifact.repository.ArtifactRepository;
25 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
26 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
27 import org.apache.maven.artifact.resolver.ArtifactResolver;
28 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
29 import org.apache.maven.artifact.versioning.VersionRange;
30 import org.apache.maven.doxia.site.decoration.Body;
31 import org.apache.maven.doxia.site.decoration.DecorationModel;
32 import org.apache.maven.doxia.site.decoration.Skin;
33 import org.apache.maven.doxia.siterenderer.Renderer;
34 import org.apache.maven.doxia.siterenderer.RendererException;
35 import org.apache.maven.doxia.siterenderer.RenderingContext;
36 import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
37 import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
38 import org.apache.maven.plugin.MojoExecutionException;
39 import org.apache.maven.plugin.MojoFailureException;
40 import org.apache.maven.plugins.annotations.Component;
41 import org.apache.maven.plugins.annotations.Mojo;
42 import org.apache.maven.plugins.annotations.Parameter;
43 import org.apache.maven.plugins.annotations.ResolutionScope;
44 import org.apache.maven.reporting.MavenReport;
45 import org.apache.maven.reporting.MavenReportException;
46 import org.apache.rat.Defaults;
47 import org.codehaus.doxia.sink.Sink;
48
49 import java.io.File;
50 import java.io.FileWriter;
51 import java.io.IOException;
52 import java.io.Writer;
53 import java.util.HashMap;
54 import java.util.Iterator;
55 import java.util.Locale;
56 import java.util.Map;
57 import java.util.ResourceBundle;
58
59
60
61
62
63 @SuppressWarnings("deprecation")
64 @Mojo(name = "rat", requiresDependencyResolution = ResolutionScope.TEST)
65 public class RatReportMojo extends AbstractRatMojo implements MavenReport {
66 public static final String DOT_HTML = ".html";
67 @Component
68 private Renderer siteRenderer;
69
70 @Component
71 private ArtifactFactory factory;
72
73 @Component
74 private ArtifactResolver resolver;
75
76
77
78
79 @Parameter(defaultValue = "${project.reporting.outputDirectory}", required = true)
80 private File outputDirectory;
81
82 @Parameter(defaultValue = "${localRepository}", required = true, readonly = true)
83 private ArtifactRepository localRepository;
84
85
86
87
88
89
90
91
92 private File getSkinArtifactFile() throws MojoFailureException, MojoExecutionException {
93 final Skin skin = Skin.getDefaultSkin();
94
95 String version = skin.getVersion();
96 final Artifact artifact;
97 try {
98 if (version == null) {
99 version = Artifact.RELEASE_VERSION;
100 }
101 VersionRange versionSpec = VersionRange.createFromVersionSpec(version);
102 artifact =
103 factory.createDependencyArtifact(skin.getGroupId(), skin.getArtifactId(), versionSpec, "jar", null,
104 null);
105
106 resolver.resolve(artifact, getProject().getRemoteArtifactRepositories(), localRepository);
107 } catch (InvalidVersionSpecificationException e) {
108 throw new MojoFailureException("The skin version '" + version + "' is not valid: " + e.getMessage());
109 } catch (ArtifactResolutionException e) {
110 throw new MojoExecutionException("Unable to find skin", e);
111 } catch (ArtifactNotFoundException e) {
112 throw new MojoFailureException("The skin does not exist: " + e.getMessage());
113 }
114
115 return artifact.getFile();
116 }
117
118
119
120
121
122
123
124 public void execute() throws MojoExecutionException, MojoFailureException {
125 if (skip) {
126 getLog().info("RAT will not execute since it is configured to be skipped via system property 'rat.skip'.");
127 return;
128 }
129
130 final DecorationModel model = new DecorationModel();
131 model.setBody(new Body());
132 final Map<String, String> attributes = new HashMap<String, String>();
133 attributes.put("outputEncoding", "UTF-8");
134 final Locale locale = Locale.getDefault();
135 try {
136 final SiteRenderingContext siteContext =
137 siteRenderer.createContextForSkin(getSkinArtifactFile(), attributes, model, getName(locale),
138 locale);
139 final RenderingContext context = new RenderingContext(outputDirectory, getOutputName() + DOT_HTML);
140
141 final SiteRendererSink sink = new SiteRendererSink(context);
142 generate(sink, locale);
143
144 if (!outputDirectory.mkdirs() && !outputDirectory.isDirectory()) {
145 throw new IOException("Could not create output directory " + outputDirectory);
146 }
147
148
149 final Writer writer = new FileWriter(new File(outputDirectory, getOutputName() + DOT_HTML));
150
151 siteRenderer.generateDocument(writer, sink, siteContext);
152
153 siteRenderer.copyResources(siteContext, new File(getProject().getBasedir(), "src/site/resources"),
154 outputDirectory);
155 } catch (IOException e) {
156 throw new MojoExecutionException(e.getMessage(), e);
157 } catch (MavenReportException e) {
158 throw new MojoExecutionException(e.getMessage(), e);
159 } catch (RendererException e) {
160 throw new MojoExecutionException(e.getMessage(), e);
161 }
162 }
163
164
165
166
167
168
169 public boolean canGenerateReport() {
170 return true;
171 }
172
173
174
175
176
177
178 private String getRatVersion() {
179 for (@SuppressWarnings("unchecked")
180 Iterator<Artifact> iter = getProject().getDependencyArtifacts().iterator(); iter.hasNext(); ) {
181 Artifact a = iter.next();
182 if ("rat-lib".equals(a.getArtifactId())) {
183 return a.getVersion();
184 }
185 }
186 return null;
187 }
188
189
190
191
192
193
194
195
196 public void generate(Sink sink, Locale locale) throws MavenReportException {
197 ResourceBundle bundle = getBundle(locale);
198 final String title = bundle.getString("report.rat.title");
199 sink.head();
200 sink.title();
201 sink.text(title);
202 sink.title_();
203 sink.head_();
204
205 sink.body();
206
207 sink.section1();
208 sink.sectionTitle1();
209 sink.text(title);
210 sink.sectionTitle1_();
211
212 sink.paragraph();
213 sink.text(bundle.getString("report.rat.link") + " ");
214 sink.link(bundle.getString("report.rat.url"));
215 sink.text(bundle.getString("report.rat.fullName"));
216 sink.link_();
217 final String ratVersion = getRatVersion();
218 if (ratVersion != null) {
219 sink.text(" " + ratVersion);
220 }
221 sink.text(".");
222 sink.paragraph_();
223
224 sink.paragraph();
225 sink.verbatim(true);
226 try {
227 sink.text(createReport(Defaults.getDefaultStyleSheet()));
228 } catch (MojoExecutionException e) {
229 throw new MavenReportException(e.getMessage(), e);
230 } catch (MojoFailureException e) {
231 throw new MavenReportException(e.getMessage(), e);
232 }
233 sink.verbatim_();
234 sink.paragraph_();
235 sink.section1_();
236 sink.body_();
237 }
238
239
240
241
242
243
244 public String getCategoryName() {
245 return MavenReport.CATEGORY_PROJECT_REPORTS;
246 }
247
248
249
250
251
252
253
254 private ResourceBundle getBundle(Locale locale) {
255 return ResourceBundle.getBundle("org/apache/rat/mp/rat-report", locale, getClass().getClassLoader());
256 }
257
258
259
260
261
262
263
264 public String getDescription(Locale locale) {
265 return getBundle(locale).getString("report.rat.description");
266 }
267
268
269
270
271
272
273
274 public String getName(Locale locale) {
275 return getBundle(locale).getString("report.rat.name");
276 }
277
278
279
280
281
282
283 public String getOutputName() {
284 return "rat-report";
285 }
286
287
288
289
290
291
292 public File getReportOutputDirectory() {
293 return outputDirectory;
294 }
295
296
297
298
299
300
301 public boolean isExternalReport() {
302 return false;
303 }
304
305
306
307
308
309
310 public void setReportOutputDirectory(File pOutputDirectory) {
311 outputDirectory = pOutputDirectory;
312 }
313 }