extensionnamespacesmanager.java
来自「java jdk 1.4的源码」· Java 代码 · 共 317 行
JAVA
317 行
/* * 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})); } }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?