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 java.io.File;
23 import java.io.FileWriter;
24 import java.io.IOException;
25 import java.io.PrintWriter;
26 import java.io.StringWriter;
27 import java.io.Writer;
28 import java.util.HashMap;
29 import java.util.Iterator;
30 import java.util.Locale;
31 import java.util.Map;
32 import java.util.ResourceBundle;
33
34 import org.apache.maven.artifact.Artifact;
35 import org.apache.maven.artifact.factory.ArtifactFactory;
36 import org.apache.maven.artifact.repository.ArtifactRepository;
37 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
38 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
39 import org.apache.maven.artifact.resolver.ArtifactResolver;
40 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
41 import org.apache.maven.artifact.versioning.VersionRange;
42 import org.apache.maven.doxia.module.xhtml.decoration.render.RenderingContext;
43 import org.apache.maven.doxia.site.decoration.Body;
44 import org.apache.maven.doxia.site.decoration.DecorationModel;
45 import org.apache.maven.doxia.site.decoration.Skin;
46 import org.apache.maven.doxia.siterenderer.Renderer;
47 import org.apache.maven.doxia.siterenderer.RendererException;
48 import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
49 import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
50 import org.apache.maven.plugin.MojoExecutionException;
51 import org.apache.maven.plugin.MojoFailureException;
52 import org.apache.maven.reporting.MavenReport;
53 import org.apache.maven.reporting.MavenReportException;
54 import org.apache.rat.Defaults;
55 import org.apache.maven.doxia.sink.Sink;
56
57
58
59
60
61
62
63
64 public class RatReportMojo extends AbstractRatMojo implements MavenReport
65 {
66
67
68
69
70
71
72 private File outputDirectory;
73
74
75
76
77 private Renderer siteRenderer;
78
79
80
81
82 private ArtifactFactory factory;
83
84
85
86
87 private ArtifactResolver resolver;
88
89
90
91
92
93
94 private ArtifactRepository localRepository;
95
96
97
98
99
100
101
102
103
104
105 private File getSkinArtifactFile() throws MojoFailureException, MojoExecutionException
106 {
107 Skin skin = Skin.getDefaultSkin();
108
109 String version = skin.getVersion();
110 Artifact artifact;
111 try
112 {
113 if ( version == null )
114 {
115 version = Artifact.RELEASE_VERSION;
116 }
117 VersionRange versionSpec = VersionRange.createFromVersionSpec( version );
118 artifact =
119 factory.createDependencyArtifact( skin.getGroupId(), skin.getArtifactId(), versionSpec, "jar", null,
120 null );
121
122 resolver.resolve( artifact, getProject().getRemoteArtifactRepositories(), localRepository );
123 }
124 catch ( InvalidVersionSpecificationException e )
125 {
126 throw new MojoFailureException( "The skin version '" + version + "' is not valid: " + e.getMessage() );
127 }
128 catch ( ArtifactResolutionException e )
129 {
130 throw new MojoExecutionException( "Unable to find skin", e );
131 }
132 catch ( ArtifactNotFoundException e )
133 {
134 throw new MojoFailureException( "The skin does not exist: " + e.getMessage() );
135 }
136
137 return artifact.getFile();
138 }
139
140
141
142
143
144
145
146
147
148
149 private String createReport() throws MojoExecutionException, MojoFailureException
150 {
151 StringWriter sw = new StringWriter();
152 PrintWriter pw = null;
153 try
154 {
155 pw = new PrintWriter( sw );
156 createReport( new PrintWriter( sw ), Defaults.getDefaultStyleSheet() );
157 final String result = sw.toString();
158 pw.close();
159 pw = null;
160 sw.close();
161 sw = null;
162 return result;
163 }
164 catch ( IOException e )
165 {
166 throw new MojoExecutionException( e.getMessage(), e );
167 }
168 finally
169 {
170 if ( pw != null )
171 {
172 try
173 {
174 pw.close();
175 }
176 catch ( Throwable t )
177 {
178
179 }
180 }
181 if ( sw != null )
182 {
183 try
184 {
185 sw.close();
186 }
187 catch ( Throwable t )
188 {
189
190 }
191 }
192 }
193 }
194
195
196
197
198
199
200
201
202
203 public void execute() throws MojoExecutionException, MojoFailureException
204 {
205 DecorationModel model = new DecorationModel();
206 model.setBody( new Body() );
207 Map attributes = new HashMap();
208 attributes.put( "outputEncoding", "UTF-8" );
209 Locale locale = Locale.getDefault();
210 try
211 {
212 SiteRenderingContext siteContext =
213 siteRenderer.createContextForSkin( getSkinArtifactFile(), attributes, model, getName( locale ),
214 locale );
215 RenderingContext context = new RenderingContext( outputDirectory, getOutputName() + ".html" );
216
217 SiteRendererSink sink = new SiteRendererSink( context );
218 generate( sink, locale );
219
220 outputDirectory.mkdirs();
221
222 Writer writer = new FileWriter( new File( outputDirectory, getOutputName() + ".html" ) );
223
224 siteRenderer.generateDocument( writer, sink, siteContext );
225
226 siteRenderer.copyResources( siteContext, new File( getProject().getBasedir(), "src/site/resources" ),
227 outputDirectory );
228 }
229 catch ( IOException e )
230 {
231 throw new MojoExecutionException( e.getMessage(), e );
232 }
233 catch ( MavenReportException e )
234 {
235 throw new MojoExecutionException( e.getMessage(), e );
236 }
237 catch ( RendererException e )
238 {
239 throw new MojoExecutionException( e.getMessage(), e );
240 }
241 }
242
243
244
245
246
247
248 public boolean canGenerateReport()
249 {
250 return true;
251 }
252
253
254
255
256
257
258 private String getRatVersion()
259 {
260 for ( Iterator iter = getProject().getDependencyArtifacts().iterator(); iter.hasNext(); )
261 {
262 Artifact a = (Artifact) iter.next();
263 if ( "rat-lib".equals( a.getArtifactId() ) )
264 {
265 return a.getVersion();
266 }
267 }
268 return null;
269 }
270
271
272
273
274
275
276
277
278
279
280
281 public void generate( Sink sink, Locale locale ) throws MavenReportException
282 {
283 ResourceBundle bundle = getBundle( locale );
284 final String title = bundle.getString( "report.rat.title" );
285 sink.head();
286 sink.title();
287 sink.text( title );
288 sink.title_();
289 sink.head_();
290
291 sink.body();
292
293 sink.section1();
294 sink.sectionTitle1();
295 sink.text( title );
296 sink.sectionTitle1_();
297
298 sink.paragraph();
299 sink.text( bundle.getString( "report.rat.link" ) + " " );
300 sink.link( bundle.getString( "report.rat.url" ) );
301 sink.text( bundle.getString( "report.rat.fullName" ) );
302 sink.link_();
303 final String ratVersion = getRatVersion();
304 if ( ratVersion != null )
305 {
306 sink.text( " " + ratVersion );
307 }
308 sink.text( "." );
309 sink.paragraph_();
310
311 sink.paragraph();
312 sink.verbatim( true );
313 try
314 {
315 sink.text( createReport() );
316 }
317 catch ( MojoExecutionException e )
318 {
319 throw new MavenReportException( e.getMessage(), e );
320 }
321 catch ( MojoFailureException e )
322 {
323 throw new MavenReportException( e.getMessage(), e );
324 }
325 sink.verbatim_();
326 sink.paragraph_();
327 sink.section1_();
328 sink.body_();
329 }
330
331
332
333
334
335
336 public String getCategoryName()
337 {
338 return MavenReport.CATEGORY_PROJECT_REPORTS;
339 }
340
341
342
343
344
345
346
347
348 private ResourceBundle getBundle( Locale locale )
349 {
350 return ResourceBundle.getBundle( "org/apache/rat/mp/rat-report", locale, getClass().getClassLoader() );
351 }
352
353
354
355
356
357
358
359
360 public String getDescription( Locale locale )
361 {
362 return getBundle( locale ).getString( "report.rat.description" );
363 }
364
365
366
367
368
369
370
371
372 public String getName( Locale locale )
373 {
374 return getBundle( locale ).getString( "report.rat.name" );
375 }
376
377
378
379
380
381
382 public String getOutputName()
383 {
384 return "rat-report";
385 }
386
387
388
389
390
391
392 public File getReportOutputDirectory()
393 {
394 return outputDirectory;
395 }
396
397
398
399
400
401
402 public boolean isExternalReport()
403 {
404 return false;
405 }
406
407
408
409
410
411
412
413 public void setReportOutputDirectory( File pOutputDirectory )
414 {
415 outputDirectory = pOutputDirectory;
416 }
417 }