dom2dtmdefaultnamespacedeclarationnode.java

来自「JAVA 所有包」· Java 代码 · 共 678 行 · 第 1/2 页

JAVA
678
字号
/* * Copyright 1999-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//* * $Id: DOM2DTMdefaultNamespaceDeclarationNode.java,v 1.2.4.1 2005/09/15 08:15:11 suresh_emailid Exp $ */package com.sun.org.apache.xml.internal.dtm.ref.dom2dtm;import com.sun.org.apache.xml.internal.dtm.DTMException;import org.w3c.dom.Attr;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.w3c.dom.TypeInfo;import org.w3c.dom.UserDataHandler;import org.w3c.dom.DOMException;/** This is a kluge to let us shove a declaration for xml: into the * DOM2DTM model.  Basically, it creates a proxy node in DOM space to * carry the additional information. This is _NOT_ a full DOM * implementation, and shouldn't be one since it sits alongside the * DOM rather than becoming part of the DOM model. *  * (This used to be an internal class within DOM2DTM. Moved out because * I need to perform an instanceof operation on it to support a temporary * workaround in DTMManagerDefault.) *  * %REVIEW% What if the DOM2DTM was built around a DocumentFragment and * there isn't a single root element? I think this fails that case... *  * %REVIEW% An alternative solution would be to create the node _only_ * in DTM space, but given how DOM2DTM is currently written I think * this is simplest. * */public class DOM2DTMdefaultNamespaceDeclarationNode implements Attr,TypeInfo{  final String NOT_SUPPORTED_ERR="Unsupported operation on pseudonode";    Element pseudoparent;  String prefix,uri,nodename;  int handle;  DOM2DTMdefaultNamespaceDeclarationNode(Element pseudoparent,String prefix,String uri,int handle)  {    this.pseudoparent=pseudoparent;    this.prefix=prefix;    this.uri=uri;    this.handle=handle;    this.nodename="xmlns:"+prefix;  }  public String getNodeName() {return nodename;}  public String getName() {return nodename;}  public String getNamespaceURI() {return "http://www.w3.org/2000/xmlns/";}  public String getPrefix() {return prefix;}  public String getLocalName() {return prefix;}  public String getNodeValue() {return uri;}  public String getValue() {return uri;}  public Element getOwnerElement() {return pseudoparent;}    public boolean isSupported(String feature, String version) {return false;}  public boolean hasChildNodes() {return false;}  public boolean hasAttributes() {return false;}  public Node getParentNode() {return null;}  public Node getFirstChild() {return null;}  public Node getLastChild() {return null;}  public Node getPreviousSibling() {return null;}  public Node getNextSibling() {return null;}  public boolean getSpecified() {return false;}  public void normalize() {return;}  public NodeList getChildNodes() {return null;}  public NamedNodeMap getAttributes() {return null;}  public short getNodeType() {return Node.ATTRIBUTE_NODE;}  public void setNodeValue(String value) {throw new DTMException(NOT_SUPPORTED_ERR);}  public void setValue(String value) {throw new DTMException(NOT_SUPPORTED_ERR);}  public void setPrefix(String value) {throw new DTMException(NOT_SUPPORTED_ERR);}  public Node insertBefore(Node a, Node b) {throw new DTMException(NOT_SUPPORTED_ERR);}  public Node replaceChild(Node a, Node b) {throw new DTMException(NOT_SUPPORTED_ERR);}  public Node appendChild(Node a) {throw new DTMException(NOT_SUPPORTED_ERR);}  public Node removeChild(Node a) {throw new DTMException(NOT_SUPPORTED_ERR);}  public Document getOwnerDocument() {return pseudoparent.getOwnerDocument();}  public Node cloneNode(boolean deep) {throw new DTMException(NOT_SUPPORTED_ERR);}	    /** Non-DOM method, part of the temporary kluge     * %REVIEW% This would be a pruning problem, but since it will always be     * added to the root element and we prune on elements, we shouldn't have      * to worry.     */    public int getHandleOfNode()		    {        return handle;    }    //RAMESH: PENDING=> Add proper implementation for the below DOM L3 additions    /**     * @see org.w3c.dom.TypeInfo#getTypeName()     */    public String getTypeName() {return null; }         /**     * @see org.w3c.dom.TypeInfo#getTypeNamespace()     */    public String getTypeNamespace() { return null;}        /**     * @see or.gw3c.dom.TypeInfo#isDerivedFrom(String,String,int)     */    public boolean isDerivedFrom( String ns, String localName, int derivationMethod ) {        return false;    }    public TypeInfo getSchemaTypeInfo() { return this; }        public boolean isId( ) { return false; }    /**     * Associate an object to a key on this node. The object can later be     * retrieved from this node by calling <code>getUserData</code> with the     * same key.     * @param key The key to associate the object to.     * @param data The object to associate to the given key, or     *   <code>null</code> to remove any existing association to that key.     * @param handler The handler to associate to that key, or     *   <code>null</code>.     * @return Returns the <code>DOMObject</code> previously associated to     *   the given key on this node, or <code>null</code> if there was none.     * @since DOM Level 3     */    public Object setUserData(String key,                              Object data,                              UserDataHandler handler) {        return getOwnerDocument().setUserData( key, data, handler);    }    /**     * Retrieves the object associated to a key on a this node. The object     * must first have been set to this node by calling     * <code>setUserData</code> with the same key.     * @param key The key the object is associated to.     * @return Returns the <code>DOMObject</code> associated to the given key     *   on this node, or <code>null</code> if there was none.     * @since DOM Level 3     */    public Object getUserData(String key) {        return getOwnerDocument().getUserData( key);    }     /**     *  This method returns a specialized object which implements the     * specialized APIs of the specified feature and version. The     * specialized object may also be obtained by using binding-specific     * casting methods but is not necessarily expected to, as discussed in Mixed DOM implementations.     * @param feature The name of the feature requested (case-insensitive).     * @param version  This is the version number of the feature to test. If     *   the version is <code>null</code> or the empty string, supporting     *   any version of the feature will cause the method to return an     *   object that supports at least one version of the feature.     * @return  Returns an object which implements the specialized APIs of     *   the specified feature and version, if any, or <code>null</code> if     *   there is no object which implements interfaces associated with that     *   feature. If the <code>DOMObject</code> returned by this method     *   implements the <code>Node</code> interface, it must delegate to the     *   primary core <code>Node</code> and not return results inconsistent     *   with the primary core <code>Node</code> such as attributes,     *   childNodes, etc.     * @since DOM Level 3     */    public Object getFeature(String feature, String version) {        // we don't have any alternate node, either this node does the job        // or we don't have anything that does        return isSupported(feature, version) ? this : null;    }    /**     * Tests whether two nodes are equal.     * <br>This method tests for equality of nodes, not sameness (i.e.,     * whether the two nodes are references to the same object) which can be     * tested with <code>Node.isSameNode</code>. All nodes that are the same     * will also be equal, though the reverse may not be true.     * <br>Two nodes are equal if and only if the following conditions are     * satisfied: The two nodes are of the same type.The following string     * attributes are equal: <code>nodeName</code>, <code>localName</code>,     * <code>namespaceURI</code>, <code>prefix</code>, <code>nodeValue</code>     * , <code>baseURI</code>. This is: they are both <code>null</code>, or     * they have the same length and are character for character identical.     * The <code>attributes</code> <code>NamedNodeMaps</code> are equal.     * This is: they are both <code>null</code>, or they have the same     * length and for each node that exists in one map there is a node that     * exists in the other map and is equal, although not necessarily at the     * same index.The <code>childNodes</code> <code>NodeLists</code> are     * equal. This is: they are both <code>null</code>, or they have the     * same length and contain equal nodes at the same index. This is true     * for <code>Attr</code> nodes as for any other type of node. Note that     * normalization can affect equality; to avoid this, nodes should be     * normalized before being compared.     * <br>For two <code>DocumentType</code> nodes to be equal, the following     * conditions must also be satisfied: The following string attributes     * are equal: <code>publicId</code>, <code>systemId</code>,     * <code>internalSubset</code>.The <code>entities</code>     * <code>NamedNodeMaps</code> are equal.The <code>notations</code>     * <code>NamedNodeMaps</code> are equal.     * <br>On the other hand, the following do not affect equality: the     * <code>ownerDocument</code> attribute, the <code>specified</code>     * attribute for <code>Attr</code> nodes, the     * <code>isWhitespaceInElementContent</code> attribute for     * <code>Text</code> nodes, as well as any user data or event listeners     * registered on the nodes.     * @param arg The node to compare equality with.     * @param deep If <code>true</code>, recursively compare the subtrees; if     *   <code>false</code>, compare only the nodes themselves (and its     *   attributes, if it is an <code>Element</code>).     * @return If the nodes, and possibly subtrees are equal,     *   <code>true</code> otherwise <code>false</code>.     * @since DOM Level 3     */    public boolean isEqualNode(Node arg) {        if (arg == this) {            return true;        }        if (arg.getNodeType() != getNodeType()) {            return false;        }        // in theory nodeName can't be null but better be careful        // who knows what other implementations may be doing?...        if (getNodeName() == null) {            if (arg.getNodeName() != null) {                return false;            }        }        else if (!getNodeName().equals(arg.getNodeName())) {            return false;        }        if (getLocalName() == null) {            if (arg.getLocalName() != null) {                return false;            }        }        else if (!getLocalName().equals(arg.getLocalName())) {            return false;        }        if (getNamespaceURI() == null) {            if (arg.getNamespaceURI() != null) {                return false;            }        }        else if (!getNamespaceURI().equals(arg.getNamespaceURI())) {            return false;        }        if (getPrefix() == null) {            if (arg.getPrefix() != null) {                return false;            }        }        else if (!getPrefix().equals(arg.getPrefix())) {            return false;        }        if (getNodeValue() == null) {            if (arg.getNodeValue() != null) {                return false;            }        }        else if (!getNodeValue().equals(arg.getNodeValue())) {            return false;        }    /*        if (getBaseURI() == null) {            if (((NodeImpl) arg).getBaseURI() != null) {                return false;            }        }        else if (!getBaseURI().equals(((NodeImpl) arg).getBaseURI())) {            return false;        }*/             return true;    }    /**     * DOM Level 3 - Experimental:     * Look up the namespace URI associated to the given prefix, starting from this node.     * Use lookupNamespaceURI(null) to lookup the default namespace     *     * @param namespaceURI     * @return th URI for the namespace     * @since DOM Level 3     */    public String lookupNamespaceURI(String specifiedPrefix) {        short type = this.getNodeType();        switch (type) {        case Node.ELEMENT_NODE : {                String namespace = this.getNamespaceURI();                String prefix = this.getPrefix();                if (namespace !=null) {                    // REVISIT: is it possible that prefix is empty string?                    if (specifiedPrefix== null && prefix==specifiedPrefix) {                        // looking for default namespace                        return namespace;                    } else if (prefix != null && prefix.equals(specifiedPrefix)) {                        // non default namespace                        return namespace;                    }                }                if (this.hasAttributes()) {                    NamedNodeMap map = this.getAttributes();                    int length = map.getLength();                    for (int i=0;i<length;i++) {                        Node attr = map.item(i);                        String attrPrefix = attr.getPrefix();                        String value = attr.getNodeValue();                        namespace = attr.getNamespaceURI();                        if (namespace !=null && namespace.equals("http://www.w3.org/2000/xmlns/")) {                            // at this point we are dealing with DOM Level 2 nodes only                            if (specifiedPrefix == null &&                                attr.getNodeName().equals("xmlns")) {                                // default namespace                                return value;                            } else if (attrPrefix !=null &&                                       attrPrefix.equals("xmlns") &&

⌨️ 快捷键说明

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