<?xml version="1.0" standalone="no"?>
<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
<!-- 
 * The Apache Software License, Version 1.1
 *
 *
 * Copyright (c) 2001 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Xalan" and "Apache Software Foundation" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    nor may "Apache" appear in their name, without prior written
 *    permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation and was
 * originally based on software copyright (c) 2001, Sun
 * Microsystems., http://www.sun.com.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 -->
<s1 title="XSLTC Internal DOM">

  <ul>
    <li><link anchor="functionality">General functionlaity</link></li>
    <li><link anchor="components">Components of the internal DOM</link></li>
    <li><link anchor="structure">Internal structure</link></li>
    <li><link anchor="navigation">Tree navigation</link></li>
    <li><link anchor="namespaces">Namespaces</link></li>
    <li><link anchor="w3c">W3C DOM2 navigation support</link></li>
    <li><link anchor="adapter">The DOM adapter - DOMAdapter</link></li>
    <li><link anchor="multiplexer">The DOM multiplexer - MultiDOM</link></li>
    <li><link anchor="builder">The DOM builder - DOMImpl$DOMBuilder</link></li>
  </ul>

  <anchor name="functionality"/>
  <s2 title="General functionality">
  <p>The internal DOM gives the translet access to the XML document(s) it has
  to transform. The interface to the internal DOM is specified in the DOM.java
  class. This is the interface that the translet uses to access the DOM. 
  There is also an interface specified for DOM caches -- DOMCache.java</p>

  </s2><anchor name="components"/>
  <s2 title="Components of the internal DOM">

  <p>This DOM interface is implemented by three classes:</p>
  <ul>
    <li><em>org.apache.xalan.xsltc.dom.DOMImpl</em><br/><br/>
      This is the main DOM class. An instance of this class contains the nodes
      of a <em>single</em> XML document.<br/><br/>
    </li>
    <li><em>org.apache.xalan.xsltc.dom.MultiDOM</em><br/><br/>
      This class is best described as a DOM multiplexer. XSLTC was initially
      designed to operate on a single XML document, and the initial DOM and
      the DOM interface were designed and implemented without the
      <code>document()</code> function in mind. This class will allow a translet
      to access multiple DOMs through the original DOM interface.<br/><br/>
    </li>
    <li><em>org.apache.xalan.xsltc.dom.DOMAdapter</em><br/><br/>
      The DOM adapter is a mediator between a DOMImpl or a MultiDOM object and
      a single translet. A DOMAdapter object contains mappings and reverse
      mappings between node  types in the DOM(s) and node types in the translet.
      This mediator is needed to allow several translets access to a single DOM.
      <br/><br/>
    </li>
    <li><em>org.apache.xalan.xsltc.dom.DocumentCache</em><br/><br/>
      A sample DOM cache (implementing DOMCache) that is used with our sample
      transformation applications.
    </li>
  </ul>

  <p><img src="DOMInterface.gif" alt="DOMInterface.gif"/></p>
  <p><ref>Figure 1: Main components of the internal DOM</ref></p>

  <p>The figure above shows how several translets can access one or more
  internal DOM from a shared pool of cached DOMs. A translet can also access a
  DOM tree outside of a cache. The Stylesheet class that represents the XSL
  stylesheet to compile contains a flag that indicates if the translet uses the
  <code>document()</code> function. The code compiled into the translet will act
  accordingly and instanciate a MultiDOM object if needed (this code is compiled
   in the compiler's <code>Stylesheet.compileTransform()</code> method).</p>

  </s2><anchor name="structure"/>
  <s2 title="Internal Structure">
  <ul>
    <li><link anchor="node-id">Node identification</link></li>
    <li><link anchor="element-nodes">Element nodes</link></li>
    <li><link anchor="attribute-nodes">Attribute nodes</link></li>    
    <li><link anchor="text-nodes">Text nodes</link></li>
    <li><link anchor="comment-nodes">Comment nodes</link></li>    
    <li><link anchor="pi"></link>Processing instructions</li>
  </ul>
  <anchor name="node-id"/>
  <s3 title="Node identifation">

  <p>Each node in the DOM is represented by an integer. This integer is an
  index into a series of arrays that describes the node. Most important is
  the <code>_type[]</code> array, which holds the (DOM internal) node type. There
  are some general node types that are described in the DOM.java interface:</p>

<source>
    public final static int ROOT                   = 0;
    public final static int TEXT                   = 1;
    public final static int UNUSED                 = 2;
    public final static int ELEMENT                = 3;
    public final static int ATTRIBUTE              = 4;
    public final static int PROCESSING_INSTRUCTION = 5;
    public final static int COMMENT                = 6;
    public final static int NTYPES                 = 7;
</source>

  <p>Element and attribute nodes will be assigned types based on their expanded
  QNames. The <code>_type[]</code> array is used for this:</p>

<source>
    int    type      = _type[node];             // get node type
</source>

  <p>The node type can be used to look up the element/attribute name in the
  element/attribute name array <code>_namesArray[]</code>:</p>

<source>
    String name      = _namesArray[type-NTYPES]; // get node element name
</source>

  <p>The resulting string contains the full, expanded QName of the element or
  attribute. Retrieving the namespace URI of an element/attribute is done in a
  very similar fashion:</p>

<source>
    int    nstype    = _namespace[type-NTYPES]; // get namespace type
    String namespace = _nsNamesArray[nstype];   // get node namespace name
</source>
  </s3><anchor name="element-nodes"/>
  <s3 title="Element nodes">

  <p>The contents of an element node (child nodes) can be identified using
  the <code>_offsetOrChild[]</code> and <code>_nextSibling[]</code> arrays. The
  <code>_offsetOrChild[]</code> array will give you the first child of an element
  node:</p>

<source>
    int    child     = _offsetOrChild[node];    // first child
    child = _nextSibling[child];                // next child
</source>

  <p>The last child will have a &quot;<code>_nextSibling[]</code>&quot; of 0 (zero).
  This value is OK since the root node (the 0 node) will not be a child of
  any element.</p>

  </s3><anchor name="attribute-nodes"/>
  <s3 title="Attribute nodes">

  <p>The first attribute node of an element is found by a lookup in the
  <code>_lengthOrAttr[]</code> array using the node index:</p>

<source>
    int    attribute = _offsetOrChild[node];    // first attribute
    attribute = _nextSibling[attribute];        // next attribute
</source>

  <p>The names of attributes are contained in the <code>_namesArray[]</code> just
  like the names of element nodes. The value of attributes are store the same
  way as text nodes:</p>

<source>
    int    offset    = _offsetOrChild[attribute]; // offset into character array
    int    length    = _lengthOrAttr[attribute];  // length of attribute value
    String value     = new String(_text, offset, length);
</source>
  </s3><anchor name="text-nodes"/>
  <s3 title="Text nodes">

  <p>Text nodes are stored identically to attribute values. See the previous
  section on <link anchor="attribute-nodes">attribute nodes</link>.</p>
  </s3><anchor name="comment-nodes"/>
  <s3 title="Comment nodes">

  <p>The internal DOM does currently <em>not</em> contain comment nodes. Yes, I
  am quite aware that the DOM has a type assigned to comment nodes, but comments
  are still not inserted into the DOM.</p>
  </s3><anchor name="pi"/>
  <s3 title="Processing instructions">

  <p>Processing instructions are handled as text nodes. These nodes are stored
  identically to attribute values. See the previous section on
  <link anchor="attribute-nodes">attribute nodes</link>.</p>

  </s3></s2><anchor name="navigation"/>
  <s2 title="Tree navigation">

  <p>The DOM implementation contains a series of iterator that implement the
  XPath axis. All these iterators implement the NodeIterator interface and
  extend the NodeIteratorBase base class. These iterators do the job of
  navigating the tree using the <code>_offsetOrChild[]</code>, <code>_nextSibling</code>
  and <code>_parent[]</code> arrays. All iterators that handles XPath axis are
  implemented as a private inner class of DOMImpl. The translet uses a handful
  of methods to instanciate these iterators:</p>

<source>
    public NodeIterator getIterator();
    public NodeIterator getChildren(final int node);
    public NodeIterator getTypedChildren(final int type);
    public NodeIterator getAxisIterator(final int axis);
    public NodeIterator getTypedAxisIterator(final int axis, final int type);
    public NodeIterator getNthDescendant(int node, int n);
    public NodeIterator getNamespaceAxisIterator(final int axis, final int ns);
    public NodeIterator orderNodes(NodeIterator source, int node);
</source>

  <p>There are a few iterators in addition to these, such as sorting/ordering
  iterators and filtering iterators. These iterators are implemented in
  separate classes and can be instanciated directly by the translet.</p>

  </s2><anchor name="namespaces"/>
  <s2 title="Namespaces">

  <p>Namespace support was added to the internal DOM at a late stage, and the
  design and implementation of the DOM bears a few scars because of this. 
  There is a separate <link idref="xsltc_namespace">design
  document</link> that covers namespaces.</p>

  </s2><anchor name="w3c"/>
  <s2 title="W3C DOM2 navigation support">

  <p>The DOM has a few methods that give basic W3C-type DOM navigation. These
  methods are:</p>

<source>
    public Node makeNode(int index);
    public Node makeNode(NodeIterator iter);
    public NodeList makeNodeList(int index);
    public NodeList makeNodeList(NodeIterator iter);
</source>

  <p>These methods return instances of inner classes of the DOM that implement
  the W3C Node and NodeList interfaces.</p>

  </s2><anchor name="adapter"/>
  <s2 title="The DOM adapter - DOMAdapter">
  <ul>
    <li><link anchor="translet-dom">Translet/DOM type mapping</link></li>
    <li><link anchor="whitespace">Whitespace text-node stripping</link></li>
    <li><link anchor="method-mapping">Method mapping</link></li>
  </ul>
  <anchor name="translet-dom"/>
  <s3 title="Translet/DOM type mapping">

  <p>The DOMAdapter class performs the mappings between DOM and translet node
  types, and vice versa. These mappings are necessary in order for the translet
  to correctly identify an element/attribute in the DOM and for the DOM to
  correctly identify the element/attribute type of a typed iterator requested
  by the translet. Note that the DOMAdapter also maps translet namespace types
  to DOM namespace types, and vice versa.</p>

  <p>The DOMAdapter class has four global tables that hold the translet/DOM
  type and namespace-type mappings. If the DOM knows an element as type
  19, the DOMAdapter will translate this to some other integer using the
  <code>_mapping[]</code> array:</p>

<source>
    int domType = _mapping[transletType];
</source>

  <p>This action will be performed when the DOM asks what type a specific node
  is. The reverse is done then the translet wants an iterator for a specific
  node type. The DOMAdapter must translate the translet-type to the type used
  internally in the DOM by looking up the <code>_reverse[]</code> array:</p>

<source>
    int transletType = _mapping[domType];
</source>

  <p>There are two additional mapping tables: <code>_NSmapping[]</code> and
  <code>_NSreverse[]</code> that do the same for namespace types.</p>
  </s3><anchor name="whitespace"/>
  <s3 title="Whitespace text-node stripping">

  <p>The DOMAdapter class has the additional function of stripping whitespace
  nodes in the DOM. This functionality had to be put in the DOMAdapter, as
  different translets will have different preferences for node stripping.</p>
  </s3><anchor name="method-mapping"/>
  <s3 title="Method mapping">

  <p>The DOMAdapter class implements the same <code>DOM</code> interface as the
  DOMImpl class. A DOMAdapter object will look like a DOMImpl tree, but the
  translet can access it directly without being concerned with type mapping
  and whitespace stripping. The <code>getTypedChildren()</code> demonstrates very
  well how this is done:</p>

<source>
    public NodeIterator getTypedChildren(int type) {
        // Get the DOM type for the requested typed iterator
        final int domType = _reverse[type];
        // Now get the typed child iterator from the DOMImpl object
        NodeIterator iterator = _domImpl.getTypedChildren(domType);
        // Wrap the iterator in a WS stripping iterator if child-nodes are text nodes
	if ((domType == DOM.TEXT) &amp;&amp; (_filter != null))
	    iterator = _domImpl.strippingIterator(iterator,_mapping,_filter);
	return(iterator);
    }
</source>

  </s3></s2><anchor name="multiplexer"/>
  <s2 title="The DOM multiplexer - MultiDOM">

  <p>The DOM multiplexer class is only used when the compiled stylesheet uses
  the <code>document()</code> function. An instance of the MultiDOM class also
  implements the DOM interface, so that it can be accessed in the same way
  as a DOMAdapter object.</p>

  <p>A node in the DOM is identified by an integer. The first 8 bits of this
  integer are used to identify the DOM in which the node belongs, while the
  lower 24 bits are used to identify the node within the DOM:</p>
    <table>
      <tr>
        <td>31-24</td>
        <td>23-16</td>
        <td>16-8</td>
        <td>7-0</td>
      </tr>
      <tr>
        <td>DOM id</td>
        <td colspan="3">node id</td>
      </tr>
    </table>

  <p>The DOM multiplexer has an array of DOMAdapter objects. The topmost 8
  bits of the identifier is used to find the correct DOM from the array. Then
  the lower 24 bits are used in calls to methods in the DOMAdapter object:</p>

<source>
    public int getParent(int node) {
	return _adapters[node>>>24].getParent(node &amp; 0x00ffffff) | node &amp; 0xff000000;
    }
</source>

  <p>Note that the node identifier returned by this method has the same upper 8
  bits as the input node. This is why we <code>OR</code> the result from
  <code>DOMAdapter.getParent()</code> with the top 8 bits of the input node.</p>

  </s2><anchor name="builder"/>
  <s2 title="The DOM builder - DOMImpl$DOMBuilder">
  <ul>
    <li><link anchor="startelement">startElement()</link></li>
    <li><link anchor="endelement">endElement()</link></li>
    <li><link anchor="startprefixmapping">startPrefixMapping()</link></li>
    <li><link anchor="endprefixmapping">endPrefixMapping()</link></li>
    <li><link anchor="characters">characters()</link></li>
    <li><link anchor="startdocument">startDocument()</link></li>
    <li><link anchor="enddocument">endDocument()</link></li>
  </ul>

  <p>The DOM builder is an inner class of the DOM implementation. The builder
  implements the SAX2 <code>ContentHandler</code> interface and populates the DOM
  by receiving SAX2 events from a SAX2 parser (presently xerces). An instance
  of the DOM builder class can be retrieved from <code>DOMImpl.getBuilder()</code>
  method, and this handler can be set as an XMLReader's content handler:</p>

<source>
    final SAXParserFactory factory = SAXParserFactory.newInstance();
    final SAXParser parser = factory.newSAXParser();
    final XMLReader reader = parser.getXMLReader();
    final DOMImpl dom = new DOMImpl();
    reader.setContentHandler(dom.getBuilder());
</source>

  <p>The DOM builder will start to populate the DOM once the XML parser starts
  generating SAX2 events:</p>
  <anchor name="startelement"/>
  <s3 title="startElement()">

  <p>This method can be called in one of two ways; either with the expanded
  QName (the element's separate uri and local name are supplied) or as a
  normal QName (one String on the format prefix:local-name). The DOM stores
  elements as expanded QNames so it needs to know the element's namespace URI.
  Since the URI is not supplied with this call, we have to keep track of
  namespace prefix/uri mappings while we're building the DOM. See 
  <code><link anchor="startprefixmapping">startPrefixMapping()</link></code> below for details on
  namespace handling.</p>

  <p>The <code>startElement()</code> inserts the element as a child of the current
  parent element, creates attribute nodes for all attributes in the supplied
  &quot;<code>Attributes</code>&quot; attribute list (by a series of calls to
  <code>makeAttributeNode()</code>), and finally creates the actual element node
  (by calling <code>internElement()</code>, which inserts a new entry in the
  <code>_type[]</code> array).</p>
  </s3><anchor name="endelement"/>
  <s3 title="endElement()">

  <p>This method does some cleanup after the <code>startElement()</code> method,
  such as revering <code>xml:space</code> settings and linking the element's
  child nodes.</p>
  </s3><anchor name="startprefixmapping"/>
  <s3 title="startPrefixMapping()">

  <p>This method is called for each namespace declaration in the source
  document. The parser should call this method before the prefix is referenced
  in a QName that is passed to the <code>startElement()</code> call. Namespace
  prefix/uri mappings are stored in a Hashtable structure. Namespace prefixes
  are used as the keys in the Hashtable, and each key maps to a Stack that
  contains the various URIs that the prefix maps to. The URI on top of the
  stack is the URI that the prefix currently maps to.</p>

  
    <p><img src="namespace_stack.gif" alt="namespace_stack.gif"/></p>
    <p><ref>Figure 2: Namespace handling in the DOM builder</ref></p>


  <p>Each call to <code>startPrefixMapping()</code> results in a lookup in the
  Hashtable (using the prefix), and a <code>push()</code> of the URI onto the
  Stack that the prefix maps to.</p>
  </s3><anchor name="endprefixmapping"/>
  <s3 title="endPrefixMapping()">

  <p>A namespace prefix/uri mapping is closed by locating the Stack for the
  prefix, and then <code>pop()</code>'ing the topmost URI off this Stack.</p>
  </s3><anchor name="characters"/>
  <s3 title="characters()">

  <p>Text nodes are stored as simple character sequences in the character array
  <code>_text[]</code>. The start and lenght of a node's text can be determined by
  using the node index to look up <code>_offsetOrChild[]</code> and
  <code>_lengthOrAttribute[]</code>.</p>

  <p>We want to re-use character sequences if two or more text nodes have
  identical content. This can be achieved by having two different text node
  indexes map to the same character sequence. The <code>maybeReuseText()</code>
  method is always called before a new character string is stored in the
  <code>_text[]</code> array. This method will locate the offset of an existing
  instance of a character sequence.</p>
  </s3><anchor name="startdocument"/>
  <s3 title="startDocument()">

  <p>This method initialises a bunch of data structures that are used by the
  builder. It also pushes the default namespace on the namespace stack (so that
  the &quot;&quot; prefix maps to the <code>null</code> namespace).</p>
  </s3><anchor name="enddocument"/>
  <s3 title="endDocument()">

  <p>This method builds the <code>_namesArray[]</code>, <code>_namespace[]</code>
  and <code>_nsNamesArray[]</code> structures from temporary datastructures used
  in the DOM builder.</p>

   </s3>
 </s2>
</s1>   
