MCHANGES-299: ClassNotFoundException when running jira-report using Maven 2.2.1
o work around failure of maven 2 to set the context class loader.


git-svn-id: https://svn.apache.org/repos/asf/maven/plugins/trunk@1451101 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/maven/plugin/jira/RestJiraDownloader.java b/src/main/java/org/apache/maven/plugin/jira/RestJiraDownloader.java
index 50c85a4..f10aa6a 100644
--- a/src/main/java/org/apache/maven/plugin/jira/RestJiraDownloader.java
+++ b/src/main/java/org/apache/maven/plugin/jira/RestJiraDownloader.java
@@ -95,68 +95,73 @@
         resolvedPriorityIds = new ArrayList<String>(  );
     }
 
-    public void doExecute() throws Exception
+    public void doExecute()
+        throws Exception
     {
 
         Map<String, String> urlMap = JiraHelper.getJiraUrlAndProjectName( project.getIssueManagement().getUrl() );
         String jiraUrl = urlMap.get( "url" );
         jiraProject = urlMap.get( "project" );
-        WebClient client = setupWebClient( jiraUrl );
 
-        // We use version 2 of the REST API, that first appeared in JIRA 5
-        // Check if version 2 of the REST API is supported
-        // http://docs.atlassian.com/jira/REST/5.0/
-        // Note that serverInfo can always be accessed without authentication
-        client.replacePath( "/rest/api/2/serverInfo" );
-        client.accept( MediaType.APPLICATION_JSON );
-        Response siResponse = client.get();
-        if ( siResponse.getStatus() != Response.Status.OK.getStatusCode() )
+        // This classloader juggling is a workaround for a classic Maven 2 class loader management bug.
+        ClassLoader ccl = Thread.currentThread().getContextClassLoader();
+        try
         {
-            throw new NoRest( "This JIRA server does not support version 2 of the REST API, which maven-changes-plugin requires." );
+            Thread.currentThread().setContextClassLoader( WebClient.class.getClassLoader( ) );
+            WebClient client = setupWebClient( jiraUrl );
+
+            // We use version 2 of the REST API, that first appeared in JIRA 5
+            // Check if version 2 of the REST API is supported
+            // http://docs.atlassian.com/jira/REST/5.0/
+            // Note that serverInfo can always be accessed without authentication
+            client.replacePath( "/rest/api/2/serverInfo" );
+            client.accept( MediaType.APPLICATION_JSON );
+            Response siResponse = client.get();
+            if ( siResponse.getStatus() != Response.Status.OK.getStatusCode() )
+            {
+                throw new NoRest(
+                    "This JIRA server does not support version 2 of the REST API, which maven-changes-plugin requires." );
+            }
+
+            doSessionAuth( client );
+
+            resolveIds( client, jiraProject );
+
+            String jqlQuery = new JqlQueryBuilder( log ).urlEncode( false ).project( jiraProject ).fixVersion(
+                getFixFor() ).fixVersionIds( resolvedFixVersionIds ).statusIds( resolvedStatusIds ).priorityIds(
+                resolvedPriorityIds ).resolutionIds( resolvedResolutionIds ).components( resolvedComponentIds ).typeIds(
+                resolvedTypeIds ).sortColumnNames( sortColumnNames ).build();
+
+            StringWriter searchParamStringWriter = new StringWriter();
+            JsonGenerator gen = jsonFactory.createGenerator( searchParamStringWriter );
+            gen.writeStartObject();
+            gen.writeStringField( "jql", jqlQuery );
+            gen.writeNumberField( "maxResults", nbEntriesMax );
+            gen.writeArrayFieldStart( "fields" );
+            // Retrieve all fields. If that seems slow, we can reconsider.
+            gen.writeString( "*all" );
+            gen.writeEndArray();
+            gen.writeEndObject();
+            gen.close();
+            client.replacePath( "/rest/api/2/search" );
+            client.type( MediaType.APPLICATION_JSON_TYPE );
+            client.accept( MediaType.APPLICATION_JSON_TYPE );
+            Response searchResponse = client.post( searchParamStringWriter.toString() );
+            if ( searchResponse.getStatus() != Response.Status.OK.getStatusCode() )
+            {
+                reportErrors( searchResponse );
+            }
+
+            JsonNode issueTree = getResponseTree( searchResponse );
+            assert issueTree.isObject();
+            JsonNode issuesNode = issueTree.get( "issues" );
+            assert issuesNode.isArray();
+            buildIssues( issuesNode, jiraUrl, jiraProject );
         }
-
-        doSessionAuth( client );
-
-        resolveIds( client, jiraProject );
-
-        String jqlQuery = new JqlQueryBuilder( log )
-            .urlEncode( false )
-            .project( jiraProject )
-            .fixVersion( getFixFor() )
-            .fixVersionIds( resolvedFixVersionIds )
-            .statusIds( resolvedStatusIds )
-            .priorityIds( resolvedPriorityIds )
-            .resolutionIds( resolvedResolutionIds )
-            .components( resolvedComponentIds )
-            .typeIds( resolvedTypeIds )
-            .sortColumnNames( sortColumnNames )
-            .build();
-
-        StringWriter searchParamStringWriter = new StringWriter( );
-        JsonGenerator gen = jsonFactory.createGenerator( searchParamStringWriter );
-        gen.writeStartObject();
-        gen.writeStringField( "jql", jqlQuery );
-        gen.writeNumberField( "maxResults", nbEntriesMax );
-        gen.writeArrayFieldStart( "fields" );
-        // Retrieve all fields. If that seems slow, we can reconsider.
-        gen.writeString( "*all" );
-        gen.writeEndArray();
-        gen.writeEndObject();
-        gen.close();
-        client.replacePath( "/rest/api/2/search" );
-        client.type( MediaType.APPLICATION_JSON_TYPE );
-        client.accept( MediaType.APPLICATION_JSON_TYPE );
-        Response searchResponse = client.post( searchParamStringWriter.toString() );
-        if ( searchResponse.getStatus() != Response.Status.OK.getStatusCode() )
+        finally
         {
-            reportErrors( searchResponse );
+            Thread.currentThread().setContextClassLoader( ccl );
         }
-
-        JsonNode issueTree = getResponseTree( searchResponse );
-        assert issueTree.isObject();
-        JsonNode issuesNode = issueTree.get( "issues" );
-        assert issuesNode.isArray();
-        buildIssues( issuesNode, jiraUrl, jiraProject );
     }
 
     private JsonNode getResponseTree( Response response )