| /* |
| * 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); |
| } |
| } |