1 package org.apache.maven.plugin.trac;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
32
33
34
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
53
54 private static final String[] TRAC_COLUMNS = {
55
56
57
58
59
60
61
62
63
64
65
66
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
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
87 columnOrder[i] = columnIndex;
88 validColumnNames++;
89 break;
90 }
91 }
92 }
93 if ( validColumnNames == 0 )
94 {
95
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
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
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.rawText( text );
309 }
310 else
311 {
312 sink.rawText( " " );
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 }