1 16 package org.apache.commons.jxpath.ri.model.dom; 17 18 import org.apache.commons.jxpath.ri.compiler.NodeTest; 19 import org.apache.commons.jxpath.ri.model.NodeIterator; 20 import org.apache.commons.jxpath.ri.model.NodePointer; 21 import org.w3c.dom.Node ; 22 23 29 public class DOMNodeIterator implements NodeIterator { 30 private NodePointer parent; 31 private NodeTest nodeTest; 32 private Node node; 33 private Node child = null; 34 private boolean reverse; 35 private int position = 0; 36 37 public DOMNodeIterator( 38 NodePointer parent, 39 NodeTest nodeTest, 40 boolean reverse, 41 NodePointer startWith) 42 { 43 this.parent = parent; 44 this.node = (Node ) parent.getNode(); 45 if (startWith != null) { 46 this.child = (Node ) startWith.getNode(); 47 } 48 this.nodeTest = nodeTest; 49 this.reverse = reverse; 50 } 51 52 public NodePointer getNodePointer() { 53 if (position == 0) { 54 setPosition(1); 55 } 56 if (child == null) { 57 return null; 58 } 59 return new DOMNodePointer(parent, child); 60 } 61 62 public int getPosition() { 63 return position; 64 } 65 66 public boolean setPosition(int position) { 67 while (this.position < position) { 68 if (!next()) { 69 return false; 70 } 71 } 72 while (this.position > position) { 73 if (!previous()) { 74 return false; 75 } 76 } 77 return true; 78 } 79 80 private boolean previous() { 81 position--; 82 if (!reverse) { 83 if (position == 0) { 84 child = null; 85 } 86 else if (child == null) { 87 child = node.getLastChild(); 88 } 89 else { 90 child = child.getPreviousSibling(); 91 } 92 while (child != null && !testChild()) { 93 child = child.getPreviousSibling(); 94 } 95 } 96 else { 97 child = child.getNextSibling(); 98 while (child != null && !testChild()) { 99 child = child.getNextSibling(); 100 } 101 } 102 return child != null; 103 } 104 105 private boolean next() { 106 position++; 107 if (!reverse) { 108 if (position == 1) { 109 if (child == null) { 110 child = node.getFirstChild(); 111 } 112 else { 113 child = child.getNextSibling(); 114 } 115 } 116 else { 117 child = child.getNextSibling(); 118 } 119 while (child != null && !testChild()) { 120 child = child.getNextSibling(); 121 } 122 } 123 else { 124 if (position == 1) { 125 if (child == null) { 126 child = node.getLastChild(); 127 } 128 else { 129 child = child.getPreviousSibling(); 130 } 131 } 132 else { 133 child = child.getPreviousSibling(); 134 } 135 while (child != null && !testChild()) { 136 child = child.getPreviousSibling(); 137 } 138 } 139 return child != null; 140 } 141 142 private boolean testChild() { 143 return DOMNodePointer.testNode(child, nodeTest); 144 } 145 } | Popular Tags |