org.jaxen.util

Class PrecedingAxisIterator

Implemented Interfaces:
Iterator

public class PrecedingAxisIterator
extends java.lang.Object
implements Iterator

This implementation of 'preceding' works like so: the preceding axis includes preceding-siblings of this node and their descendants. Also, for each ancestor node of this node, it includes all preceding-siblings of that ancestor, and their descendants. Finally, it includes the ancestor nodes themselves.

The reversed descendant-or-self axes that are required are calculated using a stack of reversed 'child-or-self' axes. When asked for a node, it is always taken from a child-or-self axis. If it was the last node on that axis, the node is returned. Otherwise, this axis is pushed on the stack, and the process is repeated with the child-or-self of the node. Eventually this recurses down to the last descendant of any node, then works back up to the root.

I reckon most object models could provide a faster implementation of the reversed 'children-or-self' used here.

Field Summary

private Iterator
ancestorOrSelf
private ListIterator
childrenOrSelf
private Navigator
navigator
private Iterator
precedingSibling
private ArrayList
stack

Constructor Summary

PrecedingAxisIterator(Object contextNode, Navigator navigator)

Method Summary

private ListIterator
childrenOrSelf(Object node)
boolean
hasNext()
Object
next()
void
remove()

Field Details

ancestorOrSelf

private Iterator ancestorOrSelf

childrenOrSelf

private ListIterator childrenOrSelf

navigator

private Navigator navigator

precedingSibling

private Iterator precedingSibling

stack

private ArrayList stack

Constructor Details

PrecedingAxisIterator

public PrecedingAxisIterator(Object contextNode,
                             Navigator navigator)
            throws UnsupportedAxisException

Method Details

childrenOrSelf

private ListIterator childrenOrSelf(Object node)

hasNext

public boolean hasNext()

next

public Object next()
            throws NoSuchElementException

remove

public void remove()
            throws UnsupportedOperationException