Add package.html, code formatting.

git-svn-id: https://svn.apache.org/repos/asf/maven/maven-1/plugins/trunk@367739 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
ltheussl 2006-01-10 19:12:59 +00:00
parent 4a2a8c45ab
commit cde8859e34
2 changed files with 372 additions and 205 deletions

View File

@ -21,8 +21,10 @@ import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.NumberFormat;
import java.text.ParsePosition;
import java.util.HashMap;
import java.util.Map;
@ -48,11 +50,43 @@ import org.apache.maven.project.Project;
*
* @author mfranken@xebia.com
*/
public final class JiraDownloader {
public final class JiraDownloader
{
/**
* Log for debug output.
*/
private static Log log = LogFactory.getLog(JiraDownloader.class);
private static Log log = LogFactory.getLog( JiraDownloader.class );
/** 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" );
}
/** Output file for xml document. */
private File output;
@ -93,93 +127,92 @@ public final class JiraDownloader {
/** Include a Jira roadmap. */
private boolean roadmap;
/** 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");
}
/**
* 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
*/
private String createFilter() {
if (this.filter != null && this.filter.length() > 0) {
if (this.filter.charAt(0) == '&') {
return this.filter.substring(1);
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);
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 ( 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) {
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);
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]);
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";
String sort =
"&sorter/field=created&sorter/order=DESC"
+ "&sorter/field=priority&sorter/order=DESC";
return localFilter + sort;
}
@ -189,117 +222,158 @@ public final class JiraDownloader {
* @throws Exception
* on error
*/
public void doExecute() throws Exception {
if (project == null) {
throw new Exception("No project set.");
public void doExecute()
throws Exception
{
if ( project == null )
{
throw new Exception( "No project set." );
}
if (project.getIssueTrackingUrl() == null) {
throw new Exception("No issue tracking url set.");
if ( project.getIssueTrackingUrl() == null )
{
throw new Exception( "No issue tracking url set." );
}
try {
try
{
HttpClient cl = new HttpClient();
HttpState state = new HttpState();
HostConfiguration hc = new HostConfiguration();
cl.setHostConfiguration(hc);
cl.setState(state);
determineProxy(cl);
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("?");
int pos = url.indexOf( "?" );
// and get the id while we're at it
String id = null;
if (pos >= 0) {
if ( pos >= 0 )
{
// url
id = url.substring(url.lastIndexOf("=") + 1);
id = url.substring( url.lastIndexOf( "=" ) + 1 );
}
String jiraUrl = url.substring(0, url.lastIndexOf("/"));
if (jiraUrl.endsWith("secure") || jiraUrl.endsWith("browse")) {
jiraUrl = jiraUrl.substring(0, jiraUrl.lastIndexOf("/"));
String jiraUrl = url.substring( 0, url.lastIndexOf( "/" ) );
if ( jiraUrl.endsWith( "secure" ) || jiraUrl.endsWith( "browse" ) )
{
jiraUrl = jiraUrl.substring( 0, jiraUrl.lastIndexOf( "/" ) );
}
log.info("Jira lives at: " + jiraUrl);
doAuthentication(cl, jiraUrl);
log.info( "Jira lives at: " + jiraUrl );
doAuthentication( cl, jiraUrl );
String projectPage = "";
if ( id == null || roadmap)
if ( ( id == null ) || roadmap )
{
GetMethod gm = new GetMethod( url + "?report=com.atlassian.jira.plugin.system.project:roadmap-panel" );
GetMethod gm =
new GetMethod( url
+ "?report=com.atlassian.jira.plugin.system.project:roadmap-panel" );
try
{
cl.executeMethod(gm);
log.info("Succesfully reached JIRA.");
cl.executeMethod( gm );
log.info( "Succesfully reached JIRA." );
}
catch (Exception e)
catch ( Exception e )
{
if (log.isDebugEnabled())
if ( log.isDebugEnabled() )
{
log.error("Unable to reach JIRA project page:", e);
log.error( "Unable to reach JIRA project page:", e );
}
else
{
log.error("Unable to reach JIRA project page. Cause is: " + e.getLocalizedMessage());
log.error(
"Unable to reach JIRA project page. Cause is: "
+ e.getLocalizedMessage() );
}
}
projectPage = gm.getResponseBodyAsString();
}
if ( id == null )
{
log.info("Jira URL " + url + " doesn't include a pid, trying to get it");
int pidIndex = projectPage.indexOf("pid="); // @todo, a safer way to get the PID
log.info( "Jira URL " + url
+ " doesn't include a pid, trying to get it" );
if (pidIndex == -1)
int pidIndex = projectPage.indexOf( "pid=" ); // @todo, a safer way to get the PID
if ( pidIndex == -1 )
{
// fail
log.error("Unable to get JIRA pid using url " + project.getIssueTrackingUrl());
log.error( "Unable to get JIRA pid using url "
+ project.getIssueTrackingUrl() );
return;
}
NumberFormat nf = NumberFormat.getInstance();
Number pidNumber = nf.parse(projectPage, new ParsePosition(pidIndex + 4));
id = Integer.toString(pidNumber.intValue());
Number pidNumber =
nf.parse( projectPage, new ParsePosition( pidIndex + 4 ) );
id = Integer.toString( pidNumber.intValue() );
}
// create the URL for getting the proper iussues from JIRA
String fullURL = jiraUrl + "/secure/IssueNavigator.jspa?view=rss&pid=" + id;
String fullURL =
jiraUrl + "/secure/IssueNavigator.jspa?view=rss&pid=" + id;
fullURL += createFilter();
fullURL += "&tempMax=" + nbEntriesMax + "&reset=true&decorator=none";
fullURL += ( "&tempMax=" + nbEntriesMax
+ "&reset=true&decorator=none" );
// execute the GET
download(cl, fullURL, output);
download( cl, fullURL, output );
if ( roadmap )
{
int fixforIndex = projectPage.indexOf("fixfor="); // @todo, a safer way to get the PID
int fixforIndex = projectPage.indexOf( "fixfor=" ); // @todo, a safer way to get the PID
if (fixforIndex == -1)
if ( fixforIndex == -1 )
{
// fail
log.error("Unable to get JIRA roadmap using url " + project.getIssueTrackingUrl());
log.error( "Unable to get JIRA roadmap using url "
+ project.getIssueTrackingUrl() );
return;
}
NumberFormat nf = NumberFormat.getInstance();
Number fixforNumber = nf.parse(projectPage, new ParsePosition(fixforIndex + 7));
String fixfor = Integer.toString(fixforNumber.intValue());
setFilter("&&fixfor=" + fixfor + "&sorter/field=status&sorter/order=ASC");
fullURL = jiraUrl + "/secure/IssueNavigator.jspa?view=rss&pid=" + id;
Number fixforNumber =
nf.parse( projectPage, new ParsePosition( fixforIndex + 7 ) );
String fixfor = Integer.toString( fixforNumber.intValue() );
setFilter( "&&fixfor=" + fixfor
+ "&sorter/field=status&sorter/order=ASC" );
fullURL =
jiraUrl + "/secure/IssueNavigator.jspa?view=rss&pid=" + id;
fullURL += createFilter();
fullURL += "&tempMax=" + nbEntriesMax + "&reset=true&decorator=none";
fullURL += ( "&tempMax=" + nbEntriesMax
+ "&reset=true&decorator=none" );
String outFile = output.getAbsolutePath();
int endIndex = outFile.lastIndexOf( '/' );
outFile = outFile.substring( 0, endIndex ) + "/jira-roadmap.xml";
// execute the GET
download(cl, fullURL, new File( outFile ) );
}
} catch (Exception e) {
log.error("Error accessing " + project.getIssueTrackingUrl(), e);
outFile =
outFile.substring( 0, endIndex ) + "/jira-roadmap.xml";
// execute the GET
download( cl, fullURL, new File( outFile ) );
}
}
catch ( Exception e )
{
log.error( "Error accessing " + project.getIssueTrackingUrl(), e );
}
}
@ -311,38 +385,59 @@ public final class JiraDownloader {
* @param jiraUrl
* the JIRA installation
*/
private void doAuthentication(HttpClient client, final String jiraUrl) {
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);
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);
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());
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
}
}
@ -354,28 +449,45 @@ public final class JiraDownloader {
* @param client
* the HttpClient
*/
private void determineProxy(HttpClient client) {
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.");
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.");
if ( ctx == null )
{
log.error( "Maven project has no context. No proxy info available." );
return;
}
String proxyHost = ctx.getProxyHost();
if (proxyHost != null) {
if ( proxyHost != null )
{
String proxyPort = ctx.getProxyPort();
client.getHostConfiguration().setProxy(proxyHost, Integer.parseInt(proxyPort));
log.info("Using proxy: " + proxyHost + " at port " + proxyPort);
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);
if ( proxyUser != null )
{
log.info( "Using proxy user: " + proxyUser );
String proxyPass = ctx.getProxyPassword();
client.getState().setProxyCredentials(null, null, new UsernamePasswordCredentials(proxyUser, proxyPass));
client.getState().setProxyCredentials( null, null,
new UsernamePasswordCredentials( proxyUser, proxyPass ) );
}
}
}
@ -387,51 +499,83 @@ public final class JiraDownloader {
* the HttpClient
* @param link
* the JiraUrl
* @param outFile
* the output file
* @return
*/
private void download(final HttpClient cl, final String link, final File outFile) {
try {
GetMethod gm = new GetMethod(link);
log.info("Downloading " + link);
gm.setFollowRedirects(true);
cl.executeMethod(gm);
private void download( final HttpClient cl, final String link,
final File outFile )
{
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(outFile));
pw.print(strGetResponseBody);
PrintWriter pw = new PrintWriter( new FileWriter( outFile ) );
pw.print( strGetResponseBody );
pw.close();
StatusLine sl = gm.getStatusLine();
if (sl == null) {
log.info("Unknown error validating link : " + link);
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 {
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, outFile);
log.debug( "Following redirect to " + newLink );
download( cl, newLink, outFile );
}
}
if (gm.getStatusCode() != HttpStatus.SC_OK) {
log.warn("Received: [" + gm.getStatusCode() + "]");
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 ( HttpException e )
{
if ( log.isDebugEnabled() )
{
log.error( "Error downloading issues from JIRA:", e );
}
} 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());
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() );
}
}
}
@ -442,7 +586,8 @@ public final class JiraDownloader {
* @param thisOutput
* the output file
*/
public void setOutput(final File thisOutput) {
public void setOutput( final File thisOutput )
{
this.output = thisOutput;
}
@ -452,7 +597,8 @@ public final class JiraDownloader {
* @param thisProject
* The project to set
*/
public void setProject(final Object thisProject) {
public void setProject( final Object thisProject )
{
this.project = (Project) thisProject;
}
@ -462,7 +608,8 @@ public final class JiraDownloader {
* @param nbEntries
* The maximum number of Issues
*/
public void setNbEntries(final int nbEntries) {
public void setNbEntries( final int nbEntries )
{
nbEntriesMax = nbEntries;
}
@ -472,7 +619,8 @@ public final class JiraDownloader {
* @param thisStatusIds
* The id(s) of the status to show, as comma separated string
*/
public void setStatusIds(final String thisStatusIds) {
public void setStatusIds( final String thisStatusIds )
{
statusIds = thisStatusIds;
}
@ -482,7 +630,8 @@ public final class JiraDownloader {
* @param thisPriorityIds
* The id(s) of the priority to show, as comma separated string
*/
public void setPriorityIds(final String thisPriorityIds) {
public void setPriorityIds( final String thisPriorityIds )
{
priorityIds = thisPriorityIds;
}
@ -492,7 +641,8 @@ public final class JiraDownloader {
* @param thisResolutionIds
* The id(s) of the resolution to show, as comma separated string
*/
public void setResolutionIds(final String thisResolutionIds) {
public void setResolutionIds( final String thisResolutionIds )
{
resolutionIds = thisResolutionIds;
}
@ -502,7 +652,8 @@ public final class JiraDownloader {
* @param thisWebPassword
* The password of the webserver
*/
public void setWebPassword(final String thisWebPassword) {
public void setWebPassword( final String thisWebPassword )
{
this.webPassword = thisWebPassword;
}
@ -512,7 +663,8 @@ public final class JiraDownloader {
* @param thisWebUser
* The username of the webserver
*/
public void setWebUser(final String thisWebUser) {
public void setWebUser( final String thisWebUser )
{
this.webUser = thisWebUser;
}
@ -522,7 +674,8 @@ public final class JiraDownloader {
* @param thisJiraPassword
* The password for JIRA
*/
public void setJiraPassword(final String thisJiraPassword) {
public void setJiraPassword( final String thisJiraPassword )
{
this.jiraPassword = thisJiraPassword;
}
@ -532,7 +685,8 @@ public final class JiraDownloader {
* @param thisJiraUser
* The username for JIRA
*/
public void setJiraUser(final String thisJiraUser) {
public void setJiraUser( final String thisJiraUser )
{
this.jiraUser = thisJiraUser;
}
@ -542,7 +696,8 @@ public final class JiraDownloader {
* @param thisFilter
* The filter to query JIRA
*/
public void setFilter(final String thisFilter) {
public void setFilter( final String thisFilter )
{
this.filter = thisFilter;
}
@ -552,7 +707,8 @@ public final class JiraDownloader {
* @param theseComponents
* The id(s) of components to show, as comma separated string
*/
public void setComponent(final String theseComponents) {
public void setComponent( final String theseComponents )
{
this.component = theseComponents;
}
@ -560,8 +716,8 @@ public final class JiraDownloader {
* Sets the roadmap property.
* @param thisRoadmap The roadmap.
*/
public void setRoadmap(final boolean thisRoadmap) {
public void setRoadmap( final boolean thisRoadmap )
{
this.roadmap = thisRoadmap;
}
}

View File

@ -0,0 +1,11 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title>org.apache.maven.jira</title>
</head>
<body>
<p>
Contains utility classes to perform operations on JIRA installations.
</p>
</body>
</html>