1 package org.apache.maven.reporting;
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.doxia.sink.Sink;
23 import org.apache.maven.doxia.sink.SinkFactory;
24 import org.apache.maven.doxia.sink.render.RenderingContext;
25 import org.apache.maven.doxia.site.decoration.DecorationModel;
26 import org.apache.maven.doxia.siterenderer.Renderer;
27 import org.apache.maven.doxia.siterenderer.RendererException;
28 import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
29 import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
30 import org.apache.maven.plugin.AbstractMojo;
31 import org.apache.maven.plugin.MojoExecutionException;
32 import org.apache.maven.project.MavenProject;
33 import org.codehaus.plexus.util.IOUtil;
34
35 import java.io.File;
36 import java.io.FileOutputStream;
37 import java.io.IOException;
38 import java.io.OutputStreamWriter;
39 import java.io.Writer;
40 import java.util.Locale;
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 public abstract class AbstractMavenReport
59 extends AbstractMojo
60 implements MavenMultiPageReport
61 {
62
63 private Sink sink;
64
65
66 private SinkFactory sinkFactory;
67
68
69 private File reportOutputDirectory;
70
71
72
73
74
75
76
77
78 public void execute()
79 throws MojoExecutionException
80 {
81 if ( !canGenerateReport() )
82 {
83 return;
84 }
85
86 Writer writer = null;
87 try
88 {
89 File outputDirectory = new File( getOutputDirectory() );
90
91 String filename = getOutputName() + ".html";
92
93 Locale locale = Locale.getDefault();
94
95 SiteRenderingContext siteContext = new SiteRenderingContext();
96 siteContext.setDecoration( new DecorationModel() );
97 siteContext.setTemplateName( "org/apache/maven/doxia/siterenderer/resources/default-site.vm" );
98 siteContext.setLocale( locale );
99
100 RenderingContext context = new RenderingContext( outputDirectory, filename );
101
102 SiteRendererSink sink = new SiteRendererSink( context );
103
104 generate( sink, null, locale );
105
106 if ( !isExternalReport() )
107 {
108 outputDirectory.mkdirs();
109
110 writer =
111 new OutputStreamWriter( new FileOutputStream( new File( outputDirectory, filename ) ), "UTF-8" );
112
113 getSiteRenderer().generateDocument( writer, sink, siteContext );
114
115
116
117 }
118 }
119 catch ( RendererException e )
120 {
121 throw new MojoExecutionException(
122 "An error has occurred in " + getName( Locale.ENGLISH ) + " report generation.", e );
123 }
124 catch ( IOException e )
125 {
126 throw new MojoExecutionException(
127 "An error has occurred in " + getName( Locale.ENGLISH ) + " report generation.", e );
128 }
129 catch ( MavenReportException e )
130 {
131 throw new MojoExecutionException(
132 "An error has occurred in " + getName( Locale.ENGLISH ) + " report generation.", e );
133 }
134 finally
135 {
136 IOUtil.close( writer );
137 }
138 }
139
140
141
142
143
144
145
146
147
148 public void generate( org.codehaus.doxia.sink.Sink aSink, Locale aLocale )
149 throws MavenReportException
150 {
151 generate( aSink, null, aLocale );
152 }
153
154
155
156
157
158
159
160
161
162
163 public void generate( Sink aSink, Locale aLocale )
164 throws MavenReportException
165 {
166 generate( aSink, null, aLocale );
167 }
168
169
170
171
172
173
174
175
176
177 public void generate( Sink aSink, SinkFactory aSinkFactory, Locale aLocale )
178 throws MavenReportException
179 {
180 if ( aSink == null )
181 {
182 throw new MavenReportException( "You must specify a sink." );
183 }
184
185 if ( !canGenerateReport() )
186 {
187 getLog().info( "This report cannot be generated as part of the current build. "
188 + "The report name should be referenced in this line of output." );
189 return;
190 }
191
192 this.sink = aSink;
193
194 this.sinkFactory = aSinkFactory;
195
196 executeReport( aLocale );
197
198 closeReport();
199 }
200
201
202
203
204
205 public String getCategoryName()
206 {
207 return CATEGORY_PROJECT_REPORTS;
208 }
209
210
211 public File getReportOutputDirectory()
212 {
213 if ( reportOutputDirectory == null )
214 {
215 reportOutputDirectory = new File( getOutputDirectory() );
216 }
217
218 return reportOutputDirectory;
219 }
220
221
222 public void setReportOutputDirectory( File reportOutputDirectory )
223 {
224 this.reportOutputDirectory = reportOutputDirectory;
225 }
226
227
228
229
230 protected void closeReport()
231 {
232 getSink().close();
233 }
234
235
236
237
238 public Sink getSink()
239 {
240 return sink;
241 }
242
243
244
245
246 public SinkFactory getSinkFactory()
247 {
248 return sinkFactory;
249 }
250
251
252
253
254
255 public boolean isExternalReport()
256 {
257 return false;
258 }
259
260
261 public boolean canGenerateReport()
262 {
263 return true;
264 }
265
266
267
268
269 protected abstract Renderer getSiteRenderer();
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284 protected abstract String getOutputDirectory();
285
286
287
288
289 protected abstract MavenProject getProject();
290
291
292
293
294
295
296
297 protected abstract void executeReport( Locale locale )
298 throws MavenReportException;
299 }