domnamednodemap.java

来自「kaffe Java 解释器语言,源码,Java的子集系统,开放源代码」· Java 代码 · 共 343 行

JAVA
343
字号
/* * Copyright (C) 1999-2001 David Brownell *  * This file is part of GNU JAXP, a library. * * GNU JAXP is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. *  * GNU JAXP is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * As a special exception, if you link this library with other files to * produce an executable, this library does not by itself cause the * resulting executable to be covered by the GNU General Public License. * This exception does not however invalidate any other reasons why the * executable file might be covered by the GNU General Public License.  */package gnu.xml.dom;import java.util.Vector;import org.w3c.dom.*;/** * <p> "NamedNodeMap" implementation. </p> * Used mostly to hold element attributes, but sometimes also * to list notations or entities. * * @author David Brownell  */public class DomNamedNodeMap implements NamedNodeMap{    private final Document		owner;    private DomNode			contents [] = new DomNode [1];    private int				length;    private boolean			readonly;    private final Element		element;    private static final int		DELTA = 5;    /**     * Constructs an empty map associated with the specified document.     */    public DomNamedNodeMap (Document owner)    {	this.owner = owner;	this.element = null;    }    // package private    DomNamedNodeMap (Document owner, Element element)    {	this.owner = owner;	this.element = element;    }    /**     * Reduces space utilization for this object.     */    public void compact ()    {	if (contents.length != length)	    setCapacity (length);    }    private void setCapacity (int len)    {	DomNode		newContents [] = new DomNode [len];	System.arraycopy (contents, 0, newContents, 0, length);	contents = newContents;    }    /**     * Exposes the internal "readonly" flag.  In DOM, all NamedNodeMap     * objects found in a DocumentType object are read-only (after     * they are fully constructed), and those holding attributes of     * a readonly element will also be readonly.     */    final public boolean isReadonly ()    {	return readonly;    }        /**     * Sets the internal "readonly" flag so the node and its     * children can't be changed.     */    public void makeReadonly ()    {	readonly = true;	for (int i = 0; i < length; i++)	    contents [i].makeReadonly ();    }    /**     * <b>DOM L1</b>     * Returns the named item from the map, or null; names are just     * the nodeName property.     */    public Node getNamedItem (String name)    {	for (int i = 0; i < length; i++) {	    if (contents [i].getNodeName ().equals (name))		return contents [i];	}	return null;    }    /**     * <b>DOM L2</b>     * Returns the named item from the map, or null; names are the     * localName and namespaceURI properties, ignoring any prefix.     */    public Node getNamedItemNS (String namespaceURI, String localName)    {	for (int i = 0; i < length; i++) {	    DomNode	temp = contents [i];	    String	tempName = temp.getLocalName ();	    String	ns;	    if (tempName != null && tempName.equals (localName)) {		ns = temp.getNamespaceURI ();		if ((ns == null && namespaceURI == null)			|| ns.equals (namespaceURI)) {		    return temp;		}	    }	}	return null;    }    private void checkAttr (Attr arg)    {	if (element == null)	    return;	Element	argOwner = arg.getOwnerElement ();	if (argOwner != null) {	    if (argOwner != element)		throw new DomEx (DomEx.INUSE_ATTRIBUTE_ERR);	    return;	}	// We can't escape implementation dependencies here; we let	// the Java runtime deal with error reporting	((DomAttr)arg).setOwnerElement (element);    }    /**     * <b>DOM L1</b>     * Stores the named item into the map, optionally overwriting     * any existing node with that name.  The name used is just     * the nodeName attribute.     */    public Node setNamedItem (Node arg)    {	if (readonly)	    throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);	if (arg.getOwnerDocument () != owner)	    throw new DomEx (DomEx.WRONG_DOCUMENT_ERR);	if (arg instanceof Attr)	    checkAttr ((Attr) arg);	String	name = arg.getNodeName ();// maybe attribute ADDITION events (?)	for (int i = 0; i < length; i++) {	    Node temp = contents [i];	    if (temp.getNodeName ().equals (name)) {		contents [i] = (DomNode) arg;		return temp;	    }	}	if (length == contents.length)	    setCapacity (length + DELTA);	contents [length++] = (DomNode) arg;	return null;    }    /**     * <b>DOM L2</b>     * Stores the named item into the map, optionally overwriting     * any existing node with that fully qualified name.  The name     * used incorporates the localName and namespaceURI properties,     * and ignores any prefix.     */    public Node setNamedItemNS (Node arg)    {	if (readonly)	    throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);	if (arg.getOwnerDocument () != owner)	    throw new DomEx (DomEx.WRONG_DOCUMENT_ERR);	if (arg instanceof Attr)	    checkAttr ((Attr) arg);	String	localName = arg.getLocalName ();	String	namespaceURI = arg.getNamespaceURI ();	if (localName == null)	    throw new DomEx (DomEx.INVALID_ACCESS_ERR);	for (int i = 0; i < length; i++) {	    DomNode	temp = contents [i];	    String	tempName = temp.getLocalName ();	    String	ns;	    if (tempName != null && tempName.equals (localName)) {		ns = temp.getNamespaceURI ();		if ((ns == null && namespaceURI == null)			|| ns.equals (namespaceURI)) {		    contents [i] = (DomNode) arg;		    return temp;		}	    }	}	if (length == contents.length)	    setCapacity (length + DELTA);	contents [length++] = (DomNode) arg;	return null;    }    private void maybeRestoreDefault (String uri, String name)    {	DomDoctype		doctype = (DomDoctype)owner.getDoctype ();	DomDoctype.ElementInfo	info;	String			value;	DomAttr			attr;	if (doctype == null)	    return;	if ((info = doctype.getElementInfo (element.getNodeName ())) == null)	    return;	if ((value = info.getAttrDefault (name)) == null)	    return;	if (uri == null)	    attr = (DomAttr) owner.createAttribute (name);	else	    attr = (DomAttr) owner.createAttributeNS (uri, name);	attr.setNodeValue (value);	attr.setSpecified (false);	setNamedItem (attr);    }    /**     * <b>DOM L1</b>     * Removes the named item from the map, or reports an exception;     * names are just the nodeName property.     */    public Node removeNamedItem (String name)    {	if (readonly)	    throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);// report attribute REMOVAL event?	for (int i = 0; i < length; i++) {	    DomNode	temp = contents [i];	    if (temp.getNodeName ().equals (name)) {		System.arraycopy (contents, i+1, contents, i,			length - (i + 1));		contents [--length] = null;		if (element != null)		    maybeRestoreDefault (temp.getNamespaceURI (), name);		return temp;	    }	}	throw new DomEx (DomEx.NOT_FOUND_ERR);    }    /**     * <b>DOM L2</b>     * Removes the named item from the map, or reports an exception;     * names are the localName and namespaceURI properties.     */    public Node removeNamedItemNS (String namespaceURI, String localName)    {	if (readonly)	    throw new DomEx (DomEx.NO_MODIFICATION_ALLOWED_ERR);	for (int i = 0; i < length; i++) {	    DomNode	temp = contents [i];	    String	tempName = temp.getLocalName ();	    String	ns;	    if (tempName != null && tempName.equals (localName)) {		ns = temp.getNamespaceURI ();		if ((ns == null && namespaceURI == null)			|| ns.equals (namespaceURI)) {		    System.arraycopy (contents, i+1, contents, i,			    length - (i + 1));		    contents [--length] = null;		    if (element != null)			maybeRestoreDefault (ns, temp.getNodeName ());		    return temp;		}	    }	}	throw new DomEx (DomEx.NOT_FOUND_ERR);    }    /**     * <b>DOM L1</b>     * Returns the indexed item from the map, or null.     */    public Node item (int index)    {	if (index < 0 || index >= length)	    return null;	return contents [index];    }    /**     * <b>DOM L1</b>     * Returns the length of the map.     */    public int getLength ()	{ return length; }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?