View Javadoc
1   package org.apache.maven.plugin.issues;
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.maven.doxia.sink.Sink;
23  
24  import java.text.DateFormat;
25  import java.util.List;
26  import java.util.Locale;
27  import java.util.ResourceBundle;
28  
29  /**
30   * Generates a report on issues.
31   *
32   * @author Noriko Kinugasa
33   * @author Dennis Lundberg
34   * @version $Id: IssuesReportGenerator.java 1685894 2015-06-16 19:29:09Z khmarbaise $
35   * @since 2.4
36   */
37  public class IssuesReportGenerator
38      extends AbstractIssuesReportGenerator
39  {
40      /**
41       * Fallback value that is used if date field are not available.
42       */
43      private static final String NOT_AVAILABLE = "n/a";
44  
45      /**
46       * Holds the id:s for the columns to include in the report, in the order that they should appear in the report.
47       */
48      private int[] columns;
49  
50      /**
51       * @param includedColumns The id:s of the columns to include in the report
52       */
53      public IssuesReportGenerator( int[] includedColumns )
54      {
55          this.columns = includedColumns;
56      }
57  
58      public void doGenerateEmptyReport( ResourceBundle bundle, Sink sink )
59      {
60          sinkBeginReport( sink, bundle );
61  
62          sink.paragraph();
63  
64          sink.text( bundle.getString( "report.issues.error" ) );
65  
66          sink.paragraph_();
67  
68          sinkEndReport( sink );
69      }
70  
71      public void doGenerateReport( ResourceBundle bundle, Sink sink, List<Issue> issueList )
72      {
73          sinkBeginReport( sink, bundle );
74  
75          constructHeaderRow( sink, issueList, bundle );
76  
77          // Always use the international date format as recommended by the W3C:
78          // http://www.w3.org/QA/Tips/iso-date
79          // This date format is used in the Swedish locale.
80          constructDetailRows( sink, issueList, bundle, new Locale( "sv" ) );
81  
82          sinkEndReport( sink );
83      }
84  
85      private void constructHeaderRow( Sink sink, List<Issue> issueList, ResourceBundle bundle )
86      {
87          if ( issueList == null )
88          {
89              return;
90          }
91  
92          sink.table();
93  
94          sink.tableRow();
95  
96          for ( int column : columns )
97          {
98              switch ( column )
99              {
100                 case IssuesReportHelper.COLUMN_ASSIGNEE:
101                     sinkHeader( sink, bundle.getString( "report.issues.label.assignee" ) );
102                     break;
103 
104                 case IssuesReportHelper.COLUMN_COMPONENT:
105                     sinkHeader( sink, bundle.getString( "report.issues.label.component" ) );
106                     break;
107 
108                 case IssuesReportHelper.COLUMN_CREATED:
109                     sinkHeader( sink, bundle.getString( "report.issues.label.created" ) );
110                     break;
111 
112                 case IssuesReportHelper.COLUMN_FIX_VERSION:
113                     sinkHeader( sink, bundle.getString( "report.issues.label.fixVersion" ) );
114                     break;
115 
116                 case IssuesReportHelper.COLUMN_ID:
117                     sinkHeader( sink, bundle.getString( "report.issues.label.id" ) );
118                     break;
119 
120                 case IssuesReportHelper.COLUMN_KEY:
121                     sinkHeader( sink, bundle.getString( "report.issues.label.key" ) );
122                     break;
123 
124                 case IssuesReportHelper.COLUMN_PRIORITY:
125                     sinkHeader( sink, bundle.getString( "report.issues.label.priority" ) );
126                     break;
127 
128                 case IssuesReportHelper.COLUMN_REPORTER:
129                     sinkHeader( sink, bundle.getString( "report.issues.label.reporter" ) );
130                     break;
131 
132                 case IssuesReportHelper.COLUMN_RESOLUTION:
133                     sinkHeader( sink, bundle.getString( "report.issues.label.resolution" ) );
134                     break;
135 
136                 case IssuesReportHelper.COLUMN_STATUS:
137                     sinkHeader( sink, bundle.getString( "report.issues.label.status" ) );
138                     break;
139 
140                 case IssuesReportHelper.COLUMN_SUMMARY:
141                     sinkHeader( sink, bundle.getString( "report.issues.label.summary" ) );
142                     break;
143 
144                 case IssuesReportHelper.COLUMN_TYPE:
145                     sinkHeader( sink, bundle.getString( "report.issues.label.type" ) );
146                     break;
147 
148                 case IssuesReportHelper.COLUMN_UPDATED:
149                     sinkHeader( sink, bundle.getString( "report.issues.label.updated" ) );
150                     break;
151 
152                 case IssuesReportHelper.COLUMN_VERSION:
153                     sinkHeader( sink, bundle.getString( "report.issues.label.version" ) );
154                     break;
155 
156                 default:
157                     // Do not add a header for this column
158                     break;
159             }
160         }
161 
162         sink.tableRow_();
163     }
164 
165     private void constructDetailRows( Sink sink, List<Issue> issueList, ResourceBundle bundle, Locale locale )
166     {
167         if ( issueList == null )
168         {
169             return;
170         }
171 
172         for ( Issue issue : issueList )
173         {
174             // Use a DateFormat based on the Locale
175             DateFormat df = DateFormat.getDateInstance( DateFormat.SHORT, locale );
176 
177             sink.tableRow();
178 
179             for ( int column : columns )
180             {
181                 switch ( column )
182                 {
183                     case IssuesReportHelper.COLUMN_ASSIGNEE:
184                         sinkCell( sink, issue.getAssignee() );
185                         break;
186 
187                     case IssuesReportHelper.COLUMN_COMPONENT:
188                         sinkCell( sink, IssuesReportHelper.printValues( issue.getComponents() ) );
189                         break;
190 
191                     case IssuesReportHelper.COLUMN_CREATED:
192                         String created = NOT_AVAILABLE;
193                         if ( issue.getCreated() != null )
194                         {
195                             created = df.format( issue.getCreated() );
196                         }
197                         sinkCell( sink, created );
198                         break;
199 
200                     case IssuesReportHelper.COLUMN_FIX_VERSION:
201                         sinkCell( sink, IssuesReportHelper.printValues( issue.getFixVersions() ) );
202                         break;
203 
204                     case IssuesReportHelper.COLUMN_ID:
205                         sink.tableCell();
206                         sink.link( issue.getLink() );
207                         sink.text( issue.getId() );
208                         sink.link_();
209                         sink.tableCell_();
210                         break;
211 
212                     case IssuesReportHelper.COLUMN_KEY:
213                         sink.tableCell();
214                         sink.link( issue.getLink() );
215                         sink.text( issue.getKey() );
216                         sink.link_();
217                         sink.tableCell_();
218                         break;
219 
220                     case IssuesReportHelper.COLUMN_PRIORITY:
221                         sinkCell( sink, issue.getPriority() );
222                         break;
223 
224                     case IssuesReportHelper.COLUMN_REPORTER:
225                         sinkCell( sink, issue.getReporter() );
226                         break;
227 
228                     case IssuesReportHelper.COLUMN_RESOLUTION:
229                         sinkCell( sink, issue.getResolution() );
230                         break;
231 
232                     case IssuesReportHelper.COLUMN_STATUS:
233                         sinkCell( sink, issue.getStatus() );
234                         break;
235 
236                     case IssuesReportHelper.COLUMN_SUMMARY:
237                         sinkCell( sink, issue.getSummary() );
238                         break;
239 
240                     case IssuesReportHelper.COLUMN_TYPE:
241                         sinkCell( sink, issue.getType() );
242                         break;
243 
244                     case IssuesReportHelper.COLUMN_UPDATED:
245                         String updated = NOT_AVAILABLE;
246                         if ( issue.getUpdated() != null )
247                         {
248                             updated = df.format( issue.getUpdated() );
249                         }
250                         sinkCell( sink, updated );
251                         break;
252 
253                     case IssuesReportHelper.COLUMN_VERSION:
254                         sinkCell( sink, issue.getVersion() );
255                         break;
256 
257                     default:
258                         // Do not add this column
259                         break;
260                 }
261             }
262 
263             sink.tableRow_();
264         }
265 
266         sink.table_();
267     }
268 }