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: StylesheetRoot.java 476466 2006-11-18 08:22:31Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xalan.templates;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.text.DecimalFormatSymbols;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.ArrayList;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.HashMap;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Hashtable;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Properties;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Vector;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.ErrorListener;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Templates;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Transformer;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerConfigurationException;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.extensions.ExtensionNamespacesManager;
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.processor.XSLTSchema;
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLMessages;
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLTErrorResources;
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.transformer.TransformerImpl;
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM;
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.ref.ExpandedNameTable;
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.IntStack;
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.QName;
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPath;
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext;
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class represents the root object of the stylesheet tree.
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage general
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class StylesheetRoot extends StylesheetComposed
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        implements java.io.Serializable, Templates
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = 3875353123529147855L;
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The flag for the setting of the optimize feature;
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean m_optimizer = true;
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The flag for the setting of the incremental feature;
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean m_incremental = false;
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * The flag for the setting of the source_location feature;
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean m_source_location = false;
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * State of the secure processing feature.
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private boolean m_isSecureProcessing = false;
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Uses an XSL stylesheet document.
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException if the baseIdentifier can not be resolved to a URL.
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public StylesheetRoot(ErrorListener errorListener) throws TransformerConfigurationException
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super(null);
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    setStylesheetRoot(this);
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_selectDefault = new XPath("node()", this, this, XPath.SELECT, errorListener);
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      initDefaultRule(errorListener);
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (TransformerException se)
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new TransformerConfigurationException(XSLMessages.createMessage(XSLTErrorResources.ER_CANNOT_INIT_DEFAULT_TEMPLATES, null), se); //"Can't init default templates!", se);
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The schema used when creating this StylesheetRoot
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private HashMap m_availElems;
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Creates a StylesheetRoot and retains a pointer to the schema used to create this
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * StylesheetRoot.  The schema may be needed later for an element-available() function call.
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param schema The schema used to create this stylesheet
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerConfigurationException if the baseIdentifier can not be resolved to a URL.
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public StylesheetRoot(XSLTSchema schema, ErrorListener listener) throws TransformerConfigurationException
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this(listener);
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_availElems = schema.getElemsAvailable();
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if this is the root of the stylesheet tree.
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return True since this is the root of the stylesheet tree.
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isRoot()
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return true;
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the state of the secure processing feature.
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setSecureProcessing(boolean flag)
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_isSecureProcessing = flag;
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the state of the secure processing feature.
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isSecureProcessing()
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_isSecureProcessing;
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the hashtable of available elements.
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return table of available elements, keyed by qualified names, and with
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * values of the same qualified names.
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public HashMap getAvailableElements()
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_availElems;
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private transient ExtensionNamespacesManager m_extNsMgr = null;
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Only instantiate an ExtensionNamespacesManager if one is called for
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (i.e., if the stylesheet contains  extension functions and/or elements).
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ExtensionNamespacesManager getExtensionNamespacesManager()
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     if (m_extNsMgr == null)
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       m_extNsMgr = new ExtensionNamespacesManager();
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     return m_extNsMgr;
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the vector of extension namespaces. Used to provide
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the extensions table access to a list of extension
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * namespaces encountered during composition of a stylesheet.
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Vector getExtensions()
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_extNsMgr != null ? m_extNsMgr.getExtensions() : null;
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void runtimeInit(TransformerImpl transformer) throws TransformerException
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    System.out.println("StylesheetRoot.runtimeInit()");
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //    try{throw new Exception("StylesheetRoot.runtimeInit()");} catch(Exception e){e.printStackTrace();}
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson*/
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //============== Templates Interface ================
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a new transformation context for this Templates object.
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A Transformer instance, never null.
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Transformer newTransformer()
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return new TransformerImpl(this);
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Properties getDefaultOutputProps()
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_outputProperties.getProperties();
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the static properties for xsl:output.  The object returned will
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be a clone of the internal values, and thus it can be mutated
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * without mutating the Templates object, and then handed in to
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the process method.
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>For XSLT, Attribute Value Templates attribute values will
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be returned unexpanded (since there is no context at this point).</p>
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A Properties object, not null.
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Properties getOutputProperties()
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (Properties)getDefaultOutputProps().clone();
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //============== End Templates Interface ================
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Recompose the values of all "composed" properties, meaning
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * properties that need to be combined or calculated from
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the combination of imported and included stylesheets.  This
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * method determines the proper import precedence of all imported
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * stylesheets.  It then iterates through all of the elements and
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * properties in the proper order and triggers the individual recompose
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * methods.
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void recompose() throws TransformerException
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Now we make a Vector that is going to hold all of the recomposable elements
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Vector recomposableElements = new Vector();
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // First, we build the global import tree.
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_globalImportList)
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Vector importList = new Vector();
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      addImports(this, true, importList);
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Now we create an array and reverse the order of the importList vector.
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // We built the importList vector backwards so that we could use addElement
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // to append to the end of the vector instead of constantly pushing new
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // stylesheets onto the front of the vector and having to shift the rest
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // of the vector each time.
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_globalImportList = new StylesheetComposed[importList.size()];
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i =  0, j= importList.size() -1; i < importList.size(); i++)
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_globalImportList[j] = (StylesheetComposed) importList.elementAt(i);
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Build the global include list for this stylesheet.
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // This needs to be done ahead of the recomposeImports
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // because we need the info from the composed includes.
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_globalImportList[j].recomposeIncludes(m_globalImportList[j]);
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Calculate the number of this import.
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_globalImportList[j--].recomposeImports();
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Next, we walk the import tree and add all of the recomposable elements to the vector.
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = getGlobalImportCount();
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < n; i++)
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      StylesheetComposed imported = getGlobalImport(i);
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      imported.recompose(recomposableElements);
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // We sort the elements into ascending order.
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    QuickSort2(recomposableElements, 0, recomposableElements.size() - 1);
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // We set up the global variables that will hold the recomposed information.
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_outputProperties = new OutputProperties(org.apache.xml.serializer.Method.UNKNOWN);
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  m_outputProperties = new OutputProperties(Method.XML);
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_attrSets = new HashMap();
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_decimalFormatSymbols = new Hashtable();
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_keyDecls = new Vector();
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_namespaceAliasComposed = new Hashtable();
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_templateList = new TemplateList();
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_variables = new Vector();
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Now we sequence through the sorted elements,
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // calling the recompose() function on each one.  This will call back into the
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // appropriate routine here to actually do the recomposition.
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Note that we're going backwards, encountering the highest precedence items first.
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = recomposableElements.size() - 1; i >= 0; i--)
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ((ElemTemplateElement) recomposableElements.elementAt(i)).recompose(this);
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Backing out REE again, as it seems to cause some new failures
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * which need to be investigated. -is
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // This has to be done before the initialization of the compose state, because
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // eleminateRedundentGlobals will add variables to the m_variables vector, which
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // it then copied in the ComposeState constructor.
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    if(true && org.apache.xalan.processor.TransformerFactoryImpl.m_optimize)
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    {
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//          RedundentExprEliminator ree = new RedundentExprEliminator();
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//          callVisitors(ree);
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//          ree.eleminateRedundentGlobals(this);
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    }
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    initComposeState();
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Need final composition of TemplateList.  This adds the wild cards onto the chains.
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_templateList.compose(this);
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Need to clear check for properties at the same import level.
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_outputProperties.compose(this);
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_outputProperties.endCompose(this);
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Now call the compose() method on every element to give it a chance to adjust
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // based on composed values.
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    n = getGlobalImportCount();
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < n; i++)
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      StylesheetComposed imported = this.getGlobalImport(i);
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int includedCount = imported.getIncludeCountComposed();
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int j = -1; j < includedCount; j++)
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Stylesheet included = imported.getIncludeComposed(j);
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        composeTemplates(included);
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Attempt to register any remaining unregistered extension namespaces.
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_extNsMgr != null)
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_extNsMgr.registerUnregisteredNamespaces();
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    clearComposeState();
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Call the compose function for each ElemTemplateElement.
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param templ non-null reference to template element that will have
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the composed method called on it, and will have it's children's composed
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * methods called.
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void composeTemplates(ElemTemplateElement templ) throws TransformerException
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    templ.compose(this);
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (ElemTemplateElement child = templ.getFirstChildElem();
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            child != null; child = child.getNextSiblingElem())
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      composeTemplates(child);
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    templ.endCompose(this);
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The combined list of imports.  The stylesheet with the highest
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * import precedence will be at element 0.  The one with the lowest
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * import precedence will be at element length - 1.
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private StylesheetComposed[] m_globalImportList;
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Add the imports in the given sheet to the working importList vector.
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The will be added from highest import precedence to
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * least import precedence.  This is a post-order traversal of the
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * import tree as described in <a href="http://www.w3.org/TR/xslt.html#import">the
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * XSLT Recommendation</a>.
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>For example, suppose</p>
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>stylesheet A imports stylesheets B and C in that order;</p>
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>stylesheet B imports stylesheet D;</p>
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>stylesheet C imports stylesheet E.</p>
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Then the order of import precedence (highest first) is
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * A, C, E, B, D.</p>
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param stylesheet Stylesheet to examine for imports.
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param addToList  <code>true</code> if this template should be added to the import list
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param importList The working import list.  Templates are added here in the reverse
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        order of priority.  When we're all done, we'll reverse this to the correct
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        priority in an array.
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void addImports(Stylesheet stylesheet, boolean addToList, Vector importList)
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Get the direct imports of this sheet.
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = stylesheet.getImportCount();
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (n > 0)
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i = 0; i < n; i++)
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Stylesheet imported = stylesheet.getImport(i);
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        addImports(imported, true, importList);
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    n = stylesheet.getIncludeCount();
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (n > 0)
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i = 0; i < n; i++)
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Stylesheet included = stylesheet.getInclude(i);
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        addImports(included, false, importList);
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (addToList)
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      importList.addElement(stylesheet);
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a stylesheet from the global import list.
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * TODO: JKESS PROPOSES SPECIAL-CASE FOR NO IMPORT LIST, TO MATCH COUNT.
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param i Index of stylesheet to get from global import list
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The stylesheet at the given index
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public StylesheetComposed getGlobalImport(int i)
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_globalImportList[i];
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the total number of imports in the global import list.
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The total number of imported stylesheets, including
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the root stylesheet, thus the number will always be 1 or
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * greater.
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * TODO: JKESS PROPOSES SPECIAL-CASE FOR NO IMPORT LIST, TO MATCH DESCRIPTION.
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getGlobalImportCount()
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return (m_globalImportList!=null)
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        ? m_globalImportList.length
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          : 1;
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a stylesheet, return the number of the stylesheet
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in the global import list.
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param sheet The stylesheet which will be located in the
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * global import list.
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The index into the global import list of the given stylesheet,
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or -1 if it is not found (which should never happen).
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getImportNumber(StylesheetComposed sheet)
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (this == sheet)
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return 0;
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = getGlobalImportCount();
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < n; i++)
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (sheet == getGlobalImport(i))
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return i;
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return -1;
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This will be set up with the default values, and then the values
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * will be set as stylesheets are encountered.
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private OutputProperties m_outputProperties;
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Recompose the output format object from the included elements.
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param oprops non-null reference to xsl:output properties representation.
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void recomposeOutput(OutputProperties oprops)
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    throws TransformerException
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_outputProperties.copyFrom(oprops);
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the combined "xsl:output" property with the properties
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * combined from the included stylesheets.  If a xsl:output
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is not declared in this stylesheet or an included stylesheet,
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * look in the imports.
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Please note that this returns a reference to the OutputProperties
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * object, not a cloned object, like getOutputProperties does.
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#output">output in XSLT Specification</a>
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return non-null reference to composed output properties object.
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public OutputProperties getOutputComposed()
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // System.out.println("getOutputComposed.getIndent: "+m_outputProperties.getIndent());
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // System.out.println("getOutputComposed.getIndenting: "+m_outputProperties.getIndenting());
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_outputProperties;
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Flag indicating whether an output method has been set by the user.
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial           */
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_outputMethodSet = false;
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Find out if an output method has been set by the user.
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Value indicating whether an output method has been set by the user
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage internal
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean isOutputMethodSet()
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_outputMethodSet;
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Composed set of all included and imported attribute set properties.
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Each entry is a vector of ElemAttributeSet objects.
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private HashMap m_attrSets;
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Recompose the attribute-set declarations.
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param attrSet An attribute-set to add to the hashtable of attribute sets.
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void recomposeAttributeSets(ElemAttributeSet attrSet)
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ArrayList attrSetList = (ArrayList) m_attrSets.get(attrSet.getName());
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == attrSetList)
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      attrSetList = new ArrayList();
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_attrSets.put(attrSet.getName(), attrSetList);
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    attrSetList.add(attrSet);
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a list "xsl:attribute-set" properties that match the qname.
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#attribute-sets">attribute-sets in XSLT Specification</a>
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name Qualified name of attribute set properties to get
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A vector of attribute sets matching the given name
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws ArrayIndexOutOfBoundsException
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ArrayList getAttributeSetComposed(QName name)
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws ArrayIndexOutOfBoundsException
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (ArrayList) m_attrSets.get(name);
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Table of DecimalFormatSymbols, keyed by QName.
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Hashtable m_decimalFormatSymbols;
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Recompose the decimal-format declarations.
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dfp A DecimalFormatProperties to add to the hashtable of decimal formats.
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void recomposeDecimalFormats(DecimalFormatProperties dfp)
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DecimalFormatSymbols oldDfs =
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  (DecimalFormatSymbols) m_decimalFormatSymbols.get(dfp.getName());
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == oldDfs)
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_decimalFormatSymbols.put(dfp.getName(), dfp.getDecimalFormatSymbols());
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (!dfp.getDecimalFormatSymbols().equals(oldDfs))
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String themsg;
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (dfp.getName().equals(new QName("")))
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // "Only one default xsl:decimal-format declaration is allowed."
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        themsg = XSLMessages.createWarning(
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          XSLTErrorResources.WG_ONE_DEFAULT_XSLDECIMALFORMAT_ALLOWED,
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          new Object[0]);
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // "xsl:decimal-format names must be unique. Name {0} has been duplicated."
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        themsg = XSLMessages.createWarning(
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          XSLTErrorResources.WG_XSLDECIMALFORMAT_NAMES_MUST_BE_UNIQUE,
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          new Object[] {dfp.getName()});
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      error(themsg);   // Should we throw TransformerException instead?
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a valid element decimal-format name, return the
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * decimalFormatSymbols with that name.
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>It is an error to declare either the default decimal-format or
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * a decimal-format with a given name more than once (even with
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * different import precedence), unless it is declared every
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * time with the same value for all attributes (taking into
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * account any default values).</p>
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <p>Which means, as far as I can tell, the decimal-format
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * properties are not additive.</p>
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name Qualified name of the decimal format to find
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return DecimalFormatSymbols object matching the given name or
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * null if name is not found.
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public DecimalFormatSymbols getDecimalFormatComposed(QName name)
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (DecimalFormatSymbols) m_decimalFormatSymbols.get(name);
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * A list of all key declarations visible from this stylesheet and all
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * lesser stylesheets.
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Vector m_keyDecls;
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Recompose the key declarations.
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param keyDecl A KeyDeclaration to be added to the vector of key declarations.
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void recomposeKeys(KeyDeclaration keyDecl)
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_keyDecls.addElement(keyDecl);
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the composed "xsl:key" properties.
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#key">key in XSLT Specification</a>
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A vector of the composed "xsl:key" properties.
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Vector getKeysComposed()
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_keyDecls;
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Composed set of all namespace aliases.
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Hashtable m_namespaceAliasComposed;
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Recompose the namespace-alias declarations.
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nsAlias A NamespaceAlias object to add to the hashtable of namespace aliases.
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void recomposeNamespaceAliases(NamespaceAlias nsAlias)
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_namespaceAliasComposed.put(nsAlias.getStylesheetNamespace(),
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 nsAlias);
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the "xsl:namespace-alias" property.
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the NamespaceAlias for a given namespace uri.
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#literal-result-element">literal-result-element in XSLT Specification</a>
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param uri non-null reference to namespace that is to be aliased.
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return NamespaceAlias that matches uri, or null if no match.
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NamespaceAlias getNamespaceAliasComposed(String uri)
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (NamespaceAlias) ((null == m_namespaceAliasComposed)
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    ? null : m_namespaceAliasComposed.get(uri));
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The "xsl:template" properties.
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private TemplateList m_templateList;
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Recompose the template declarations.
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param template An ElemTemplate object to add to the template list.
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void recomposeTemplates(ElemTemplate template)
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_templateList.setTemplate(template);
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Accessor method to retrieve the <code>TemplateList</code> associated with
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this StylesheetRoot.
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The composed <code>TemplateList</code>.
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final TemplateList getTemplateListComposed()
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_templateList;
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Mutator method to set the <code>TemplateList</code> associated with this
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * StylesheetRoot.  This method should only be used by the compiler.  Normally,
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the template list is built during the recompose process and should not be
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * altered by the user.
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param templateList The new <code>TemplateList</code> for this StylesheetRoot.
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final void setTemplateListComposed(TemplateList templateList)
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_templateList = templateList;
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an "xsl:template" property by node match. This looks in the imports as
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * well as this stylesheet.
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#section-Defining-Template-Rules">section-Defining-Template-Rules in XSLT Specification</a>
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt non-null reference to XPath runtime execution context.
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param targetNode non-null reference of node that the template must match.
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param mode qualified name of the node, or null.
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param quietConflictWarnings true if conflict warnings should not be reported.
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return reference to ElemTemplate that is the best match for targetNode, or
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         null if no match could be made.
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ElemTemplate getTemplateComposed(XPathContext xctxt,
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          int targetNode,
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          QName mode,
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          boolean quietConflictWarnings,
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          DTM dtm)
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws TransformerException
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_templateList.getTemplate(xctxt, targetNode, mode,
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                      quietConflictWarnings,
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                      dtm);
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an "xsl:template" property by node match. This looks in the imports as
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * well as this stylesheet.
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#section-Defining-Template-Rules">section-Defining-Template-Rules in XSLT Specification</a>
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt non-null reference to XPath runtime execution context.
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param targetNode non-null reference of node that the template must match.
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param mode qualified name of the node, or null.
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param maxImportLevel The maximum importCountComposed that we should consider or -1
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        if we should consider all import levels.  This is used by apply-imports to
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        access templates that have been overridden.
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param endImportLevel The count of composed imports
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param quietConflictWarnings true if conflict warnings should not be reported.
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return reference to ElemTemplate that is the best match for targetNode, or
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         null if no match could be made.
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ElemTemplate getTemplateComposed(XPathContext xctxt,
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          int targetNode,
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          QName mode,
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          int maxImportLevel, int endImportLevel,
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          boolean quietConflictWarnings,
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          DTM dtm)
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws TransformerException
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_templateList.getTemplate(xctxt, targetNode, mode,
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                      maxImportLevel, endImportLevel,
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                      quietConflictWarnings,
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                      dtm);
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an "xsl:template" property. This looks in the imports as
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * well as this stylesheet.
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#section-Defining-Template-Rules">section-Defining-Template-Rules in XSLT Specification</a>
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param qname non-null reference to qualified name of template.
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return reference to named template, or null if not found.
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ElemTemplate getTemplateComposed(QName qname)
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_templateList.getTemplate(qname);
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Composed set of all variables and params.
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Vector m_variables;
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Recompose the top level variable and parameter declarations.
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param elemVar A top level variable or parameter to be added to the Vector.
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void recomposeVariables(ElemVariable elemVar)
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Don't overide higher priority variable
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (getVariableOrParamComposed(elemVar.getName()) == null)
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      elemVar.setIsTopLevel(true);        // Mark as a top-level variable or param
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      elemVar.setIndex(m_variables.size());
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_variables.addElement(elemVar);
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an "xsl:variable" property.
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#top-level-variables">top-level-variables in XSLT Specification</a>
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param qname Qualified name of variable or param
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The ElemVariable with the given qualified name
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ElemVariable getVariableOrParamComposed(QName qname)
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_variables)
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int n = m_variables.size();
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i = 0; i < n; i++)
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ElemVariable var = (ElemVariable)m_variables.elementAt(i);
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(var.getName().equals(qname))
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return var;
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null;
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get all global "xsl:variable" properties in scope for this stylesheet.
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#top-level-variables">top-level-variables in XSLT Specification</a>
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Vector of all variables and params in scope
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Vector getVariablesAndParamsComposed()
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_variables;
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * A list of properties that specify how to do space
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * stripping. This uses the same exact mechanism as Templates.
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private TemplateList m_whiteSpaceInfoList;
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Recompose the strip-space and preserve-space declarations.
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param wsi A WhiteSpaceInfo element to add to the list of WhiteSpaceInfo elements.
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void recomposeWhiteSpaceInfo(WhiteSpaceInfo wsi)
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_whiteSpaceInfoList)
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_whiteSpaceInfoList = new TemplateList();
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_whiteSpaceInfoList.setTemplate(wsi);
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Check to see if the caller should bother with check for
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * whitespace nodes.
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Whether the caller should bother with check for
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * whitespace nodes.
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean shouldCheckWhitespace()
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return null != m_whiteSpaceInfoList;
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get information about whether or not an element should strip whitespace.
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a>
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param support The XPath runtime state.
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param targetElement Element to check
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return WhiteSpaceInfo for the given element
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public WhiteSpaceInfo getWhiteSpaceInfo(
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext support, int targetElement, DTM dtm) throws TransformerException
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_whiteSpaceInfoList)
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (WhiteSpaceInfo) m_whiteSpaceInfoList.getTemplate(support,
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              targetElement, null, false, dtm);
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return null;
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get information about whether or not an element should strip whitespace.
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a>
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param support The XPath runtime state.
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param targetElement Element to check
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the whitespace should be stripped.
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean shouldStripWhiteSpace(
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext support, int targetElement) throws TransformerException
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_whiteSpaceInfoList)
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while(DTM.NULL != targetElement)
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        DTM dtm = support.getDTM(targetElement);
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        WhiteSpaceInfo info = (WhiteSpaceInfo) m_whiteSpaceInfoList.getTemplate(support,
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                targetElement, null, false, dtm);
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(null != info)
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          return info.getShouldStripSpace();
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int parent = dtm.getParent(targetElement);
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(DTM.NULL != parent && DTM.ELEMENT_NODE == dtm.getNodeType(parent))
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          targetElement = parent;
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          targetElement = DTM.NULL;
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get information about whether or not whitespace can be stripped.
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a>
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the whitespace can be stripped.
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean canStripWhiteSpace()
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (null != m_whiteSpaceInfoList);
9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The default template to use for text nodes if we don't find
9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * anything else.  This is initialized in initDefaultRule().
9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private ElemTemplate m_defaultTextRule;
9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the default template for text.
9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the default template for text.
9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final ElemTemplate getDefaultTextRule()
9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_defaultTextRule;
9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The default template to use if we don't find anything
9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * else.  This is initialized in initDefaultRule().
9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private ElemTemplate m_defaultRule;
10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the default template for elements.
10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the default template for elements.
10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final ElemTemplate getDefaultRule()
10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_defaultRule;
10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The default template to use for the root if we don't find
10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * anything else.  This is initialized in initDefaultRule().
10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * We kind of need this because the defaultRule isn't good
10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * enough because it doesn't supply a document context.
10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * For now, I default the root document element to "HTML".
10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Don't know if this is really a good idea or not.
10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * I suspect it is not.
10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private ElemTemplate m_defaultRootRule;
10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the default template for a root node.
10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The default template for a root node.
10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final ElemTemplate getDefaultRootRule()
10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_defaultRootRule;
10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The start rule to kick off the transformation.
10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private ElemTemplate m_startRule;
10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the default template for a root node.
10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The default template for a root node.
10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final ElemTemplate getStartRule()
10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_startRule;
10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Used for default selection.
10589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
10599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XPath m_selectDefault;
10619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create the default rule if needed.
10649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
10659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
10669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private void initDefaultRule(ErrorListener errorListener) throws TransformerException
10689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Then manufacture a default
10719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_defaultRule = new ElemTemplate();
10729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_defaultRule.setStylesheet(this);
10749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XPath defMatch = new XPath("*", this, this, XPath.MATCH, errorListener);
10769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_defaultRule.setMatch(defMatch);
10789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ElemApplyTemplates childrenElement = new ElemApplyTemplates();
10809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    childrenElement.setIsDefaultTemplate(true);
10829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    childrenElement.setSelect(m_selectDefault);
10839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_defaultRule.appendChild(childrenElement);
10849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_startRule = m_defaultRule;
10869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // -----------------------------
10889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_defaultTextRule = new ElemTemplate();
10899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_defaultTextRule.setStylesheet(this);
10919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    defMatch = new XPath("text() | @*", this, this, XPath.MATCH, errorListener);
10939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_defaultTextRule.setMatch(defMatch);
10959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ElemValueOf elemValueOf = new ElemValueOf();
10979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_defaultTextRule.appendChild(elemValueOf);
10999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XPath selectPattern = new XPath(".", this, this, XPath.SELECT, errorListener);
11019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    elemValueOf.setSelect(selectPattern);
11039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //--------------------------------
11059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_defaultRootRule = new ElemTemplate();
11069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_defaultRootRule.setStylesheet(this);
11089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    defMatch = new XPath("/", this, this, XPath.MATCH, errorListener);
11109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_defaultRootRule.setMatch(defMatch);
11129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    childrenElement = new ElemApplyTemplates();
11149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    childrenElement.setIsDefaultTemplate(true);
11169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_defaultRootRule.appendChild(childrenElement);
11179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    childrenElement.setSelect(m_selectDefault);
11189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
11199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
11219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This is a generic version of C.A.R Hoare's Quick Sort
11229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * algorithm.  This will handle arrays that are already
11239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * sorted, and arrays with duplicate keys.  It was lifted from
11249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the NodeSorter class but should probably be eliminated and replaced
11259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with a call to Collections.sort when we migrate to Java2.<BR>
11269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If you think of a one dimensional array as going from
11289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the lowest index on the left to the highest index on the right
11299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * then the parameters to this function are lowest index or
11309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * left and highest index or right.  The first time you call
11319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this function it will be with the parameters 0, a.length - 1.
11329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param v       a vector of ElemTemplateElement elements
11349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param lo0     left boundary of partition
11359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param hi0     right boundary of partition
11369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
11379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
11389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private void QuickSort2(Vector v, int lo0, int hi0)
11409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
11419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int lo = lo0;
11429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int hi = hi0;
11439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if ( hi0 > lo0)
11459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
11469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Arbitrarily establishing partition element as the midpoint of
11479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // the array.
11489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ElemTemplateElement midNode = (ElemTemplateElement) v.elementAt( ( lo0 + hi0 ) / 2 );
11499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // loop through the array until indices cross
11519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while( lo <= hi )
11529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // find the first element that is greater than or equal to
11549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // the partition element starting from the left Index.
11559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          while( (lo < hi0) && (((ElemTemplateElement) v.elementAt(lo)).compareTo(midNode) < 0) )
11569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
11579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ++lo;
11589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          } // end while
11599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // find an element that is smaller than or equal to
11619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // the partition element starting from the right Index.
11629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          while( (hi > lo0) && (((ElemTemplateElement) v.elementAt(hi)).compareTo(midNode) > 0) )          {
11639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            --hi;
11649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
11659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // if the indexes have not crossed, swap
11679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if( lo <= hi )
11689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
11699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ElemTemplateElement node = (ElemTemplateElement) v.elementAt(lo);
11709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            v.setElementAt(v.elementAt(hi), lo);
11719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            v.setElementAt(node, hi);
11729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ++lo;
11749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            --hi;
11759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
11769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If the right index has not reached the left side of array
11799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // must now sort the left partition.
11809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if( lo0 < hi )
11819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          QuickSort2( v, lo0, hi );
11839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If the left index has not reached the right side of array
11869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // must now sort the right partition.
11879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if( lo < hi0 )
11889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
11899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          QuickSort2( v, lo, hi0 );
11909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
11929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // end QuickSort2  */
11939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private transient ComposeState m_composeState;
11959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Initialize a new ComposeState.
11989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    void initComposeState()
12009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_composeState = new ComposeState();
12029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Return class to track state global state during the compose() operation.
12069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return ComposeState reference, or null if endCompose has been called.
12079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ComposeState getComposeState()
12099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_composeState;
12119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Clear the compose state.
12159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private void clearComposeState()
12179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_composeState = null;
12199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String m_extensionHandlerClass =
12229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        "org.apache.xalan.extensions.ExtensionHandlerExsltFunction";
12239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This internal method allows the setting of the java class
12269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * to handle the extension function (if other than the default one).
12279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @xsl.usage internal
12299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String setExtensionHandlerClass(String handlerClassName) {
12319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String oldvalue = m_extensionHandlerClass;
12329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_extensionHandlerClass = handlerClassName;
12339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return oldvalue;
12349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @xsl.usage internal
12389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getExtensionHandlerClass() {
12409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_extensionHandlerClass;
12419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
12429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
12449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Class to track state global state during the compose() operation.
12459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    class ComposeState
12479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
12489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ComposeState()
12499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
12509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int size = m_variables.size();
12519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int i = 0; i < size; i++)
12529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
12539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ElemVariable ev = (ElemVariable)m_variables.elementAt(i);
12549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_variableNames.addElement(ev.getName());
12559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      private ExpandedNameTable m_ent = new ExpandedNameTable();
12609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      /**
12629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * Given a qualified name, return an integer ID that can be
12639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * quickly compared.
12649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       *
12659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * @param qname a qualified name object, must not be null.
12669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       *
12679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * @return the expanded-name id of the qualified name.
12689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       */
12699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      public int getQNameID(QName qname)
12709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
12719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_ent.getExpandedTypeID(qname.getNamespace(),
12739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                       qname.getLocalName(),
12749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                       // The type doesn't matter for our
12759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                       // purposes.
12769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                       org.apache.xml.dtm.DTM.ELEMENT_NODE);
12779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
12789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      /**
12809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * A Vector of the current params and QNames within the current template.
12819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * Set by ElemTemplate and used by ProcessorVariable.
12829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       */
12839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      private java.util.Vector m_variableNames = new java.util.Vector();
12849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      /**
12869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * Add the name of a qualified name within the template.  The position in
12879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * the vector is its ID.
12889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * @param qname A qualified name of a param or variable, should be non-null.
12899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * @return the index where the variable was added.
12909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       */
12919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int addVariableName(final org.apache.xml.utils.QName qname)
12929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
12939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int pos = m_variableNames.size();
12949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_variableNames.addElement(qname);
12959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int frameSize = m_variableNames.size() - getGlobalsSize();
12969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(frameSize > m_maxStackFrameSize)
12979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_maxStackFrameSize++;
12989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return pos;
12999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      void resetStackFrameSize()
13029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_maxStackFrameSize = 0;
13049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int getFrameSize()
13079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_maxStackFrameSize;
13099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      /**
13129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * Get the current size of the stack frame.  Use this to record the position
13139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * in a template element at startElement, so that it can be popped
13149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * at endElement.
13159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       */
13169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int getCurrentStackFrameSize()
13179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_variableNames.size();
13199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      /**
13229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * Set the current size of the stack frame.
13239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       */
13249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      void setCurrentStackFrameSize(int sz)
13259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_variableNames.setSize(sz);
13279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int getGlobalsSize()
13309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_variables.size();
13329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      IntStack m_marks = new IntStack();
13359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      void pushStackMark()
13379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_marks.push(getCurrentStackFrameSize());
13399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      void popStackMark()
13429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int mark = m_marks.pop();
13449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        setCurrentStackFrameSize(mark);
13459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      /**
13489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * Get the Vector of the current params and QNames to be collected
13499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * within the current template.
13509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * @return A reference to the vector of variable names.  The reference
13519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * returned is owned by this class, and so should not really be mutated, or
13529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       * stored anywhere.
13539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       */
13549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      java.util.Vector getVariableNames()
13559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
13569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_variableNames;
13579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
13589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      private int m_maxStackFrameSize;
13609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return Optimization flag
13659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean getOptimizer() {
13679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_optimizer;
13689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param b Optimization flag
13729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setOptimizer(boolean b) {
13749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_optimizer = b;
13759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return Incremental flag
13799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean getIncremental() {
13819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_incremental;
13829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return source location flag
13869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean getSource_location() {
13889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_source_location;
13899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param b Incremental flag
13939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setIncremental(boolean b) {
13959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_incremental = b;
13969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param b Source location flag
14009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
14019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setSource_location(boolean b) {
14029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_source_location = b;
14039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
1406