InventoryIterator.java
package org.oxerr.stubhub.client.cxf.impl.inventory;
import java.util.Collections;
import java.util.Iterator;
import java.util.Optional;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.oxerr.stubhub.client.model.InventoryExportResponse;
import org.oxerr.stubhub.client.model.ListingResponse;
public abstract class InventoryIterator implements Iterator<ListingResponse> {
private final Logger log = LogManager.getLogger();
private final int pageSize;
private Iterator<ListingResponse> current = Collections.emptyIterator();
private Long cursor;
private boolean finished;
private int loadedPageCount;
protected InventoryIterator(int pageSize) {
this.pageSize = pageSize;
}
@Override
public boolean hasNext() {
loadIfNeeded();
return current.hasNext();
}
@Override
public ListingResponse next() {
loadIfNeeded();
return current.next();
}
private void loadIfNeeded() {
if (!finished && !current.hasNext()) {
InventoryExportResponse page = fetchPage(cursor);
current = page.getInventory() != null ? page.getInventory().iterator() : Collections.emptyIterator();
cursor = page.getPaginationToken();
finished = Optional.ofNullable(page.getNumberOfItems()).orElse(0) < pageSize;
loadedPageCount++;
log.trace("loaded page: loadedPageCount={}, cursor={}, numberOfItems={}, finished={}",
loadedPageCount, cursor, page.getNumberOfItems(), finished);
}
}
protected abstract InventoryExportResponse fetchPage(Long cursor2);
}