View Javadoc

1   package org.apache.maven.plugin.changes;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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   * Generates a changes report.
33   *
34   * @version $Id: ChangesReportGenerator.html 816584 2012-05-08 12:33:35Z hboutemy $
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         // @todo Temporarily commented out until MCHANGES-46 is completely solved
205         //        sink.rawText( bundle.getString( "report.changes.text.rssfeed" ) );
206         //        sink.text( " " );
207         //        sink.link( "changes.rss" );
208         //        sinkFigure( "images/rss.png", sink );
209         //        sink.link_();
210         //
211         //        sink.lineBreak();
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 }