in src/main/java/org/apache/sling/pipes/internal/ContainerPipe.java [113:142]
private boolean updateCursor(){
Pipe currentPipe = container.subpipes.get(cursor);
Iterator<Resource> it = iterators.get(currentPipe);
do {
// go up to at best reach the last pipe, updating iterators & bindings of the
// all intermediates, if an intermediate pipe is not outputing anything
// anymore, stop.
while (it.hasNext() && cursor < container.subpipes.size() - 1) {
Resource resource = it.next();
bindings.updateBindings(currentPipe, resource);
//now we update the following pipe output with that new context
Pipe nextPipe = container.subpipes.get(++cursor);
iterators.put(nextPipe, nextPipe.getOutput());
currentPipe = nextPipe;
log.debug("switching to {}", currentPipe);
it = iterators.get(currentPipe);
}
//go down (or stay) to the first pipe having a next item
while (!it.hasNext() && cursor > 0) {
currentPipe = container.subpipes.get(--cursor);
log.debug("switching to {}", currentPipe);
it = iterators.get(currentPipe);
}
} while (it.hasNext() && cursor < container.subpipes.size() - 1);
//2 choices here:
// either cursor is at 0 with no resource left: end,
// either cursor is on last pipe with a resource left: hasNext
// the second part is for the corner case with only one item
return cursor > 0 || (iterators.size() == 1 && it.hasNext());
}