attrimpl.java

来自「JAVA 所有包」· Java 代码 · 共 1,236 行 · 第 1/3 页

JAVA
1,236
字号
        else {            if (refInternal == null) {                // this is an append                ChildNode lastChild = firstChild.previousSibling;                lastChild.nextSibling = newInternal;                newInternal.previousSibling = lastChild;                firstChild.previousSibling = newInternal;            }            else {                // this is an insert                if (refChild == firstChild) {                    // at the head of the list                    firstChild.isFirstChild(false);                    newInternal.nextSibling = firstChild;                    newInternal.previousSibling = firstChild.previousSibling;                    firstChild.previousSibling = newInternal;                    value = newInternal; // firstChild = newInternal;                    newInternal.isFirstChild(true);                }                else {                    // somewhere in the middle                    ChildNode prev = refInternal.previousSibling;                    newInternal.nextSibling = refInternal;                    prev.nextSibling = newInternal;                    refInternal.previousSibling = newInternal;                    newInternal.previousSibling = prev;                }            }        }        changed();        // notify document        ownerDocument.insertedNode(this, newInternal, replace);        checkNormalizationAfterInsert(newInternal);        return newChild;    } // internalInsertBefore(Node,Node,int):Node    /**     * Remove a child from this Node. The removed child's subtree     * remains intact so it may be re-inserted elsewhere.     *     * @return oldChild, in its new state (removed).     *     * @throws DOMException(NOT_FOUND_ERR) if oldChild is not a child of     * this node.     *     * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) if this node is     * read-only.     */    public Node removeChild(Node oldChild)         throws DOMException {        // Tail-call, should be optimizable        if (hasStringValue()) {            // we don't have any child per say so it can't be one of them!            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR", null);            throw new DOMException(DOMException.NOT_FOUND_ERR, msg);                    }        return internalRemoveChild(oldChild, false);    } // removeChild(Node) :Node         /** NON-DOM INTERNAL: Within DOM actions,we sometimes need to be able     * to control which mutation events are spawned. This version of the     * removeChild operation allows us to do so. It is not intended     * for use by application programs.     */    Node internalRemoveChild(Node oldChild, boolean replace)        throws DOMException {        CoreDocumentImpl ownerDocument = ownerDocument();        if (ownerDocument.errorChecking) {            if (isReadOnly()) {                String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);                throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, msg);            }            if (oldChild != null && oldChild.getParentNode() != this) {                String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR", null);                throw new DOMException(DOMException.NOT_FOUND_ERR, msg);            }        }        ChildNode oldInternal = (ChildNode) oldChild;        // notify document        ownerDocument.removingNode(this, oldInternal, replace);        // Patch linked list around oldChild        // Note: lastChild == firstChild.previousSibling        if (oldInternal == value) { // oldInternal == firstChild            // removing first child            oldInternal.isFirstChild(false);            // next line is: firstChild = oldInternal.nextSibling            value = oldInternal.nextSibling;            ChildNode firstChild = (ChildNode) value;            if (firstChild != null) {                firstChild.isFirstChild(true);                firstChild.previousSibling = oldInternal.previousSibling;            }        } else {            ChildNode prev = oldInternal.previousSibling;            ChildNode next = oldInternal.nextSibling;            prev.nextSibling = next;            if (next == null) {                // removing last child                ChildNode firstChild = (ChildNode) value;                firstChild.previousSibling = prev;            } else {                // removing some other child in the middle                next.previousSibling = prev;            }        }        // Save previous sibling for normalization checking.        ChildNode oldPreviousSibling = oldInternal.previousSibling();        // Remove oldInternal's references to tree        oldInternal.ownerNode       = ownerDocument;        oldInternal.isOwned(false);        oldInternal.nextSibling     = null;        oldInternal.previousSibling = null;        changed();        // notify document        ownerDocument.removedNode(this, replace);        checkNormalizationAfterRemove(oldPreviousSibling);        return oldInternal;    } // internalRemoveChild(Node,int):Node    /**     * Make newChild occupy the location that oldChild used to     * have. Note that newChild will first be removed from its previous     * parent, if any. Equivalent to inserting newChild before oldChild,     * then removing oldChild.     *     * @return oldChild, in its new state (removed).     *     * @throws DOMException(HIERARCHY_REQUEST_ERR) if newChild is of a     * type that shouldn't be a child of this node, or if newChild is     * one of our ancestors.     *     * @throws DOMException(WRONG_DOCUMENT_ERR) if newChild has a     * different owner document than we do.     *     * @throws DOMException(NOT_FOUND_ERR) if oldChild is not a child of     * this node.     *     * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) if this node is     * read-only.     */    public Node replaceChild(Node newChild, Node oldChild)        throws DOMException {        makeChildNode();        // If Mutation Events are being generated, this operation might        // throw aggregate events twice when modifying an Attr -- once         // on insertion and once on removal. DOM Level 2 does not specify         // this as either desirable or undesirable, but hints that        // aggregations should be issued only once per user request.        // notify document        CoreDocumentImpl ownerDocument = ownerDocument();        ownerDocument.replacingNode(this);        internalInsertBefore(newChild, oldChild, true);        if (newChild != oldChild) {            internalRemoveChild(oldChild, true);        }        // notify document        ownerDocument.replacedNode(this);        return oldChild;    }    //    // NodeList methods    //    /**     * NodeList method: Count the immediate children of this node     * @return int     */    public int getLength() {        if (hasStringValue()) {            return 1;        }        ChildNode node = (ChildNode) value;        int length = 0;        for (; node != null; node = node.nextSibling) {            length++;        }        return length;    } // getLength():int    /**     * NodeList method: Return the Nth immediate child of this node, or     * null if the index is out of bounds.     * @return org.w3c.dom.Node     * @param Index int     */    public Node item(int index) {        if (hasStringValue()) {            if (index != 0 || value == null) {                return null;            }            else {                makeChildNode();                return (Node) value;            }        }        if (index < 0) {            return null;        }        ChildNode node = (ChildNode) value;        for (int i = 0; i < index && node != null; i++) {            node = node.nextSibling;        }         return node;    } // item(int):Node    //    // DOM3    //    /**     * DOM Level 3 WD- Experimental.     * Override inherited behavior from ParentNode to support deep equal.     * isEqualNode is always deep on Attr nodes.     */    public boolean isEqualNode(Node arg) {        return super.isEqualNode(arg);    }    /**     * Introduced in DOM Level 3. <p>     * Checks if a type is derived from another by restriction. See:     * http://www.w3.org/TR/DOM-Level-3-Core/core.html#TypeInfo-isDerivedFrom     *      * @param ancestorNS      *        The namspace of the ancestor type declaration     * @param ancestorName     *        The name of the ancestor type declaration     * @param type     *        The reference type definition     *      * @return boolean True if the type is derived by restriciton for the     *         reference type     */    public boolean isDerivedFrom(String typeNamespaceArg,                                  String typeNameArg,                                  int derivationMethod) {                                 	        return false;    }            //    // Public methods    //    /**     * Override default behavior so that if deep is true, children are also     * toggled.     * @see Node     * <P>     * Note: this will not change the state of an EntityReference or its     * children, which are always read-only.     */    public void setReadOnly(boolean readOnly, boolean deep) {        super.setReadOnly(readOnly, deep);        if (deep) {            if (needsSyncChildren()) {                synchronizeChildren();            }            if (hasStringValue()) {                return;            }            // Recursively set kids            for (ChildNode mykid = (ChildNode) value;                 mykid != null;                 mykid = mykid.nextSibling) {                if (mykid.getNodeType() != Node.ENTITY_REFERENCE_NODE) {                    mykid.setReadOnly(readOnly,true);                }            }        }    } // setReadOnly(boolean,boolean)    //    // Protected methods    //    /**     * Override this method in subclass to hook in efficient     * internal data structure.     */    protected void synchronizeChildren() {        // By default just change the flag to avoid calling this method again        needsSyncChildren(false);    }    /**     * Checks the normalized state of this node after inserting a child.     * If the inserted child causes this node to be unnormalized, then this     * node is flagged accordingly.     * The conditions for changing the normalized state are:     * <ul>     * <li>The inserted child is a text node and one of its adjacent siblings     * is also a text node.     * <li>The inserted child is is itself unnormalized.     * </ul>     *     * @param insertedChild the child node that was inserted into this node     *     * @throws NullPointerException if the inserted child is <code>null</code>     */    void checkNormalizationAfterInsert(ChildNode insertedChild) {        // See if insertion caused this node to be unnormalized.        if (insertedChild.getNodeType() == Node.TEXT_NODE) {            ChildNode prev = insertedChild.previousSibling();            ChildNode next = insertedChild.nextSibling;            // If an adjacent sibling of the new child is a text node,            // flag this node as unnormalized.            if ((prev != null && prev.getNodeType() == Node.TEXT_NODE) ||                (next != null && next.getNodeType() == Node.TEXT_NODE)) {                isNormalized(false);            }        }        else {            // If the new child is not normalized,            // then this node is inherently not normalized.            if (!insertedChild.isNormalized()) {                isNormalized(false);            }        }    } // checkNormalizationAfterInsert(ChildNode)    /**     * Checks the normalized of this node after removing a child.     * If the removed child causes this node to be unnormalized, then this     * node is flagged accordingly.     * The conditions for changing the normalized state are:     * <ul>     * <li>The removed child had two adjacent siblings that were text nodes.     * </ul>     *     * @param previousSibling the previous sibling of the removed child, or     * <code>null</code>     */    void checkNormalizationAfterRemove(ChildNode previousSibling) {        // See if removal caused this node to be unnormalized.        // If the adjacent siblings of the removed child were both text nodes,        // flag this node as unnormalized.        if (previousSibling != null &&            previousSibling.getNodeType() == Node.TEXT_NODE) {            ChildNode next = previousSibling.nextSibling;            if (next != null && next.getNodeType() == Node.TEXT_NODE) {                isNormalized(false);            }        }    } // checkNormalizationAfterRemove(ChildNode)    //    // Serialization methods    //    /** Serialize object. */    private void writeObject(ObjectOutputStream out) throws IOException {        // synchronize chilren        if (needsSyncChildren()) {            synchronizeChildren();        }        // write object        out.defaultWriteObject();    } // writeObject(ObjectOutputStream)    /** Deserialize object. */    private void readObject(ObjectInputStream ois)        throws ClassNotFoundException, IOException {        // perform default deseralization        ois.defaultReadObject();        // hardset synchildren - so we don't try to sync -        // it does not make any sense to try to synchildren when we just        // deserialize object.        needsSyncChildren(false);    } // readObject(ObjectInputStream)} // class AttrImpl

⌨️ 快捷键说明

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