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