1 package org.apache.maven.plugin.jira;
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.plugin.changes.AbstractChangesReport;
24 import org.apache.maven.plugin.changes.ProjectUtils;
25 import org.apache.maven.plugin.issues.Issue;
26 import org.apache.maven.plugin.issues.IssueUtils;
27 import org.apache.maven.plugin.issues.IssuesReportGenerator;
28 import org.apache.maven.plugin.issues.IssuesReportHelper;
29 import org.apache.maven.plugins.annotations.Component;
30 import org.apache.maven.plugins.annotations.Mojo;
31 import org.apache.maven.plugins.annotations.Parameter;
32 import org.apache.maven.reporting.MavenReportException;
33 import org.apache.maven.settings.Settings;
34
35 import java.io.File;
36 import java.util.HashMap;
37 import java.util.List;
38 import java.util.Locale;
39 import java.util.Map;
40 import java.util.ResourceBundle;
41
42
43
44
45
46
47
48 @Mojo( name = "jira-report", threadSafe = true )
49 public class JiraMojo
50 extends AbstractChangesReport
51 {
52
53
54
55 private static final Map<String,Integer> JIRA_COLUMNS = new HashMap<String,Integer>( 16 );
56
57 static
58 {
59 JIRA_COLUMNS.put( "Assignee", Integer.valueOf( IssuesReportHelper.COLUMN_ASSIGNEE ) );
60 JIRA_COLUMNS.put( "Component", Integer.valueOf( IssuesReportHelper.COLUMN_COMPONENT ) );
61 JIRA_COLUMNS.put( "Created", Integer.valueOf( IssuesReportHelper.COLUMN_CREATED ) );
62 JIRA_COLUMNS.put( "Fix Version", Integer.valueOf( IssuesReportHelper.COLUMN_FIX_VERSION ) );
63 JIRA_COLUMNS.put( "Id", Integer.valueOf( IssuesReportHelper.COLUMN_ID ) );
64 JIRA_COLUMNS.put( "Key", Integer.valueOf( IssuesReportHelper.COLUMN_KEY ) );
65 JIRA_COLUMNS.put( "Priority", Integer.valueOf( IssuesReportHelper.COLUMN_PRIORITY ) );
66 JIRA_COLUMNS.put( "Reporter", Integer.valueOf( IssuesReportHelper.COLUMN_REPORTER ) );
67 JIRA_COLUMNS.put( "Resolution", Integer.valueOf( IssuesReportHelper.COLUMN_RESOLUTION ) );
68 JIRA_COLUMNS.put( "Status", Integer.valueOf( IssuesReportHelper.COLUMN_STATUS ) );
69 JIRA_COLUMNS.put( "Summary", Integer.valueOf( IssuesReportHelper.COLUMN_SUMMARY ) );
70 JIRA_COLUMNS.put( "Type", Integer.valueOf( IssuesReportHelper.COLUMN_TYPE ) );
71 JIRA_COLUMNS.put( "Updated", Integer.valueOf( IssuesReportHelper.COLUMN_UPDATED ) );
72 JIRA_COLUMNS.put( "Version", Integer.valueOf( IssuesReportHelper.COLUMN_VERSION ) );
73 }
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 @Parameter( defaultValue = "Key,Summary,Status,Resolution,Assignee" )
90 private String columnNames;
91
92
93
94
95
96
97
98
99 @Parameter( defaultValue = "false" )
100 private boolean useJql;
101
102
103
104
105
106
107
108
109 @Parameter( defaultValue = "false")
110 private boolean forceRss;
111
112
113
114
115
116
117 @Parameter( defaultValue = "" )
118 private String component;
119
120
121
122
123
124
125 @Parameter( defaultValue = "" )
126 private String filter;
127
128
129
130
131
132
133
134
135
136 @Parameter( defaultValue = "" )
137 private String fixVersionIds;
138
139
140
141
142
143
144
145 @Parameter( defaultValue = "EEE, d MMM yyyy HH:mm:ss Z" )
146 private String jiraDatePattern;
147
148
149
150
151 @Parameter( defaultValue = "" )
152 private String jiraPassword;
153
154
155
156
157 @Parameter( defaultValue = "" )
158 private String jiraUser;
159
160
161
162
163 @Parameter( defaultValue = "${project.build.directory}/jira-results.xml", required = true, readonly = true )
164 private File jiraXmlPath;
165
166
167
168
169 @Parameter( defaultValue = "100" )
170 private int maxEntries;
171
172
173
174
175
176
177
178
179 @Parameter( defaultValue = "false" )
180 private boolean onlyCurrentVersion;
181
182
183
184
185
186
187
188
189 @Parameter( defaultValue = "" )
190 private String priorityIds;
191
192
193
194
195
196
197
198
199
200
201
202
203 @Parameter( defaultValue = "Fixed" )
204 private String resolutionIds;
205
206
207
208
209 @Component
210 private Settings settings;
211
212
213
214
215
216
217 @Parameter( property = "changes.jira.skip", defaultValue = "false" )
218 private boolean skip;
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249 @Parameter( defaultValue = "Priority DESC, Created DESC" )
250 private String sortColumnNames;
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272 @Parameter( defaultValue = "Closed" )
273 private String statusIds;
274
275
276
277
278
279
280
281
282
283
284
285 @Parameter( defaultValue = "" )
286 private String typeIds;
287
288
289
290
291
292
293
294
295
296
297
298
299
300 @Parameter( defaultValue = "" )
301 private String versionPrefix;
302
303
304
305
306 @Parameter( defaultValue = "" )
307 private String webPassword;
308
309
310
311
312 @Parameter( defaultValue = "" )
313 private String webUser;
314
315
316
317
318 private AbstractJiraDownloader mockDownloader;
319
320
321
322
323
324
325
326
327 public boolean canGenerateReport()
328 {
329 if ( skip )
330 {
331 return false;
332 }
333 if ( mockDownloader != null )
334 {
335 return true;
336 }
337 return ProjectUtils.validateIfIssueManagementComplete( project, "JIRA", "JIRA Report", getLog() );
338 }
339
340 public void executeReport( Locale locale )
341 throws MavenReportException
342 {
343
344 List<Integer> columnIds = IssuesReportHelper.getColumnIds( columnNames, JIRA_COLUMNS );
345 if ( columnIds.isEmpty() )
346 {
347
348 throw new MavenReportException(
349 "maven-changes-plugin: None of the configured columnNames '" + columnNames + "' are valid." );
350 }
351
352 try
353 {
354
355 AbstractJiraDownloader issueDownloader;
356 if ( mockDownloader != null )
357 {
358 issueDownloader = mockDownloader;
359 }
360 else
361 {
362 AdaptiveJiraDownloader downloader = new AdaptiveJiraDownloader();
363 downloader.setForceClassic( forceRss );
364 issueDownloader = downloader;
365 }
366 configureIssueDownloader( issueDownloader );
367 issueDownloader.doExecute();
368
369 List<Issue> issueList = issueDownloader.getIssueList();
370
371 if ( StringUtils.isNotEmpty( versionPrefix ) )
372 {
373 int originalNumberOfIssues = issueList.size();
374 issueList = IssueUtils.filterIssuesWithVersionPrefix( issueList, versionPrefix );
375 getLog().debug( "Filtered out " + issueList.size() + " issues of " + originalNumberOfIssues
376 + " that matched the versionPrefix '" + versionPrefix + "'." );
377 }
378
379 if ( onlyCurrentVersion )
380 {
381 String version = ( versionPrefix == null ? "" : versionPrefix ) + project.getVersion();
382 issueList = IssueUtils.getIssuesForVersion( issueList, version );
383 getLog().info( "The JIRA Report will contain issues only for the current version." );
384 }
385
386
387 IssuesReportGenerator report = new IssuesReportGenerator( IssuesReportHelper.toIntArray( columnIds ) );
388
389 if ( issueList.isEmpty() )
390 {
391 report.doGenerateEmptyReport( getBundle( locale ), getSink() );
392 }
393 else
394 {
395 report.doGenerateReport( getBundle( locale ), getSink(), issueList );
396 }
397 }
398 catch ( Exception e )
399 {
400 getLog().warn( e );
401 }
402 }
403
404 public String getDescription( Locale locale )
405 {
406 return getBundle( locale ).getString( "report.issues.description" );
407 }
408
409 public String getName( Locale locale )
410 {
411 return getBundle( locale ).getString( "report.issues.name" );
412 }
413
414 public String getOutputName()
415 {
416 return "jira-report";
417 }
418
419
420
421
422
423 private ResourceBundle getBundle( Locale locale )
424 {
425 return ResourceBundle.getBundle( "jira-report", locale, this.getClass().getClassLoader() );
426 }
427
428 private void configureIssueDownloader( AbstractJiraDownloader issueDownloader )
429 {
430 issueDownloader.setLog( getLog() );
431
432 issueDownloader.setMavenProject( project );
433
434 issueDownloader.setOutput( jiraXmlPath );
435
436 issueDownloader.setNbEntries( maxEntries );
437
438 issueDownloader.setComponent( component );
439
440 issueDownloader.setFixVersionIds( fixVersionIds );
441
442 issueDownloader.setStatusIds( statusIds );
443
444 issueDownloader.setResolutionIds( resolutionIds );
445
446 issueDownloader.setPriorityIds( priorityIds );
447
448 issueDownloader.setSortColumnNames( sortColumnNames );
449
450 issueDownloader.setFilter( filter );
451
452 issueDownloader.setJiraDatePattern( jiraDatePattern );
453
454 issueDownloader.setJiraUser( jiraUser );
455
456 issueDownloader.setJiraPassword( jiraPassword );
457
458 issueDownloader.setTypeIds( typeIds );
459
460 issueDownloader.setWebUser( webUser );
461
462 issueDownloader.setWebPassword( webPassword );
463
464 issueDownloader.setSettings( settings );
465
466 issueDownloader.setUseJql( useJql );
467
468 issueDownloader.setOnlyCurrentVersion( onlyCurrentVersion );
469
470 issueDownloader.setVersionPrefix( versionPrefix );
471 }
472
473 public void setMockDownloader( AbstractJiraDownloader mockDownloader )
474 {
475 this.mockDownloader = mockDownloader;
476 }
477
478 public AbstractJiraDownloader getMockDownloader()
479 {
480 return mockDownloader;
481 }
482 }