blob: 1a3ad5748dbe84055c771cff4b80707f60341aaf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*
* Jens Lukowski/Innoopract - initial renaming/restructuring
*
* Balazs Banfai: Bug 154737 getUserData/setUserData support for Node
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=154737
*
* David Carver (STAR) - bug 296999 - Inefficient use of new String()
*******************************************************************************/
package org.eclipse.wst.xml.core.internal.document;
import java.util.Iterator;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
import org.w3c.dom.CDATASection;
import org.w3c.dom.DOMException;
import org.w3c.dom.Node;
import org.w3c.dom.UserDataHandler;
/**
* CDATASectionImpl class
*/
public class CDATASectionImpl extends TextImpl implements CDATASection {
/**
* CDATASectionImpl constructor
*/
protected CDATASectionImpl() {
super();
}
/**
* CDATASectionImpl constructor
*
* @param that
* CDATASectionImpl
*/
protected CDATASectionImpl(CDATASectionImpl that) {
super(that);
}
/**
* cloneNode method
*
* @return org.w3c.dom.Node
* @param deep
* boolean
*/
public Node cloneNode(boolean deep) {
CDATASectionImpl cloned = new CDATASectionImpl(this);
notifyUserDataHandlers(UserDataHandler.NODE_CLONED, cloned);
return cloned;
}
/**
* getData method
*
* @return java.lang.String
*/
public String getData() throws DOMException {
// instead of super(TextImpl).getData(), call getCharacterData()
char[] data = getCharacterData();
if (data == null) {
String sdata = getData(getStructuredDocumentRegion());
if (sdata != null)
return sdata;
return NodeImpl.EMPTY_STRING;
}
return new String(data);
}
/**
*/
private String getData(IStructuredDocumentRegion flatNode) {
if (flatNode == null)
return null;
ITextRegionList regions = flatNode.getRegions();
if (regions == null)
return null;
ITextRegion contentRegion = null;
StringBuffer buffer = null;
Iterator e = regions.iterator();
while (e.hasNext()) {
ITextRegion region = (ITextRegion) e.next();
String regionType = region.getType();
if (regionType == DOMRegionContext.XML_CDATA_OPEN || regionType == DOMRegionContext.XML_CDATA_CLOSE) {
continue;
}
if (contentRegion == null) { // first content
contentRegion = region;
} else { // multiple contents
if (buffer == null) {
buffer = new StringBuffer(flatNode.getText(contentRegion));
}
buffer.append(flatNode.getText(region));
}
}
if (buffer != null)
return buffer.toString();
if (contentRegion != null)
return flatNode.getText(contentRegion);
return null;
}
/**
* getNodeName method
*
* @return java.lang.String
*/
public String getNodeName() {
return "#cdata-section";//$NON-NLS-1$
}
/**
* getNodeType method
*
* @return short
*/
public short getNodeType() {
return CDATA_SECTION_NODE;
}
/**
*/
public boolean isClosed() {
IStructuredDocumentRegion flatNode = getStructuredDocumentRegion();
if (flatNode == null)
return true; // will be generated
String regionType = StructuredDocumentRegionUtil.getLastRegionType(flatNode);
return (regionType == DOMRegionContext.XML_CDATA_CLOSE);
}
}