blob: 4a817e07b4a7ed8f1761acd60615d4a2b9315be9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2010 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.Comment;
import org.w3c.dom.DOMException;
import org.w3c.dom.Node;
import org.w3c.dom.UserDataHandler;
/**
* CommentImpl class
*/
public class CommentImpl extends CharacterDataImpl implements Comment {
private boolean isJSPTag = false;
/**
* CommentImpl constructor
*/
protected CommentImpl() {
super();
}
/**
* CommentImpl constructor
*
* @param that
* CommentImpl
*/
protected CommentImpl(CommentImpl that) {
super(that);
if (that != null) {
this.isJSPTag = that.isJSPTag;
}
}
/**
* cloneNode method
*
* @return org.w3c.dom.Node
* @param deep
* boolean
*/
public Node cloneNode(boolean deep) {
CommentImpl cloned = new CommentImpl(this);
notifyUserDataHandlers(UserDataHandler.NODE_CLONED, cloned);
return cloned;
}
/**
* getData method
*
* @return java.lang.String
*/
public String getData() throws DOMException {
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_COMMENT_OPEN || regionType == DOMRegionContext.XML_COMMENT_CLOSE || isNestedCommentOpenClose(regionType)) {
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 "#comment";//$NON-NLS-1$
}
/**
* getNodeType method
*
* @return short
*/
public short getNodeType() {
return COMMENT_NODE;
}
/**
*/
public boolean isClosed() {
IStructuredDocumentRegion flatNode = getStructuredDocumentRegion();
if (flatNode == null)
return true; // will be generated
String regionType = StructuredDocumentRegionUtil.getLastRegionType(flatNode);
return (regionType == DOMRegionContext.XML_COMMENT_CLOSE || isNestedCommentClose(regionType));
}
/**
* Subclasses must override
* @param regionType
* @return
*/
protected boolean isNestedCommentClose(String regionType) {
boolean result = false;
return result;
}
/**
* Subclasses must override
* @param regionType
* @return
*/
protected boolean isNestedCommentOpenClose(String regionType) {
boolean result = false;
return result;
}
public boolean isJSPTag() {
return this.isJSPTag;
}
/**
* setJSPTag method
*
* @param isJSPTag
* boolean
*/
public void setJSPTag(boolean isJSPTag) {
if (isJSPTag == this.isJSPTag)
return;
if (!isDataEditable()) {
throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
}
DocumentImpl document = (DocumentImpl) getOwnerDocument();
if (isJSPTag) {
if (document == null || !document.isJSPType())
return;
}
this.isJSPTag = isJSPTag;
if (getContainerDocument() != null) {
// already in the tree, update IStructuredDocument
setData(getData()); // calls notifyValueChanged();
}
}
}