<?xml version="1.0" standalone="no"?>
<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
<!-- 
 * The Apache Software License, Version 1.1
 *
 *
 * Copyright (c) 2001-2003 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>   
