19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: TreeWalker.java 468655 2006-10-28 07:12:06Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xml.utils;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.File;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Comment;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Element;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.EntityReference;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.NamedNodeMap;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Node;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.ProcessingInstruction;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Text;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.ContentHandler;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.Locator;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.ext.LexicalHandler;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.helpers.LocatorImpl;
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class does a pre-order walk of the DOM tree, calling a ContentHandler
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * interface as it goes.
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class TreeWalker
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Local reference to a ContentHandler          */
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private ContentHandler m_contentHandler = null;
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // ARGHH!!  JAXP Uses Xerces without setting the namespace processing to ON!
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  // DOM2Helper m_dh = new DOM2Helper();
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** DomHelper for this TreeWalker          */
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected DOMHelper m_dh;
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        /** Locator object for this TreeWalker          */
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        private LocatorImpl m_locator = new LocatorImpl();
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the ContentHandler used for the tree walk.
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the ContentHandler used for the tree walk
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ContentHandler getContentHandler()
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_contentHandler;
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the ContentHandler used for the tree walk.
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the ContentHandler used for the tree walk
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setContentHandler(ContentHandler ch)
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_contentHandler = ch;
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        /**
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Constructor.
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param   contentHandler The implemention of the
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param   systemId System identifier for the document.
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * contentHandler operation (toXMLString, digest, ...)
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public TreeWalker(ContentHandler contentHandler, DOMHelper dh, String systemId)
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_contentHandler = contentHandler;
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_contentHandler.setDocumentLocator(m_locator);
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (systemId != null)
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_locator.setSystemId(systemId);
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else {
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try {
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // Bug see Bugzilla  26741
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl");
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         }
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         catch (SecurityException se) {// user.dir not accessible from applet
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         }
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_dh = dh;
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Constructor.
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param   contentHandler The implemention of the
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * contentHandler operation (toXMLString, digest, ...)
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public TreeWalker(ContentHandler contentHandler, DOMHelper dh)
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_contentHandler = contentHandler;
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_contentHandler.setDocumentLocator(m_locator);
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try {
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       // Bug see Bugzilla  26741
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl");
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (SecurityException se){// user.dir not accessible from applet
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_dh = dh;
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Constructor.
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param   contentHandler The implemention of the
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * contentHandler operation (toXMLString, digest, ...)
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public TreeWalker(ContentHandler contentHandler)
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_contentHandler = contentHandler;
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (m_contentHandler != null)
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        m_contentHandler.setDocumentLocator(m_locator);
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                try {
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                   // Bug see Bugzilla  26741
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  m_locator.setSystemId(System.getProperty("user.dir") + File.separator + "dummy.xsl");
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                catch (SecurityException se){// user.dir not accessible from applet
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_dh = new DOM2Helper();
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Perform a pre-order traversal non-recursive style.
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Note that TreeWalker assumes that the subtree is intended to represent
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a complete (though not necessarily well-formed) document and, during a
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * traversal, startDocument and endDocument will always be issued to the
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * SAX listener.
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param pos Node in the tree where to start traversal
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void traverse(Node pos) throws org.xml.sax.SAXException
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.m_contentHandler.startDocument();
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        traverseFragment(pos);
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.m_contentHandler.endDocument();
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Perform a pre-order traversal non-recursive style.
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * In contrast to the traverse() method this method will not issue
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * startDocument() and endDocument() events to the SAX listener.
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param pos Node in the tree where to start traversal
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void traverseFragment(Node pos) throws org.xml.sax.SAXException
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Node top = pos;
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (null != pos)
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      startNode(pos);
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node nextNode = pos.getFirstChild();
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (null == nextNode)
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        endNode(pos);
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (top.equals(pos))
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        nextNode = pos.getNextSibling();
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null == nextNode)
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          pos = pos.getParentNode();
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if ((null == pos) || (top.equals(pos)))
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (null != pos)
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              endNode(pos);
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            nextNode = null;
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            break;
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      pos = nextNode;
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Perform a pre-order traversal non-recursive style.
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Note that TreeWalker assumes that the subtree is intended to represent
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a complete (though not necessarily well-formed) document and, during a
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * traversal, startDocument and endDocument will always be issued to the
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * SAX listener.
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param pos Node in the tree where to start traversal
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param top Node in the tree where to end traversal
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void traverse(Node pos, Node top) throws org.xml.sax.SAXException
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	this.m_contentHandler.startDocument();
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    while (null != pos)
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      startNode(pos);
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Node nextNode = pos.getFirstChild();
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (null == nextNode)
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        endNode(pos);
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if ((null != top) && top.equals(pos))
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        nextNode = pos.getNextSibling();
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null == nextNode)
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          pos = pos.getParentNode();
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if ((null == pos) || ((null != top) && top.equals(pos)))
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            nextNode = null;
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            break;
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      pos = nextNode;
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.m_contentHandler.endDocument();
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Flag indicating whether following text to be processed is raw text          */
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  boolean nextIsRaw = false;
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Optimized dispatch of characters.
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private final void dispatachChars(Node node)
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     throws org.xml.sax.SAXException
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(m_contentHandler instanceof org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.CharacterNodeHandler)
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ((org.apache.xml.dtm.ref.dom2dtm.DOM2DTM.CharacterNodeHandler)m_contentHandler).characters(node);
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String data = ((Text) node).getData();
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      this.m_contentHandler.characters(data.toCharArray(), 0, data.length());
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Start processing given node
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param node Node to process
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws org.xml.sax.SAXException
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void startNode(Node node) throws org.xml.sax.SAXException
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_contentHandler instanceof NodeConsumer)
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ((NodeConsumer) m_contentHandler).setOriginatingNode(node);
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (node instanceof Locator)
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        Locator loc = (Locator)node;
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        m_locator.setColumnNumber(loc.getColumnNumber());
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        m_locator.setLineNumber(loc.getLineNumber());
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        m_locator.setPublicId(loc.getPublicId());
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        m_locator.setSystemId(loc.getSystemId());
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        m_locator.setColumnNumber(0);
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_locator.setLineNumber(0);
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    switch (node.getNodeType())
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Node.COMMENT_NODE :
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String data = ((Comment) node).getData();
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (m_contentHandler instanceof LexicalHandler)
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        LexicalHandler lh = ((LexicalHandler) this.m_contentHandler);
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        lh.comment(data.toCharArray(), 0, data.length());
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    break;
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Node.DOCUMENT_FRAGMENT_NODE :
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // ??;
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Node.DOCUMENT_NODE :
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Node.ELEMENT_NODE :
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      NamedNodeMap atts = ((Element) node).getAttributes();
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int nAttrs = atts.getLength();
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // System.out.println("TreeWalker#startNode: "+node.getNodeName());
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i = 0; i < nAttrs; i++)
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Node attr = atts.item(i);
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String attrName = attr.getNodeName();
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // System.out.println("TreeWalker#startNode: attr["+i+"] = "+attrName+", "+attr.getNodeValue());
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (attrName.equals("xmlns") || attrName.startsWith("xmlns:"))
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // System.out.println("TreeWalker#startNode: attr["+i+"] = "+attrName+", "+attr.getNodeValue());
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int index;
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // Use "" instead of null, as Xerces likes "" for the
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // name of the default namespace.  Fix attributed
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // to "Steven Murray" <smurray@ebt.com>.
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String prefix = (index = attrName.indexOf(":")) < 0
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          ? "" : attrName.substring(index + 1);
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          this.m_contentHandler.startPrefixMapping(prefix,
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                                   attr.getNodeValue());
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // System.out.println("m_dh.getNamespaceOfNode(node): "+m_dh.getNamespaceOfNode(node));
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // System.out.println("m_dh.getLocalNameOfNode(node): "+m_dh.getLocalNameOfNode(node));
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String ns = m_dh.getNamespaceOfNode(node);
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null == ns)
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ns = "";
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      this.m_contentHandler.startElement(ns,
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         m_dh.getLocalNameOfNode(node),
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         node.getNodeName(),
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         new AttList(atts, m_dh));
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Node.PROCESSING_INSTRUCTION_NODE :
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ProcessingInstruction pi = (ProcessingInstruction) node;
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String name = pi.getNodeName();
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // String data = pi.getData();
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (name.equals("xslt-next-is-raw"))
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        nextIsRaw = true;
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this.m_contentHandler.processingInstruction(pi.getNodeName(),
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                                    pi.getData());
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    break;
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Node.CDATA_SECTION_NODE :
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      boolean isLexH = (m_contentHandler instanceof LexicalHandler);
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      LexicalHandler lh = isLexH
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          ? ((LexicalHandler) this.m_contentHandler) : null;
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (isLexH)
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        lh.startCDATA();
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      dispatachChars(node);
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (isLexH)
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          lh.endCDATA();
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    break;
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Node.TEXT_NODE :
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //String data = ((Text) node).getData();
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (nextIsRaw)
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        nextIsRaw = false;
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_contentHandler.processingInstruction(javax.xml.transform.Result.PI_DISABLE_OUTPUT_ESCAPING, "");
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        dispatachChars(node);
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_contentHandler.processingInstruction(javax.xml.transform.Result.PI_ENABLE_OUTPUT_ESCAPING, "");
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        dispatachChars(node);
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    break;
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Node.ENTITY_REFERENCE_NODE :
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      EntityReference eref = (EntityReference) node;
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (m_contentHandler instanceof LexicalHandler)
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ((LexicalHandler) this.m_contentHandler).startEntity(
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          eref.getNodeName());
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // warning("Can not output entity to a pure SAX ContentHandler");
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    break;
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    default :
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * End processing of given node
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param node Node we just finished processing
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws org.xml.sax.SAXException
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void endNode(Node node) throws org.xml.sax.SAXException
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    switch (node.getNodeType())
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Node.DOCUMENT_NODE :
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Node.ELEMENT_NODE :
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String ns = m_dh.getNamespaceOfNode(node);
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null == ns)
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ns = "";
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      this.m_contentHandler.endElement(ns,
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         m_dh.getLocalNameOfNode(node),
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         node.getNodeName());
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      NamedNodeMap atts = ((Element) node).getAttributes();
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int nAttrs = atts.getLength();
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i = 0; i < nAttrs; i++)
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Node attr = atts.item(i);
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String attrName = attr.getNodeName();
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (attrName.equals("xmlns") || attrName.startsWith("xmlns:"))
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int index;
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // Use "" instead of null, as Xerces likes "" for the
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // name of the default namespace.  Fix attributed
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // to "Steven Murray" <smurray@ebt.com>.
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String prefix = (index = attrName.indexOf(":")) < 0
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          ? "" : attrName.substring(index + 1);
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          this.m_contentHandler.endPrefixMapping(prefix);
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Node.CDATA_SECTION_NODE :
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Node.ENTITY_REFERENCE_NODE :
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      EntityReference eref = (EntityReference) node;
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (m_contentHandler instanceof LexicalHandler)
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        LexicalHandler lh = ((LexicalHandler) this.m_contentHandler);
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        lh.endEntity(eref.getNodeName());
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    break;
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    default :
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}  //TreeWalker
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
509