diff options
author | Chris Somme <csomme@atlassian.com> | 2016-08-25 11:17:37 -0700 |
---|---|---|
committer | Chris Somme <csomme@atlassian.com> | 2016-08-25 11:28:18 -0700 |
commit | 3f1ccecdf1acee11f43377a613b4943580a38ea8 (patch) | |
tree | 2c86a5a708c6c47dba54dc7116d3a810ce7e7df3 /src/main | |
parent | 37d5d42e056d5faff0bbed119115a4cbe7c4e016 (diff) | |
download | bbprb-3f1ccecdf1acee11f43377a613b4943580a38ea8.tar.gz |
Use the V2 Bitbucket pull request comment API.
The V1 pull request comment API is deprecated. Replace with a call
to the V2 API. The V2 API is paginated and may need to be called
multiple times to get the entire set of comments.
While fixing this I noticed that while fetching pull requests the
plugin is using the v2 API there, which is also paginated. So not
all open pull requests were being retrieved.
Diffstat (limited to 'src/main')
2 files changed, 47 insertions, 24 deletions
diff --git a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java index c8dfeb2..7025396 100644 --- a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java +++ b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/ApiClient.java @@ -6,9 +6,12 @@ import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.DeleteMethod; import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.type.TypeFactory; +import org.codehaus.jackson.type.JavaType; import org.codehaus.jackson.type.TypeReference; import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Level; @@ -82,23 +85,11 @@ public class ApiClient { } public List<Pullrequest> getPullRequests() { - try { - return parse(get(v2("/pullrequests/")), Pullrequest.Response.class).getPullrequests(); - } catch(Exception e) { - logger.log(Level.WARNING, "invalid pull request response.", e); - e.printStackTrace(); - } - return Collections.EMPTY_LIST; + return getAllValues(v2("/pullrequests/"), 50, Pullrequest.class); } public List<Pullrequest.Comment> getPullRequestComments(String commentOwnerName, String commentRepositoryName, String pullRequestId) { - try { - return parse(get(v1("/pullrequests/" + pullRequestId + "/comments")), new TypeReference<List<Pullrequest.Comment>>() {}); - } catch(Exception e) { - logger.log(Level.WARNING, "invalid pull request response.", e); - e.printStackTrace(); - } - return Collections.EMPTY_LIST; + return getAllValues(v2("/pullrequests/" + pullRequestId + "/comments"), 100, Pullrequest.Comment.class); } public String getName() { @@ -193,6 +184,23 @@ public class ApiClient { return null; } + private <T> List<T> getAllValues(String rootUrl, int pageLen, Class<T> cls) { + List<T> values = new ArrayList<T>(); + try { + String url = rootUrl + "?pagelen=" + pageLen; + do { + final JavaType type = TypeFactory.defaultInstance().constructParametricType(Pullrequest.Response.class, cls); + Pullrequest.Response<T> response = parse(get(url), type); + values.addAll(response.getValues()); + url = response.getNext(); + } while (url != null); + } catch (Exception e) { + logger.log(Level.WARNING, "invalid response.", e); + e.printStackTrace(); + } + return values; + } + private HttpClient getHttpClient() { return this.factory.getInstanceHttpClient(); } @@ -253,6 +261,9 @@ public class ApiClient { private <R> R parse(String response, Class<R> cls) throws IOException { return new ObjectMapper().readValue(response, cls); } + private <R> R parse(String response, JavaType type) throws IOException { + return new ObjectMapper().readValue(response, type); + } private <R> R parse(String response, TypeReference<R> ref) throws IOException { return new ObjectMapper().readValue(response, ref); } diff --git a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/Pullrequest.java b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/Pullrequest.java index 140c213..96412b2 100644 --- a/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/Pullrequest.java +++ b/src/main/java/bitbucketpullrequestbuilder/bitbucketpullrequestbuilder/bitbucket/Pullrequest.java @@ -2,6 +2,7 @@ package bitbucketpullrequestbuilder.bitbucketpullrequestbuilder.bitbucket; import java.util.List; import java.util.Comparator; +import java.util.Map; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; @@ -31,11 +32,12 @@ public class Pullrequest { private Author author; @JsonIgnoreProperties(ignoreUnknown = true) - public static class Response { + public static class Response<T> { private int pageLength; - private List<Pullrequest> pullrequests; + private List<T> values; private int page; private int size; + private String next; @JsonProperty("pagelen") public int getPageLength() { @@ -45,13 +47,11 @@ public class Pullrequest { public void setPageLength(int pageLength) { this.pageLength = pageLength; } - @JsonProperty("values") - public List<Pullrequest> getPullrequests() { - return pullrequests; + public List<T> getValues() { + return values; } - @JsonProperty("values") - public void setPullrequests(List<Pullrequest> pullrequests) { - this.pullrequests = pullrequests; + public void setValues(List<T> values) { + this.values = values; } public int getPage() { return page; @@ -65,8 +65,15 @@ public class Pullrequest { public void setSize(int size) { this.size = size; } + public String getNext() { + return next; + } + public void setNext(String next) { + this.next = next; + } } + @JsonIgnoreProperties(ignoreUnknown = true) public static class Revision { private Repository repository; @@ -214,8 +221,13 @@ public class Pullrequest { return content; } - public void setContent(String content) { - this.content = content; + public void setContent(Object content) { + if (content instanceof String) { + this.content = (String)content; + } else if (content instanceof Map){ + this.content = (String)((Map)content).get("raw"); + } + return; } @JsonProperty("utc_last_updated") public String getUpdatedOn() { |