Skip to content

Commit 78d1a9e

Browse files
committed
Flatten tree
1 parent 7fdfb85 commit 78d1a9e

File tree

5 files changed

+103
-169
lines changed

5 files changed

+103
-169
lines changed

src/main/java/org/kohsuke/github/GitHubEndpointIterable.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ static <P extends GitHubPage<I>, I> GitHubEndpointIterable<P, I> ofSingleton(P p
107107
return new GitHubEndpointIterable<>(null, null, (Class<P>) page.getClass(), itemType, null) {
108108
@Nonnull
109109
@Override
110-
public GitHubPageIterator<P, I> pageIterator() {
111-
return GitHubPageIterator.ofSingleton(page);
110+
public GitHubEndpointPageIterator<P, I> pageIterator() {
111+
return GitHubEndpointPageIterator.ofSingleton(page);
112112
}
113113
};
114114
}
@@ -165,7 +165,7 @@ public final Iterator<Item> iterator() {
165165
* @return
166166
*/
167167
@Nonnull
168-
public GitHubPageIterator<Page, Item> pageIterator() {
168+
public GitHubEndpointPageIterator<Page, Item> pageIterator() {
169169
return new GitHubEndpointPageIterator<>(client, pageType, request, pageSize, itemInitializer);
170170
}
171171

@@ -251,7 +251,7 @@ private Item[] concatenatePages(List<Item[]> pages, int totalLength) {
251251
* @throws IOException
252252
* if an I/O exception occurs.
253253
*/
254-
private Item[] toArray(final GitHubPageIterator<Page, Item> iterator, Class<Item> itemType) throws IOException {
254+
private Item[] toArray(final GitHubEndpointPageIterator<Page, Item> iterator, Class<Item> itemType) throws IOException {
255255
try {
256256
ArrayList<Item[]> pages = new ArrayList<>();
257257
int totalSize = 0;
@@ -284,7 +284,7 @@ private Item[] toArray(final GitHubPageIterator<Page, Item> iterator, Class<Item
284284
*/
285285
@Nonnull
286286
final GitHubResponse<Item[]> toResponse() throws IOException {
287-
GitHubPageIterator<Page, Item> iterator = pageIterator();
287+
GitHubEndpointPageIterator<Page, Item> iterator = pageIterator();
288288
Item[] items = toArray(iterator, itemType);
289289
GitHubResponse<Page> lastResponse = iterator.finalResponse();
290290
return new GitHubResponse<>(lastResponse, items);

src/main/java/org/kohsuke/github/GitHubEndpointPageIterator.java

Lines changed: 77 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import org.jetbrains.annotations.NotNull;
44

5+
import javax.annotation.Nonnull;
56
import java.io.IOException;
67
import java.net.URL;
8+
import java.util.NoSuchElementException;
79
import java.util.function.Consumer;
810

911
/**
@@ -21,8 +23,21 @@
2123
* @param <P>
2224
* type of each page (not the items in the page).
2325
*/
24-
class GitHubEndpointPageIterator<P extends GitHubPage<Item>, Item> extends GitHubPageIterator<P, Item> {
26+
class GitHubEndpointPageIterator<P extends GitHubPage<Item>, Item> implements java.util.Iterator<P> {
2527

28+
protected final Class<P> pageType;
29+
private final Consumer<Item> itemInitializer;
30+
/**
31+
* The page that will be returned when {@link #next()} is called.
32+
*
33+
* <p>
34+
* Will be {@code null} after {@link #next()} is called.
35+
* </p>
36+
* <p>
37+
* Will not be {@code null} after {@link #fetchNext()} is called if a new page was fetched.
38+
* </p>
39+
*/
40+
private P next;
2641
/**
2742
* When done iterating over pages, it is on rare occasions useful to be able to get information from the final
2843
* response that was retrieved.
@@ -37,12 +52,18 @@ class GitHubEndpointPageIterator<P extends GitHubPage<Item>, Item> extends GitHu
3752
*/
3853
protected GitHubRequest nextRequest;
3954

55+
private GitHubEndpointPageIterator(P page) {
56+
this(null, (Class<P>)page.getClass(), null, 0, null);
57+
this.next = page;
58+
}
59+
4060
GitHubEndpointPageIterator(GitHubClient client,
4161
Class<P> pageType,
4262
GitHubRequest request,
4363
int pageSize,
4464
Consumer<Item> itemInitializer) {
45-
super(pageType, itemInitializer);
65+
this.pageType = pageType;
66+
this.itemInitializer = itemInitializer;
4667

4768
if (pageSize > 0) {
4869
GitHubRequest.Builder<?> builder = request.toBuilder().with("per_page", pageSize);
@@ -57,6 +78,10 @@ class GitHubEndpointPageIterator<P extends GitHubPage<Item>, Item> extends GitHu
5778
this.nextRequest = request;
5879
}
5980

81+
static <P extends GitHubPage<Item>, Item> GitHubEndpointPageIterator<P, Item> ofSingleton(final P page) {
82+
return new GitHubEndpointPageIterator<>(page);
83+
}
84+
6085
/**
6186
* On rare occasions the final response from iterating is needed.
6287
*
@@ -97,7 +122,8 @@ private void updateNextRequest(GitHubResponse<P> nextResponse) {
97122
* Fetch is called at the start of {@link #hasNext()} or {@link #next()} to fetch another page of data if it is
98123
* needed.
99124
* <p>
100-
* If {@link #next} is not {@code null}, no further action is needed. If {@link #next} is {@code null} and
125+
* If {@link #next} is not {@code null}, no further action is needed.
126+
* If {@link #next} is {@code null} and
101127
* {@link #nextRequest} is {@code null}, there are no more pages to fetch.
102128
* </p>
103129
* <p>
@@ -106,10 +132,9 @@ private void updateNextRequest(GitHubResponse<P> nextResponse) {
106132
* after the current response, {@link #nextRequest} is set to {@code null}.
107133
* </p>
108134
*/
109-
@Override
110135
protected P fetchNext() {
111-
if (next != null || nextRequest == null)
112-
return null; // already fetched or no more data to fetch
136+
if (nextRequest == null)
137+
return null; // no more data to fetch
113138

114139
P result;
115140

@@ -132,4 +157,50 @@ protected P fetchNext() {
132157
(connectorResponse) -> GitHubResponse.parseBody(connectorResponse, pageType));
133158
}
134159

160+
/**
161+
* {@inheritDoc}
162+
*/
163+
public boolean hasNext() {
164+
return peek() != null;
165+
}
166+
167+
/**
168+
* {@inheritDoc}
169+
*/
170+
@Nonnull
171+
public P next() {
172+
P result = peek();
173+
if (result == null)
174+
throw new NoSuchElementException();
175+
next = null;
176+
return result;
177+
}
178+
179+
/**
180+
*
181+
* @return
182+
*/
183+
public P peek() {
184+
if (next == null) {
185+
P result = fetchNext();
186+
if (result != null) {
187+
next = result;
188+
initializeItems();
189+
}
190+
}
191+
return next;
192+
}
193+
194+
/**
195+
* This method initializes items with local data after they are fetched. It is up to the implementer to decide what
196+
* local data to apply.
197+
*
198+
*/
199+
private void initializeItems() {
200+
if (itemInitializer != null) {
201+
for (Item item : next.getItems()) {
202+
itemInitializer.accept(item);
203+
}
204+
}
205+
}
135206
}

src/main/java/org/kohsuke/github/GitHubPageItemIterator.java

Lines changed: 19 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ class GitHubPageItemIterator<Page extends GitHubPage<Item>, Item> implements Ite
2525
*/
2626
private int nextItemIndex;
2727

28-
private final GitHubPageIterator<Page, Item> pageIterator;
28+
private final GitHubEndpointPageIterator<Page, Item> pageIterator;
2929

30-
GitHubPageItemIterator(GitHubPageIterator<Page, Item> pageIterator) {
30+
GitHubPageItemIterator(GitHubEndpointPageIterator<Page, Item> pageIterator) {
3131
this.pageIterator = pageIterator;
3232
}
3333

@@ -54,8 +54,24 @@ public Item next() {
5454
*
5555
* @return the list
5656
*/
57+
@Deprecated
5758
public List<Item> nextPage() {
58-
return Arrays.asList(nextPageArray());
59+
// if we have not fetched any pages yet, always fetch.
60+
// If we have fetched at least one page, check hasNext()
61+
if (currentPage == null) {
62+
peek();
63+
} else if (!hasNext()) {
64+
throw new NoSuchElementException();
65+
}
66+
67+
// Current should never be null after fetch
68+
Objects.requireNonNull(currentPage);
69+
Item[] r = currentPage.getItems();
70+
if (nextItemIndex != 0) {
71+
r = Arrays.copyOfRange(r, nextItemIndex, r.length);
72+
}
73+
nextItemIndex = currentPage.getItems().length;
74+
return Arrays.asList(r);
5975
}
6076

6177
/**
@@ -100,39 +116,4 @@ private Item lookupItem() {
100116
? currentPage.getItems()[nextItemIndex]
101117
: null;
102118
}
103-
104-
/**
105-
* Gets the next page worth of data.
106-
*
107-
* @return the list
108-
*/
109-
protected Page currentPage() {
110-
peek();
111-
return currentPage;
112-
}
113-
114-
/**
115-
* Gets the next page worth of data.
116-
*
117-
* @return the list
118-
*/
119-
@Nonnull
120-
Item[] nextPageArray() {
121-
// if we have not fetched any pages yet, always fetch.
122-
// If we have fetched at least one page, check hasNext()
123-
if (currentPage == null) {
124-
peek();
125-
} else if (!hasNext()) {
126-
throw new NoSuchElementException();
127-
}
128-
129-
// Current should never be null after fetch
130-
Objects.requireNonNull(currentPage);
131-
Item[] r = currentPage.getItems();
132-
if (nextItemIndex != 0) {
133-
r = Arrays.copyOfRange(r, nextItemIndex, r.length);
134-
}
135-
nextItemIndex = currentPage.getItems().length;
136-
return r;
137-
}
138119
}

src/main/java/org/kohsuke/github/GitHubPageIterator.java

Lines changed: 0 additions & 118 deletions
This file was deleted.

src/main/java/org/kohsuke/github/PagedSearchIterable.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ <Result extends SearchResult<T>> PagedSearchIterable(GitHubEndpointIterable<Resu
3333
*/
3434
public int getTotalCount() {
3535
// populate();
36-
return paginatedEndpoint.itemIterator().currentPage().totalCount;
36+
return paginatedEndpoint.pageIterator().peek().totalCount;
3737
}
3838

3939
/**
@@ -43,6 +43,6 @@ public int getTotalCount() {
4343
*/
4444
public boolean isIncomplete() {
4545
// populate();
46-
return paginatedEndpoint.itemIterator().currentPage().incompleteResults;
46+
return paginatedEndpoint.pageIterator().peek().incompleteResults;
4747
}
4848
}

0 commit comments

Comments
 (0)