<?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 runtime environment">

  <s2 title="Contents">

  <p>This document describes the design and overall architecture of XSLTC's
  runtime environment. This does not include the internal DOM and the DOM
  iterators, which are all covered in separate documents.</p>

  <ul>
    <li><link anchor="overview">Runtime overview</link></li>
    <li><link anchor="translet">The compiled translet</link></li>
    <li><link anchor="types">External/internal type mapping</link></li>    
    <li><link anchor="mainloop">Main program loop</link></li>
    <li><link anchor="library">Runtime library</link></li>
    <li><link anchor="output">Output handling</link></li>
  </ul>

  </s2>

  <!--=================== OVERVIEW SECTION ===========================--> 

  <anchor name="overview"/>
  <s2 title="Runtime overview">

    <p>This figure shows the main components of XSLTC's runtime environment:</p>
 
    <p><img src="runtime_design.gif" alt="runtime_design.gif"/></p>
    <p><ref>Figure 1: Runtime environment overview</ref></p>

    <p>The various steps these components have to go through to transform a
    document are:</p>

    <ul>
      <li>instanciate a parser and hand it the input document</li>
      <li>build an internal DOM from the parser's SAX events</li>
      <li>instanciate the translet object</li>
      <li>pass control to the translet object</li>
      <li>receive output events from the translet</li>
      <li>format the output document</li>
    </ul>

    <p>This process can be initiated either through XSLTC's native API or
    through the implementation of the JAXP/TrAX API.</p>

    </s2><anchor name="translet"/>
    <s2 title="The compiled translet">

    <p>A translet is always a subclass of <code>AbstractTranslet</code>. As well
    as having access to the public/protected methods in this class, the
    translet is compiled with these methods:</p><source>
    public void transform(DOM, NodeIterator, TransletOutputHandler);</source>

    <p>This method is passed a <code>DOMImpl</code> object. Depending on whether
    the stylesheet had any calls to the <code>document()</code> function this
    method will either generate a <code>DOMAdapter</code> object (when only one
    XML document is used as input) or a <code>MultiDOM</code> object (when there
    are more than one XML input documents). This DOM object is passed on to
    the <code>topLevel()</code> method.</p>

    <p>When the <code>topLevel()</code> method returns, we initiate the output
    document by calling <code>startDocument()</code> on the supplied output
    handler object. We then call <code>applyTemplates()</code> to get the actual
    output contents, before we close the output document by calling
    <code>endDocument()</code> on the output handler.</p><source>
    public void topLevel(DOM, NodeIterator, TransletOutputHandler);</source>

    <p>This method handles all of these top-level elements:</p>
    <ul>
      <li><code>&lt;xsl:output&gt;</code></li>
      <li><code>&lt;xsl:decimal-format&gt;</code></li>
      <li><code>&lt;xsl:key&gt;</code></li>
      <li><code>&lt;xsl:param&gt;</code> (for global parameters)</li>
      <li><code>&lt;xsl:variable&gt;</code> (for global variables)</li>
    </ul><source>
    public void applyTemplates(DOM, NodeIterator, TransletOutputHandler);</source>

    <p>This is the method that produces the actual output. Its central element
    is a big <code>switch()</code> statement that is used to trigger the code
    that represent the available templates for the various node in the input
    document. See the chapter on the
    <link anchor="mainloop">main program loop</link> for details on this method.
    </p><source>
    public void &lt;init&gt;();</source>

    <anchor name="namesarray"/>
    <p>The translet's constructor initializes a table of all the elements we
    want to search for in the XML input document. This table is called the
    <code>namesArray</code>, and maps each element name to an unique integer
    value, know as the elements &quot;translet-type&quot;.
    The DOMAdapter, which acts as a mediator between the DOM and the translet,
    will map these element identifier to the element identifiers used internally
    in the DOM. See the section on <link anchor="types">extern/internal type
    mapping</link> and the internal DOM design document for details on this.</p>

    <p>The constructor also initializes any <code>DecimalFormatSymbol</code>
    objects that are used to format numbers before passing them to the
    output post-processor. The output processor uses thes symbols to format
    decimal numbers in the output.</p><source>
    public boolean stripSpace(int nodeType);</source>

    <p>This method is only present if any <code>&lt;xsl:strip-space&gt;</code>
    or <code>&lt;xsl:preserve-space&gt;</code> elements are present in the
    stylesheet. If that is the case, the translet implements the
    <code>StripWhitespaceFilter</code> interface by containing this method.</p>

  </s2>

  <!--=================== TYPE MAPPING SECTION ===========================--> 

  <anchor name="types"/>
  <s2 title="External/internal type mapping">

    <p>This is the very core of XSL transformations:
    <em>Read carefully!!!</em></p>

    <anchor name="external-types"/>
    <p>Every node in the input XML document(s) is assigned a type by the DOM
    builder class. This type is a unique integer value which represents the
    element, so that for instance all <code>&lt;bob&gt;</code> elements in the
    input document will be given type <code>7</code> and can be referred to by
    that integer. These types can be used for lookups in the
    <link anchor="namesarray">namesArray</link> table to get the actual
    element name (in this case "bob"). The type identifiers used in the DOM are
    referred to as <em>external types</em> or <em>DOM types</em>, as they are
    types known only outside of the translet.</p>

    <anchor name="internal-types"/>
    <p>Similarly the translet assignes types to all element and attribute names
    that are referenced in the stylesheet. This type assignment is done at
    compile-time, while the DOM builder assigns the external types at runtime.
    The element type identifiers used by the translet are referred to as
    <em>internal types</em> or <em>translet types</em>.</p>

    <p>It is not very probable that there will be a one-to-one mapping between
    internal and external types. There will most often be elements in the DOM
    (ie. the input document) that are not mentioned in the stylesheet, and
    there could be elements in the stylesheet that do not match any elements
    in the DOM. Here is an example:</p>

