Authentication support for access a private Jira instalation. MPJIRA-8

Enable retrieving component-specific issues. MPJIRA-11
MPJIRA-13

git-svn-id: https://svn.apache.org/repos/asf/maven/maven-1/plugins/trunk@232355 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
carlos 2005-08-12 18:57:49 +00:00
parent ef704f9ac6
commit 2134c137ab
8 changed files with 625 additions and 164 deletions

View File

@ -54,8 +54,18 @@
project="${pom}"
output="${maven.build.dir}/jira/jira-results.xml"
nbEntries="${maven.jira.nbentries}"
statusIds="${maven.jira.status}"
filter="${maven.jira.filter}"
resolutionIds="${maven.jira.resolution}"
priorityIds="${maven.jira.priority}"
webUser="${maven.jira.webUser}"
webPassword="${maven.jira.webPassword}"
jiraUser="${maven.jira.jiraUser}"
jiraPassword="${maven.jira.jiraPassword}"
component="${maven.jira.component}"
/>
<mkdir dir="${maven.gen.docs}"/>
<doc:jslFile
input="${maven.build.dir}/jira/jira-results.xml"
output="${maven.gen.docs}/jira.xml"

View File

@ -17,4 +17,13 @@
# -------------------------------------------------------------------
# P L U G I N P R O P E R I E S
# -------------------------------------------------------------------
maven.jira.webUser=
maven.jira.webPassword=
maven.jira.jiraUser=
maven.jira.jiraPassword=
maven.jira.nbentries=1000
maven.jira.filter=
maven.jira.status=Open,In Progress,Reopened
maven.jira.resolution=Unresolved
maven.jira.priority=
maven.jira.component=

View File

