| /* DomHTMLDocument.java -- |
| Copyright (C) 2005 Free Software Foundation, Inc. |
| |
| This file is part of GNU Classpath. |
| |
| GNU Classpath is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2, or (at your option) |
| any later version. |
| |
| GNU Classpath is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GNU Classpath; see the file COPYING. If not, write to the |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| 02110-1301 USA. |
| |
| Linking this library statically or dynamically with other modules is |
| making a combined work based on this library. Thus, the terms and |
| conditions of the GNU General Public License cover the whole |
| combination. |
| |
| As a special exception, the copyright holders of this library give you |
| permission to link this library with independent modules to produce an |
| executable, regardless of the license terms of these independent |
| modules, and to copy and distribute the resulting executable under |
| terms of your choice, provided that you also meet, for each linked |
| independent module, the terms and conditions of the license of that |
| module. An independent module is a module which is not derived from |
| or based on this library. If you modify this library, you may extend |
| this exception to your version of the library, but you are not |
| obligated to do so. If you do not wish to do so, delete this |
| exception statement from your version. */ |
| |
| package gnu.xml.dom.html2; |
| |
| import gnu.xml.dom.DomDocument; |
| import gnu.xml.dom.DomDOMException; |
| import java.lang.reflect.Constructor; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.Map; |
| import java.util.Set; |
| import org.w3c.dom.DOMException; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Node; |
| import org.w3c.dom.NodeList; |
| import org.w3c.dom.html2.HTMLCollection; |
| import org.w3c.dom.html2.HTMLDocument; |
| import org.w3c.dom.html2.HTMLElement; |
| |
| /** |
| * An HTML document. |
| * This is the factory object used to create HTML elements. |
| * |
| * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> |
| */ |
| public class DomHTMLDocument |
| extends DomDocument |
| implements HTMLDocument |
| { |
| |
| private static final Class[] ELEMENT_PT = new Class[] { |
| DomHTMLDocument.class, |
| String.class, |
| String.class |
| }; |
| |
| private static Map ELEMENT_CLASSES; |
| static |
| { |
| Map map = new HashMap(); |
| map.put("a", DomHTMLAnchorElement.class); |
| map.put("applet", DomHTMLAppletElement.class); |
| map.put("area", DomHTMLAreaElement.class); |
| map.put("base", DomHTMLBaseElement.class); |
| map.put("basefont", DomHTMLBaseFontElement.class); |
| map.put("body", DomHTMLBodyElement.class); |
| map.put("br", DomHTMLBRElement.class); |
| map.put("button", DomHTMLButtonElement.class); |
| map.put("dir", DomHTMLDirectoryElement.class); |
| map.put("div", DomHTMLDivElement.class); |
| map.put("dlist", DomHTMLDListElement.class); |
| map.put("embed", DomHTMLEmbedElement.class); |
| map.put("fieldset", DomHTMLFieldSetElement.class); |
| map.put("font", DomHTMLFontElement.class); |
| map.put("form", DomHTMLFormElement.class); |
| map.put("frame", DomHTMLFrameElement.class); |
| map.put("frameset", DomHTMLFrameSetElement.class); |
| map.put("head", DomHTMLHeadElement.class); |
| map.put("h1", DomHTMLHeadingElement.class); |
| map.put("h2", DomHTMLHeadingElement.class); |
| map.put("h3", DomHTMLHeadingElement.class); |
| map.put("h4", DomHTMLHeadingElement.class); |
| map.put("h5", DomHTMLHeadingElement.class); |
| map.put("h6", DomHTMLHeadingElement.class); |
| map.put("html", DomHTMLHtmlElement.class); |
| map.put("iframe", DomHTMLIFrameElement.class); |
| map.put("img", DomHTMLImageElement.class); |
| map.put("input", DomHTMLInputElement.class); |
| map.put("isindex", DomHTMLIsIndexElement.class); |
| map.put("label", DomHTMLLabelElement.class); |
| map.put("legend", DomHTMLLegendElement.class); |
| map.put("li", DomHTMLLIElement.class); |
| map.put("link", DomHTMLLinkElement.class); |
| map.put("map", DomHTMLMapElement.class); |
| map.put("menu", DomHTMLMenuElement.class); |
| map.put("meta", DomHTMLMetaElement.class); |
| map.put("ins", DomHTMLModElement.class); |
| map.put("del", DomHTMLModElement.class); |
| map.put("object", DomHTMLObjectElement.class); |
| map.put("ol", DomHTMLOListElement.class); |
| map.put("optgroup", DomHTMLOptGroupElement.class); |
| map.put("option", DomHTMLOptionElement.class); |
| map.put("p", DomHTMLParagraphElement.class); |
| map.put("param", DomHTMLParamElement.class); |
| map.put("pre", DomHTMLPreElement.class); |
| map.put("q", DomHTMLQuoteElement.class); |
| map.put("blockquote", DomHTMLQuoteElement.class); |
| map.put("script", DomHTMLScriptElement.class); |
| map.put("select", DomHTMLSelectElement.class); |
| map.put("style", DomHTMLStyleElement.class); |
| map.put("caption", DomHTMLTableCaptionElement.class); |
| map.put("th", DomHTMLTableCellElement.class); |
| map.put("td", DomHTMLTableCellElement.class); |
| map.put("col", DomHTMLTableColElement.class); |
| map.put("colgroup", DomHTMLTableColElement.class); |
| map.put("table", DomHTMLTableElement.class); |
| map.put("tr", DomHTMLTableRowElement.class); |
| map.put("thead", DomHTMLTableSectionElement.class); |
| map.put("tfoot", DomHTMLTableSectionElement.class); |
| map.put("tbody", DomHTMLTableSectionElement.class); |
| map.put("textarea", DomHTMLTextAreaElement.class); |
| map.put("title", DomHTMLTitleElement.class); |
| map.put("ul", DomHTMLUListElement.class); |
| ELEMENT_CLASSES = Collections.unmodifiableMap(map); |
| } |
| |
| private static Set HTML_NS_URIS; |
| static |
| { |
| Set set = new HashSet(); |
| set.add("http://www.w3.org/TR/html4/strict"); |
| set.add("http://www.w3.org/TR/html4/loose"); |
| set.add("http://www.w3.org/TR/html4/frameset"); |
| set.add("http://www.w3.org/1999/xhtml"); |
| set.add("http://www.w3.org/TR/xhtml1/strict"); |
| set.add("http://www.w3.org/TR/xhtml1/loose"); |
| set.add("http://www.w3.org/TR/xhtml1/frameset"); |
| HTML_NS_URIS = Collections.unmodifiableSet(set); |
| } |
| |
| /** |
| * Convenience constructor. |
| */ |
| public DomHTMLDocument() |
| { |
| this(new DomHTMLImpl()); |
| } |
| |
| /** |
| * Constructor. |
| * This is called by the DOMImplementation. |
| */ |
| public DomHTMLDocument(DomHTMLImpl impl) |
| { |
| super(impl); |
| } |
| |
| private Node getChildNodeByName(Node parent, String name) |
| { |
| for (Node ctx = parent.getFirstChild(); ctx != null; |
| ctx = ctx.getNextSibling()) |
| { |
| if (name.equalsIgnoreCase(ctx.getNodeName())) |
| { |
| return ctx; |
| } |
| } |
| return null; |
| } |
| |
| public String getTitle() |
| { |
| Node html = getDocumentElement(); |
| if (html != null) |
| { |
| Node head = getChildNodeByName(html, "head"); |
| if (head != null) |
| { |
| Node title = getChildNodeByName(head, "title"); |
| if (title != null) |
| { |
| return title.getTextContent(); |
| } |
| } |
| } |
| return null; |
| } |
| |
| public void setTitle(String title) |
| { |
| Node html = getDocumentElement(); |
| if (html == null) |
| { |
| html = createElement("html"); |
| appendChild(html); |
| } |
| Node head = getChildNodeByName(html, "head"); |
| if (head == null) |
| { |
| head = createElement("head"); |
| Node first = html.getFirstChild(); |
| if (first != null) |
| { |
| html.insertBefore(first, head); |
| } |
| else |
| { |
| html.appendChild(head); |
| } |
| } |
| Node titleNode = getChildNodeByName(head, "title"); |
| if (titleNode == null) |
| { |
| titleNode = createElement("title"); |
| Node first = head.getFirstChild(); |
| if (first != null) |
| { |
| head.insertBefore(first, titleNode); |
| } |
| else |
| { |
| head.appendChild(titleNode); |
| } |
| } |
| titleNode.setTextContent(title); |
| } |
| |
| public String getReferrer() |
| { |
| // TODO getReferrer |
| return null; |
| } |
| |
| public String getDomain() |
| { |
| try |
| { |
| URL url = new URL(getDocumentURI()); |
| return url.getHost(); |
| } |
| catch (MalformedURLException e) |
| { |
| return null; |
| } |
| } |
| |
| public String getURL() |
| { |
| return getDocumentURI(); |
| } |
| |
| public HTMLElement getBody() |
| { |
| Node html = getDocumentElement(); |
| if (html != null) |
| { |
| Node body = getChildNodeByName(html, "body"); |
| if (body == null) |
| { |
| body = getChildNodeByName(html, "frameset"); |
| } |
| return (HTMLElement) body; |
| } |
| return null; |
| } |
| |
| public void setBody(HTMLElement body) |
| { |
| Node html = getDocumentElement(); |
| if (html == null) |
| { |
| html = createElement("html"); |
| appendChild(html); |
| } |
| Node ref = getBody(); |
| if (ref == null) |
| { |
| html.appendChild(body); |
| } |
| else |
| { |
| html.replaceChild(body, ref); |
| } |
| } |
| |
| public HTMLCollection getImages() |
| { |
| DomHTMLCollection ret = new DomHTMLCollection(this, this); |
| ret.addNodeName("img"); |
| ret.evaluate(); |
| return ret; |
| } |
| |
| public HTMLCollection getApplets() |
| { |
| DomHTMLCollection ret = new DomHTMLCollection(this, this); |
| ret.addNodeName("embed"); |
| ret.addNodeName("object"); |
| ret.addNodeName("applet"); |
| ret.evaluate(); |
| return ret; |
| } |
| |
| public HTMLCollection getLinks() |
| { |
| DomHTMLCollection ret = new DomHTMLCollection(this, this); |
| ret.addNodeName("area"); |
| ret.addNodeName("a"); |
| ret.evaluate(); |
| return ret; |
| } |
| |
| public HTMLCollection getForms() |
| { |
| DomHTMLCollection ret = new DomHTMLCollection(this, this); |
| ret.addNodeName("form"); |
| ret.evaluate(); |
| return ret; |
| } |
| |
| public HTMLCollection getAnchors() |
| { |
| DomHTMLCollection ret = new DomHTMLCollection(this, this); |
| ret.addNodeName("a"); |
| ret.addAttributeName("name"); |
| ret.evaluate(); |
| return ret; |
| } |
| |
| public String getCookie() |
| { |
| // TODO getCookie |
| return null; |
| } |
| |
| public void setCookie(String cookie) |
| { |
| // TODO setCookie |
| } |
| |
| public void open() |
| { |
| // TODO open |
| } |
| |
| public void close() |
| { |
| // TODO close |
| } |
| |
| public void write(String text) |
| { |
| // TODO write |
| } |
| |
| public void writeln(String text) |
| { |
| // TODO write |
| } |
| |
| public NodeList getElementsByName(String name) |
| { |
| DomHTMLCollection ret = new DomHTMLCollection(this, this); |
| ret.addNodeName(name); |
| ret.evaluate(); |
| return ret; |
| // TODO xhtml: return only form controls (?) |
| } |
| |
| public Element createElement(String tagName) |
| { |
| return createElementNS(null, tagName); |
| } |
| |
| public Element createElementNS(String uri, String qName) |
| { |
| /* If a non-HTML element, use the default implementation. */ |
| if (uri != null && !HTML_NS_URIS.contains(uri)) |
| { |
| return super.createElementNS(uri, qName); |
| } |
| String localName = qName.toLowerCase(); |
| int ci = qName.indexOf(':'); |
| if (ci != -1) |
| { |
| localName = qName.substring(ci + 1); |
| } |
| Class t = (Class) ELEMENT_CLASSES.get(localName); |
| /* If a non-HTML element, use the default implementation. */ |
| if (t == null) |
| { |
| return super.createElementNS(uri, qName); |
| } |
| try |
| { |
| Constructor c = t.getDeclaredConstructor(ELEMENT_PT); |
| Object[] args = new Object[] { this, uri, qName }; |
| return (Element) c.newInstance(args); |
| } |
| catch (Exception e) |
| { |
| DOMException e2 = new DomDOMException(DOMException.TYPE_MISMATCH_ERR); |
| e2.initCause(e); |
| throw e2; |
| } |
| } |
| |
| } |
| |