1 package org.apache.maven.plugin.changes;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.commons.lang.StringUtils;
23 import org.apache.maven.doxia.sink.Sink;
24 import org.apache.maven.doxia.util.HtmlTools;
25 import org.apache.maven.plugin.logging.Log;
26
27 import java.io.File;
28 import java.util.List;
29 import java.util.ResourceBundle;
30
31
32
33
34
35
36 public class ChangesReportGenerator
37 {
38 private ChangesXML report;
39
40 private String issueLink;
41
42 private String url;
43
44 public ChangesReportGenerator()
45 {
46 }
47
48 public ChangesReportGenerator( File xmlPath, Log log )
49 {
50 report = new ChangesXML( xmlPath, log );
51 }
52
53 public void setIssueLink( String issueLink )
54 {
55 this.issueLink = issueLink;
56 }
57
58 public String getIssueLink()
59 {
60 return issueLink;
61 }
62
63 public void setUrl( String url )
64 {
65 this.url = url;
66 }
67
68 public String getUrl()
69 {
70 return url;
71 }
72
73 public void doGenerateEmptyReport( ResourceBundle bundle, Sink sink, String message )
74 {
75 sinkBeginReport( sink, bundle );
76
77 sink.text( message );
78
79 sinkEndReport( sink );
80 }
81
82 public void doGenerateReport( ResourceBundle bundle, Sink sink )
83 {
84 sinkBeginReport( sink, bundle );
85
86 constructReleaseHistory( sink, bundle );
87
88 constructReleases( sink, bundle );
89
90 sinkEndReport( sink );
91 }
92
93 private void constructActions( Sink sink, List actionList, ResourceBundle bundle )
94 {
95 sink.table();
96
97 sink.tableRow();
98
99 sinkHeader( sink, bundle.getString( "report.changes.label.type" ) );
100
101 sinkHeader( sink, bundle.getString( "report.changes.label.changes" ) );
102
103 sinkHeader( sink, bundle.getString( "report.changes.label.by" ) );
104
105 sink.tableRow_();
106
107 for ( int idx = 0; idx < actionList.size(); idx++ )
108 {
109 Action action = (Action) actionList.get( idx );
110
111 sink.tableRow();
112
113 sinkShowTypeIcon( sink, action.getType() );
114
115 sink.tableCell();
116
117 sink.rawText( action.getAction() );
118
119 if ( StringUtils.isNotEmpty( action.getIssue() ) )
120 {
121 sink.text( " " + bundle.getString( "report.changes.text.fixes" ) + " " );
122
123 if ( StringUtils.isEmpty( url ) )
124 {
125 sink.text( action.getIssue() );
126
127 }
128 else
129 {
130 sink.link( parseIssueLink( action.getIssue() ) );
131
132 sink.text( action.getIssue() );
133
134 sink.link_();
135
136 }
137 sink.text( "." );
138 }
139
140 if ( StringUtils.isNotEmpty( action.getDueTo() ) )
141 {
142 sink.text( " " + bundle.getString( "report.changes.text.thanx" ) + " " );
143
144 if ( StringUtils.isNotEmpty( action.getDueToEmail() ) )
145 {
146 sinkLink( sink, action.getDueTo(), "mailto:" + action.getDueToEmail() );
147 }
148 else
149 {
150 sink.text( action.getDueTo() );
151 }
152
153 sink.text( "." );
154 }
155
156 sink.tableCell_();
157
158 sinkCellLink( sink, action.getDev(), "team-list.html#" + action.getDev() );
159
160 sink.tableRow_();
161 }
162
163 sink.table_();
164 }
165
166 private void constructReleaseHistory( Sink sink, ResourceBundle bundle )
167 {
168 sinkSectionTitle2Anchor( sink, bundle.getString( "report.changes.label.releasehistory" ), bundle
169 .getString( "report.changes.label.releasehistory" ) );
170
171 List releaseList = report.getReleaseList();
172
173 sink.table();
174
175 sink.tableRow();
176
177 sinkHeader( sink, bundle.getString( "report.changes.label.version" ) );
178
179 sinkHeader( sink, bundle.getString( "report.changes.label.date" ) );
180
181 sinkHeader( sink, bundle.getString( "report.changes.label.description" ) );
182
183 sink.tableRow_();
184
185 for ( int idx = 0; idx < releaseList.size(); idx++ )
186 {
187 Release release = (Release) releaseList.get( idx );
188
189 sink.tableRow();
190
191 sinkCellLink( sink, release.getVersion(), "#" + HtmlTools.encodeId( release.getVersion() ) );
192
193 sinkCell( sink, release.getDateRelease() );
194
195 sinkCell( sink, release.getDescription() );
196
197 sink.tableRow_();
198 }
199
200 sink.table_();
201
202 sink.lineBreak();
203
204
205
206
207
208
209
210
211
212
213 sink.lineBreak();
214 }
215
216 private void constructReleases( Sink sink, ResourceBundle bundle )
217 {
218 List releaseList = report.getReleaseList();
219
220 for ( int idx = 0; idx < releaseList.size(); idx++ )
221 {
222 Release release = (Release) releaseList.get( idx );
223
224 sinkSectionTitle2Anchor( sink, bundle.getString( "report.changes.label.release" ) + " "
225 + release.getVersion() + " - " + release.getDateRelease(), HtmlTools.encodeId( release.getVersion() ) );
226
227 constructActions( sink, release.getAction(), bundle );
228 }
229 }
230
231 private String parseIssueLink( String issue )
232 {
233 String parseLink = "";
234
235 String url = this.url.substring( 0, this.url.lastIndexOf( "/" ) );
236
237 parseLink = this.issueLink.replaceFirst( "%ISSUE%", issue );
238
239 parseLink = parseLink.replaceFirst( "%URL%", url );
240
241 return parseLink;
242 }
243
244 private void sinkBeginReport( Sink sink, ResourceBundle bundle )
245 {
246 sink.head();
247
248 sink.title();
249 sink.text( bundle.getString( "report.changes.header" ) );
250 sink.title_();
251
252 if ( StringUtils.isNotEmpty( report.getAuthor() ) )
253 {
254 sink.author();
255 sink.text( report.getAuthor() );
256 sink.author_();
257 }
258
259 sink.head_();
260
261 sink.body();
262
263 sinkSectionTitle1Anchor( sink, bundle.getString( "report.changes.header" ), bundle
264 .getString( "report.changes.header" ) );
265 }
266
267 private void sinkCell( Sink sink, String text )
268 {
269 sink.tableCell();
270
271 sink.text( text );
272
273 sink.tableCell_();
274 }
275
276 private void sinkCellLink( Sink sink, String text, String link )
277 {
278 sink.tableCell();
279
280 sinkLink( sink, text, link );
281
282 sink.tableCell_();
283 }
284
285 private void sinkEndReport( Sink sink )
286 {
287 sink.body_();
288
289 sink.flush();
290
291 sink.close();
292 }
293
294 private void sinkFigure( String image, Sink sink )
295 {
296 sink.figure();
297
298 sink.figureGraphics( image );
299
300 sink.figure_();
301 }
302
303 private void sinkFigure( String image, Sink sink, String altText )
304 {
305 sink.figure();
306
307 sink.figureGraphics( image );
308
309 sink.figureCaption();
310
311 sink.text( altText );
312
313 sink.figureCaption_();
314
315 sink.figure_();
316 }
317
318 private void sinkHeader( Sink sink, String header )
319 {
320 sink.tableHeaderCell();
321
322 sink.text( header );
323
324 sink.tableHeaderCell_();
325 }
326
327 private void sinkLink( Sink sink, String text, String link )
328 {
329 sink.link( link );
330
331 sink.text( text );
332
333 sink.link_();
334 }
335
336 private void sinkSectionTitle1Anchor( Sink sink, String text, String anchor )
337 {
338 sink.sectionTitle1();
339 sink.anchor( anchor );
340 sink.anchor_();
341 sink.text( text );
342 sink.sectionTitle1_();
343 }
344
345 private void sinkSectionTitle2Anchor( Sink sink, String text, String anchor )
346 {
347 sink.sectionTitle2();
348 sink.anchor( anchor );
349 sink.anchor_();
350 sink.text( text );
351 sink.sectionTitle2_();
352 }
353
354 private void sinkShowTypeIcon( Sink sink, String type )
355 {
356 String image = "";
357 String altText = "";
358
359 if ( type == null )
360 {
361 image = "images/icon_help_sml.gif";
362 altText = "?";
363 }
364 else if ( type.equals( "fix" ) )
365 {
366 image = "images/fix.gif";
367 altText = "fix";
368 }
369 else if ( type.equals( "update" ) )
370 {
371 image = "images/update.gif";
372 altText = "update";
373 }
374 else if ( type.equals( "add" ) )
375 {
376 image = "images/add.gif";
377 altText = "add";
378 }
379 else if ( type.equals( "remove" ) )
380 {
381 image = "images/remove.gif";
382 altText = "remove";
383 }
384
385 sink.tableCell();
386
387 sinkFigure( image, sink, altText );
388
389 sink.tableCell_();
390 }
391
392 }