/* * 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.GWT; import com.google.gwt.core.client.JavaScriptException; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.xml.client.Document; /** * Native implementation associated with * {@link com.google.gwt.xml.client.XMLParser}. */ public abstract class XMLParserImpl { private static XMLParserImpl impl = GWT.create(XMLParserImpl.class); public static XMLParserImpl getInstance() { return impl; } static native JavaScriptObject appendChild(JavaScriptObject jsObject, JavaScriptObject newChildJs) /*-{ return jsObject.appendChild(newChildJs); }-*/; static native void appendData(JavaScriptObject jsObject, String arg) /*-{ jsObject.appendData(arg); }-*/; static native JavaScriptObject cloneNode(JavaScriptObject jsObject, boolean deep) /*-{ return jsObject.cloneNode(deep); }-*/; static native JavaScriptObject createCDATASection(JavaScriptObject jsObject, String data) /*-{ return jsObject.createCDATASection(data); }-*/; static native JavaScriptObject createComment(JavaScriptObject jsObject, String data) /*-{ return jsObject.createComment(data); }-*/; static native JavaScriptObject createDocumentFragment( JavaScriptObject jsObject) /*-{ return jsObject.createDocumentFragment(); }-*/; static native JavaScriptObject createElement(JavaScriptObject jsObject, String tagName) /*-{ return jsObject.createElement(tagName); }-*/; static native JavaScriptObject createProcessingInstruction( JavaScriptObject jsObject, String target, String data) /*-{ return jsObject.createProcessingInstruction(target, data); }-*/; static native JavaScriptObject createTextNode(JavaScriptObject jsObject, String data) /*-{ return jsObject.createTextNode(data); }-*/; static native void deleteData(JavaScriptObject jsObject, int offset, int count) /*-{ jsObject.deleteData(offset, count); }-*/; static native String getAttribute(JavaScriptObject o, String name) /*-{ return o.getAttribute(name); }-*/; static native JavaScriptObject getAttributeNode(JavaScriptObject o, String name) /*-{ return o.getAttributeNode(name); }-*/; static native JavaScriptObject getAttributes(JavaScriptObject t) /*-{ return t.attributes; }-*/; static native JavaScriptObject getChildNodes(JavaScriptObject t) /*-{ return t.childNodes; }-*/; static native String getData(JavaScriptObject o) /*-{ return o.data; }-*/; static native JavaScriptObject getDocumentElement(JavaScriptObject o) /*-{ return o.documentElement; }-*/; static JavaScriptObject getElementById(JavaScriptObject document, String id) { return impl.getElementByIdImpl(document, id); } static JavaScriptObject getElementsByTagName(JavaScriptObject o, String tagName) { return impl.getElementsByTagNameImpl(o, tagName); } static native int getLength(JavaScriptObject o) /*-{ return o.length; }-*/; static native String getName(JavaScriptObject o) /*-{ return o.name; }-*/; static native JavaScriptObject getNamedItem(JavaScriptObject t, String name) /*-{ return t.getNamedItem(name); }-*/; static native String getNamespaceURI(JavaScriptObject jsObject) /*-{ return jsObject.namespaceURI; }-*/; static native JavaScriptObject getNextSibling(JavaScriptObject o) /*-{ return o.nextSibling; }-*/; static native String getNodeName(JavaScriptObject o) /*-{ return o.nodeName; }-*/; static native short getNodeType(JavaScriptObject jsObject) /*-{ var out = jsObject.nodeType; return (out == null) ? -1 : out; }-*/; static native String getNodeValue(JavaScriptObject o) /*-{ return o.nodeValue; }-*/; static native JavaScriptObject getOwnerDocument(JavaScriptObject o) /*-{ return o.ownerDocument; }-*/; static native JavaScriptObject getParentNode(JavaScriptObject o) /*-{ return o.parentNode; }-*/; static String getPrefix(JavaScriptObject jsObject) { return impl.getPrefixImpl(jsObject); } static native JavaScriptObject getPreviousSibling(JavaScriptObject o) /*-{ return o.previousSibling; }-*/; static native boolean getSpecified(JavaScriptObject o) /*-{ return o.specified; }-*/; static native String getTagName(JavaScriptObject o) /*-{ return o.tagName; }-*/; static native String getTarget(JavaScriptObject o) /*-{ return o.target; }-*/; static native String getValue(JavaScriptObject o) /*-{ return o.value; }-*/; static native boolean hasAttributes(JavaScriptObject jsObject) /*-{ return jsObject.attributes.length != 0; }-*/; static native boolean hasChildNodes(JavaScriptObject jsObject) /*-{ return jsObject.hasChildNodes(); }-*/; static JavaScriptObject importNode(JavaScriptObject jsObject, JavaScriptObject importedNode, boolean deep) { return impl.importNodeImpl(jsObject, importedNode, deep); } static native JavaScriptObject insertBefore(JavaScriptObject jsObject, JavaScriptObject newChildJs, JavaScriptObject refChildJs) /*-{ return jsObject.insertBefore(newChildJs, refChildJs); }-*/; static native void insertData(JavaScriptObject jsObject, int offset, String arg) /*-{ jsObject.insertData(offset, arg); }-*/; static native JavaScriptObject item(JavaScriptObject t, int index) /*-{ if (index >= t.length) { return null; } return t.item(index); }-*/; static native void normalize(JavaScriptObject jsObject) /*-{ jsObject.normalize(); }-*/; static native void removeAttribute(JavaScriptObject jsObject, String name) /*-{ jsObject.removeAttribute(name); }-*/; static native JavaScriptObject removeChild(JavaScriptObject jsObject, JavaScriptObject oldChildJs) /*-{ return jsObject.removeChild(oldChildJs); }-*/; static native JavaScriptObject removeNamedItem(JavaScriptObject jsObject, String name) /*-{ return jsObject.removeNamedItem(name); }-*/; static native JavaScriptObject replaceChild(JavaScriptObject jsObject, JavaScriptObject newChildJs, JavaScriptObject oldChildJs) /*-{ return jsObject.replaceChild(newChildJs, oldChildJs); }-*/; static native void replaceData(JavaScriptObject jsObject, int offset, int count, String arg) /*-{ jsObject.replaceData(offset, count, arg); }-*/; static native void setAttribute(JavaScriptObject jsObject, String name, String value) /*-{ jsObject.setAttribute(name, value); }-*/; static native void setData(JavaScriptObject jsObject, String data) /*-{ jsObject.data = data; }-*/; static native JavaScriptObject setNamedItem(JavaScriptObject jsObject, JavaScriptObject arg) /*-{ return jsObject.setNamedItem(arg); }-*/; static native void setNodeValue(JavaScriptObject jsObject, String nodeValue) /*-{ jsObject.nodeValue = nodeValue; }-*/; static native JavaScriptObject splitText(JavaScriptObject jsObject, int offset) /*-{ return jsObject.splitText(offset); }-*/; static native String substringData(JavaScriptObject o, int offset, int count) /*-{ return o.substringData(offset, count); }-*/; /** * Not globally instantable. */ XMLParserImpl() { } public final Document createDocument() { return (Document) NodeImpl.build(createDocumentImpl()); } public final Document parse(String contents) { try { return (Document) NodeImpl.build(parseImpl(contents)); } catch (JavaScriptException e) { throw new DOMParseException(contents, e); } } public boolean supportsCDATASection() { return true; } protected abstract JavaScriptObject createDocumentImpl(); protected abstract JavaScriptObject getElementByIdImpl( JavaScriptObject document, String id); protected abstract JavaScriptObject getElementsByTagNameImpl( JavaScriptObject o, String tagName); protected abstract String getPrefixImpl(JavaScriptObject jsObject); protected abstract JavaScriptObject importNodeImpl(JavaScriptObject jsObject, JavaScriptObject importedNode, boolean deep); protected abstract JavaScriptObject parseImpl(String contents); abstract String toStringImpl(ProcessingInstructionImpl node); abstract String toStringImpl(NodeImpl node); }