/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

/*
 * WARNING: because java doesn't support multi-inheritance some code is
 * duplicated. If you're changing this file you probably want to change
 * DeferredAttrNSImpl.java at the same time.
 */

package org.apache.xerces.dom;

Attribute represents an XML-style attribute of an Element. Typically, the allowable values are controlled by its declaration in the Document Type Definition (DTD) governing this kind of document.

If the attribute has not been explicitly assigned a value, but has been declared in the DTD, it will exist and have that default. Only if neither the document nor the DTD specifies a value will the Attribute really be considered absent and have no value; in that case, querying the attribute will return null.

Attributes may have multiple children that contain their data. (XML allows attributes to contain entity references, and tokenized attribute types such as NMTOKENS may have a child for each token.) For convenience, the Attribute object's getValue() method returns the string version of the attribute's value.

Attributes are not children of the Elements they belong to, in the usual sense, and have no valid Parent reference. However, the spec says they _do_ belong to a specific Element, and an INUSE exception is to be thrown if the user attempts to explicitly share them between elements.

Note that Elements do not permit attributes to appear to be shared (see the INUSE exception), so this object's mutability is officially not an issue.

DeferredAttrImpl inherits from AttrImpl which does not support Namespaces. DeferredAttrNSImpl, which inherits from AttrNSImpl, does.

Author:Andy Clark, IBM, Arnaud Le Hors, IBM
See Also:
  • DeferredAttrNSImpl
@xerces.internal
Version:$Id: DeferredAttrImpl.java 447266 2006-09-18 05:57:49Z mrglavas $
Since: PR-DOM-Level-1-19980818.
/** * Attribute represents an XML-style attribute of an * Element. Typically, the allowable values are controlled by its * declaration in the Document Type Definition (DTD) governing this * kind of document. * <P> * If the attribute has not been explicitly assigned a value, but has * been declared in the DTD, it will exist and have that default. Only * if neither the document nor the DTD specifies a value will the * Attribute really be considered absent and have no value; in that * case, querying the attribute will return null. * <P> * Attributes may have multiple children that contain their data. (XML * allows attributes to contain entity references, and tokenized * attribute types such as NMTOKENS may have a child for each token.) * For convenience, the Attribute object's getValue() method returns * the string version of the attribute's value. * <P> * Attributes are not children of the Elements they belong to, in the * usual sense, and have no valid Parent reference. However, the spec * says they _do_ belong to a specific Element, and an INUSE exception * is to be thrown if the user attempts to explicitly share them * between elements. * <P> * Note that Elements do not permit attributes to appear to be shared * (see the INUSE exception), so this object's mutability is * officially not an issue. * <P> * DeferredAttrImpl inherits from AttrImpl which does not support * Namespaces. DeferredAttrNSImpl, which inherits from AttrNSImpl, does. * @see DeferredAttrNSImpl * * @xerces.internal * * @author Andy Clark, IBM * @author Arnaud Le Hors, IBM * @version $Id: DeferredAttrImpl.java 447266 2006-09-18 05:57:49Z mrglavas $ * @since PR-DOM-Level-1-19980818. */
public final class DeferredAttrImpl extends AttrImpl implements DeferredNode { // // Constants //
Serialization version.
/** Serialization version. */
static final long serialVersionUID = 6903232312469148636L; // // Data //
Node index.
/** Node index. */
protected transient int fNodeIndex; // // Constructors //
This is the deferred constructor. Only the fNodeIndex is given here. All other data, can be requested from the ownerDocument via the index.
/** * This is the deferred constructor. Only the fNodeIndex is given here. * All other data, can be requested from the ownerDocument via the index. */
DeferredAttrImpl(DeferredDocumentImpl ownerDocument, int nodeIndex) { super(ownerDocument, null); fNodeIndex = nodeIndex; needsSyncData(true); needsSyncChildren(true); } // <init>(DeferredDocumentImpl,int) // // DeferredNode methods //
Returns the node index.
/** Returns the node index. */
public int getNodeIndex() { return fNodeIndex; } // // Protected methods //
Synchronizes the data (name and value) for fast nodes.
/** Synchronizes the data (name and value) for fast nodes. */
protected void synchronizeData() { // no need to sync in the future needsSyncData(false); // fluff data DeferredDocumentImpl ownerDocument = (DeferredDocumentImpl) ownerDocument(); name = ownerDocument.getNodeName(fNodeIndex); int extra = ownerDocument.getNodeExtra(fNodeIndex); isSpecified((extra & SPECIFIED) != 0); isIdAttribute((extra & ID) != 0); int extraNode = ownerDocument.getLastChild(fNodeIndex); type = ownerDocument.getTypeInfo(extraNode); } // synchronizeData()
Synchronizes the node's children with the internal structure. Fluffing the children at once solves a lot of work to keep the two structures in sync. The problem gets worse when editing the tree -- this makes it a lot easier.
/** * Synchronizes the node's children with the internal structure. * Fluffing the children at once solves a lot of work to keep * the two structures in sync. The problem gets worse when * editing the tree -- this makes it a lot easier. */
protected void synchronizeChildren() { DeferredDocumentImpl ownerDocument = (DeferredDocumentImpl) ownerDocument(); ownerDocument.synchronizeChildren(this, fNodeIndex); } // synchronizeChildren() } // class DeferredAttrImpl