package org.zend.php.zendserver.deployment.core.internal.descriptor; import java.io.IOException; import java.io.InputStream; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.traversal.DocumentTraversal; import org.w3c.dom.traversal.NodeFilter; import org.w3c.dom.traversal.TreeWalker; public class CalculateOffsets { public static final String NODE_OFFSET = "node.offset"; //$NON-NLS-1$ private String cachedDoc; public CalculateOffsets(InputStream src) throws IOException { int count = 0; byte[] buf = new byte[4096]; StringBuilder sb = new StringBuilder(); while ((count = src.read(buf)) > 0) { sb.append(new String(buf, 0, count)); } cachedDoc = sb.toString(); } public void traverse(Document document) { int offset = 0; // this cast is checked on Apache implementation (Xerces): DocumentTraversal traversal = (DocumentTraversal) document; TreeWalker tw = traversal.createTreeWalker(document.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, false); Node node = tw.getCurrentNode(); while (node != null) { String nodeName = node.getNodeName(); offset = cachedDoc.indexOf('<'+nodeName, offset) + 1; if (offset > 0) { node.setUserData(NODE_OFFSET, offset, null); } node = tw.nextNode(); } } public int getDocumentLength() { return cachedDoc.length(); } }