- /*
- * 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}));
- }
-
- }