diff --git a/src/main/java/org/kohsuke/github/GHSearchBuilder.java b/src/main/java/org/kohsuke/github/GHSearchBuilder.java index 47138f5b90..0e7d2ea89c 100644 --- a/src/main/java/org/kohsuke/github/GHSearchBuilder.java +++ b/src/main/java/org/kohsuke/github/GHSearchBuilder.java @@ -20,11 +20,13 @@ public abstract class GHSearchBuilder extends GHQueryBuilder { /** * Data transfer object that receives the result of search. */ + @Nonnull private final Class> receiverType; - GHSearchBuilder(GitHub root, Class> receiverType) { + GHSearchBuilder(@Nonnull GitHub root, @Nonnull Class> receiverType) { super(root); this.receiverType = receiverType; + req.withUrlPath(getApiUrl()); } /** @@ -42,25 +44,12 @@ public GHQueryBuilder q(String term) { /** * Performs the search. */ + @Nonnull @Override public PagedSearchIterable list() { - req.set("q", StringUtils.join(terms, " ")); try { - final GitHubRequest baseRequest = req.build(); - return new PagedSearchIterable(root) { - @Nonnull - public PagedIterator _iterator(int pageSize) { - return new PagedIterator(adapt(GitHubPageIterator.create(root.getClient(), - receiverType, - baseRequest.toBuilder().withUrlPath(getApiUrl()).withPageSize(pageSize)))) { - protected void wrapUp(T[] page) { - // PagedSearchIterable - // SearchResult.getItems() should do it - } - }; - } - }; + return new PagedSearchIterable(root, req.build(), receiverType); } catch (MalformedURLException e) { throw new GHException("", e); } diff --git a/src/main/java/org/kohsuke/github/GitHubPageContentsIterable.java b/src/main/java/org/kohsuke/github/GitHubPageContentsIterable.java index 43aebbceb5..e6d1d2b1ce 100644 --- a/src/main/java/org/kohsuke/github/GitHubPageContentsIterable.java +++ b/src/main/java/org/kohsuke/github/GitHubPageContentsIterable.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.util.function.Consumer; +import javax.annotation.CheckForNull; import javax.annotation.Nonnull; /** @@ -17,15 +18,22 @@ */ class GitHubPageContentsIterable extends PagedIterable { + @Nonnull private final GitHubClient client; + + @Nonnull private final GitHubRequest request; + + @Nonnull private final Class clazz; + + @CheckForNull private final Consumer itemInitializer; - GitHubPageContentsIterable(GitHubClient client, - GitHubRequest request, - Class clazz, - Consumer itemInitializer) { + GitHubPageContentsIterable(@Nonnull GitHubClient client, + @Nonnull GitHubRequest request, + @Nonnull Class clazz, + @CheckForNull Consumer itemInitializer) { this.client = client; this.request = request; this.clazz = clazz; @@ -40,7 +48,7 @@ class GitHubPageContentsIterable extends PagedIterable { public PagedIterator _iterator(int pageSize) { final GitHubPageIterator iterator = GitHubPageIterator .create(client, clazz, request.toBuilder().withPageSize(pageSize)); - return new GitHubPageContentsIterator(iterator); + return new GitHubPageContentsIterator<>(iterator, itemInitializer); } /** @@ -53,37 +61,10 @@ public PagedIterator _iterator(int pageSize) { */ @Nonnull GitHubResponse toResponse() throws IOException { - GitHubPageContentsIterator iterator = (GitHubPageContentsIterator) iterator(); + GitHubPageContentsIterator iterator = (GitHubPageContentsIterator) iterator(); T[] items = toArray(iterator); GitHubResponse lastResponse = iterator.lastResponse(); return new GitHubResponse<>(lastResponse, items); } - /** - * This class is not thread-safe. Any one instance should only be called from a single thread. - */ - private class GitHubPageContentsIterator extends PagedIterator { - - public GitHubPageContentsIterator(GitHubPageIterator iterator) { - super(iterator); - } - - @Override - protected void wrapUp(T[] page) { - if (itemInitializer != null) { - for (T item : page) { - itemInitializer.accept(item); - } - } - } - - /** - * Gets the {@link GitHubResponse} for the last page received. - * - * @return the {@link GitHubResponse} for the last page received. - */ - private GitHubResponse lastResponse() { - return ((GitHubPageIterator) base).finalResponse(); - } - } } diff --git a/src/main/java/org/kohsuke/github/GitHubPageContentsIterator.java b/src/main/java/org/kohsuke/github/GitHubPageContentsIterator.java new file mode 100644 index 0000000000..79637ad233 --- /dev/null +++ b/src/main/java/org/kohsuke/github/GitHubPageContentsIterator.java @@ -0,0 +1,39 @@ +package org.kohsuke.github; + +import java.util.Iterator; +import java.util.function.Consumer; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +/** + * This class is not thread-safe. Any one instance should only be called from a single thread. + */ +class GitHubPageContentsIterator extends PagedIterator { + + @CheckForNull + private final Consumer itemInitializer; + + public GitHubPageContentsIterator(@Nonnull Iterator iterator, @CheckForNull Consumer itemInitializer) { + super(iterator); + this.itemInitializer = itemInitializer; + } + + @Override + protected void wrapUp(T[] page) { + if (itemInitializer != null) { + for (T item : page) { + itemInitializer.accept(item); + } + } + } + + /** + * Gets the {@link GitHubResponse} for the last page received. + * + * @return the {@link GitHubResponse} for the last page received. + */ + GitHubResponse lastResponse() { + return ((GitHubPageIterator) base).finalResponse(); + } +} diff --git a/src/main/java/org/kohsuke/github/PagedSearchIterable.java b/src/main/java/org/kohsuke/github/PagedSearchIterable.java index 4caec25550..84969f06cd 100644 --- a/src/main/java/org/kohsuke/github/PagedSearchIterable.java +++ b/src/main/java/org/kohsuke/github/PagedSearchIterable.java @@ -4,6 +4,8 @@ import java.util.Iterator; +import javax.annotation.Nonnull; + /** * {@link PagedIterable} enhanced to report search result specific information. * @@ -14,16 +16,30 @@ value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" }, justification = "Constructed by JSON API") -public abstract class PagedSearchIterable extends PagedIterable { +public class PagedSearchIterable extends PagedIterable { + @Nonnull private final GitHub root; + @Nonnull + private final GitHubRequest request; + + /** + * Data transfer object that receives the result of search. + */ + @Nonnull + private final Class> receiverType; + /** * As soon as we have any result fetched, it's set here so that we can report the total count. */ private SearchResult result; - PagedSearchIterable(GitHub root) { + PagedSearchIterable(@Nonnull GitHub root, + @Nonnull GitHubRequest request, + @Nonnull Class> receiverType) { this.root = root; + this.receiverType = receiverType; + this.request = request; } @Override @@ -56,6 +72,15 @@ private void populate() { iterator().hasNext(); } + @Nonnull + @Override + public PagedIterator _iterator(int pageSize) { + final Iterator adapter = adapt(GitHubPageIterator + .create(root.getClient(), receiverType, this.request.toBuilder().withPageSize(pageSize))); + return new GitHubPageContentsIterator<>(adapter, null); + + } + /** * Adapts {@link Iterator}. *