package org.kohsuke.github; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Iterator; import javax.annotation.Nonnull; /** * {@link PagedIterable} enhanced to report search result specific information. * * @param * the type parameter * @author Kohsuke Kawaguchi */ @SuppressFBWarnings( value = { "UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD", "UWF_UNWRITTEN_FIELD", "UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" }, justification = "Constructed by JSON API") public class PagedSearchIterable extends PagedIterable { private final transient GitHub root; private final GitHubRequest request; 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, GitHubRequest request, Class> receiverType) { this.root = root; this.request = request; this.receiverType = receiverType; } @Override public PagedSearchIterable withPageSize(int size) { return (PagedSearchIterable) super.withPageSize(size); } /** * Returns the total number of hit, including the results that's not yet fetched. * * @return the total count */ public int getTotalCount() { populate(); return result.total_count; } /** * Is incomplete boolean. * * @return the boolean */ public boolean isIncomplete() { populate(); return result.incomplete_results; } private void populate() { if (result == null) iterator().hasNext(); } @Nonnull @Override public PagedIterator _iterator(int pageSize) { final Iterator adapter = adapt( GitHubPageIterator.create(root.getClient(), receiverType, request, pageSize)); return new PagedIterator(adapter, null); } /** * Adapts {@link Iterator}. * * @param base * the base * @return the iterator */ protected Iterator adapt(final Iterator> base) { return new Iterator() { public boolean hasNext() { return base.hasNext(); } public T[] next() { SearchResult v = base.next(); if (result == null) result = v; return v.getItems(root); } }; } }