## org.apache.xpath
Class NodeSetDTM

    java.lang.Object
      |
      +--org.apache.xml.utils.NodeVector
            |
            +--org.apache.xpath.NodeSetDTM

Direct Known Subclasses:
  RTFIterator

public class NodeSetDTM
extends NodeVector
implements DTMIterator, java.lang.Cloneable

The NodeSetDTM class can act as either a NodeVector, NodeList, or NodeIterator. However, in order for it to act as a NodeVector or NodeList, it's required that setShouldCacheNodes(true) be called before the first nextNode() is called, in order that nodes can be added as they are fetched. Derived classes that implement iterators must override runTo(int index), in order that they may run the iteration to the given index.

Note that we directly implement the DOM's NodeIterator interface. We do not emulate all the behavior of the standard NodeIterator. In particular, we do not guarantee to present a "live view" of the document ... but in XSLT, the source document should never be mutated, so this should never be an issue.

Thought: Should NodeSetDTM really implement NodeList and NodeIterator, or should there be specific subclasses of it which do so? The advantage of doing it all here is that all NodeSetDTMs will respond to the same calls; the disadvantage is that some of them may return less-than-enlightening results when you do so.

See Also:
  Serialized Form
Usage:
  **For advanced use only**

Constructor Summary
`NodeSetDTM(DTMIterator ni)` Create a NodeSetDTM, and copy the members of the given DTMIterator into it.
`NodeSetDTM(DTMManager dtmManager)` Create an empty nodelist.
`NodeSetDTM(int node, DTMManager dtmManager)` Create a NodeSetDTM which contains the given Node.
`NodeSetDTM(int blocksize, int dummy, DTMManager dtmManager)` Create an empty, using the given block size.
`NodeSetDTM(NodeIterator iterator, XPathContext xctxt)` Create a NodeSetDTM, and copy the members of the given DTMIterator into it.
`NodeSetDTM(NodeList nodeList, XPathContext xctxt)` Create a NodeSetDTM, and copy the members of the given DTMIterator into it.
`NodeSetDTM(NodeSetDTM nodelist)` Create a NodeSetDTM, and copy the members of the given NodeSetDTM into it.

