1 16 19 20 package org.apache.xalan.xsltc.dom; 21 22 import org.apache.xalan.xsltc.runtime.BasisLibrary; 23 import org.apache.xalan.xsltc.util.IntegerArray; 24 import org.apache.xml.dtm.DTMAxisIterator; 25 import org.apache.xml.dtm.ref.DTMAxisIteratorBase; 26 import org.apache.xml.dtm.ref.DTMDefaultBase; 27 28 34 public final class DupFilterIterator extends DTMAxisIteratorBase { 35 36 39 private DTMAxisIterator _source; 40 41 44 private IntegerArray _nodes = new IntegerArray(); 45 46 49 private int _current = 0; 50 51 54 private int _nodesSize = 0; 55 56 59 private int _lastNext = END; 60 61 64 private int _markedLastNext = END; 65 66 public DupFilterIterator(DTMAxisIterator source) { 67 _source = source; 68 70 if (source instanceof KeyIndex) { 74 setStartNode(DTMDefaultBase.ROOTNODE); 75 } 76 } 77 78 83 public DTMAxisIterator setStartNode(int node) { 84 if (_isRestartable) { 85 if (_source instanceof KeyIndex 88 && _startNode == DTMDefaultBase.ROOTNODE) { 89 return this; 90 } 91 92 if (node != _startNode) { 93 _source.setStartNode(_startNode = node); 94 95 _nodes.clear(); 96 while ((node = _source.next()) != END) { 97 _nodes.add(node); 98 } 99 _nodes.sort(); 100 _nodesSize = _nodes.cardinality(); 101 _current = 0; 102 _lastNext = END; 103 resetPosition(); 104 } 105 } 106 return this; 107 } 108 109 public int next() { 110 while (_current < _nodesSize) { 111 final int next = _nodes.at(_current++); 112 if (next != _lastNext) { 113 return returnNode(_lastNext = next); 114 } 115 } 116 return END; 117 } 118 119 public DTMAxisIterator cloneIterator() { 120 try { 121 final DupFilterIterator clone = 122 (DupFilterIterator) super.clone(); 123 clone._nodes = (IntegerArray) _nodes.clone(); 124 clone._source = _source.cloneIterator(); 125 clone._isRestartable = false; 126 return clone.reset(); 127 } 128 catch (CloneNotSupportedException e) { 129 BasisLibrary.runTimeError(BasisLibrary.ITERATOR_CLONE_ERR, 130 e.toString()); 131 return null; 132 } 133 } 134 135 public void setRestartable(boolean isRestartable) { 136 _isRestartable = isRestartable; 137 _source.setRestartable(isRestartable); 138 } 139 140 public void setMark() { 141 _markedNode = _current; 142 _markedLastNext = _lastNext; } 144 145 public void gotoMark() { 146 _current = _markedNode; 147 _lastNext = _markedLastNext; } 149 150 public DTMAxisIterator reset() { 151 _current = 0; 152 _lastNext = END; 153 return resetPosition(); 154 } 155 } 156 | Popular Tags |