FileDocCategorySizeDatePackage
CharacterDataImpl.javaAPI DocJava SE 6 API14706Tue Jun 10 00:22:36 BST 2008com.sun.org.apache.xerces.internal.dom

CharacterDataImpl

public abstract class CharacterDataImpl extends ChildNode
CharacterData is an abstract Node that can carry character data as its Value. It provides shared behavior for Text, CData, and possibly other node types. All offsets are 0-based.

Since ProcessingInstructionImpl inherits from this class to reuse the setNodeValue method, this class isn't declared as implementing the interface CharacterData. This is done by relevant subclasses (TexImpl, CommentImpl).

This class doesn't directly support mutation events, however, it notifies the document when mutations are performed so that the document class do so.

xerces.internal
version
$Id: CharacterDataImpl.java,v 1.2.6.1 2005/08/30 11:34:20 sunithareddy Exp $
since
PR-DOM-Level-1-19980818.

Fields Summary
static final long
serialVersionUID
Serialization version.
protected String
data
private static transient NodeList
singletonNodeList
Empty child nodes.
Constructors Summary
public CharacterDataImpl()


    //
    // Constructors
    //

     
protected CharacterDataImpl(CoreDocumentImpl ownerDocument, String data)
Factory constructor.

        super(ownerDocument);
        this.data = data;
    
Methods Summary
public voidappendData(java.lang.String data)
Concatenate additional characters onto the end of the data stored in this node. Note that this, and insert(), are the paths by which a DOM could wind up accumulating more data than the language's strings can easily handle. (See above discussion.)

throws
DOMException(NO_MODIFICATION_ALLOWED_ERR) if node is readonly.


    	if (isReadOnly()) {
            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
            throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, msg);
        }
        if (data == null) {
            return;
        }
        if (needsSyncData()) {
            synchronizeData();
        }
        
        setNodeValue(this.data + data);

    
public voiddeleteData(int offset, int count)
Remove a range of characters from the node's value. Throws a DOMException if the offset is beyond the end of the string. However, a deletion _count_ that exceeds the available data is accepted as a delete-to-end request.

throws
DOMException(INDEX_SIZE_ERR) if offset is negative or greater than length, or if count is negative.
throws
DOMException(NO_MODIFICATION_ALLOWED_ERR) if node is readonly.

    	
    	internalDeleteData(offset, count, false);
    
public org.w3c.dom.NodeListgetChildNodes()
Returns an empty node list.

        return singletonNodeList;
    
public java.lang.StringgetData()
Retrieve character data currently stored in this node.

throws
DOMExcpetion(DOMSTRING_SIZE_ERR) In some implementations, the stored data may exceed the permitted length of strings. If so, getData() will throw this DOMException advising the user to instead retrieve the data in chunks via the substring() operation.

        if (needsSyncData()) {
            synchronizeData();
        }
        return data;
    
public intgetLength()
Report number of characters currently stored in this node's data. It may be 0, meaning that the value is an empty string.

   
        if (needsSyncData()) {
            synchronizeData();
        }
        return data.length();
    
public java.lang.StringgetNodeValue()

        if (needsSyncData()) {
            synchronizeData();
        }
        return data;
    
public voidinsertData(int offset, java.lang.String data)
Insert additional characters into the data stored in this node, at the offset specified.

throws
DOMException(INDEX_SIZE_ERR) if offset is negative or greater than length.
throws
DOMException(NO_MODIFICATION_ALLOWED_ERR) if node is readonly.


    	internalInsertData(offset, data, false);
        
    
voidinternalDeleteData(int offset, int count, boolean replace)
NON-DOM INTERNAL: Within DOM actions, we sometimes need to be able to control which mutation events are spawned. This version of the deleteData operation allows us to do so. It is not intended for use by application programs.

        
        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 (count < 0) {
                String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "INDEX_SIZE_ERR", null);
                throw new DOMException(DOMException.INDEX_SIZE_ERR, msg);
            }
        }
        
        if (needsSyncData()) {
            synchronizeData();
        }
        int tailLength = Math.max(data.length() - count - offset, 0);
        try {
            String value = data.substring(0, offset) +
            (tailLength > 0 ? data.substring(offset + count, offset + count + tailLength) : "");            
            
            setNodeValueInternal(value, replace);      
            
            // notify document
            ownerDocument.deletedText(this, offset, count);
        }
        catch (StringIndexOutOfBoundsException e) {
            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "INDEX_SIZE_ERR", null);
            throw new DOMException(DOMException.INDEX_SIZE_ERR, msg);
        }
        
    
