/** * Moves the <code>TreeWalker</code> to the next visible node in document order relative to the * current node, and returns the new node. If the current node has no next node, or if the search * for nextNode attempts to step upward from the TreeWalker's root node, returns <code>null</code> * , and retains the current node. * * @return The new node, or <code>null</code> if the current node has no next node in the * TreeWalker's logical view. */ public int nextNode() { int nextNode = DTM.NULL; AxesWalker walker = wi().getLastUsedWalker(); while (true) { if (null == walker) break; nextNode = walker.getNextNode(); if (DTM.NULL == nextNode) { walker = walker.m_prevWalker; } else { if (walker.acceptNode(nextNode) != DTMIterator.FILTER_ACCEPT) { continue; } if (null == walker.m_nextWalker) { wi().setLastUsedWalker(walker); // return walker.returnNextNode(nextNode); break; } else { AxesWalker prev = walker; walker = walker.m_nextWalker; walker.setRoot(nextNode); walker.m_prevWalker = prev; continue; } } // if(null != nextNode) } // while(null != walker) return nextNode; }
/** * Do a deep clone of this walker, including next and previous walkers. If the this AxesWalker is * on the clone list, don't clone but return the already cloned version. * * @param cloneOwner non-null reference to the cloned location path iterator to which this clone * will be added. * @param cloneList non-null vector of sources in odd elements, and the corresponding clones in * even vectors. * @return non-null clone, which may be a new clone, or may be a clone contained on the cloneList. */ AxesWalker cloneDeep(WalkingIterator cloneOwner, Vector cloneList) throws CloneNotSupportedException { AxesWalker clone = findClone(this, cloneList); if (null != clone) return clone; clone = (AxesWalker) this.clone(); clone.setLocPathIterator(cloneOwner); if (null != cloneList) { cloneList.addElement(this); cloneList.addElement(clone); } if (wi().m_lastUsedWalker == this) cloneOwner.m_lastUsedWalker = clone; if (null != m_nextWalker) clone.m_nextWalker = m_nextWalker.cloneDeep(cloneOwner, cloneList); // If you don't check for the cloneList here, you'll go into an // recursive infinate loop. if (null != cloneList) { if (null != m_prevWalker) clone.m_prevWalker = m_prevWalker.cloneDeep(cloneOwner, cloneList); } else { if (null != m_nextWalker) clone.m_nextWalker.m_prevWalker = clone; } return clone; }