Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 5 additions & 16 deletions src/main/java/org/kohsuke/github/GHSearchBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@ public abstract class GHSearchBuilder<T> extends GHQueryBuilder<T> {
/**
* Data transfer object that receives the result of search.
*/
@Nonnull
private final Class<? extends SearchResult<T>> receiverType;

GHSearchBuilder(GitHub root, Class<? extends SearchResult<T>> receiverType) {
GHSearchBuilder(@Nonnull GitHub root, @Nonnull Class<? extends SearchResult<T>> receiverType) {
super(root);
this.receiverType = receiverType;
req.withUrlPath(getApiUrl());
}

/**
Expand All @@ -42,25 +44,12 @@ public GHQueryBuilder<T> q(String term) {
/**
* Performs the search.
*/
@Nonnull
@Override
public PagedSearchIterable<T> list() {

req.set("q", StringUtils.join(terms, " "));
try {
final GitHubRequest baseRequest = req.build();
return new PagedSearchIterable<T>(root) {
@Nonnull
public PagedIterator<T> _iterator(int pageSize) {
return new PagedIterator<T>(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<T>(root, req.build(), receiverType);
} catch (MalformedURLException e) {
throw new GHException("", e);
}
Expand Down
47 changes: 14 additions & 33 deletions src/main/java/org/kohsuke/github/GitHubPageContentsIterable.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.io.IOException;
import java.util.function.Consumer;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;

/**
Expand All @@ -17,15 +18,22 @@
*/
class GitHubPageContentsIterable<T> extends PagedIterable<T> {

@Nonnull
private final GitHubClient client;

@Nonnull
private final GitHubRequest request;

@Nonnull
private final Class<T[]> clazz;

@CheckForNull
private final Consumer<T> itemInitializer;

GitHubPageContentsIterable(GitHubClient client,
GitHubRequest request,
Class<T[]> clazz,
Consumer<T> itemInitializer) {
GitHubPageContentsIterable(@Nonnull GitHubClient client,
@Nonnull GitHubRequest request,
@Nonnull Class<T[]> clazz,
@CheckForNull Consumer<T> itemInitializer) {
this.client = client;
this.request = request;
this.clazz = clazz;
Expand All @@ -40,7 +48,7 @@ class GitHubPageContentsIterable<T> extends PagedIterable<T> {
public PagedIterator<T> _iterator(int pageSize) {
final GitHubPageIterator<T[]> iterator = GitHubPageIterator
.create(client, clazz, request.toBuilder().withPageSize(pageSize));
return new GitHubPageContentsIterator(iterator);
return new GitHubPageContentsIterator<>(iterator, itemInitializer);
}

/**
Expand All @@ -53,37 +61,10 @@ public PagedIterator<T> _iterator(int pageSize) {
*/
@Nonnull
GitHubResponse<T[]> toResponse() throws IOException {
GitHubPageContentsIterator iterator = (GitHubPageContentsIterator) iterator();
GitHubPageContentsIterator<T> iterator = (GitHubPageContentsIterator<T>) iterator();
T[] items = toArray(iterator);
GitHubResponse<T[]> 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<T> {

public GitHubPageContentsIterator(GitHubPageIterator<T[]> 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<T[]> lastResponse() {
return ((GitHubPageIterator<T[]>) base).finalResponse();
}
}
}
39 changes: 39 additions & 0 deletions src/main/java/org/kohsuke/github/GitHubPageContentsIterator.java
Original file line number Diff line number Diff line change
@@ -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<T> extends PagedIterator<T> {

@CheckForNull
private final Consumer<T> itemInitializer;

public GitHubPageContentsIterator(@Nonnull Iterator<T[]> iterator, @CheckForNull Consumer<T> 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<T[]> lastResponse() {
return ((GitHubPageIterator<T[]>) base).finalResponse();
}
}
29 changes: 27 additions & 2 deletions src/main/java/org/kohsuke/github/PagedSearchIterable.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

import java.util.Iterator;

import javax.annotation.Nonnull;

/**
* {@link PagedIterable} enhanced to report search result specific information.
*
Expand All @@ -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<T> extends PagedIterable<T> {
public class PagedSearchIterable<T> extends PagedIterable<T> {
@Nonnull
private final GitHub root;

@Nonnull
private final GitHubRequest request;

/**
* Data transfer object that receives the result of search.
*/
@Nonnull
private final Class<? extends SearchResult<T>> receiverType;

/**
* As soon as we have any result fetched, it's set here so that we can report the total count.
*/
private SearchResult<T> result;

PagedSearchIterable(GitHub root) {
PagedSearchIterable(@Nonnull GitHub root,
@Nonnull GitHubRequest request,
@Nonnull Class<? extends SearchResult<T>> receiverType) {
this.root = root;
this.receiverType = receiverType;
this.request = request;
}

@Override
Expand Down Expand Up @@ -56,6 +72,15 @@ private void populate() {
iterator().hasNext();
}

@Nonnull
@Override
public PagedIterator<T> _iterator(int pageSize) {
final Iterator<T[]> adapter = adapt(GitHubPageIterator
.create(root.getClient(), receiverType, this.request.toBuilder().withPageSize(pageSize)));
return new GitHubPageContentsIterator<>(adapter, null);

}

/**
* Adapts {@link Iterator}.
*
Expand Down