- /*
 - * The Apache Software License, Version 1.1
 - *
 - *
 - * Copyright (c) 1999 The Apache Software Foundation. All rights
 - * reserved.
 - *
 - * Redistribution and use in source and binary forms, with or without
 - * modification, are permitted provided that the following conditions
 - * are met:
 - *
 - * 1. Redistributions of source code must retain the above copyright
 - * notice, this list of conditions and the following disclaimer.
 - *
 - * 2. Redistributions in binary form must reproduce the above copyright
 - * notice, this list of conditions and the following disclaimer in
 - * the documentation and/or other materials provided with the
 - * distribution.
 - *
 - * 3. The end-user documentation included with the redistribution,
 - * if any, must include the following acknowledgment:
 - * "This product includes software developed by the
 - * Apache Software Foundation (http://www.apache.org/)."
 - * Alternately, this acknowledgment may appear in the software itself,
 - * if and wherever such third-party acknowledgments normally appear.
 - *
 - * 4. The names "Xalan" and "Apache Software Foundation" must
 - * not be used to endorse or promote products derived from this
 - * software without prior written permission. For written
 - * permission, please contact apache@apache.org.
 - *
 - * 5. Products derived from this software may not be called "Apache",
 - * nor may "Apache" appear in their name, without prior written
 - * permission of the Apache Software Foundation.
 - *
 - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 - * SUCH DAMAGE.
 - * ====================================================================
 - *
 - * This software consists of voluntary contributions made by many
 - * individuals on behalf of the Apache Software Foundation and was
 - * originally based on software copyright (c) 1999, Lotus
 - * Development Corporation., http://www.lotus.com. For more
 - * information on the Apache Software Foundation, please see
 - * <http://www.apache.org/>.
 - */
 - package org.apache.xalan.extensions;
 - import org.apache.xalan.templates.Constants;
 - import java.util.Vector;
 - /**
 - * Used during assembly of a stylesheet to collect the information for each
 - * extension namespace that is required during the transformation process
 - * to generate an {@link ExtensionHandler}.
 - *
 - */
 - public class ExtensionNamespacesManager
 - {
 - /**
 - * Vector of ExtensionNamespaceSupport objects to be used to generate ExtensionHandlers.
 - */
 - private Vector m_extensions = new Vector();
 - /**
 - * Vector of ExtensionNamespaceSupport objects for predefined ExtensionNamespaces. Elements
 - * from this vector are added to the m_extensions vector when encountered in the stylesheet.
 - */
 - private Vector m_predefExtensions = new Vector(7);
 - /**
 - * Vector of extension namespaces for which sufficient information is not yet available to
 - * complete the registration process.
 - */
 - private Vector m_unregisteredExtensions = new Vector();
 - /**
 - * An ExtensionNamespacesManager is instantiated the first time an extension function or
 - * element is found in the stylesheet. During initialization, a vector of ExtensionNamespaceSupport
 - * objects is created, one for each predefined extension namespace.
 - */
 - public ExtensionNamespacesManager()
 - {
 - setPredefinedNamespaces();
 - }
 - /**
 - * If necessary, register the extension namespace found compiling a function or
 - * creating an extension element.
 - *
 - * If it is a predefined namespace, create a
 - * support object to simplify the instantiate of an appropriate ExtensionHandler
 - * during transformation runtime. Otherwise, add the namespace, if necessary,
 - * to a vector of undefined extension namespaces, to be defined later.
 - *
 - */
 - public void registerExtension(String namespace)
 - {
 - if (namespaceIndex(namespace, m_extensions) == -1)
 - {
 - int predef = namespaceIndex(namespace, m_predefExtensions);
 - if (predef !=-1)
 - m_extensions.addElement(m_predefExtensions.elementAt(predef));
 - else if (!(m_unregisteredExtensions.contains(namespace)))
 - m_unregisteredExtensions.addElement(namespace);
 - }
 - }
 - /**
 - * Register the extension namespace for an ElemExtensionDecl or ElemFunction,
 - * and prepare a support object to launch the appropriate ExtensionHandler at
 - * transformation runtime.
 - */
 - public void registerExtension(ExtensionNamespaceSupport extNsSpt)
 - {
 - String namespace = extNsSpt.getNamespace();
 - if (namespaceIndex(namespace, m_extensions) == -1)
 - {
 - m_extensions.addElement(extNsSpt);
 - if (m_unregisteredExtensions.contains(namespace))
 - m_unregisteredExtensions.removeElement(namespace);
 - }
 - }
 - /**
 - * Get the index for a namespace entry in the extension namespace Vector, -1 if
 - * no such entry yet exists.
 - */
 - public int namespaceIndex(String namespace, Vector extensions)
 - {
 - for (int i = 0; i < extensions.size(); i++)
 - {
 - if (((ExtensionNamespaceSupport)extensions.elementAt(i)).getNamespace().equals(namespace))
 - return i;
 - }
 - return -1;
 - }
 - /**
 - * Get the vector of extension namespaces. Used to provide
 - * the extensions table access to a list of extension
 - * namespaces encountered during composition of a stylesheet.
 - */
 - public Vector getExtensions()
 - {
 - return m_extensions;
 - }
 - /**
 - * Attempt to register any unregistered extension namespaces.
 - */
 - public void registerUnregisteredNamespaces()
 - {
 - for (int i = 0; i < m_unregisteredExtensions.size(); i++)
 - {
 - String ns = (String)m_unregisteredExtensions.elementAt(i);
 - ExtensionNamespaceSupport extNsSpt = defineJavaNamespace(ns);
 - if (extNsSpt != null)
 - m_extensions.addElement(extNsSpt);
 - }
 - }
 - /**
 - * For any extension namespace that is not either predefined or defined
 - * by a "component" declaration or exslt function declaration, attempt
 - * to create an ExtensionNamespaceSuport object for the appropriate
 - * Java class or Java package Extension Handler.
 - *
 - * Called by StylesheetRoot.recompose(), after all ElemTemplate compose()
 - * operations have taken place, in order to set up handlers for
 - * the remaining extension namespaces.
 - *
 - * @param ns The extension namespace URI.
 - * @return An ExtensionNamespaceSupport object for this namespace
 - * (which defines the ExtensionHandler to be used), or null if such
 - * an object cannot be created.
 - *
 - * @throws javax.xml.transform.TransformerException
 - */
 - public ExtensionNamespaceSupport defineJavaNamespace(String ns)
 - {
 - return defineJavaNamespace(ns, ns);
 - }
 - public ExtensionNamespaceSupport defineJavaNamespace(String ns, String classOrPackage)
 - {
 - if(null == ns || ns.trim().length() == 0) // defensive. I don't think it's needed. -sb
 - return null;
 - // Prepare the name of the actual class or package, stripping
 - // out any leading "class:". Next, see if there is a /. If so,
 - // only look at the text to the right of the rightmost /.
 - String className = classOrPackage;
 - if (className.startsWith("class:"))
 - className = className.substring(6);
 - int lastSlash = className.lastIndexOf("/");
 - if (-1 != lastSlash)
 - className = className.substring(lastSlash + 1);
 - // The className can be null here, and can cause an error in getClassForName
 - // in JDK 1.8.
 - if(null == className || className.trim().length() == 0)
 - return null;
 - try
 - {
 - ExtensionHandler.getClassForName(className);
 - return new ExtensionNamespaceSupport(
 - ns,
 - "org.apache.xalan.extensions.ExtensionHandlerJavaClass",
 - new Object[]{ns, "javaclass", className});
 - }
 - catch (ClassNotFoundException e)
 - {
 - return new ExtensionNamespaceSupport(
 - ns,
 - "org.apache.xalan.extensions.ExtensionHandlerJavaPackage",
 - new Object[]{ns, "javapackage", className + "."});
 - }
 - }
 - /*
 - public ExtensionNamespaceSupport getSupport(int index, Vector extensions)
 - {
 - return (ExtensionNamespaceSupport)extensions.elementAt(index);
 - }
 - */
 - /**
 - * Set up a Vector for predefined extension namespaces.
 - */
 - private void setPredefinedNamespaces()
 - {
 - String uri = Constants.S_EXTENSIONS_JAVA_URL;
 - String handlerClassName = "org.apache.xalan.extensions.ExtensionHandlerJavaPackage";
 - String lang = "javapackage";
 - String lib = "";
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - uri = Constants.S_EXTENSIONS_OLD_JAVA_URL;
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - uri = Constants.S_EXTENSIONS_LOTUSXSL_JAVA_URL;
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - uri = Constants.S_EXTENSIONS_XALANLIB_URL;
 - handlerClassName = "org.apache.xalan.extensions.ExtensionHandlerJavaClass";
 - lang = "javaclass"; // for remaining predefined extension namespaces.
 - lib = "org.apache.xalan.lib.Extensions";
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - // Xalan extension namespaces (redirect, pipe and SQL).
 - uri = Constants.S_EXTENSIONS_REDIRECT_URL;
 - lib = "org.apache.xalan.lib.Redirect";
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - uri = Constants.S_EXTENSIONS_PIPE_URL;
 - lib = "org.apache.xalan.lib.PipeDocument";
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - uri = Constants.S_EXTENSIONS_SQL_URL;
 - lib = "org.apache.xalan.lib.sql.XConnection";
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - //EXSLT namespaces (not including EXSLT function namespaces which are
 - // registered by the associated ElemFunction.
 - uri = Constants.S_EXSLT_COMMON_URL;
 - lib = "org.apache.xalan.lib.ExsltCommon";
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - uri = Constants.S_EXSLT_MATH_URL;
 - lib = "org.apache.xalan.lib.ExsltMath";
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - uri = Constants.S_EXSLT_SETS_URL;
 - lib = "org.apache.xalan.lib.ExsltSets";
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - uri = Constants.S_EXSLT_DATETIME_URL;
 - lib = "org.apache.xalan.lib.ExsltDatetime";
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - uri = Constants.S_EXSLT_DYNAMIC_URL;
 - lib = "org.apache.xalan.lib.ExsltDynamic";
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - uri = Constants.S_EXSLT_STRINGS_URL;
 - lib = "org.apache.xalan.lib.ExsltStrings";
 - m_predefExtensions.addElement(new ExtensionNamespaceSupport(uri, handlerClassName,
 - new Object[]{uri, lang, lib}));
 - }
 - }