<source>
      &lt;?xml version="1.0"?&gt;
      &lt;xsl:stylesheet version="1.0" xmlns:xsl="blahblahblah"&gt;

      &lt;xsl:template match="/"&gt;
        &lt;xsl:for-each select="//B"&gt;
          &lt;xsl:apply-templates select="." /&gt;
        &lt;/xsl:for-each&gt;
        &lt;xsl:for-each select="C"&gt;
          &lt;xsl:apply-templates select="." /&gt;
        &lt;/xsl:for-each&gt;
        &lt;xsl:for-each select="A/B"&gt;
          &lt;xsl:apply-templates select="." /&gt;
        &lt;/xsl:for-each&gt;
      &lt;/xsl:template&gt;

    &lt;/xsl:stylesheet&gt;
</source>

    <p>In this stylesheet we are looking for elements <code>&lt;B&gt;</code>,
    <code>&lt;C&gt;</code> and <code>&lt;A&gt;</code>. For this example we can
    assume that these element types will be assigned the values 0, 1 and 2.
    Now, lets say we are transforming this XML document:</p>

<source>
      &lt;?xml version="1.0"?&gt;

      &lt;A&gt;
        The crocodile cried:
        &lt;F&gt;foo&lt;/F&gt;
        &lt;B&gt;bar&lt;/B&gt;
        &lt;B&gt;baz&lt;/B&gt;
      &lt;/A&gt;
