blob: 2e69e203ca88068d1910c0affabe2c67be58a87d [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed 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.
*/
package com.google.gwt.xml.client.impl;
import com.google.gwt.core.client.JavaScriptException;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.xml.client.DOMException;
import com.google.gwt.xml.client.Document;
import com.google.gwt.xml.client.NamedNodeMap;
import com.google.gwt.xml.client.Node;
import com.google.gwt.xml.client.NodeList;
/**
* This class wraps the native Node object.
*/
class NodeImpl extends DOMItem implements Node {
/**
* This method creates a new node of the correct type.
*
* @param node - the supplied DOM JavaScript object
* @return a Node object that corresponds to the DOM object
*/
static Node build(JavaScriptObject node) {
if (node == null) {
return null;
}
short nodeType = XMLParserImpl.getNodeType(node);
switch (nodeType) {
case Node.ATTRIBUTE_NODE:
return new AttrImpl(node);
case Node.CDATA_SECTION_NODE:
return new CDATASectionImpl(node);
case Node.COMMENT_NODE:
return new CommentImpl(node);
case Node.DOCUMENT_FRAGMENT_NODE:
return new DocumentFragmentImpl(node);
case Node.DOCUMENT_NODE:
return new DocumentImpl(node);
case Node.ELEMENT_NODE:
return new ElementImpl(node);
case Node.PROCESSING_INSTRUCTION_NODE:
return new ProcessingInstructionImpl(node);
case Node.TEXT_NODE:
return new TextImpl(node);
default:
return new NodeImpl(node);
}
}
/**
* creates a new NodeImpl from the supplied JavaScriptObject.
*
* @param jso - the DOM node JavaScriptObject
*/
protected NodeImpl(JavaScriptObject jso) {
super(jso);
}
/**
* This function delegates to the native method <code>appendChild</code> in
* XMLParserImpl.
*/
public Node appendChild(Node newChild) {
try {
final JavaScriptObject newChildJs = ((DOMItem) newChild).getJsObject();
final JavaScriptObject appendChildResults = XMLParserImpl.appendChild(
this.getJsObject(), newChildJs);
return NodeImpl.build(appendChildResults);
} catch (JavaScriptException e) {
throw new DOMNodeException(DOMException.INVALID_MODIFICATION_ERR, e, this);
}
}
/**
* This function delegates to the native method <code>cloneNode</code> in
* XMLParserImpl.
*/
public Node cloneNode(boolean deep) {
return NodeImpl.build(XMLParserImpl.cloneNode(this.getJsObject(), deep));
}
public NamedNodeMap getAttributes() {
return new NamedNodeMapImpl(XMLParserImpl.getAttributes(this.getJsObject()));
}
public NodeList getChildNodes() {
return new NodeListImpl(XMLParserImpl.getChildNodes(this.getJsObject()));
}
public Node getFirstChild() {
return getChildNodes().item(0);
}
public Node getLastChild() {
return getChildNodes().item(getChildNodes().getLength() - 1);
}
/**
* This function delegates to the native method <code>getNamespaceURI</code>
* in XMLParserImpl.
*/
public String getNamespaceURI() {
return XMLParserImpl.getNamespaceURI(this.getJsObject());
}
public Node getNextSibling() {
return NodeImpl.build(XMLParserImpl.getNextSibling(this.getJsObject()));
}
public String getNodeName() {
return XMLParserImpl.getNodeName(this.getJsObject());
}
public short getNodeType() {
return XMLParserImpl.getNodeType(this.getJsObject());
}
public String getNodeValue() {
return XMLParserImpl.getNodeValue(this.getJsObject());
}
public Document getOwnerDocument() {
return (Document) NodeImpl.build(XMLParserImpl.getOwnerDocument(this.getJsObject()));
}
public Node getParentNode() {
return NodeImpl.build(XMLParserImpl.getParentNode(this.getJsObject()));
}
/**
* This function delegates to the native method <code>getPrefix</code> in
* XMLParserImpl.
*/
public String getPrefix() {
return XMLParserImpl.getPrefix(this.getJsObject());
}
public Node getPreviousSibling() {
return NodeImpl.build(XMLParserImpl.getPreviousSibling(this.getJsObject()));
}
/**
* This function delegates to the native method <code>hasAttributes</code>
* in XMLParserImpl.
*/
public boolean hasAttributes() {
return XMLParserImpl.hasAttributes(this.getJsObject());
}
/**
* This function delegates to the native method <code>hasChildNodes</code>
* in XMLParserImpl.
*/
public boolean hasChildNodes() {
return XMLParserImpl.hasChildNodes(this.getJsObject());
}
/**
* This function delegates to the native method <code>insertBefore</code> in
* XMLParserImpl.
*/
public Node insertBefore(Node newChild, Node refChild) {
try {
final JavaScriptObject newChildJs = ((DOMItem) newChild).getJsObject();
final JavaScriptObject refChildJs;
if (refChild != null) {
refChildJs = ((DOMItem) refChild).getJsObject();
} else {
refChildJs = null;
}
final JavaScriptObject insertBeforeResults = XMLParserImpl.insertBefore(
this.getJsObject(), newChildJs, refChildJs);
return NodeImpl.build(insertBeforeResults);
} catch (JavaScriptException e) {
throw new DOMNodeException(DOMException.INVALID_MODIFICATION_ERR, e, this);
}
}
/**
* This function delegates to the native method <code>normalize</code> in
* XMLParserImpl.
*/
public void normalize() {
XMLParserImpl.normalize(this.getJsObject());
}
/**
* This function delegates to the native method <code>removeChild</code> in
* XMLParserImpl.
*/
public Node removeChild(Node oldChild) {
try {
final JavaScriptObject oldChildJs = ((DOMItem) oldChild).getJsObject();
final JavaScriptObject removeChildResults = XMLParserImpl.removeChild(
this.getJsObject(), oldChildJs);
return NodeImpl.build(removeChildResults);
} catch (JavaScriptException e) {
throw new DOMNodeException(DOMException.INVALID_MODIFICATION_ERR, e, this);
}
}
/**
* This function delegates to the native method <code>replaceChild</code> in
* XMLParserImpl.
*/
public Node replaceChild(Node newChild, Node oldChild) {
try {
final JavaScriptObject newChildJs = ((DOMItem) newChild).getJsObject();
final JavaScriptObject oldChildJs = ((DOMItem) oldChild).getJsObject();
final JavaScriptObject replaceChildResults = XMLParserImpl.replaceChild(
this.getJsObject(), newChildJs, oldChildJs);
return NodeImpl.build(replaceChildResults);
} catch (JavaScriptException e) {
throw new DOMNodeException(DOMException.INVALID_MODIFICATION_ERR, e, this);
}
}
/**
* This function delegates to the native method <code>setNodeValue</code> in
* XMLParserImpl.
*/
public void setNodeValue(String nodeValue) {
try {
XMLParserImpl.setNodeValue(this.getJsObject(), nodeValue);
} catch (JavaScriptException e) {
throw new DOMNodeException(DOMException.INVALID_MODIFICATION_ERR, e, this);
}
}
@Override
public String toString() {
return XMLParserImpl.getInstance().toStringImpl(this);
}
}