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