expandednametable.java
来自「java jdk 1.4的源码」· Java 代码 · 共 363 行
JAVA
363 行
/* * 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.xml.dtm.ref;import org.apache.xml.dtm.DTM;import java.util.Vector;import java.util.Hashtable;/** * This is a default implementation of a table that manages mappings from * expanded names to expandedNameIDs. * * %REVIEW% Note that this is not really a separate table, or a * separate pool. Instead, it's an access method build on top of the * existing pools, using three pieces of information: the index * numbers for a node's namespaceURI, localName, and node type, which * are combined to yield a composite index number. * * %TBD% startup sequence -- how this gets access to the appropriate * string pools in the DTMDocument/stylesheet. * * */public class ExpandedNameTable{ /** Probably a reference to static pool. */ //private DTMStringPool m_locNamesPool; /** Probably a reference to static pool. */ //private DTMStringPool m_namespaceNames; /** Vector of extended types for this document */ private /*static*/ Vector m_extendedTypes; /** Next available extended type */ private int m_nextType; // These are all the types prerotated, for caller convenience. public static final int ELEMENT = ((int)DTM.ELEMENT_NODE) ; public static final int ATTRIBUTE = ((int)DTM.ATTRIBUTE_NODE) ; public static final int TEXT = ((int)DTM.TEXT_NODE) ; public static final int CDATA_SECTION = ((int)DTM.CDATA_SECTION_NODE) ; public static final int ENTITY_REFERENCE = ((int)DTM.ENTITY_REFERENCE_NODE) ; public static final int ENTITY = ((int)DTM.ENTITY_NODE) ; public static final int PROCESSING_INSTRUCTION = ((int)DTM.PROCESSING_INSTRUCTION_NODE) ; public static final int COMMENT = ((int)DTM.COMMENT_NODE) ; public static final int DOCUMENT = ((int)DTM.DOCUMENT_NODE) ; public static final int DOCUMENT_TYPE = ((int)DTM.DOCUMENT_TYPE_NODE) ; public static final int DOCUMENT_FRAGMENT =((int)DTM.DOCUMENT_FRAGMENT_NODE) ; public static final int NOTATION = ((int)DTM.NOTATION_NODE) ; public static final int NAMESPACE = ((int)DTM.NAMESPACE_NODE) ; Hashtable m_hashtable = new Hashtable(); /** Workspace for lookup. NOT THREAD SAFE! * */ ExtendedType hashET=new ExtendedType(-1,"",""); private static Hashtable m_defaultHashtable; private static Vector m_defaultExtendedTypes; /** * Init default vales */ static { // use bigger values than default, to avoid reallocation in the future m_defaultExtendedTypes = new Vector(23); m_defaultHashtable = new Hashtable(23, 0.75f); for (int i = 0; i < DTM.NTYPES; i++) { ExtendedType newET = new ExtendedType(i, "", ""); m_defaultExtendedTypes.addElement(newET); m_defaultHashtable.put(newET, new Integer(i)); } } /** * Create an expanded name table that uses private string pool lookup. */ public ExpandedNameTable() { //m_locNamesPool = new DTMSafeStringPool(); //m_namespaceNames = new DTMSafeStringPool(); initExtendedTypes(); } /** * Constructor ExpandedNameTable * * @param locNamesPool Local element names lookup. * @param namespaceNames Namespace values lookup. */ public ExpandedNameTable(DTMStringPool locNamesPool, DTMStringPool namespaceNames) { //m_locNamesPool = locNamesPool; //m_namespaceNames = namespaceNames; initExtendedTypes(); } /** * Initialize the vector of extended types with the * basic DOM node types. */ private void initExtendedTypes() { // Since objects in the Vector a m_extendedTypes and m_hashtable are never changed // it should be safe to copy default tables m_extendedTypes = (Vector)m_defaultExtendedTypes.clone(); m_hashtable = (Hashtable)m_defaultHashtable.clone(); m_nextType = m_extendedTypes.size(); } /** * Given an expanded name, return an ID. If the expanded-name does not * exist in the internal tables, the entry will be created, and the ID will * be returned. Any additional nodes that are created that have this * expanded name will use this ID. * * @param namespace * @param localName * * @return the expanded-name id of the node. */ public int getExpandedTypeID(String namespace, String localName, int type) { /*int nsID = (null != namespace) ? m_namespaceNames.stringToIndex(namespace) : 0; int lnID = m_locNamesPool.stringToIndex(localName); int expandedTypeID = (type << (BITS_PER_NAMESPACE+BITS_PER_LOCALNAME)) | (nsID << BITS_PER_LOCALNAME) | lnID; return expandedTypeID;*/ if (null == namespace) namespace = ""; if (null == localName) localName = ""; // Set our reusable ExpandedType so we can look // it up in the hashtable. Not threadsafe, but // avoids creating a new object until we know // this isn't one we've seen before. hashET.redefine(type,namespace,localName); Object eType; if ((eType = m_hashtable.get(hashET)) != null ) return ((Integer)eType).intValue(); ExtendedType newET=new ExtendedType(type, namespace, localName); m_extendedTypes.addElement(newET); m_hashtable.put(newET, new Integer(m_nextType)); return m_nextType++; } /** * Given a type, return an expanded name ID.Any additional nodes that are * created that have this expanded name will use this ID. * * @param namespace * @param localName * * @return the expanded-name id of the node. */ public int getExpandedTypeID(int type) { return type; } /** * Given an expanded-name ID, return the local name part. * * @param ExpandedNameID an ID that represents an expanded-name. * @return String Local name of this node, or null if the node has no name. */ public String getLocalName(int ExpandedNameID) { //return m_locNamesPool.indexToString(ExpandedNameID & MASK_LOCALNAME); ExtendedType etype = (ExtendedType)m_extendedTypes.elementAt (ExpandedNameID); return etype.localName; } /** * Given an expanded-name ID, return the local name ID. * * @param ExpandedNameID an ID that represents an expanded-name. * @return The id of this local name. */ public /*static*/ final int getLocalNameID(int ExpandedNameID) { //return (ExpandedNameID & MASK_LOCALNAME); ExtendedType etype = (ExtendedType)m_extendedTypes.elementAt (ExpandedNameID); if (etype.localName.equals("")) return 0; else return ExpandedNameID; } /** * Given an expanded-name ID, return the namespace URI part. * * @param ExpandedNameID an ID that represents an expanded-name. * @return String URI value of this node's namespace, or null if no * namespace was resolved. */ public String getNamespace(int ExpandedNameID) { //int id = (ExpandedNameID & MASK_NAMESPACE) >> BITS_PER_LOCALNAME; //return (0 == id) ? null : m_namespaceNames.indexToString(id); ExtendedType etype = (ExtendedType)m_extendedTypes.elementAt (ExpandedNameID); return (etype.namespace.equals("") ? null : etype.namespace); } /** * Given an expanded-name ID, return the namespace URI ID. * * @param ExpandedNameID an ID that represents an expanded-name. * @return The id of this namespace. */ public /*static*/ final int getNamespaceID(int ExpandedNameID) { //return (ExpandedNameID & MASK_NAMESPACE) >> BITS_PER_LOCALNAME; ExtendedType etype = (ExtendedType)m_extendedTypes.elementAt (ExpandedNameID); if (etype.namespace.equals("")) return 0; else return ExpandedNameID; } /** * Given an expanded-name ID, return the local name ID. * * @param ExpandedNameID an ID that represents an expanded-name. * @return The id of this local name. */ public final short getType(int ExpandedNameID) { //return (short)(ExpandedNameID >> ROTAMOUNT_TYPE); ExtendedType etype = (ExtendedType)m_extendedTypes.elementAt (ExpandedNameID); return (short)etype.nodetype; } /** * Private class representing an extended type object */ private static class ExtendedType { protected int nodetype; protected String namespace; protected String localName; protected int hash; protected ExtendedType (int nodetype, String namespace, String localName) { this.nodetype = nodetype; this.namespace = namespace; this.localName = localName; this.hash=nodetype+namespace.hashCode()+localName.hashCode(); } /* This is intended to be used ONLY on the hashET * object. Using it elsewhere will mess up existing * hashtable entries! * */ protected void redefine(int nodetype, String namespace, String localName) { this.nodetype = nodetype; this.namespace = namespace; this.localName = localName; this.hash=nodetype+namespace.hashCode()+localName.hashCode(); } /* Override super method * */ public int hashCode() { return hash; } /* Override super method * */ public boolean equals(Object other) { //Usually an optimization, but // won't arise in our usage: //if(other==this) return true; try { ExtendedType et=(ExtendedType)other; return et.nodetype==this.nodetype && et.localName.equals(this.localName) && et.namespace.equals(this.namespace); } catch(ClassCastException e) { return false; } catch(NullPointerException e) { return false; } } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?