FileDocCategorySizeDatePackage
TextImpl.javaAPI DocJava SE 5 API12359Fri Aug 26 14:55:44 BST 2005com.sun.org.apache.xerces.internal.dom

TextImpl

public class TextImpl extends CharacterDataImpl implements CharacterData, Text
Text nodes hold the non-markup, non-Entity content of an Element or Attribute.

When a document is first made available to the DOM, there is only one Text object for each block of adjacent plain-text. Users (ie, applications) may create multiple adjacent Texts during editing -- see {@link org.w3c.dom.Element#normalize} for discussion.

Note that CDATASection is a subclass of Text. This is conceptually valid, since they're really just two different ways of quoting characters when they're written out as part of an XML stream.

version
$Id: TextImpl.java,v 1.22 2004/02/10 17:09:45 elena Exp $
since
PR-DOM-Level-1-19980818.

Fields Summary
static final long
serialVersionUID
Serialization version.
Constructors Summary
public TextImpl()
Default constructor

        
    //
    // Constructors
    //

       
     
public TextImpl(CoreDocumentImpl ownerDoc, String data)
Factory constructor.

        super(ownerDoc, data);
    
Methods Summary
private booleancanModify(org.w3c.dom.Node node)
If any EntityReference to be removed has descendants that are not EntityReference, Text, or CDATASection nodes, the replaceWholeText method must fail before performing any modification of the document, raising a DOMException with the code NO_MODIFICATION_ALLOWED_ERR.

param
node
return
true - can replace text false - can't replace exception must be raised

        while (node != null) {
            short type = node.getNodeType();
            if (type == Node.ENTITY_REFERENCE_NODE) {
                if (!canModify(node.getFirstChild())){
                    return false;
                }
            }
            else if (type != Node.TEXT_NODE && 
                     type != Node.CDATA_SECTION_NODE) {
                return false;
            }

            node = node.getNextSibling();
        }
        return true;
    
public java.lang.StringgetNodeName()
Returns the node name.

        return "#text";
    
public shortgetNodeType()
A short integer indicating what type of node this is. The named constants for this value are defined in the org.w3c.dom.Node interface.

        return Node.TEXT_NODE;
    
public java.lang.StringgetWholeText()
DOM Level 3 WD - Experimental. Returns all text of Text nodes logically-adjacent text nodes to this node, concatenated in document order.

since
DOM Level 3

        
        if (needsSyncData()) {
            synchronizeData();
        }
        if (nextSibling == null) {
            return data;
        }
        if (fBufferStr == null){
            fBufferStr = new StringBuffer();
        }
        else {
            fBufferStr.setLength(0);
        }
        if (data != null && data.length() != 0) {
            fBufferStr.append(data);
        }
        getWholeText(nextSibling, fBufferStr);
        return fBufferStr.toString();
    
    
private booleangetWholeText(org.w3c.dom.Node node, java.lang.StringBuffer buffer)
Concatenates the text of all logically-adjacent text nodes

param
node
param
buffer
return
true - if execution was stopped because the type of node other than EntityRef, Text, CDATA is encountered, otherwise return false

        String text;
        while (node != null) {
            short type = node.getNodeType();
            if (type == Node.ENTITY_REFERENCE_NODE) {
                if (getWholeText(node.getFirstChild(), buffer)){
                    return true;
                }
            }
            else if (type == Node.TEXT_NODE || 
                     type == Node.CDATA_SECTION_NODE) {
                ((NodeImpl)node).getTextContent(buffer);
            }
            else {
                return true; 
            }

            node = node.getNextSibling();
        }
        return false;
    
public booleanisElementContentWhitespace()
DOM L3 Core CR - Experimental Returns whether this text node contains element content whitespace, often abusively called "ignorable whitespace". The text node is determined to contain whitespace in element content during the load of the document or if validation occurs while using Document.normalizeDocument().

since
DOM Level 3

        // REVISIT: is this implemenation correct?
        if (needsSyncData()) {
            synchronizeData();
        }
        return internalIsIgnorableWhitespace();
    
public booleanisIgnorableWhitespace()
NON-DOM: Returns whether this Text is ignorable whitespace.


        if (needsSyncData()) {
            synchronizeData();
        }
        return internalIsIgnorableWhitespace();

    
public java.lang.StringremoveData()
NON-DOM (used by DOMParser: Sets data to empty string. Returns the value the data was set to.

        String olddata=data;
        data = "";
        return olddata;
    
public voidreplaceData(java.lang.String value)
NON-DOM (used by DOMParser): Reset data for the node.

        data = value;
    
public org.w3c.dom.TextreplaceWholeText(java.lang.String content)
DOM Level 3 WD - Experimental.


        if (needsSyncData()) {
            synchronizeData();
        }

        // make sure we can make the replacement
        if (!canModify(nextSibling)) {
            throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, 
                DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null));
        }

        Node parent = this.getParentNode();
        if (content == null || content.length() == 0) {
            // remove current node
            if (parent !=null) { // check if node in the tree 
                parent.removeChild(this);
                return null;
            }
        }
        Text currentNode = null;
    	if (isReadOnly()){
            Text newNode = this.ownerDocument().createTextNode(content);
            if (parent !=null) { // check if node in the tree                
                parent.insertBefore(newNode, this);
                parent.removeChild(this);
                currentNode = newNode;
            } else {
                return newNode;
            }
        }  else {
            this.setData(content);
            currentNode = this;
        }
        Node sibling =  currentNode.getNextSibling();
        while ( sibling !=null) {
            parent.removeChild(sibling);
            sibling = currentNode.getNextSibling();
        }

        return currentNode;
    
public voidsetIgnorableWhitespace(boolean ignore)
NON-DOM: Set whether this Text is ignorable whitespace.


        if (needsSyncData()) {
            synchronizeData();
        }
        isIgnorableWhitespace(ignore);

    
public voidsetValues(com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl ownerDoc, java.lang.String data)
NON-DOM: resets node and sets specified values for the current node

param
ownerDoc
param
data


        flags=0;
        nextSibling = null;
        previousSibling=null;
        setOwnerDocument(ownerDoc);
        super.data = data;
    
public org.w3c.dom.TextsplitText(int offset)
Break a text node into two sibling nodes. (Note that if the current node has no parent, they won't wind up as "siblings" -- they'll both be orphans.)

param
offset The offset at which to split. If offset is at the end of the available data, the second node will be empty.
return
A reference to the new node (containing data after the offset point). The original node will contain data up to that point.
throws
DOMException(INDEX_SIZE_ERR) if offset is <0 or >length.
throws
DOMException(NO_MODIFICATION_ALLOWED_ERR) if node is read-only.


    	if (isReadOnly()) {
            throw new DOMException(
    		DOMException.NO_MODIFICATION_ALLOWED_ERR, 
                DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null));
        }

        if (needsSyncData()) {
            synchronizeData();
        }
    	if (offset < 0 || offset > data.length() ) {
            throw new DOMException(DOMException.INDEX_SIZE_ERR, 
                DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "INDEX_SIZE_ERR", null));
        }
    		
        // split text into two separate nodes
    	Text newText =
            getOwnerDocument().createTextNode(data.substring(offset));
    	setNodeValue(data.substring(0, offset));

        // insert new text node
        Node parentNode = getParentNode();
    	if (parentNode != null) {
    		parentNode.insertBefore(newText, nextSibling);
        }

    	return newText;