Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
AbstractJiraDownloader |
|
| 1.5161290322580645;1.516 |
1 | package org.apache.maven.plugin.jira; | |
2 | ||
3 | /* | |
4 | * Licensed to the Apache Software Foundation (ASF) under one | |
5 | * or more contributor license agreements. See the NOTICE file | |
6 | * distributed with this work for additional information | |
7 | * regarding copyright ownership. The ASF licenses this file | |
8 | * to you under the Apache License, Version 2.0 (the | |
9 | * "License"); you may not use this file except in compliance | |
10 | * with the License. You may obtain a copy of the License at | |
11 | * | |
12 | * http://www.apache.org/licenses/LICENSE-2.0 | |
13 | * | |
14 | * Unless required by applicable law or agreed to in writing, | |
15 | * software distributed under the License is distributed on an | |
16 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
17 | * KIND, either express or implied. See the License for the | |
18 | * specific language governing permissions and limitations | |
19 | * under the License. | |
20 | */ | |
21 | ||
22 | import org.apache.maven.plugin.MojoExecutionException; | |
23 | import org.apache.maven.plugin.issues.Issue; | |
24 | import org.apache.maven.plugin.issues.IssueUtils; | |
25 | import org.apache.maven.plugin.logging.Log; | |
26 | import org.apache.maven.project.MavenProject; | |
27 | import org.apache.maven.settings.Proxy; | |
28 | import org.apache.maven.settings.Settings; | |
29 | import org.apache.maven.wagon.proxy.ProxyInfo; | |
30 | ||
31 | import java.io.File; | |
32 | import java.net.MalformedURLException; | |
33 | import java.net.URL; | |
34 | import java.util.List; | |
35 | ||
36 | /** | |
37 | * Abstract API, more or less, to retrieving issue information from JIRA. | |
38 | * Intended to have subclasses for the old (RSS) and new (REST) ways of doing things. | |
39 | * | |
40 | * @author mfranken@xebia.com | |
41 | * @author jruiz@exist.com | |
42 | * @version $Id: AbstractJiraDownloader.java 1412155 2012-11-21 15:47:19Z bimargulies $ | |
43 | */ | |
44 | 2 | public abstract class AbstractJiraDownloader |
45 | { | |
46 | protected static final String UTF_8 = "UTF-8"; | |
47 | ||
48 | /** Log for debug output. */ | |
49 | protected Log log; | |
50 | /** Output file for xml document. */ | |
51 | protected File output; | |
52 | /** The maximum number of entries to show. */ | |
53 | protected int nbEntriesMax; | |
54 | /** The filter to apply to query to JIRA. */ | |
55 | protected String filter; | |
56 | /** Ids of fix versions to show, as comma separated string. */ | |
57 | protected String fixVersionIds; | |
58 | /** Ids of status to show, as comma separated string. */ | |
59 | protected String statusIds; | |
60 | /** Ids of resolution to show, as comma separated string. */ | |
61 | protected String resolutionIds; | |
62 | /** Ids of priority to show, as comma separated string. */ | |
63 | protected String priorityIds; | |
64 | /** The component to show. */ | |
65 | protected String component; | |
66 | /** Ids of types to show, as comma separated string. */ | |
67 | protected String typeIds; | |
68 | /** Column names to sort by, as comma separated string. */ | |
69 | protected String sortColumnNames; | |
70 | /** The username to log into JIRA. */ | |
71 | protected String jiraUser; | |
72 | /** The password to log into JIRA. */ | |
73 | protected String jiraPassword; | |
74 | /** The username to log into webserver. */ | |
75 | protected String webUser; | |
76 | /** The password to log into webserver. */ | |
77 | protected String webPassword; | |
78 | /** The maven project. */ | |
79 | protected MavenProject project; | |
80 | /** The maven settings. */ | |
81 | protected Settings settings; | |
82 | /** Use JQL, JIRA query language, instead of URL parameter based queries. | |
83 | * Note that this is down here to make it easier for the mojo to deal with | |
84 | * both new and old flavors. */ | |
85 | protected boolean useJql; | |
86 | /** Filter the JIRA query based on the current version */ | |
87 | protected boolean onlyCurrentVersion; | |
88 | /** The versionPrefix to apply to the POM version */ | |
89 | protected String versionPrefix; | |
90 | /** The pattern used to parse dates from the JIRA xml file. */ | |
91 | protected String jiraDatePattern; | |
92 | protected String proxyHost; | |
93 | protected int proxyPort; | |
94 | protected String proxyUser; | |
95 | protected String proxyPass; | |
96 | ||
97 | /** | |
98 | * Execute the query on the JIRA server. | |
99 | * | |
100 | * @throws Exception on error | |
101 | */ | |
102 | public abstract void doExecute() throws Exception; | |
103 | ||
104 | ||
105 | /** | |
106 | * Check to see if we think that JIRA authentication is needed. | |
107 | * | |
108 | * @return <code>true</code> if jiraUser and jiraPassword are set, otherwise <code>false</code> | |
109 | */ | |
110 | protected boolean isJiraAuthenticationConfigured() | |
111 | { | |
112 | 0 | return ( jiraUser != null ) && ( jiraUser.length() > 0 ) && ( jiraPassword != null ); |
113 | } | |
114 | ||
115 | ||
116 | protected void getProxyInfo( String jiraUrl ) | |
117 | { | |
118 | // see whether there is any proxy defined in maven | |
119 | 0 | Proxy proxy = null; |
120 | ||
121 | 0 | if ( project == null ) |
122 | { | |
123 | 0 | getLog().error( "No project set. No proxy info available." ); |
124 | ||
125 | 0 | return; |
126 | } | |
127 | ||
128 | 0 | if ( settings != null ) |
129 | { | |
130 | 0 | proxy = settings.getActiveProxy(); |
131 | } | |
132 | ||
133 | 0 | if ( proxy != null ) |
134 | { | |
135 | ||
136 | 0 | ProxyInfo proxyInfo = new ProxyInfo(); |
137 | 0 | proxyInfo.setNonProxyHosts( proxy.getNonProxyHosts() ); |
138 | ||
139 | // Get the host out of the JIRA URL | |
140 | 0 | URL url = null; |
141 | try | |
142 | { | |
143 | 0 | url = new URL( jiraUrl ); |
144 | } | |
145 | 0 | catch( MalformedURLException e ) |
146 | { | |
147 | 0 | getLog().error( "Invalid JIRA URL: " + jiraUrl + ". " + e.getMessage() ); |
148 | 0 | } |
149 | 0 | String jiraHost = null; |
150 | 0 | if ( url != null ) |
151 | { | |
152 | 0 | jiraHost = url.getHost(); |
153 | } | |
154 | ||
155 | // Validation of proxy method copied from org.apache.maven.wagon.proxy.ProxyUtils. | |
156 | // @todo Can use original when maven-changes-plugin requires a more recent version of Maven | |
157 | ||
158 | //if ( ProxyUtils.validateNonProxyHosts( proxyInfo, jiraHost ) ) | |
159 | 0 | if ( JiraHelper.validateNonProxyHosts( proxyInfo, jiraHost ) ) |
160 | { | |
161 | 0 | return; |
162 | } | |
163 | ||
164 | 0 | proxyHost = settings.getActiveProxy().getHost(); |
165 | 0 | proxyPort = settings.getActiveProxy().getPort(); |
166 | 0 | proxyUser = settings.getActiveProxy().getUsername(); |
167 | 0 | proxyPass = settings.getActiveProxy().getPassword(); |
168 | } | |
169 | 0 | } |
170 | ||
171 | /** | |
172 | * Override this method if you need to get issues for a specific Fix For. | |
173 | * | |
174 | * @return A Fix For id or <code>null</code> if you don't have that need | |
175 | */ | |
176 | protected String getFixFor() | |
177 | { | |
178 | 0 | if ( onlyCurrentVersion && useJql ) |
179 | { | |
180 | // Let JIRA do the filtering of the current version instead of the JIRA mojo. | |
181 | // This way JIRA returns less issues and we do not run into the "nbEntriesMax" limit that easily. | |
182 | ||
183 | 0 | String version = ( versionPrefix == null ? "" : versionPrefix ) + project.getVersion(); |
184 | ||
185 | // Remove "-SNAPSHOT" from the end of the version, if it's there | |
186 | 0 | if ( version.endsWith( IssueUtils.SNAPSHOT_SUFFIX ) ) |
187 | { | |
188 | 0 | return version.substring( 0, version.length() - IssueUtils.SNAPSHOT_SUFFIX.length() ); |
189 | } | |
190 | else | |
191 | { | |
192 | 0 | return version; |
193 | } | |
194 | } | |
195 | else | |
196 | { | |
197 | 0 | return null; |
198 | } | |
199 | } | |
200 | ||
201 | ||
202 | public abstract List<Issue> getIssueList() throws MojoExecutionException; | |
203 | ||
204 | public void setJiraDatePattern( String jiraDatePattern ) | |
205 | { | |
206 | 2 | this.jiraDatePattern = jiraDatePattern; |
207 | 2 | } |
208 | ||
209 | /** | |
210 | * Set the output file for the log. | |
211 | * | |
212 | * @param thisOutput the output file | |
213 | */ | |
214 | public void setOutput( File thisOutput ) | |
215 | { | |
216 | 2 | this.output = thisOutput; |
217 | 2 | } |
218 | ||
219 | public File getOutput() | |
220 | { | |
221 | 0 | return this.output; |
222 | } | |
223 | ||
224 | /** | |
225 | * Sets the project. | |
226 | * | |
227 | * @param thisProject The project to set | |
228 | */ | |
229 | public void setMavenProject( Object thisProject ) | |
230 | { | |
231 | 2 | this.project = (MavenProject) thisProject; |
232 | 2 | } |
233 | ||
234 | /** | |
235 | * Sets the maximum number of Issues to show. | |
236 | * | |
237 | * @param nbEntries The maximum number of Issues | |
238 | */ | |
239 | public void setNbEntries( final int nbEntries ) | |
240 | { | |
241 | 2 | nbEntriesMax = nbEntries; |
242 | 2 | } |
243 | ||
244 | /** | |
245 | * Sets the statusIds. | |
246 | * | |
247 | * @param thisStatusIds The id(s) of the status to show, as comma separated string | |
248 | */ | |
249 | public void setStatusIds( String thisStatusIds ) | |
250 | { | |
251 | 2 | statusIds = thisStatusIds; |
252 | 2 | } |
253 | ||
254 | /** | |
255 | * Sets the priorityIds. | |
256 | * | |
257 | * @param thisPriorityIds The id(s) of the priority to show, as comma separated string | |
258 | */ | |
259 | public void setPriorityIds( String thisPriorityIds ) | |
260 | { | |
261 | 2 | priorityIds = thisPriorityIds; |
262 | 2 | } |
263 | ||
264 | /** | |
265 | * Sets the resolutionIds. | |
266 | * | |
267 | * @param thisResolutionIds The id(s) of the resolution to show, as comma separated string | |
268 | */ | |
269 | public void setResolutionIds( String thisResolutionIds ) | |
270 | { | |
271 | 2 | resolutionIds = thisResolutionIds; |
272 | 2 | } |
273 | ||
274 | /** | |
275 | * Sets the sort column names. | |
276 | * | |
277 | * @param thisSortColumnNames The column names to sort by | |
278 | */ | |
279 | public void setSortColumnNames( String thisSortColumnNames ) | |
280 | { | |
281 | 2 | sortColumnNames = thisSortColumnNames; |
282 | 2 | } |
283 | ||
284 | /** | |
285 | * Sets the password for authentication against the webserver. | |
286 | * | |
287 | * @param thisWebPassword The password of the webserver | |
288 | */ | |
289 | public void setWebPassword( String thisWebPassword ) | |
290 | { | |
291 | 2 | this.webPassword = thisWebPassword; |
292 | 2 | } |
293 | ||
294 | /** | |
295 | * Sets the username for authentication against the webserver. | |
296 | * | |
297 | * @param thisWebUser The username of the webserver | |
298 | */ | |
299 | public void setWebUser( String thisWebUser ) | |
300 | { | |
301 | 2 | this.webUser = thisWebUser; |
302 | 2 | } |
303 | ||
304 | /** | |
305 | * Sets the password to log into a secured JIRA. | |
306 | * | |
307 | * @param thisJiraPassword The password for JIRA | |
308 | */ | |
309 | public void setJiraPassword( final String thisJiraPassword ) | |
310 | { | |
311 | 2 | this.jiraPassword = thisJiraPassword; |
312 | 2 | } |
313 | ||
314 | /** | |
315 | * Sets the username to log into a secured JIRA. | |
316 | * | |
317 | * @param thisJiraUser The username for JIRA | |
318 | */ | |
319 | public void setJiraUser( String thisJiraUser ) | |
320 | { | |
321 | 2 | this.jiraUser = thisJiraUser; |
322 | 2 | } |
323 | ||
324 | /** | |
325 | * Sets the filter to apply to query to JIRA. | |
326 | * | |
327 | * @param thisFilter The filter to query JIRA | |
328 | */ | |
329 | public void setFilter( String thisFilter ) | |
330 | { | |
331 | 2 | this.filter = thisFilter; |
332 | 2 | } |
333 | ||
334 | /** | |
335 | * Sets the component(s) to apply to query JIRA. | |
336 | * | |
337 | * @param theseComponents The id(s) of components to show, as comma separated string | |
338 | */ | |
339 | public void setComponent( String theseComponents ) | |
340 | { | |
341 | 2 | this.component = theseComponents; |
342 | 2 | } |
343 | ||
344 | /** | |
345 | * Sets the fix version id(s) to apply to query JIRA. | |
346 | * | |
347 | * @param theseFixVersionIds The id(s) of fix versions to show, as comma separated string | |
348 | */ | |
349 | public void setFixVersionIds( String theseFixVersionIds ) | |
350 | { | |
351 | 2 | this.fixVersionIds = theseFixVersionIds; |
352 | 2 | } |
353 | ||
354 | /** | |
355 | * Sets the typeIds. | |
356 | * | |
357 | * @param theseTypeIds The id(s) of the types to show, as comma separated string | |
358 | */ | |
359 | public void setTypeIds( String theseTypeIds ) | |
360 | { | |
361 | 2 | typeIds = theseTypeIds; |
362 | 2 | } |
363 | ||
364 | public void setLog( Log log ) | |
365 | { | |
366 | 2 | this.log = log; |
367 | 2 | } |
368 | ||
369 | protected Log getLog() | |
370 | { | |
371 | 0 | return log; |
372 | } | |
373 | ||
374 | public void setSettings( Settings settings ) | |
375 | { | |
376 | 2 | this.settings = settings; |
377 | 2 | } |
378 | ||
379 | public boolean isUseJql() | |
380 | { | |
381 | 0 | return useJql; |
382 | } | |
383 | ||
384 | public void setUseJql( boolean useJql ) | |
385 | { | |
386 | 2 | this.useJql = useJql; |
387 | 2 | } |
388 | ||
389 | public boolean isOnlyCurrentVersion() | |
390 | { | |
391 | 0 | return onlyCurrentVersion; |
392 | } | |
393 | ||
394 | public void setOnlyCurrentVersion( boolean onlyCurrentVersion ) | |
395 | { | |
396 | 2 | this.onlyCurrentVersion = onlyCurrentVersion; |
397 | 2 | } |
398 | ||
399 | public String getVersionPrefix() | |
400 | { | |
401 | 0 | return versionPrefix; |
402 | } | |
403 | ||
404 | public void setVersionPrefix( String versionPrefix ) | |
405 | { | |
406 | 2 | this.versionPrefix = versionPrefix; |
407 | 2 | } |
408 | } |