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 }