@ -17,184 +17,471 @@ package org.apache.maven.jira;
* ====================================================================
*/
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.StatusLine;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.maven.jelly.MavenJellyContext;
import org.apache.maven.project.Project;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
public class JiraDownloader
{
/**
* Gets relevant issues in RSS from a given JIRA installation.
*
* Based on version 1.1.2 and patch by Dr. Spock (MPJIRA-8)
*
* @author mfranken@xebia.com
*/
public final class JiraDownloader {
/**
* Log for debug output
* Log for debug output.
*/
private static Log LOG = LogFactory.getLog(JiraDownloader.class);
private static Log log = LogFactory.getLog(JiraDownloader.class);
/** Output file for xml document */
/** Output file for xml document. */
private File output;
/** Number of entries max */
/** The maximum number of entries to show. */
private int nbEntriesMax;
/** The filter to apply to query to JIRA. */
private String filter;
/** Ids of status to show, as comma separated string. */
private String statusIds;
/** Ids of resolution to show, as comma separated string. */
private String resolutionIds;
/** Ids of priority to show, as comma separated string. */
private String priorityIds;
/** The component to show. */
private String component;
/** The username to log into JIRA. */
private String jiraUser;
/** The password to log into JIRA. */
private String jiraPassword;
/** The username to log into webserver. */
private String webUser;
/** The password to log into webserver. */
private String webPassword;
/** The maven project. */
private Project project;
/**
* Set the output file for the log.
* @param output the output file
*/
public void setOutput(File output)
{
this.output = output;
/** Mapping containing all JIRA status values. */
private static Map statusMap = new HashMap();
/** Mapping containing all JIRA resolution values. */
private static Map resolutionMap = new HashMap();
/** Mapping containing all JIRA priority values. */
private static Map priorityMap = new HashMap();
static {
statusMap.put("Open", "1");
statusMap.put("In Progress", "3");
statusMap.put("Reopened", "4");
statusMap.put("Resolved", "5");
statusMap.put("Closed", "6");
resolutionMap.put("Unresolved", "-1");
resolutionMap.put("Fixed", "1");
resolutionMap.put("Won't Fix", "2");
resolutionMap.put("Duplicate", "3");
resolutionMap.put("Incomplete", "4");
resolutionMap.put("Cannot Reproduce", "5");
priorityMap.put("Blocker", "1");
priorityMap.put("Critical", "2");
priorityMap.put("Major", "3");
priorityMap.put("Minor", "4");
priorityMap.put("Trivial", "5");
}
/**
* @return Project
* Creates a filter given the maven.jira parameters and some defaults.
*
* @return request parameters to be added to URL used for downloading the JIRA issues
*/
public Object getProject()
{
return project;
private String createFilter() {
if (this.filter != null && this.filter.length() > 0) {
if (this.filter.charAt(0) == '&') {
return this.filter.substring(1);
}
return this.filter;
}
StringBuffer localFilter = new StringBuffer();
// get the Status Ids
if (statusIds != null) {
String[] stats = statusIds.split(",");
for (int i = 0; i < stats.length; i++) {
String statusParam = (String) statusMap.get(stats[i]);
if (statusParam != null) {
localFilter.append("&statusIds=" + statusParam);
}
}
}
// get the Priority Ids
if (priorityIds != null) {
String[] prios = priorityIds.split(",");
for (int i = 0; i < prios.length; i++) {
String priorityParam = (String) priorityMap.get(prios[i]);
if (priorityParam != null) {
localFilter.append("&priorityIds=" + priorityParam);
}
}
}
if (resolutionIds != null) {
// get the Resolution Ids
String[] resos = resolutionIds.split(",");
for (int i = 0; i < resos.length; i++) {
String resoParam = (String) resolutionMap.get(resos[i]);
if (resoParam != null) {
localFilter.append("&resolutionIds=" + resoParam);
}
}
}
// add all components
if (component != null) {
String[] components = component.split(",");
for (int i = 0; i < components.length; i++) {
if (components[i].length() > 0) {
localFilter.append("&component=" + components[i]);
}
}
}
// add default sorting (by priority and then creation date)
String sort = "&sorter/field=created&sorter/order=DESC" + "&sorter/field=priority&sorter/order=DESC";
return localFilter + sort;
}
/**
* Execute the query on the JIRA server.
*
* @throws Exception
* on error
*/
public void doExecute() throws Exception {
if (project == null) {
throw new Exception("No project set.");
} else {
if (project.getIssueTrackingUrl() == null) {
throw new Exception("No issue tracking url set.");
}
}
try {
HttpClient cl = new HttpClient();
HttpState state = new HttpState();
HostConfiguration hc = new HostConfiguration();
cl.setHostConfiguration(hc);
cl.setState(state);
determineProxy(cl);
// get the Jira URL and project id
String url = project.getIssueTrackingUrl();
// chop off the parameter part
int pos = url.indexOf("?");
// and get the id while we're at it
String id = "";
if (pos >= 0) {
// url
id = url.substring(url.lastIndexOf("=") + 1);
}
// TODO: fail the build in the else block, issueTrackingUrl has to include id
String jiraUrl = url.substring(0, url.lastIndexOf("/"));
if (jiraUrl.endsWith("secure")) {
jiraUrl = jiraUrl.substring(0, jiraUrl.lastIndexOf("/"));
}
log.info("Jira lives at: " + jiraUrl);
doAuthentication(cl, jiraUrl);
// create the URL for getting the proper iussues from JIRA
String fullURL = jiraUrl + "/secure/IssueNavigator.jspa?view=rss&pid=" + id;
fullURL += createFilter();
fullURL += "&tempMax=" + nbEntriesMax + "&reset=true&decorator=none";
// execute the GET
download(cl, fullURL);
} catch (Exception e) {
log.error("Error accessing " + project.getIssueTrackingUrl(), e);
}
}
/**
* Authenticate against webserver and into JIRA if we have to.
*
* @param client
* the HttpClient
* @param jiraUrl
* the JIRA installation
*/
private void doAuthentication(HttpClient client, final String jiraUrl) {
// check and prepare for basic authentication
if (webUser != null && webUser.length() > 0) {
client.getState().setAuthenticationPreemptive(true);
Credentials defaultcreds = new UsernamePasswordCredentials(webUser, webPassword);
log.info("Using username: " + webUser + " for Basic Authentication against the webserver at " + jiraUrl);
client.getState().setCredentials(null, null, defaultcreds);
}
// log into JIRA if we have to
String loginUrl = null;
if (jiraUser != null && jiraUser.length() > 0 && jiraPassword != null) {
StringBuffer loginLink = new StringBuffer(jiraUrl);
loginLink.append("/login.jsp?os_destination=/secure/");
loginLink.append("&os_username=").append(jiraUser);
log.info("Login URL: " + loginLink + "&os_password=*******");
loginLink.append("&os_password=").append(jiraPassword);
loginUrl = loginLink.toString();
}
// execute the login
if (loginUrl != null) {
GetMethod loginGet = new GetMethod(loginUrl);
try {
client.executeMethod(loginGet);
log.info("Succesfully logged in into JIRA.");
} catch (Exception e) {
if (log.isDebugEnabled()) {
log.error("Error trying to login into JIRA:", e);
} else {
log.error("Error trying to login into JIRA. Cause is: " + e.getLocalizedMessage());
}
// continue any way, probably will fail later if authentication was necesaaray afterall
}
}
}
/**
* Setup proxy access if we have to.
*
* @param client
* the HttpClient
*/
private void determineProxy(HttpClient client) {
// see whether there is any proxy defined in maven
if (project == null) {
log.error("No project set. No proxy info available.");
return;
}
MavenJellyContext ctx = project.getContext();
if (ctx == null) {
log.error("Maven project has no context. No proxy info available.");
return;
}
String proxyHost = ctx.getProxyHost();
if (proxyHost != null) {
String proxyPort = ctx.getProxyPort();
client.getHostConfiguration().setProxy(proxyHost, Integer.parseInt(proxyPort));
log.info("Using proxy: " + proxyHost + " at port " + proxyPort);
String proxyUser = ctx.getProxyUserName();
if (proxyUser != null) {
log.info("Using proxy user: " + proxyUser);
String proxyPass = ctx.getProxyPassword();
client.getState().setProxyCredentials(null, null, new UsernamePasswordCredentials(proxyUser, proxyPass));
}
}
}
/**
* Downloads the given link using the configured HttpClient, possibly following redirects.
*
* @param cl
* the HttpClient
* @param link
* the JiraUrl
* @return
*/
private void download(final HttpClient cl, final String link) {
try {
GetMethod gm = new GetMethod(link);
log.info("Downloading " + link);
gm.setFollowRedirects(true);
cl.executeMethod(gm);
final String strGetResponseBody = gm.getResponseBodyAsString();
// write the reponse to file
PrintWriter pw = new PrintWriter(new FileWriter(output));
pw.print(strGetResponseBody);
pw.close();
StatusLine sl = gm.getStatusLine();
if (sl == null) {
log.info("Unknown error validating link : " + link);
return;
}
// if we get a redirect, do so
if (gm.getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY) {
Header locationHeader = gm.getResponseHeader("Location");
if (locationHeader == null) {
log.info("Site sent redirect, but did not set Location header");
} else {
String newLink = locationHeader.getValue();
log.debug("Following redirect to " + newLink);
download(cl, newLink);
}
}
if (gm.getStatusCode() != HttpStatus.SC_OK) {
log.warn("Received: [" + gm.getStatusCode() + "]");
}
} catch (HttpException e) {
if (log.isDebugEnabled()) {
log.error("Error downloading issues from JIRA:", e);
} else {
log.error("Error downloading issues from JIRA. Cause is: " + e.getLocalizedMessage());
}
} catch (IOException e) {
if (log.isDebugEnabled()) {
log.error("Error downloading issues from JIRA:", e);
} else {
log.error("Error downloading issues from JIRA. Cause is: " + e.getLocalizedMessage());
}
}
}
/**
* Set the output file for the log.
*
* @param thisOutput
* the output file
*/
public void setOutput(final File thisOutput) {
this.output = thisOutput;
}
/**
* Sets the project.
* @param project The project to set
*
* @param thisProject
* The project to set
*/
public void setProject(Object project)
{
//System.out.println("Setting project: " + project);
this.project = (Project) project;
public void setProject(final Object thisProject) {
this.project = (Project) thisProject;
}
/**
* Sets the number of entries.
* @param nbEntries The number of entries
* Sets the maximum number of Issues to show.
*
* @param nbEntries
* The maximum number of Issues
*/
public void setNbEntries(int nbEntries)
{
public void setNbEntries(final int nbEntries) {
nbEntriesMax = nbEntries;
}
public void doExecute() throws Exception
{
MavenJellyContext ctx;
String proxyHost;
String proxyPort;
String proxyUser;
String proxyPass;
String link;
if (getProject() == null)
{
throw new Exception("No project set.");
}
else
{
if (((Project) getProject()).getIssueTrackingUrl() == null)
{
throw new Exception("No issue tracking url set.");
}
else
{
String url = ((Project) getProject()).getIssueTrackingUrl();
int pos = url.indexOf("?");
String id = url.substring(pos+4);
url = url.substring(0, url.lastIndexOf("/"));
link = url + "/secure/IssueNavigator.jspa?view=rss&pid=" + id + "&sorter/field=issuekey&sorter/order=DESC&sorter/field=status&sorter/order=DESC&tempMax=" + String.valueOf(nbEntriesMax) + "&reset=true&decorator=none";
}
}
ctx = ((Project) getProject()).getContext();
proxyHost = ctx.getProxyHost();
proxyPort = ctx.getProxyPort();
proxyUser = ctx.getProxyUserName();
proxyPass = ctx.getProxyPassword();
try
{
HttpClient cl = new HttpClient();
HostConfiguration hc = new HostConfiguration();
if (proxyHost != null)
{
hc.setProxy(proxyHost, Integer.parseInt(proxyPort));
}
HttpState state = new HttpState();
if (proxyUser != null && proxyPass != null)
{
state.setProxyCredentials(null, null, new UsernamePasswordCredentials(proxyUser, proxyPass));
}
cl.setHostConfiguration(hc);
cl.setState(state);
// execute the GET
GetMethod gm = download(cl, link);
StatusLine sl = gm.getStatusLine();
if (sl == null) {
LOG.info("Unknown error validating link : " + link);
return;
}
if (gm.getStatusCode() == HttpStatus.SC_MOVED_TEMPORARILY)
{
Header locationHeader = gm.getResponseHeader("Location");
if (locationHeader == null) {
LOG.info("Site sent redirect, but did not set Location header");
} else {
String newLink = locationHeader.getValue();
LOG.debug("Following 1 redirect to " + newLink);
gm = download(cl, newLink);
}
}
if (gm.getStatusCode() != HttpStatus.SC_OK)
{
String msg = "Received: [" + gm.getStatusCode() + "] for " + link;
LOG.info(msg);
System.out.println(msg);
}
}
catch (Exception e)
{
LOG.warn("Error accessing " + link);
e.printStackTrace();
}
/**
* Sets the statusIds.
*
* @param thisStatusIds
* The id(s) of the status to show, as comma separated string
*/
public void setStatusIds(final String thisStatusIds) {
statusIds = thisStatusIds;
}
private GetMethod download(HttpClient cl, String link)
{
GetMethod gm = new GetMethod(link);
try
{
System.out.println("Downloading " + link);
gm.setFollowRedirects(true);
cl.executeMethod(gm);
final String strGetResponseBody = gm.getResponseBodyAsString();
PrintWriter pw = new PrintWriter(new FileWriter(output));
pw.print(strGetResponseBody);
pw.close();
}
catch (Exception e)
{
System.out.println("Error downloading " + link);
}
return gm;
/**
* Sets the priorityIds.
*
* @param thisPriorityIds
* The id(s) of the priority to show, as comma separated string
*/
public void setPriorityIds(final String thisPriorityIds) {
priorityIds = thisPriorityIds;
}
/**
* Sets the resolutionIds.
*
* @param thisResolutionIds
* The id(s) of the resolution to show, as comma separated string
*/
public void setResolutionIds(final String thisResolutionIds) {
resolutionIds = thisResolutionIds;
}
/**
* Sets the password for authentication against the webserver.
*
* @param thisWebPassword
* The password of the webserver
*/
public void setWebPassword(final String thisWebPassword) {
this.webPassword = thisWebPassword;
}
/**
* Sets the username for authentication against the webserver.
*
* @param thisWebUser
* The username of the webserver
*/
public void setWebUser(final String thisWebUser) {
this.webUser = thisWebUser;
}
/**
* Sets the password to log into a secured JIRA.
*
* @param thisJiraPassword
* The password for JIRA
*/
public void setJiraPassword(final String thisJiraPassword) {
this.jiraPassword = thisJiraPassword;
}
/**
* Sets the username to log into a secured JIRA.
*
* @param thisJiraUser
* The username for JIRA
*/
public void setJiraUser(final String thisJiraUser) {
this.jiraUser = thisJiraUser;
}
/**
* Sets the filter to apply to query to JIRA.
*
* @param thisFilter
* The filter to query JIRA
*/
public void setFilter(final String thisFilter) {
this.filter = thisFilter;
}
/**
* Sets the component(s) to apply to query JIRA.
*
* @param theseComponents
* The id(s) of components to show, as comma separated string
*/
public void setComponent(final String theseComponents) {
this.component = theseComponents;
}
}

View File

@ -42,22 +42,30 @@
<tr>
<th style="width:150px">Key</th>
<th>Summary</th>
<th style="width:150px">Status</th>
<th style="width:150px">Resolution</th>
<th style="width:150px">By</th>
<th style="width:150px">Created</th>
<th style="width:50px">Priority</th>
<th style="width:50px">Status</th>
<th style="width:100px">Resolution</th>
<th style="width:100px">Assigned to</th>
<th style="width:100px">Reported by</th>
</tr>
</thead>
<tbody>
<x:forEach var="entry" select="item">
<j:set var="key"><x:expr select="$entry/key"/></j:set>
<j:set var="link"><x:expr select="$entry/link"/></j:set>
<j:set var="createdate"><x:expr select="$entry/created"/></j:set>
<j:set var="priority"><x:expr select="$entry/priority"/></j:set>
<j:set var="status"><x:expr select="$entry/status"/></j:set>
<j:set var="summary"><x:expr select="$entry/summary"/></j:set>
<j:set var="assignee"><x:expr select="$entry/assignee"/></j:set>
<j:set var="reporter"><x:expr select="$entry/reporter"/></j:set>
<j:set var="resolution"><x:expr select="$entry/resolution"/></j:set>
<tr>
<td><a href="${link}">${key}</a></td>
<td>${summary}</td>
<td>${createdate}</td>
<td>${priority}</td>
<td>
<j:choose>
<j:when test="${status.equalsIgnoreCase('Closed')}">
@ -82,6 +90,7 @@
</td>
<td>${resolution}</td>
<td>${assignee}</td>
<td>${reporter}</td>
</tr>
</x:forEach>
</tbody>

View File

@ -24,6 +24,10 @@
<author email="brett@apache.org">Brett Porter</author>
</properties>
<body>
<release version="1.2-SNAPSHOT" date="in SVN">
<action dev="carlos" type="fix" issue="MPJIRA-11" due-to="Michael Franken">Enable retrieving component-specific issues.</action>
<action dev="carlos" type="fix" issue="MPJIRA-8" due-to="Michael Franken">Authentication support for access a private Jira instalation.</action>
</release>
<release version="1.1.2" date="2004-10-23">
<action dev="evenisse" type="fix" issue="MPJIRA-3">Fix jira downloading url for some jira instance like Apache.</action>
</release>

View File

@ -35,12 +35,15 @@
<source>&lt;issueTrackingUrl&gt;http://jira.codehaus.org/secure/BrowseProject.jspa?id=10450&lt;/issueTrackingUrl&gt;</source>
<p>
2. make sure that your project allows group Anyone to view jira issues
(you may or may not need to also set your jira installation type to
public - this is in General Configuration under administration).
2. Determine the credentials to log into the webserver, if any. The plugin supports basic authentication (and SSL).
Add the credentials to the project.properties, as maven.jira.webUser and maven.jira.webPassword
</p>
<p>
3. log out of jira (if you are using Remember me feature) and test your setup
3. Determine the JIRA account to login to the JIRA installation.
Add the credentials to the project.properties, as maven.jira.jiraUser and maven.jira.jiraPassword
</p>
<p>
4. log out of jira (if you are using Remember me feature) and test your setup
by going to url like this one:
</p>
<source>[JIRA URL]/secure/IssueNavigator.jspa?view=rss&amp;pid=[JIRA PROJECT ID]&amp;sorter/field=issuekey&amp;sorter/order=DESC&amp;sorter/field=status&amp;sorter/order=DESC&amp;tempMax=1000&amp;reset=true</source>
@ -48,13 +51,27 @@
<source>http://jira.codehaus.org/secure/IssueNavigator.jspa?view=rss&amp;pid=10450&amp;sorter/field=issuekey&amp;sorter/order=DESC&amp;sorter/field=status&amp;sorter/order=DESC&amp;tempMax=1000&amp;reset=true</source>
<p>
4. add this to your project.xml in reports section
5. add this to your project.xml in reports section
</p>
<source>&lt;report&gt;maven-jira-plugin&lt;/report&gt;</source>
<p>
5. run site:generate and you should have jira.html in your ${basedir}/target/docs directory
6. run maven site (or just maven maven-jira-plugin:report xdoc) and you should have jira.html in your ${basedir}/target/docs directory
</p>
</answer>
</faq>
<faq id="untrusted cert">
<question>
My JIRA installation runs SSL with a self signed/home brewn certificate.
I get an error message that the certificate is untrusted. How do I proceed?
</question>
<answer>
<p>
Add the server certificate to your JAVA. You can get the certificate by exporting it from your browser.
With IE you click on the certificate info, go to the details TAB and export as .DER by clicking on 'Copy to File...'.
Using SUN's keytool you can import the certificate in your 'truststore'. It is located in $JAVA_HOME/jre/lib/security/cacerts
Import it using <source>keytool -import -file &lt;servercert&gt;.cer -keystore cacerts</source>
</p>
</answer>
</faq>
</part>
</faqs>

View File

@ -25,17 +25,17 @@
<goals>
<goal>
<name>maven-jira-plugin:deregister</name>
<description>
<description>The standard goal name for report plugins to register themselves with the site plugin.
</description>
</goal>
<goal>
<name>maven-jira-plugin:register</name>
<description>
<description>The standard goal name for report plugins to deregister themselves from the site.
</description>
</goal>
<goal>
<name>maven-jira-plugin:report</name>
<description>Generate report with all entries defined in Jira.</description>
<description>Generate report for entries defined in Jira.</description>
</goal>
</goals>
</body>

View File

@ -28,17 +28,142 @@
<th>Property</th>
<th>Optional?</th>
<th>Description</th>
<th>Default value</th>
</tr>
<tr>
<td>maven.jira.nbentries</td>
<td>Yes</td>
<td>
<p>
Defines the number of entries we want to obtain into the report.
Default value is <code>1000</code>.
Defines the maximum number of issues we want to obtain into the report.
</p>
</td>
<td>
<p>
<code>1000</code>.
</p>
</td>
</tr>
<tr>
<td>maven.jira.component</td>
<td>Yes</td>
<td>
<p>
Sets the component(s) of the project you want to limit your report to.
Multiple components can be separated by commas (such as <code>10011,10012</code>).
</p>
</td>
<td>
<p>
empty, meaning all components.
</p>
</td>
</tr>
<tr>
<td>maven.jira.status</td>
<td>Yes</td>
<td>
<p>
Sets the status(es) of the project you want to limit your report to.
Valid statuses are: <code>Open, In Progress, Reopened, Resolved and Closed</code>.
Multiple values can be separated by commas.
</p>
</td>
<td>
<p>
<code>Open, In Progress, Reopened</code>
</p>
</td>
</tr>
<tr>
<td>maven.jira.resolution</td>
<td>Yes</td>
<td>
<p>
Sets the resolution(s) of the project you want to limit your report to.
Valid statuses are: <code>Unresolved, Fixed, Won't Fix, Duplicate, Incomplete, Cannot Reproduce</code>.
Multiple values can be separated by commas.
</p>
</td>
<td>
<p>
<code>Unresolved</code>
</p>
</td>
</tr>
<tr>
<td>maven.jira.priority</td>
<td>Yes</td>
<td>
<p>
Sets the priority(s) of the project you want to limit your report to.
Valid statuses are: <code>Blocker, Critical, Major, Minor, Trivial</code>.
Multiple values can be separated by commas.
</p>
</td>
<td>
<p>
empty, meaning any priority.
</p>
</td>
</tr>
<tr>
<td>maven.jira.filter</td>
<td>Yes</td>
<td>
<p>
Defines the filter parameters to restrict the result issues from Jira.
The filter parameters property must use the same format of url parameters from the Jira search url.
Example: <code>status=1&amp;resolution=-1&amp;priority=1&amp;priority=3&amp;priority=4&amp;sorter/field=issuekey&amp;sorter/order=DESC</code>
</p>
<p>
<b>Note</b>: This string should not contain the parameters <code>pid</code>, <code>tempMax</code>
and <code>view</code>.<br/>
<b>Note</b>: This filter overrides the status, resolution, priority and component properties.
</p>
</td>
<td></td>
</tr>
<tr>
<td>maven.jira.jiraUser</td>
<td>Yes</td>
<td>
<p>
Defines the jira username for authentication into a private Jira instalation.<br/>
</p>
</td>
<td></td>
</tr>
<tr>
<td>maven.jira.jiraPassword</td>
<td>Yes</td>
<td>
<p>
Defines the jira password for authentication into a private Jira instalation.
</p>
</td>
<td></td>
</tr>
<tr>
<td>maven.jira.webUser</td>
<td>Yes</td>
<td>
<p>
Defines the http user for basic authentication into the Jira webserver.<br/>
</p>
</td>
<td></td>
</tr>
<tr>
<td>maven.jira.webPassword</td>
<td>Yes</td>
<td>
<p>
Defines the http password for basic authentication into the Jira webserver.
</p>
</td>
<td></td>
</tr>
</table>
</section>
</body>