voidinternalInsertData(int offset, java.lang.String data, boolean replace)
NON-DOM INTERNAL: Within DOM actions, we sometimes need to be able to control which mutation events are spawned. This version of the insertData operation allows us to do so. It is not intended for use by application programs.

        
        CoreDocumentImpl ownerDocument = ownerDocument();
        
        if (ownerDocument.errorChecking && isReadOnly()) {
            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
            throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, msg);
        }
        
        if (needsSyncData()) {
            synchronizeData();
        }
        try {
            String value =
                new StringBuffer(this.data).insert(offset, data).toString();
            
            
            setNodeValueInternal(value, replace);
            
            // notify document
            ownerDocument.insertedText(this, offset, data.length());
        }
        catch (StringIndexOutOfBoundsException e) {
            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "INDEX_SIZE_ERR", null);
            throw new DOMException(DOMException.INDEX_SIZE_ERR, msg);
        }
        
    
public voidreplaceData(int offset, int count, java.lang.String data)
Replace a series of characters at the specified (zero-based) offset with a new string, NOT necessarily of the same length. Convenience method, equivalent to a delete followed by an insert. Throws a DOMException if the specified offset is beyond the end of the existing data.

param
offset The offset at which to begin replacing.
param
count The number of characters to remove, interpreted as in the delete() method.
param
data The new string to be inserted at offset in place of the removed data. Note that the entire string will be inserted -- the count parameter does not affect insertion, and the new data may be longer or shorter than the substring it replaces.
throws
DOMException(INDEX_SIZE_ERR) if offset is negative or greater than length, or if count is negative.
throws
DOMException(NO_MODIFICATION_ALLOWED_ERR) if node is readonly.

        
        CoreDocumentImpl ownerDocument = ownerDocument();
        
        // The read-only check is done by deleteData()
        // ***** This could be more efficient w/r/t Mutation Events,
        // specifically by aggregating DOMAttrModified and
        // DOMSubtreeModified. But mutation events are 
        // underspecified; I don't feel compelled
        // to deal with it right now.
        if (ownerDocument.errorChecking && isReadOnly()) {
            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
            throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, msg);
        }
        
        if (needsSyncData()) {
            synchronizeData();
        }
        
        //notify document
        ownerDocument.replacingData(this);
        
        // keep old value for document notification
        String oldvalue = this.data;
        
        internalDeleteData(offset, count, true);
        internalInsertData(offset, data, true);
        
        ownerDocument.replacedCharacterData(this, oldvalue, this.data);
        
    
public voidsetData(java.lang.String value)
Store character data into this node.

throws
DOMException(NO_MODIFICATION_ALLOWED_ERR) if node is readonly.

        setNodeValue(value);
    
public voidsetNodeValue(java.lang.String value)
Sets the content, possibly firing related events, and updating ranges (via notification to the document)


        setNodeValueInternal(value);

        // notify document
        ownerDocument().replacedText(this);
    
protected voidsetNodeValueInternal(java.lang.String value)
Convenience wrapper for calling setNodeValueInternal when we are not performing a replacement operation

    	setNodeValueInternal(value, false);
    
protected voidsetNodeValueInternal(java.lang.String value, boolean replace)
This function added so that we can distinguish whether setNodeValue has been called from some other DOM functions. or by the client.

This is important, because we do one type of Range fix-up, from the high-level functions in CharacterData, and another type if the client simply calls setNodeValue(value).

        
        CoreDocumentImpl ownerDocument = ownerDocument();
        
        if (ownerDocument.errorChecking && isReadOnly()) {
            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null);
            throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, msg);
        }
        
        // revisit: may want to set the value in ownerDocument.
        // Default behavior, overridden in some subclasses
        if (needsSyncData()) {
            synchronizeData();
        }
        
        // keep old value for document notification
        String oldvalue = this.data;
        
        // notify document
        ownerDocument.modifyingCharacterData(this, replace);
        
        this.data = value;
        
        // notify document
        ownerDocument.modifiedCharacterData(this, oldvalue, value, replace);
    
public java.lang.StringsubstringData(int offset, int count)
Substring is more than a convenience function. In some implementations of the DOM, where the stored data may exceed the length that can be returned in a single string, the only way to read it all is to extract it in chunks via this method.

param
offset Zero-based offset of first character to retrieve.
param
count Number of characters to retrieve. If the sum of offset and count exceeds the length, all characters to end of data are returned.
throws
DOMException(INDEX_SIZE_ERR) if offset is negative or greater than length, or if count is negative.
throws
DOMException(WSTRING_SIZE_ERR) In some implementations, count may exceed the permitted length of strings. If so, substring() will throw this DOMException advising the user to instead retrieve the data in smaller chunks.


        if (needsSyncData()) {
            synchronizeData();
        }
        
        int length = data.length();
        if (count < 0 || offset < 0 || offset > length - 1) {
            String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "INDEX_SIZE_ERR", null);
            throw new DOMException(DOMException.INDEX_SIZE_ERR, msg);
        }

        int tailIndex = Math.min(offset + count, length);

        return data.substring(offset, tailIndex);