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: ElemExtensionDecl.java 468643 2006-10-28 06:56:03Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xalan.templates;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.extensions.ExtensionNamespaceSupport;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.extensions.ExtensionNamespacesManager;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLMessages;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLTErrorResources;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.transformer.TransformerImpl;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.StringVector;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Implement the declaration of an extension element
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage internal
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class ElemExtensionDecl extends ElemTemplateElement
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = -4692738885172766789L;
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Constructor ElemExtensionDecl
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ElemExtensionDecl()
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // System.out.println("ElemExtensionDecl ctor");
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Prefix string for this extension element.
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial         */
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private String m_prefix = null;
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the prefix for this extension element
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param v Prefix to set for this extension element
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setPrefix(String v)
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_prefix = v;
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the prefix for this extension element
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Prefix for this extension element
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getPrefix()
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_prefix;
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** StringVector holding the names of functions defined in this extension.
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial     */
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private StringVector m_functions = new StringVector();
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the names of functions defined in this extension
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param v StringVector holding the names of functions defined in this extension
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setFunctions(StringVector v)
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_functions = v;
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the names of functions defined in this extension
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return StringVector holding the names of functions defined in this extension
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public StringVector getFunctions()
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_functions;
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a function at a given index in this extension element
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param i Index of function to get
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Name of Function at given index
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws ArrayIndexOutOfBoundsException
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getFunction(int i) throws ArrayIndexOutOfBoundsException
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_functions)
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new ArrayIndexOutOfBoundsException();
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (String) m_functions.elementAt(i);
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get count of functions defined in this extension element
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return count of functions defined in this extension element
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getFunctionCount()
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (null != m_functions) ? m_functions.size() : 0;
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** StringVector of elements defined in this extension.
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial         */
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private StringVector m_elements = null;
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set StringVector of elements for this extension
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param v StringVector of elements to set
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setElements(StringVector v)
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_elements = v;
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get StringVector of elements defined for this extension
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return StringVector of elements defined for this extension
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public StringVector getElements()
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_elements;
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the element at the given index
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param i Index of element to get
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The element at the given index
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws ArrayIndexOutOfBoundsException
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getElement(int i) throws ArrayIndexOutOfBoundsException
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_elements)
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new ArrayIndexOutOfBoundsException();
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (String) m_elements.elementAt(i);
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the count of elements defined for this extension element
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the count of elements defined for this extension element
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getElementCount()
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (null != m_elements) ? m_elements.size() : 0;
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an int constant identifying the type of element.
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.apache.xalan.templates.Constants
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The token ID for this element
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getXSLToken()
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return Constants.ELEMNAME_EXTENSIONDECL;
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void compose(StylesheetRoot sroot) throws TransformerException
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super.compose(sroot);
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String prefix = getPrefix();
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String declNamespace = getNamespaceForPrefix(prefix);
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String lang = null;
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String srcURL = null;
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String scriptSrc = null;
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == declNamespace)
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new TransformerException(XSLMessages.createMessage(XSLTErrorResources.ER_NO_NAMESPACE_DECL, new Object[]{prefix}));
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //"Prefix " + prefix does not have a corresponding namespace declaration");
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (ElemTemplateElement child = getFirstChildElem(); child != null;
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          child = child.getNextSiblingElem())
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (Constants.ELEMNAME_EXTENSIONSCRIPT == child.getXSLToken())
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ElemExtensionScript sdecl = (ElemExtensionScript) child;
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        lang = sdecl.getLang();
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        srcURL = sdecl.getSrc();
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ElemTemplateElement childOfSDecl = sdecl.getFirstChildElem();
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != childOfSDecl)
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (Constants.ELEMNAME_TEXTLITERALRESULT
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  == childOfSDecl.getXSLToken())
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ElemTextLiteral tl = (ElemTextLiteral) childOfSDecl;
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            char[] chars = tl.getChars();
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            scriptSrc = new String(chars);
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (scriptSrc.trim().length() == 0)
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              scriptSrc = null;
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == lang)
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      lang = "javaclass";
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (lang.equals("javaclass") && (scriptSrc != null))
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw new TransformerException(XSLMessages.createMessage(XSLTErrorResources.ER_ELEM_CONTENT_NOT_ALLOWED, new Object[]{scriptSrc}));
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //"Element content not allowed for lang=javaclass " + scriptSrc);
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Register the extension namespace if it has not already been registered.
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ExtensionNamespaceSupport extNsSpt = null;
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ExtensionNamespacesManager extNsMgr = sroot.getExtensionNamespacesManager();
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (extNsMgr.namespaceIndex(declNamespace,
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                extNsMgr.getExtensions()) == -1)
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (lang.equals("javaclass"))
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null == srcURL)
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           extNsSpt = extNsMgr.defineJavaNamespace(declNamespace);
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (extNsMgr.namespaceIndex(srcURL,
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         extNsMgr.getExtensions()) == -1)
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          extNsSpt = extNsMgr.defineJavaNamespace(declNamespace, srcURL);
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else  // not java
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String handler = "org.apache.xalan.extensions.ExtensionHandlerGeneral";
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Object [] args = {declNamespace, this.m_elements, this.m_functions,
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          lang, srcURL, scriptSrc, getSystemId()};
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        extNsSpt = new ExtensionNamespaceSupport(declNamespace, handler, args);
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (extNsSpt != null)
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      extNsMgr.registerExtension(extNsSpt);
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This function will be called on top-level elements
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * only, just before the transform begins.
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param transformer The XSLT TransformerFactory.
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void runtimeInit(TransformerImpl transformer) throws TransformerException
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*    //System.out.println("ElemExtensionDecl.runtimeInit()");
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String lang = null;
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String srcURL = null;
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String scriptSrc = null;
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String prefix = getPrefix();
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String declNamespace = getNamespaceForPrefix(prefix);
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == declNamespace)
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new TransformerException(XSLMessages.createMessage(XSLTErrorResources.ER_NO_NAMESPACE_DECL, new Object[]{prefix}));
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //"Prefix " + prefix does not have a corresponding namespace declaration");
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (ElemTemplateElement child = getFirstChildElem(); child != null;
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            child = child.getNextSiblingElem())
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (Constants.ELEMNAME_EXTENSIONSCRIPT == child.getXSLToken())
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ElemExtensionScript sdecl = (ElemExtensionScript) child;
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        lang = sdecl.getLang();
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        srcURL = sdecl.getSrc();
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ElemTemplateElement childOfSDecl = sdecl.getFirstChildElem();
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != childOfSDecl)
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (Constants.ELEMNAME_TEXTLITERALRESULT
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  == childOfSDecl.getXSLToken())
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ElemTextLiteral tl = (ElemTextLiteral) childOfSDecl;
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            char[] chars = tl.getChars();
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            scriptSrc = new String(chars);
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (scriptSrc.trim().length() == 0)
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              scriptSrc = null;
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == lang)
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      lang = "javaclass";
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (lang.equals("javaclass") && (scriptSrc != null))
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new TransformerException(XSLMessages.createMessage(XSLTErrorResources.ER_ELEM_CONTENT_NOT_ALLOWED, new Object[]{scriptSrc}));
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //"Element content not allowed for lang=javaclass " + scriptSrc);
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Instantiate a handler for this extension namespace.
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ExtensionsTable etable = transformer.getExtensionsTable();
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ExtensionHandler nsh = etable.get(declNamespace);
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // If we have no prior ExtensionHandler for this namespace, we need to
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // create one.
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // If the script element is for javaclass, this is our special compiled java.
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Element content is not supported for this so we throw an exception if
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // it is provided.  Otherwise, we look up the srcURL to see if we already have
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // an ExtensionHandler.
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == nsh)
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (lang.equals("javaclass"))
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null == srcURL)
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          nsh = etable.makeJavaNamespace(declNamespace);
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          nsh = etable.get(srcURL);
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (null == nsh)
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            nsh = etable.makeJavaNamespace(srcURL);
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else  // not java
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        nsh = new ExtensionHandlerGeneral(declNamespace, this.m_elements,
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          this.m_functions, lang, srcURL,
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                          scriptSrc, getSystemId());
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // System.out.println("Adding NS Handler: declNamespace = "+
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //                   declNamespace+", lang = "+lang+", srcURL = "+
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //                   srcURL+", scriptSrc="+scriptSrc);
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      etable.addExtensionNamespace(declNamespace, nsh);
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }*/
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
370