14c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/*
24c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
34c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * or more contributor license agreements. See the NOTICE file
44c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed with this work for additional information
54c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * regarding copyright ownership. The ASF licenses this file
64c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
74c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * you may not use this file except in compliance with the License.
84c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * You may obtain a copy of the License at
94c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Unless required by applicable law or agreed to in writing, software
134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * See the License for the specific language governing permissions and
164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * limitations under the License.
174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/*
194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * $Id: ProcessorLRE.java 475981 2006-11-16 23:35:53Z minchau $
204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpackage org.apache.xalan.processor;
224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport java.util.List;
244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport javax.xml.transform.TransformerConfigurationException;
264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport javax.xml.transform.TransformerException;
274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.res.XSLMessages;
294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.res.XSLTErrorResources;
304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.Constants;
314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.ElemExtensionCall;
324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.ElemLiteralResult;
334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.ElemTemplate;
344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.ElemTemplateElement;
354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.Stylesheet;
364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.StylesheetRoot;
374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xalan.templates.XMLNSDecl;
384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.utils.SAXSourceLocator;
394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xpath.XPath;
404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.xml.sax.Attributes;
424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.xml.sax.Locator;
434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.xml.sax.helpers.AttributesImpl;
444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Processes an XSLT literal-result-element, or something that looks
474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * like one.  The actual {@link org.apache.xalan.templates.ElemTemplateElement}
484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * produced may be a {@link org.apache.xalan.templates.ElemLiteralResult},
494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * a {@link org.apache.xalan.templates.StylesheetRoot}, or a
504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * {@link org.apache.xalan.templates.ElemExtensionCall}.
514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson *
524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#literal-result-element">literal-result-element in XSLT Specification</a>
534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @see org.apache.xalan.templates.ElemLiteralResult
544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @xsl.usage internal
554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */
564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpublic class ProcessorLRE extends ProcessorTemplateElem
574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{
584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    static final long serialVersionUID = -1490218021772101404L;
594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Receive notification of the start of an element.
614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param handler non-null reference to current StylesheetHandler that is constructing the Templates.
634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param uri The Namespace URI, or an empty string.
644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param localName The local name (without prefix), or empty string if not namespace processing.
654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param rawName The qualified name (with prefix).
664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param attributes The specified or defaulted attributes.
674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public void startElement(
694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          StylesheetHandler handler, String uri, String localName, String rawName, Attributes attributes)
704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            throws org.xml.sax.SAXException
714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    try
744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      ElemTemplateElement p = handler.getElemTemplateElement();
764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      boolean excludeXSLDecl = false;
774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      boolean isLREAsStyleSheet = false;
784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      if (null == p)
804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      {
814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        // Literal Result Template as stylesheet.
834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        XSLTElementProcessor lreProcessor = handler.popProcessor();
844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        XSLTElementProcessor stylesheetProcessor =
854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                                                  handler.getProcessorFor(Constants.S_XSLNAMESPACEURL, "stylesheet",
864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                                                                          "xsl:stylesheet");
874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        handler.pushProcessor(lreProcessor);
894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        Stylesheet stylesheet;
914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        try
924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          stylesheet = getStylesheetRoot(handler);
944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        catch(TransformerConfigurationException tfe)
964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          throw new TransformerException(tfe);
984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        // stylesheet.setDOMBackPointer(handler.getOriginatingNode());
1014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        // ***** Note that we're assigning an empty locator. Is this necessary?
1024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        SAXSourceLocator slocator = new SAXSourceLocator();
1034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        Locator locator = handler.getLocator();
1044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        if(null != locator)
1054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
1064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          slocator.setLineNumber(locator.getLineNumber());
1074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          slocator.setColumnNumber(locator.getColumnNumber());
1084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          slocator.setPublicId(locator.getPublicId());
1094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          slocator.setSystemId(locator.getSystemId());
1104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
1114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        stylesheet.setLocaterInfo(slocator);
1124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        stylesheet.setPrefixes(handler.getNamespaceSupport());
1134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        handler.pushStylesheet(stylesheet);
1144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        isLREAsStyleSheet = true;
1164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        AttributesImpl stylesheetAttrs = new AttributesImpl();
1184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        AttributesImpl lreAttrs = new AttributesImpl();
1194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        int n = attributes.getLength();
1204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        for (int i = 0; i < n; i++)
1224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
1234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          String attrLocalName = attributes.getLocalName(i);
1244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          String attrUri = attributes.getURI(i);
1254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          String value = attributes.getValue(i);
1264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          if ((null != attrUri) && attrUri.equals(Constants.S_XSLNAMESPACEURL))
1284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          {
1294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            stylesheetAttrs.addAttribute(null, attrLocalName, attrLocalName,
1304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                                         attributes.getType(i),
1314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                                         attributes.getValue(i));
1324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          }
1334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          else if ((attrLocalName.startsWith("xmlns:") || attrLocalName.equals(
1344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                                                                               "xmlns")) && value.equals(Constants.S_XSLNAMESPACEURL))
1354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          {
1364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            // ignore
1384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          }
1394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          else
1404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          {
1414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            lreAttrs.addAttribute(attrUri, attrLocalName,
1424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                                  attributes.getQName(i),
1434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                                  attributes.getType(i),
1444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                                  attributes.getValue(i));
1454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          }
1464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
1474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        attributes = lreAttrs;
1494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        // Set properties from the attributes, but don't throw
1514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        // an error if there is an attribute defined that is not
1524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        // allowed on a stylesheet.
1534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson				try{
1544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        stylesheetProcessor.setPropertiesFromAttributes(handler, "stylesheet",
1554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                                                        stylesheetAttrs, stylesheet);
1564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson				}
1574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson				catch (Exception e)
1584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson				{
1594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson					// This is pretty ugly, but it will have to do for now.
1604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson					// This is just trying to append some text specifying that
1614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson					// this error came from a missing or invalid XSLT namespace
1624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson					// declaration.
1634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson					// If someone comes up with a better solution, please feel
1644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson					// free to contribute it. -mm
1654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson					if (stylesheet.getDeclaredPrefixes() == null ||
1674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson						!declaredXSLNS(stylesheet))
1684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson					{
1694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson						throw new org.xml.sax.SAXException(XSLMessages.createWarning(XSLTErrorResources.WG_OLD_XSLT_NS, null));
1704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson					}
1714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson					else
1724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    {
1734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson						throw new org.xml.sax.SAXException(e);
1744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                    }
1754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson				}
1764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        handler.pushElemTemplateElement(stylesheet);
1774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        ElemTemplate template = new ElemTemplate();
1794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        if (slocator != null)
1804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            template.setLocaterInfo(slocator);
1814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        appendAndPush(handler, template);
1834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        XPath rootMatch = new XPath("/", stylesheet, stylesheet, XPath.MATCH,
1854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson             handler.getStylesheetProcessor().getErrorListener());
1864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        template.setMatch(rootMatch);
1884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        // template.setDOMBackPointer(handler.getOriginatingNode());
1904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        stylesheet.setTemplate(template);
1914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        p = handler.getElemTemplateElement();
1934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        excludeXSLDecl = true;
1944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      }
1954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
1964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      XSLTElementDef def = getElemDef();
1974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      Class classObject = def.getClassObject();
1984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      boolean isExtension = false;
1994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      boolean isComponentDecl = false;
2004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      boolean isUnknownTopLevel = false;
2014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      while (null != p)
2034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      {
2044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        // System.out.println("Checking: "+p);
2064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        if (p instanceof ElemLiteralResult)
2074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
2084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          ElemLiteralResult parentElem = (ElemLiteralResult) p;
2094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          isExtension = parentElem.containsExtensionElementURI(uri);
2114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
2124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        else if (p instanceof Stylesheet)
2134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
2144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          Stylesheet parentElem = (Stylesheet) p;
2154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          isExtension = parentElem.containsExtensionElementURI(uri);
2174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          if ((false == isExtension) && (null != uri)
2194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson              && (uri.equals(Constants.S_BUILTIN_EXTENSIONS_URL)
2204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                  || uri.equals(Constants.S_BUILTIN_OLD_EXTENSIONS_URL)))
2214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          {
2224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            isComponentDecl = true;
2234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          }
2244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          else
2254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          {
2264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            isUnknownTopLevel = true;
2274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          }
2284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
2294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        if (isExtension)
2314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          break;
2324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        p = p.getParentElem();
2344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      }
2354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      ElemTemplateElement elem = null;
2374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      try
2394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      {
2404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        if (isExtension)
2414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
2424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          // System.out.println("Creating extension(1): "+uri);
2444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          elem = new ElemExtensionCall();
2454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
2464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        else if (isComponentDecl)
2474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
2484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          elem = (ElemTemplateElement) classObject.newInstance();
2494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
2504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        else if (isUnknownTopLevel)
2514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
2524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          // TBD: Investigate, not sure about this.  -sb
2544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          elem = (ElemTemplateElement) classObject.newInstance();
2554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
2564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        else
2574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
2584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          elem = (ElemTemplateElement) classObject.newInstance();
2594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
2604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        elem.setDOMBackPointer(handler.getOriginatingNode());
2624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        elem.setLocaterInfo(handler.getLocator());
2634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        elem.setPrefixes(handler.getNamespaceSupport(), excludeXSLDecl);
2644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        if (elem instanceof ElemLiteralResult)
2664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
2674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          ((ElemLiteralResult) elem).setNamespace(uri);
2684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          ((ElemLiteralResult) elem).setLocalName(localName);
2694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          ((ElemLiteralResult) elem).setRawName(rawName);
2704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          ((ElemLiteralResult) elem).setIsLiteralResultAsStylesheet(
2714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                                                                    isLREAsStyleSheet);
2724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
2734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      }
2744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      catch (InstantiationException ie)
2754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      {
2764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        handler.error(XSLTErrorResources.ER_FAILED_CREATING_ELEMLITRSLT, null, ie);//"Failed creating ElemLiteralResult instance!", ie);
2774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      }
2784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      catch (IllegalAccessException iae)
2794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      {
2804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        handler.error(XSLTErrorResources.ER_FAILED_CREATING_ELEMLITRSLT, null, iae);//"Failed creating ElemLiteralResult instance!", iae);
2814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      }
2824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      setPropertiesFromAttributes(handler, rawName, attributes, elem);
2844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      // bit of a hack here...
2864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      if (!isExtension && (elem instanceof ElemLiteralResult))
2874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      {
2884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        isExtension =
2894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson                     ((ElemLiteralResult) elem).containsExtensionElementURI(uri);
2904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        if (isExtension)
2924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        {
2934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          // System.out.println("Creating extension(2): "+uri);
2954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          elem = new ElemExtensionCall();
2964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
2974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          elem.setLocaterInfo(handler.getLocator());
2984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          elem.setPrefixes(handler.getNamespaceSupport());
2994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          ((ElemLiteralResult) elem).setNamespace(uri);
3004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          ((ElemLiteralResult) elem).setLocalName(localName);
3014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          ((ElemLiteralResult) elem).setRawName(rawName);
3024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          setPropertiesFromAttributes(handler, rawName, attributes, elem);
3034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        }
3044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      }
3054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      appendAndPush(handler, elem);
3074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
3084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    catch(TransformerException te)
3094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
3104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      throw new org.xml.sax.SAXException(te);
3114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
3124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  /**
3154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * This method could be over-ridden by a class that extends this class.
3164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param handler non-null reference to current StylesheetHandler that is constructing the Templates.
3174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @return an object that represents the stylesheet element.
3184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
3194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  protected Stylesheet getStylesheetRoot(StylesheetHandler handler) throws TransformerConfigurationException
3204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    StylesheetRoot stylesheet;
3224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    stylesheet = new StylesheetRoot(handler.getSchema(), handler.getStylesheetProcessor().getErrorListener());
3234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if (handler.getStylesheetProcessor().isSecureProcessing())
3244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      stylesheet.setSecureProcessing(true);
3254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    return stylesheet;
3274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/**
3314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * Receive notification of the end of an element.
3324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   *
3334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param handler non-null reference to current StylesheetHandler that is constructing the Templates.
3344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param uri The Namespace URI, or an empty string.
3354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param localName The local name (without prefix), or empty string if not namespace processing.
3364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   * @param rawName The qualified name (with prefix).
3374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson   */
3384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  public void endElement(
3394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson          StylesheetHandler handler, String uri, String localName, String rawName)
3404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson            throws org.xml.sax.SAXException
3414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  {
3424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    ElemTemplateElement elem = handler.getElemTemplateElement();
3444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    if (elem instanceof ElemLiteralResult)
3464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    {
3474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      if (((ElemLiteralResult) elem).getIsLiteralResultAsStylesheet())
3484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      {
3494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson        handler.popStylesheet();
3504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson      }
3514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    }
3524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson    super.endElement(handler, uri, localName, rawName);
3544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson  }
3554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson	private boolean declaredXSLNS(Stylesheet stylesheet)
3574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson	{
3584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson		List declaredPrefixes = stylesheet.getDeclaredPrefixes();
3594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson		int n = declaredPrefixes.size();
3604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson
3614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson		for (int i = 0; i < n; i++)
3624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson		{
3634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson			XMLNSDecl decl = (XMLNSDecl) declaredPrefixes.get(i);
3644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson			if(decl.getURI().equals(Constants.S_XSLNAMESPACEURL))
3654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson				return true;
3664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson		}
3674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson		return false;
3684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson	}
3694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson}
370