1 19 20 28 29 package org.netbeans.modules.xml.xdm.visitor; 30 31 import java.util.List ; 32 import org.netbeans.modules.xml.xdm.nodes.Attribute; 33 import org.netbeans.modules.xml.xdm.nodes.Document; 34 import org.netbeans.modules.xml.xdm.nodes.Element; 35 import org.netbeans.modules.xml.xdm.nodes.Node; 36 import org.netbeans.modules.xml.xdm.nodes.NodeImpl; 37 import org.netbeans.modules.xml.xdm.nodes.Text; 38 import org.netbeans.modules.xml.xdm.nodes.Token; 39 import org.netbeans.modules.xml.xdm.nodes.TokenType; 40 import org.w3c.dom.NamedNodeMap ; 41 import org.w3c.dom.NodeList ; 42 46 public class PositionFinderVisitor implements XMLNodeVisitor{ 47 48 int position = 0; 49 Node node; 50 boolean found; 51 52 public int findPosition(Node rootNode, Node node){ 53 reset(); 54 this.node = node; 55 rootNode.accept(this); 56 57 return position; 58 } 59 60 public void reset(){ 61 position = 0; 62 found = false; 63 } 64 65 public void visit(Document doc) { 66 position += getLengthOfTokens(doc); 68 NodeList nodes = doc.getChildNodes(); 69 for(int i = 0; i < nodes.getLength(); i++){ 70 Node n = (Node)nodes.item(i); 71 n.accept(this); 72 if(found) return; 73 } 74 } 75 76 public void visit(Element e) { 77 if(e.getId() == node.getId()){ 78 found = true; 79 } else{ 80 position += getElementStartTokenLength(e, true); NamedNodeMap attrs = e.getAttributes(); 82 for(int i = 0; i < attrs.getLength(); i++){ 83 Node attr = (Node)attrs.item(i); 84 attr.accept(this); 85 if(found) return; 86 } 87 position += getStartTagWhiteSpaceTokensLength(e); position++; NodeList children = e.getChildNodes(); 90 for(int i = 0; i < children.getLength(); i++){ 91 Node n = (Node)children.item(i); 92 n.accept(this); 93 if(found) return; 94 } 95 position += getElementStartTokenLength(e, false); position += getEndTagWhiteSpaceTokensLength(e); position++; } 99 } 100 101 public void visit(Text txt) { 102 if(txt.getId() == node.getId()){ 103 found = true; 104 } else{ 105 int txtLen = getLength(txt); 106 if(txtLen > 0) 107 position += txtLen; 108 } 109 } 110 111 public void visit(Attribute attr) { 112 if(attr.getId() == node.getId()){ 113 position += getLeadingWhiteSpaces(attr); 115 found = true; 116 } else{ 117 position += getLengthOfTokens(attr); 118 } 119 } 120 121 private int getLength(Text n) { 122 int len = 0; 123 for(Token token:((NodeImpl)n).getTokens()) 124 len += token.getValue().length(); 125 return len; 126 } 127 128 135 private int getElementStartTokenLength(Element element, boolean beginTag){ 136 String value = ""; 137 List <Token> tokens = element.getTokens(); 138 for(Token token : tokens){ 139 if(token.getType() != TokenType.TOKEN_ELEMENT_START_TAG){ 140 continue; 141 } 142 String tokenValue = token.getValue(); 143 if(beginTag){ 144 if(!tokenValue.startsWith("</")){ 145 value = tokenValue; 146 } 147 } else{ if(tokenValue.startsWith("</")){ 149 value = tokenValue; 150 } 151 } 152 } 153 return value.length(); 154 } 155 156 private int getStartTagWhiteSpaceTokensLength(NodeImpl node){ 157 StringBuilder buf = new StringBuilder (); 158 List <Token> tokens = node.getTokens(); 159 for(Token token : tokens){ 160 if (token.getType() == TokenType.TOKEN_ELEMENT_END_TAG){ 161 break; } 163 if (token.getType() == TokenType.TOKEN_WHITESPACE) { 164 buf.append(token.getValue()); 165 } 166 } 167 return buf.toString().length(); 168 } 169 170 private int getEndTagWhiteSpaceTokensLength(NodeImpl node){ 171 StringBuilder buf = new StringBuilder (); 172 List <Token> tokens = node.getTokens(); 173 boolean counting = false; 174 for(Token token : tokens){ 175 if (token.getType() == TokenType.TOKEN_ELEMENT_START_TAG){ 176 if (token.getValue().startsWith("</")) { 177 counting = true; 178 } 179 } 180 if (! counting) continue; 181 if (token.getType() == TokenType.TOKEN_WHITESPACE) { 182 buf.append(token.getValue()); 183 } 184 } 185 return buf.toString().length(); 186 } 187 188 private int getLeadingWhiteSpaces(Attribute attr){ 189 Token firstToken = attr.getTokens().get(0); if(firstToken.getType() == TokenType.TOKEN_WHITESPACE){ 191 return firstToken.getValue().length(); 192 } 193 return 0; 194 } 195 196 private int getLengthOfTokens(NodeImpl node){ 197 StringBuilder buf = new StringBuilder (); 198 List <Token> tokens = node.getTokens(); 199 for(Token token : tokens){ 200 buf.append(token.getValue()); 201 } 202 return buf.length(); 203 } 204 205 } 206 | Popular Tags |