Method Summary
`void` `addElement(int value)` Append a Node onto the vector.
`void` `addNode(int n)` Add a node to the NodeSetDTM.
`int` `addNodeInDocOrder(int node, boolean test, XPathContext support)` Add the node into a vector of nodes where it should occur in document order.
`int` `addNodeInDocOrder(int node, XPathContext support)` Add the node into a vector of nodes where it should occur in document order.
`void` `addNodes(DTMIterator iterator)` Copy NodeList members into this nodelist, adding in document order.
`void` `addNodesInDocOrder(DTMIterator iterator, XPathContext support)` Copy NodeList members into this nodelist, adding in document order.
`void` `allowDetachToRelease(boolean allowRelease)` Specify if it's OK for detach to release the iterator for reuse.
`void` `appendNodes(NodeVector nodes)` Append the nodes to the list.
`java.lang.Object` `clone()` Clone this NodeSetDTM.
`DTMIterator` `cloneWithReset()` Get a cloned Iterator, and reset its state to the beginning of the iteration.
`boolean` `contains(int s)` Tell if the table contains the given node.
`void` `detach()` Detaches the iterator from the set which it iterated over, releasing any computational resources and placing the iterator in the INVALID state.
`int` `elementAt(int i)` Get the nth element.
`int` `getAxis()` Returns the axis being iterated, if it is known.
`int` `getCurrentNode()` Return the last fetched node.
`int` `getCurrentPos()` Get the current position, which is one less than the next nextNode() call will retrieve.
`DTM` `getDTM(int nodeHandle)` Get an instance of a DTM that "owns" a node handle.
`DTMManager` `getDTMManager()` Get an instance of the DTMManager.
`boolean` `getExpandEntityReferences()` The value of this flag determines whether the children of entity reference nodes are visible to the iterator.
`DTMFilter` `getFilter()` The filter object used to screen nodes.
`int` `getLast()`
`int` `getLength()` The number of nodes in the list.
`int` `getRoot()`
`boolean` `getShouldCacheNodes()` Get whether or not this is a cached node set.
`int` `getWhatToShow()` This attribute determines which node types are presented via the iterator.
`int` `indexOf(int elem)` Searches for the first occurence of the given argument, beginning the search at index, and testing for equality using the equals method.
`int` `indexOf(int elem, int index)` Searches for the first occurence of the given argument, beginning the search at index, and testing for equality using the equals method.
`void` `insertElementAt(int value, int at)` Inserts the specified node in this vector at the specified index.
`void` `insertNode(int n, int pos)` Insert a node at a given position.
`boolean` `isDocOrdered()` Returns true if all the nodes in the iteration well be returned in document order.
`boolean` `isFresh()` Tells if this NodeSetDTM is "fresh", in other words, if the first nextNode() that is called will return the first node in the set.
`boolean` `isMutable()` Tells if this iterator can have nodes added to it or set via the `setItem(int node, int index)` method.
`int` `item(int index)` Returns the `index`th item in the collection.
`int` `nextNode()` Returns the next node in the set and advances the position of the iterator in the set.
`int` `previousNode()` Returns the previous node in the set and moves the position of the iterator backwards in the set.
`void` `removeAllElements()` Inserts the specified node in this vector at the specified index.
`boolean` `removeElement(int s)` Removes the first occurrence of the argument from this vector.
`void` `removeElementAt(int i)` Deletes the component at the specified index.
`void` `removeNode(int n)` Remove a node.
`void` `reset()` Reset the iterator.
`void` `runTo(int index)` If an index is requested, NodeSetDTM will call this method to run the iterator to the index.
`void` `setCurrentPos(int i)` Set the current position in the node set.
`void` `setElementAt(int node, int index)` Sets the component at the specified index of this vector to be the specified object.
`void` `setEnvironment(java.lang.Object environment)` Set the environment in which this iterator operates, which should provide: a node (the context node...
`void` `setItem(int node, int index)` Same as setElementAt.
`void` `setLast(int last)`
`void` `setRoot(int context, java.lang.Object environment)` Initialize the context values for this expression after it is cloned.
`void` `setShouldCacheNodes(boolean b)` If setShouldCacheNodes(true) is called, then nodes will be cached.
`int` `size()` Get the length of the list.

Methods inherited from class org.apache.xml.utils.NodeVector
`insertInOrder, peepOrNull, peepTail, peepTailSub1, pop, popAndTop, popPair, popQuick, push, pushPair, RemoveAllNoClear, setTail, setTailSub1, sort, sort`

Methods inherited from class java.lang.Object
`equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Constructor Detail

### NodeSetDTM

    public NodeSetDTM(DTMManager dtmManager)

  Create an empty nodelist.

### NodeSetDTM

    public NodeSetDTM(int blocksize,
                      int dummy,
                      DTMManager dtmManager)

  Create an empty, using the given block size.
  Parameters:
    `blocksize` - Size of blocks to allocate
    `dummy` - pass zero for right now...

### NodeSetDTM

    public NodeSetDTM(NodeSetDTM nodelist)

  Create a NodeSetDTM, and copy the members of the given NodeSetDTM into it.
  Parameters:
    `nodelist` - Set of Nodes to be made members of the new set.

### NodeSetDTM

    public NodeSetDTM(DTMIterator ni)

  Create a NodeSetDTM, and copy the members of the given DTMIterator into it.
  Parameters:
    `ni` - Iterator which yields Nodes to be made members of the new set.

### NodeSetDTM

    public NodeSetDTM(NodeIterator iterator,
                      XPathContext xctxt)

  Create a NodeSetDTM, and copy the members of the given DTMIterator into it.
  Parameters:
    `iterator` - Iterator which yields Nodes to be made members of the new set.

### NodeSetDTM

    public NodeSetDTM(NodeList nodeList,
                      XPathContext xctxt)

  Create a NodeSetDTM, and copy the members of the given DTMIterator into it.

### NodeSetDTM

    public NodeSetDTM(int node,
                      DTMManager dtmManager)

  Create a NodeSetDTM which contains the given Node.
  Parameters:
    `node` - Single node to be added to the new set.

Method Detail

### setEnvironment

    public void setEnvironment(java.lang.Object environment)

  Set the environment in which this iterator operates, which should provide: a node (the context node... same value as "root" defined below) a pair of non-zero positive integers (the context position and the context size) a set of variable bindings a function library the set of namespace declarations in scope for the expression.

  At this time the exact implementation of this environment is application dependent. Probably a proper interface will be created fairly soon.

  Parameters:
    `environment` - The environment object.

### getRoot

    public int getRoot()

  Specified by:
    getRoot in interface DTMIterator
  Returns:
    The root node of the Iterator, as specified when it was created. For non-Iterator NodeSetDTMs, this will be null.

### setRoot

    public void setRoot(int context,
                        java.lang.Object environment)

  Initialize the context values for this expression after it is cloned.
  Specified by:
    setRoot in interface DTMIterator
  Parameters:
    `context` - The XPath runtime context for this transformation.

### clone

    public java.lang.Object clone()
                           throws java.lang.CloneNotSupportedException

  Clone this NodeSetDTM. At this time, we only expect this to be used with LocPathIterators; it may not work with other kinds of NodeSetDTMs.
  Specified by:
    clone in interface DTMIterator
  Returns:
    a new NodeSetDTM of the same type, having the same state... though unless overridden in the subclasses, it may not copy all the state information.
  Throws:
    java.lang.CloneNotSupportedException - if this subclass of NodeSetDTM does not support the clone() operation.
  Overrides:
    clone in class NodeVector

### cloneWithReset

    public DTMIterator cloneWithReset()
                               throws java.lang.CloneNotSupportedException

  Get a cloned Iterator, and reset its state to the beginning of the iteration.
  Specified by:
    cloneWithReset in interface DTMIterator
  Returns:
    a new NodeSetDTM of the same type, having the same state... except that the reset() operation has been called.
  Throws:
    java.lang.CloneNotSupportedException - if this subclass of NodeSetDTM does not support the clone() operation.

### reset

    public void reset()

  Reset the iterator. May have no effect on non-iterator Nodesets.
  Specified by:
    reset in interface DTMIterator

### getWhatToShow

    public int getWhatToShow()

  This attribute determines which node types are presented via the iterator. The available set of constants is defined in the `DTMFilter` interface. For NodeSetDTMs, the mask has been hardcoded to show all nodes except EntityReference nodes, which have no equivalent in the XPath data model.
  Specified by:
    getWhatToShow in interface DTMIterator
  Returns:
    integer used as a bit-array, containing flags defined in the DOM's DTMFilter class. The value will be `SHOW_ALL & ~SHOW_ENTITY_REFERENCE`, meaning that only entity references are suppressed.

### getFilter

    public DTMFilter getFilter()

  The filter object used to screen nodes. Filters are applied to further reduce (and restructure) the DTMIterator's view of the document. In our case, we will be using hardcoded filters built into our iterators... but getFilter() is part of the DOM's DTMIterator interface, so we have to support it.
  Returns:
    null, which is slightly misleading. True, there is no user-written filter object, but in fact we are doing some very sophisticated custom filtering. A DOM purist might suggest returning a placeholder object just to indicate that this is not going to return all nodes selected by whatToShow.

### getExpandEntityReferences

    public boolean getExpandEntityReferences()

  The value of this flag determines whether the children of entity reference nodes are visible to the iterator. If false, they will be skipped over.
  To produce a view of the document that has entity references expanded and does not expose the entity reference node itself, use the whatToShow flags to hide the entity reference node and set expandEntityReferences to true when creating the iterator. To produce a view of the document that has entity reference nodes but no entity expansion, use the whatToShow flags to show the entity reference node and set expandEntityReferences to false.
  Specified by:
    getExpandEntityReferences in interface DTMIterator
  Returns:
    true for all iterators based on NodeSetDTM, meaning that the contents of EntityRefrence nodes may be returned (though whatToShow says that the EntityReferences themselves are not shown.)

### getDTM

    public DTM getDTM(int nodeHandle)

  Get an instance of a DTM that "owns" a node handle. Since a node iterator may be passed without a DTMManager, this allows the caller to easily get the DTM using just the iterator.
  Specified by:
    getDTM in interface DTMIterator
  Parameters:
    `nodeHandle` - the nodeHandle.
  Returns:
    a non-null DTM reference.

### getDTMManager

    public DTMManager getDTMManager()

  Get an instance of the DTMManager. Since a node iterator may be passed without a DTMManager, this allows the caller to easily get the DTMManager using just the iterator.
  Specified by:
    getDTMManager in interface DTMIterator
  Returns:
    a non-null DTMManager reference.

### nextNode

    public int nextNode()

  Returns the next node in the set and advances the position of the iterator in the set. After a DTMIterator is created, the first call to nextNode() returns the first node in the set.
  Specified by:
    nextNode in interface DTMIterator
  Returns:
    The next `Node` in the set being iterated over, or `DTM.NULL` if there are no more members in that set.
  Throws:
    DOMException - INVALID_STATE_ERR: Raised if this method is called after the `detach` method was invoked.

### previousNode

    public int previousNode()

  Returns the previous node in the set and moves the position of the iterator backwards in the set.
  Specified by:
    previousNode in interface DTMIterator
  Returns:
    The previous `Node` in the set being iterated over, or`DTM.NULL` if there are no more members in that set.
  Throws:
    DOMException - INVALID_STATE_ERR: Raised if this method is called after the `detach` method was invoked.
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a cached type, and hence doesn't know what the previous node was.

### detach

    public void detach()

  Detaches the iterator from the set which it iterated over, releasing any computational resources and placing the iterator in the INVALID state. After`detach` has been invoked, calls to `nextNode` or`previousNode` will raise the exception INVALID_STATE_ERR.

  This operation is a no-op in NodeSetDTM, and will not cause INVALID_STATE_ERR to be raised by later operations.

  Specified by:
    detach in interface DTMIterator

### allowDetachToRelease

    public void allowDetachToRelease(boolean allowRelease)

  Specify if it's OK for detach to release the iterator for reuse.
  Specified by:
    allowDetachToRelease in interface DTMIterator
  Parameters:
    `allowRelease` - true if it is OK for detach to release this iterator for pooling.

### isFresh

    public boolean isFresh()

  Tells if this NodeSetDTM is "fresh", in other words, if the first nextNode() that is called will return the first node in the set.
  Specified by:
    isFresh in interface DTMIterator
  Returns:
    true if nextNode() would return the first node in the set, false if it would return a later one.

### runTo

    public void runTo(int index)

  If an index is requested, NodeSetDTM will call this method to run the iterator to the index. By default this sets m_next to the index. If the index argument is -1, this signals that the iterator should be run to the end.
  Specified by:
    runTo in interface DTMIterator
  Parameters:
    `index` - Position to advance (or retreat) to, with 0 requesting the reset ("fresh") position and -1 (or indeed any out-of-bounds value) requesting the final position.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not one of the types which supports indexing/counting.

### item

    public int item(int index)

  Returns the `index`th item in the collection. If `index` is greater than or equal to the number of nodes in the list, this returns `null`. TODO: What happens if index is out of range?
  Specified by:
    item in interface DTMIterator
  Parameters:
    `index` - Index into the collection.
  Returns:
    The node at the `index`th position in the `NodeList`, or `null` if that is not a valid index.

### getLength

    public int getLength()

  The number of nodes in the list. The range of valid child node indices is 0 to `length-1` inclusive. Note that this operation requires finding all the matching nodes, which may defeat attempts to defer that work.
  Specified by:
    getLength in interface DTMIterator
  Returns:
    integer indicating how many nodes are represented by this list.

### addNode

    public void addNode(int n)

  Add a node to the NodeSetDTM. Not all types of NodeSetDTMs support this operation
  Parameters:
    `n` - Node to be added
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.

### insertNode

    public void insertNode(int n,
                           int pos)

  Insert a node at a given position.
  Parameters:
    `n` - Node to be added
    `pos` - Offset at which the node is to be inserted, with 0 being the first position.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.

### removeNode

    public void removeNode(int n)

  Remove a node.
  Parameters:
    `n` - Node to be added
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.

### addNodes

    public void addNodes(DTMIterator iterator)

  Copy NodeList members into this nodelist, adding in document order. Null references are not added.
  Parameters:
    `iterator` - DTMIterator which yields the nodes to be added.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.

### addNodesInDocOrder

    public void addNodesInDocOrder(DTMIterator iterator,
                                   XPathContext support)

  Copy NodeList members into this nodelist, adding in document order. If a node is null, don't add it.
  Parameters:
    `iterator` - DTMIterator which yields the nodes to be added.
    `support` - The XPath runtime context.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.

### addNodeInDocOrder

    public int addNodeInDocOrder(int node,
                                 boolean test,
                                 XPathContext support)

  Add the node into a vector of nodes where it should occur in document order.
  Parameters:
    `node` - The node to be added.
    `test` - true if we should test for doc order
    `support` - The XPath runtime context.
  Returns:
    insertIndex.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.

### addNodeInDocOrder

    public int addNodeInDocOrder(int node,
                                 XPathContext support)

  Add the node into a vector of nodes where it should occur in document order.
  Parameters:
    `node` - The node to be added.
    `support` - The XPath runtime context.
  Returns:
    The index where it was inserted.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.

### size

    public int size()

  Get the length of the list.
  Returns:
    The size of this node set.
  Overrides:
    size in class NodeVector

### addElement

    public void addElement(int value)

  Append a Node onto the vector.
  Parameters:
    `value` - The node to be added.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.
  Overrides:
    addElement in class NodeVector

### insertElementAt

    public void insertElementAt(int value,
                                int at)

  Inserts the specified node in this vector at the specified index. Each component in this vector with an index greater or equal to the specified index is shifted upward to have an index one greater than the value it had previously.
  Parameters:
    `value` - The node to be inserted.
    `at` - The index where the insert should occur.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.
  Overrides:
    insertElementAt in class NodeVector

### appendNodes

    public void appendNodes(NodeVector nodes)

  Append the nodes to the list.
  Parameters:
    `nodes` - The nodes to be appended to this node set.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.
  Overrides:
    appendNodes in class NodeVector

### removeAllElements

    public void removeAllElements()

  Inserts the specified node in this vector at the specified index. Each component in this vector with an index greater or equal to the specified index is shifted upward to have an index one greater than the value it had previously.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.
  Overrides:
    removeAllElements in class NodeVector

### removeElement

    public boolean removeElement(int s)

  Removes the first occurrence of the argument from this vector. If the object is found in this vector, each component in the vector with an index greater or equal to the object's index is shifted downward to have an index one smaller than the value it had previously.
  Parameters:
    `s` - The node to be removed.
  Returns:
    True if the node was successfully removed
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.
  Overrides:
    removeElement in class NodeVector

### removeElementAt

    public void removeElementAt(int i)

  Deletes the component at the specified index. Each component in this vector with an index greater or equal to the specified index is shifted downward to have an index one smaller than the value it had previously.
  Parameters:
    `i` - The index of the node to be removed.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.
  Overrides:
    removeElementAt in class NodeVector

### setElementAt

    public void setElementAt(int node,
                             int index)

  Sets the component at the specified index of this vector to be the specified object. The previous component at that position is discarded. The index must be a value greater than or equal to 0 and less than the current size of the vector.
  Parameters:
    `node` - The node to be set.
    `index` - The index of the node to be replaced.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.
  Overrides:
    setElementAt in class NodeVector

### setItem

    public void setItem(int node,
                        int index)

  Same as setElementAt.
  Specified by:
    setItem in interface DTMIterator
  Parameters:
    `node` - The node to be set.
    `index` - The index of the node to be replaced.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a mutable type.

### elementAt

    public int elementAt(int i)

  Get the nth element.
  Parameters:
    `i` - The index of the requested node.
  Returns:
    Node at specified index.
  Overrides:
    elementAt in class NodeVector

### contains

    public boolean contains(int s)

  Tell if the table contains the given node.
  Parameters:
    `s` - Node to look for
  Returns:
    True if the given node was found.
  Overrides:
    contains in class NodeVector

### indexOf

    public int indexOf(int elem,
                       int index)

  Searches for the first occurence of the given argument, beginning the search at index, and testing for equality using the equals method.
  Parameters:
    `elem` - Node to look for
    `index` - Index of where to start the search
  Returns:
    the index of the first occurrence of the object argument in this vector at position index or later in the vector; returns -1 if the object is not found.
  Overrides:
    indexOf in class NodeVector

### indexOf

    public int indexOf(int elem)

  Searches for the first occurence of the given argument, beginning the search at index, and testing for equality using the equals method.
  Parameters:
    `elem` - Node to look for
  Returns:
    the index of the first occurrence of the object argument in this vector at position index or later in the vector; returns -1 if the object is not found.
  Overrides:
    indexOf in class NodeVector

### getCurrentPos

    public int getCurrentPos()

  Get the current position, which is one less than the next nextNode() call will retrieve. i.e. if you call getCurrentPos() and the return is 0, the next fetch will take place at index 1.
  Specified by:
    getCurrentPos in interface DTMIterator
  Returns:
    The the current position index.

### setCurrentPos

    public void setCurrentPos(int i)

  Set the current position in the node set.
  Specified by:
    setCurrentPos in interface DTMIterator
  Parameters:
    `i` - Must be a valid index.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a cached type, and thus doesn't permit indexed access.

### getCurrentNode

    public int getCurrentNode()

  Return the last fetched node. Needed to support the UnionPathIterator.
  Specified by:
    getCurrentNode in interface DTMIterator
  Returns:
    the last fetched node.
  Throws:
    java.lang.RuntimeException - thrown if this NodeSetDTM is not of a cached type, and thus doesn't permit indexed access.

### getShouldCacheNodes

    public boolean getShouldCacheNodes()

  Get whether or not this is a cached node set.
  Returns:
    True if this list is cached.

### setShouldCacheNodes

    public void setShouldCacheNodes(boolean b)

  If setShouldCacheNodes(true) is called, then nodes will be cached. They are not cached by default. This switch must be set before the first call to nextNode is made, to ensure that all nodes are cached.
  Specified by:
    setShouldCacheNodes in interface DTMIterator
  Parameters:
    `b` - true if this node set should be cached.
  Throws:
    java.lang.RuntimeException - thrown if an attempt is made to request caching after we've already begun stepping through the nodes in this set.

### isMutable

    public boolean isMutable()

  Tells if this iterator can have nodes added to it or set via the `setItem(int node, int index)` method.
  Specified by:
    isMutable in interface DTMIterator
  Returns:
    True if the nodelist can be mutated.

### getLast

    public int getLast()

### setLast

    public void setLast(int last)

### isDocOrdered

    public boolean isDocOrdered()

  Returns true if all the nodes in the iteration well be returned in document order.
  Specified by:
    isDocOrdered in interface DTMIterator
  Returns:
    true as a default.

### getAxis

    public int getAxis()

  Returns the axis being iterated, if it is known.
  Specified by:
    getAxis in interface DTMIterator
  Returns:
    Axis.CHILD, etc., or -1 if the axis is not known or is of multiple types.

Copyright © 2006 Apache XML Project. All Rights Reserved.