</source>

    <p>This XML document has the elements <code>&lt;A&gt;</code>,
    <code>&lt;B&gt;</code> and <code>&lt;F&gt;</code>, which we assume are
    assigned the types 7, 8 and 9 respectively  (the numbers below that are
    assigned for specific element types, such as the root node, text nodes,etc).
    This causes a mismatch between the type used for <code>&lt;B&gt;</code> in
    the translet and the type used for <code>&lt;B&gt;</code> in the DOM. The
    DOMAdapter class (which mediates between the DOM and the translet) has been
    given two tables for convertint between the two types; <code>mapping</code>
    for mapping from internal to external types, and <code>reverseMapping</code>
    for the other way around.</p>

    <p>The translet contains a <code>String[]</code> array called
    <code>namesArray</code>. This array contains all the element and attribute
    names that were referenced in the stylesheet. In our example, this array
    would contain these string (in this specific order): &quot;B&quot;, 
    &quot;C&quot; and &quot;A&quot;. This array is passed as one of the
    parameters to the DOM adapter constructor (the other parameter is the DOM
    itself). The DOM adapter passes this table on to the DOM. The DOM generates
    a hashtable that maps its known element names to the types the translet
    knows. The DOM does this by going through the <code>namesArray</code> from
    the translet sequentially, looks up each name in the hashtable, and is then
    able to map the internal type to an external type. The result is then passed
    back to the DOM adapter.</p>

    <p>External types that are not interesting for the translet (such as the
    type for <code>&lt;F&gt;</code> elements in the example above) are mapped
    to a generic <code>"ELEMENT"</code> type (integer value 3), and are more or
    less ignored by the translet. Uninterresting attributes are similarly
    mapped to internal type <code>"ATTRIBUTE"</code> (integer value 4).</p>

    <p>It is important that we separate the DOM from the translet. In several
    cases we want the DOM as a structure completely independent from the
    translet - even though the DOM is a structure internal to XSLTC. One such
    case is when transformations are offered by a servlet as a web service.
    Any DOM that is built should potentially be stored in a cache and made
    available for simultaneous access by several translet/servlet couples.</p>

    <p><img src="runtime_type_mapping.gif" alt="runtime_type_mapping.gif"/></p>
    <p><ref>Figure 2: Two translets accessing a single dom using different type mappings</ref></p>

  </s2>

  <!--===================== MAIN LOOP SECTION ============================--> 

  <anchor name="mainloop"/>
  <s2 title="Main program loop">

    <p>The main body of the translet is the <code>applyTemplates()</code>
    method. This method goes through these steps:</p>

    <ul>
      <li>
        Get the next node from the node iterator
      </li>
      <li>
        Get the internal type of this node. The DOMAdapter object holds the
        internal/external type mapping table, and it will supply the translet
        with the internal type of the current node.
      </li>
      <li>
        Execute a switch statement on the internal node type. There will be
        one "case" label for each recognised node type - this includes the
        first 7 internal node types.
      </li>
    </ul>

    <p>The root node will have internal type 0 and will cause any initial
    literal elements to be output. Text nodes will have internal node type 1
    and will simply be dumped to the output handler. Unrecognized elements
    will have internal node type 3 and will be given the default treatment
    (a new iterator is created for the node's children, and this iterator
    is passed with a recursive call to <code>applyTemplates()</code>).
    Unrecognised attribute nodes (type 4) will be handled like text nodes.
    This makes up the default (built in) templates of any stylesheet. Then,
    we add one <code>"case"</code>for each node type that is matched by any
    pattern in the stylesheet. The <code>switch()</code> statement in
    <code>applyTemplates</code> will thereby look something like this:</p>

<source>
        public void applyTemplates(DOM dom, NodeIterator,
                                   TransletOutputHandler handler) {

            // get nodes from iterator
            while ((node = iterator.next()) != END) {
                // get internal node type
                switch(DOM.getType(node)) {

                case 0: // root
                    outputPreable(handler);
                    break;
                case 1: // text
                    DOM.characters(node,handler);
                    break;
                case 3: // unrecognised element
                    NodeIterator newIterator = DOM.getChildren(node);
                    applyTemplates(DOM,newIterator,handler);
                    break;
                case 4: // unrecognised attribute
                    DOM.characters(node,handler);
                    break;
                case 7: // elements of type &lt;B&gt;
                    someCompiledCode();
                    break;
                case 8: // elements of type &lt;C&gt;
                    otherCompiledCode();
                    break;
                default:
                    break;
                }
            }
        }
</source>

    <p>Each recognised element will have its own piece of compiled code.</p>

    <p>Note that each "case" will not lead directly to a single template.
    There may be several templates that match node type 7
    (say <code>&lt;B&gt;</code>). In the sample stylesheet in the previous
    chapter we have to templates that would match a node <code>&lt;B&gt;</code>.
    We have one <code>match="//B"</code> (match just any <code>&lt;B&gt;</code>
    element) and one <code>match="A/B"</code> (match a <code>&lt;B&gt;</code>
    element that is a child of a <code>&lt;A&gt;</code> element). In this case
    we would have to compile code that first gets the type of the current node's
    parent, and then compared this type with the type for
    <code>&lt;A&gt;</code>. If there was no match we will have executed the
    first <code>&lt;xsl:for-each&gt;</code> element, but if there was a match
    we will have executed the last one. Consequentally, the compiler will
    generate the following code (well, it will look like this anyway):</p>

<source>
        switch(DOM.getType(node)) {
          :
          :
        case 7: // elements of type &lt;B&gt;
            int parent = DOM.getParent(node);
            if (DOM.getType(parent) == 9) // type 9 = elements &lt;A&gt;
                someCompiledCode();
            else
                evenOtherCompiledCode();
            break;
          :
          :
        }
</source>

    <p>We could do the same for namespaces, that is, assign a numeric value
    to every namespace that is references in the stylesheet, and use an
    <code>"if"</code> statement for each namespace that needs to be checked for
    each type. Lets say we had a stylesheet like this:</p>

