View Javadoc

1   package org.apache.maven.plugin.trac;
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 java.text.SimpleDateFormat;
23  import java.util.ArrayList;
24  import java.util.List;
25  import java.util.ResourceBundle;
26  
27  import org.apache.maven.doxia.sink.Sink;
28  import org.apache.maven.reporting.MavenReportException;
29  
30  /**
31   * Generates a Trac report.
32   *
33   * @author Noriko Kinugasa
34   * @version $Id: TracReportGenerator.html 816595 2012-05-08 12:43:00Z hboutemy $
35   */
36  public class TracReportGenerator
37  {
38      private static final int COLUMN_ID = 0;
39      private static final int COLUMN_TYPE = 1;
40      private static final int COLUMN_SUMMARY = 2;
41      private static final int COLUMN_STATUS = 3;
42      private static final int COLUMN_RESOLUTION = 4;
43      private static final int COLUMN_MILESTONE = 5;
44      private static final int COLUMN_OWNER = 6;
45      private static final int COLUMN_PRIORITY = 7;
46      private static final int COLUMN_REPORTER = 8;
47      private static final int COLUMN_COMPONENT = 9;
48      private static final int COLUMN_CREATED = 10;
49      private static final int COLUMN_CHANGED = 11;
50  
51      /**
52       * Valid Trac columns.
53       */
54      private static final String[] TRAC_COLUMNS = {
55              /* 0 */ "id",
56              /* 1 */ "type",
57              /* 2 */ "summary",
58              /* 3 */ "status",
59              /* 4 */ "resolution",
60              /* 5 */ "milestone",
61              /* 6 */ "owner",
62              /* 7 */ "priority",
63              /* 8 */ "reporter",
64              /* 9 */ "component",
65              /* 10 */ "created",
66              /* 11 */ "changed"
67      };
68  
69      private int[] columnOrder;
70  
71      public TracReportGenerator( String columnNames )
72          throws MavenReportException
73      {
74          String[] columnNamesArray = columnNames.split( "," );
75          int validColumnNames = 0;
76          columnOrder = new int[columnNamesArray.length];
77          for ( int i = 0; i < columnOrder.length; i++ )
78          {
79              // Default to -1, indicating that the column should not be included in the report
80              columnOrder[i] = -1;
81              for ( int columnIndex = 0; columnIndex < TRAC_COLUMNS.length; columnIndex++ )
82              {
83                  String columnName = columnNamesArray[i].trim();
84                  if ( TRAC_COLUMNS[columnIndex].equalsIgnoreCase( columnName ) )
85                  {
86                      // Found a valid column name - add it
87                      columnOrder[i] = columnIndex;
88                      validColumnNames++;
89                      break;
90                  }
91              }
92          }
93          if ( validColumnNames == 0 )
94          {
95              // This can happen if the user has configured column names and they are all invalid
96              throw new MavenReportException(
97                  "maven-changes-plugin: None of the configured columnNames '" + columnNames + "' are valid." );
98          }
99      }
100 
101     public void doGenerateEmptyReport( ResourceBundle bundle, Sink sink )
102     {
103         sinkBeginReport( sink, bundle );
104 
105         sink.paragraph();
106 
107         sink.text( bundle.getString( "report.trac.error" ) );
108 
109         sink.paragraph_();
110 
111         sinkEndReport( sink );
112     }
113 
114     public void doGenerateReport( ResourceBundle bundle, Sink sink, ArrayList ticketList )
115     {
116 
117         sinkBeginReport( sink, bundle );
118 
119         constructHeaderRow( sink, ticketList, bundle );
120 
121         constructDetailRows( sink, ticketList, bundle );
122 
123         sinkEndReport( sink );
124     }
125 
126     private void constructHeaderRow( Sink sink, List ticketList, ResourceBundle bundle )
127     {
128         if ( ticketList == null )
129         {
130             return;
131         }
132 
133         sink.table();
134 
135         sink.tableRow();
136 
137         for ( int columnIndex = 0; columnIndex < columnOrder.length; columnIndex++ )
138         {
139             switch ( columnOrder[columnIndex] )
140             {
141                 case COLUMN_ID:
142                     sinkHeader( sink, bundle.getString( "report.trac.label.id" ) );
143                     break;
144                 case COLUMN_TYPE:
145                     sinkHeader( sink, bundle.getString( "report.trac.label.type" ) );
146                     break;
147                 case COLUMN_SUMMARY:
148                     sinkHeader( sink, bundle.getString( "report.trac.label.summary" ) );
149                     break;
150                 case COLUMN_OWNER:
151                     sinkHeader( sink, bundle.getString( "report.trac.label.owner" ) );
152                     break;
153                 case COLUMN_REPORTER:
154                     sinkHeader( sink, bundle.getString( "report.trac.label.reporter" ) );
155                     break;
156                 case COLUMN_PRIORITY:
157                     sinkHeader( sink, bundle.getString( "report.trac.label.priority" ) );
158                     break;
159                 case COLUMN_STATUS:
160                     sinkHeader( sink, bundle.getString( "report.trac.label.status" ) );
161                     break;
162                 case COLUMN_RESOLUTION:
163                     sinkHeader( sink, bundle.getString( "report.trac.label.resolution" ) );
164                     break;
165                 case COLUMN_CREATED:
166                     sinkHeader( sink, bundle.getString( "report.trac.label.created" ) );
167                     break;
168                 case COLUMN_CHANGED:
169                     sinkHeader( sink, bundle.getString( "report.trac.label.changed" ) );
170                     break;
171                 case COLUMN_MILESTONE:
172                     sinkHeader( sink, bundle.getString( "report.trac.label.milestone" ) );
173                     break;
174                 case COLUMN_COMPONENT:
175                     sinkHeader( sink, bundle.getString( "report.trac.label.component" ) );
176                     break;
177                 default:
178                     // Do not add a header for this column
179                     break;
180             }
181         }
182 
183         sink.tableRow_();
184     }
185 
186     private void constructDetailRows( Sink sink, List ticketList, ResourceBundle bundle )
187     {
188         if ( ticketList == null )
189         {
190             return;
191         }
192 
193         for ( int idx = 0; idx < ticketList.size(); idx++ )
194         {
195             SimpleDateFormat sdf = new SimpleDateFormat( bundle.getString( "report.trac.dateformat" ) );
196 
197             TracTicket ticket = (TracTicket) ticketList.get( idx );
198 
199             sink.tableRow();
200 
201             for ( int columnIndex = 0; columnIndex < columnOrder.length; columnIndex++ )
202             {
203                 switch ( columnOrder[columnIndex] )
204                 {
205                     case COLUMN_ID:
206                         sink.tableCell();
207                         sink.link( ticket.getLink() );
208                         sink.text( ticket.getId() );
209                         sink.link_();
210                         sink.tableCell_();
211                         break;
212                     case COLUMN_TYPE:
213                         sinkCell( sink, ticket.getType() );
214                         break;
215                     case COLUMN_SUMMARY:
216                         sinkCell( sink, ticket.getSummary() );
217                         break;
218                     case COLUMN_OWNER:
219                         sinkCell( sink, ticket.getOwner() );
220                         break;
221                     case COLUMN_REPORTER:
222                         sinkCell( sink, ticket.getReporter() );
223                         break;
224                     case COLUMN_PRIORITY:
225                         sinkCell( sink, ticket.getPriority() );
226                         break;
227                     case COLUMN_STATUS:
228                         sinkCell( sink, ticket.getStatus() );
229                         break;
230                     case COLUMN_RESOLUTION:
231                         sinkCell( sink, ticket.getResolution() );
232                         break;
233                     case COLUMN_CREATED:
234                         sinkCell( sink, sdf.format( ticket.getTimeCreated() ) );
235                         break;
236                     case COLUMN_CHANGED:
237                         sinkCell( sink, sdf.format( ticket.getTimeChanged() ) );
238                         break;
239                     case COLUMN_MILESTONE:
240                         sinkCell( sink, ticket.getMilestone() );
241                         break;
242                     case COLUMN_COMPONENT:
243                         sinkCell( sink, ticket.getComponent() );
244                         break;
245                     default:
246                         // Do not add details for this column
247                         break;
248                 }
249             }
250 
251             sink.tableRow_();
252         }
253 
254         sink.table_();
255     }
256 
257     private void sinkBeginReport( Sink sink, ResourceBundle bundle )
258     {
259         sink.head();
260 
261         sink.text( bundle.getString( "report.trac.header" ) );
262 
263         sink.head_();
264 
265         sink.body();
266 
267         sink.section1();
268 
269         sinkSectionTitle1( sink, bundle.getString( "report.trac.header" ) );
270 
271     }
272 
273     private void sinkEndReport( Sink sink )
274     {
275         sink.section1_();
276 
277         sink.body_();
278 
279         sink.flush();
280 
281         sink.close();
282     }
283 
284     private void sinkFigure( Sink sink, String image )
285     {
286         sink.figure();
287 
288         sink.figureGraphics( image );
289 
290         sink.figure_();
291     }
292 
293     private void sinkHeader( Sink sink, String header )
294     {
295         sink.tableHeaderCell();
296 
297         sink.text( header );
298 
299         sink.tableHeaderCell_();
300     }
301 
302     private void sinkCell( Sink sink, String text )
303     {
304         sink.tableCell();
305 
306         if ( text != null )
307         {
308             sink.text( text );
309         }
310         else
311         {
312             sink.rawText( "&nbsp;" );
313         }
314 
315         sink.tableCell_();
316     }
317 
318     private void sinkSectionTitle1( Sink sink, String text )
319     {
320         sink.sectionTitle1();
321 
322         sink.text( text );
323 
324         sink.sectionTitle1_();
325     }
326 }