in src/main/java/org/apache/commons/jxpath/ri/axes/PrecedingOrFollowingContext.java [63:131]
public boolean nextNode() {
if (!setStarted) {
setStarted = true;
if (stack == null) {
stack = new Stack<>();
} else {
stack.clear();
}
currentRootLocation = parentContext.getCurrentNodePointer();
final NodePointer parent = currentRootLocation.getParent();
if (parent != null) {
// TBD: check type
stack.push(parent.childIterator(null, reverse, currentRootLocation));
}
}
while (true) {
if (stack.isEmpty()) {
currentRootLocation = currentRootLocation.getParent();
if (currentRootLocation == null || currentRootLocation.isRoot()) {
break;
}
final NodePointer parent = currentRootLocation.getParent();
if (parent != null) {
stack.push(parent.childIterator(null, reverse, currentRootLocation));
}
}
while (!stack.isEmpty()) {
if (!reverse) {
final NodeIterator it = stack.peek();
if (it.setPosition(it.getPosition() + 1)) {
currentNodePointer = it.getNodePointer();
if (!currentNodePointer.isLeaf()) {
stack.push(currentNodePointer.childIterator(null, reverse, null));
}
if (currentNodePointer.testNode(nodeTest)) {
super.setPosition(getCurrentPosition() + 1);
return true;
}
} else {
// We get here only if the name test failed
// and the iterator ended
stack.pop();
}
} else {
NodeIterator it = stack.peek();
if (it.setPosition(it.getPosition() + 1)) {
currentNodePointer = it.getNodePointer();
if (!currentNodePointer.isLeaf()) {
stack.push(currentNodePointer.childIterator(null, reverse, null));
} else if (currentNodePointer.testNode(nodeTest)) {
super.setPosition(getCurrentPosition() + 1);
return true;
}
} else {
stack.pop();
if (!stack.isEmpty()) {
it = stack.peek();
currentNodePointer = it.getNodePointer();
if (currentNodePointer.testNode(nodeTest)) {
super.setPosition(getCurrentPosition() + 1);
return true;
}
}
}
}
}
}
return false;
}