<source>
      &lt;?xml version="1.0"?&gt;
      &lt;xsl:stylesheet version="1.0" xmlns:xsl="blahblahblah"&gt;

      &lt;xsl:template match="/"
          xmlns:foo="http://foo.com/spec"
          xmlns:bar="http://bar.net/ref"&gt;
        &lt;xsl:for-each select="foo:A"&gt;
          &lt;xsl:apply-templates select="." /&gt;
        &lt;/xsl:for-each&gt;
        &lt;xsl:for-each select="bar:A"&gt;
          &lt;xsl:apply-templates select="." /&gt;
        &lt;/xsl:for-each&gt;
      &lt;/xsl:template&gt;

    &lt;/xsl:stylesheet&gt;
</source>

    <p>And a stylesheet like this:</p>

<source>
      &lt;?xml version="1.0"?&gt;

      &lt;DOC xmlns:foo="http://foo.com/spec"
           xmlns:bar="http://bar.net/ref"&gt;
        &lt;foo:A&gt;In foo namespace&lt;/foo:A&gt;
        &lt;bar:A&gt;In bar namespace&lt;/bar:A&gt;
      &lt;/DOC&gt;
</source>

    <p>We could still keep the same type for all <code>&lt;A&gt;</code> elements
    regardless of what namespace they are in, and use the same <code>"if"</code>
    structure within the <code>switch()</code> statement above. The other option
    is to assign different types to <code>&lt;foo:A&gt;</code> and
    <code>&lt;bar:A&gt;</code> elements. The latter is the option we chose, and
    it is described in detail in the namespace design document.</p>

  </s2>

  <!--===================== RUNTIME SECTION =============================--> 

  <anchor name="library"/>
  <s2 title="Runtime library">

    <p>The runtime library offers basic functionality to the translet at
    runtime. It is analoguous to UNIX's <code>libc</code>. The whole runtime
    library is contained in a single class file:</p>

<source>
    org.apache.xalan.xsltc.runtime.BasisLibrary
</source>

    <p>This class contains a large set of static methods that are invoked by
    the translet. These methods are largely independent from eachother, and
    they implement the following:</p>

    <ul>
      <li>simple XPath functions that do not require a lot of code
      compiled into the translet class</li>
      <li>functions for formatting decimal numbers to strings</li>
      <li>functions for comparing nodes, node-sets and strings - used by
      equality expressions, predicates and other</li>
      <li>functions for generating localised error messages</li>
    </ul>

    <p>The runtime library is a central part of XSLTC. But, as metioned earlier,
    the functions within the library are rarely related, so there is no real
    overall design/architecture. The only common attribute of many of the
    methods in the library is that all static methods that implement an XPath
    function and with a capital <code>F</code>.</p>

  </s2>

  <!--====================== OUTPUT SECTION =============================--> 

  <anchor name="output"/>
  <s2 title="Output handler">

    <p>The translet passes its output to an output post-processor before the
    final result is handed to the client application over a standard SAX
    interface. The interface between the translet and the output handler is
    very similar to a SAX interface, but it has a few non-standard additions.
    This interface is described in this file:</p>

<source>
    org.apache.xalan.xsltc.TransletOutputHandler
</source>

    <p>This interface is implemented by:</p>

<source>
    org.apache.xalan.xsltc.runtime.TextOutput
</source>

    <p>This class, despite its name, handles all types of output (XML, HTML and
    TEXT). Our initial idea was to have a base class implementing the
    <code>TransletOutputHandler</code> interface, and then have one subclass
    for each of the output types. This proved very difficult, as the output
    type is not always known until after the transformation has started and
    some elements have been output. But, this is an area where a change like
    that has the potential to increase performance significantly. Output
    handling has a lot to do with analyzing string contents, and by narrowing
    down the number of string comparisons and string updates one can acomplish
    a lot.</p>
 
    <p>The main tasks of the output handler are:</p>

    <ul>
      <li>determine the output type based on the output generated by the
      translet (not always necessary)</li>
      <li>generate SAX events for the client application</li>
      <li>insert the necessary namespace declarations in the output</li>
      <li>escape special characters in the output</li>
      <li>insert &lt;DOCTYPE&gt; and &lt;META&gt; elements in HTML output</li>
    </ul>

    <p>There is a very clear link between the output handler and the
    <code>org.apache.xalan.xsltc.compiler.Output</code> class that handles
    the <code>&lt;xsl:output&gt;</code> element. The <code>Output</code> class
    stores many output settings and parameters in the translet class file and
    the translet passes these on to the output handler.</p>

  </s2>

</s1>
