/*******************************************************************************
* Copyright (c) 2011 Subgraph.
* 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:
* Subgraph - initial API and implementation
******************************************************************************/
package com.subgraph.vega.internal.html.dom;
import java.util.ArrayList;
import java.util.List;
import org.jsoup.nodes.Attribute;
import org.jsoup.select.Elements;
import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.TypeInfo;
public class ElementImpl extends NodeImpl implements Element {
protected final org.jsoup.nodes.Element jsoupElement;
protected ElementImpl(org.jsoup.nodes.Element jsoupElement, Document ownerDocument) {
super(jsoupElement, ownerDocument);
this.jsoupElement = jsoupElement;
}
public String getNodeName() {
return getTagName();
}
@Override
public short getNodeType() {
return Node.ELEMENT_NODE;
}
org.jsoup.nodes.Element getJsoupElement() {
return jsoupElement;
}
@Override
public String getTagName() {
return jsoupElement.tagName().toUpperCase();
}
@Override
public String getTextContent() {
final short type = getNodeType();
switch(type) {
case Node.TEXT_NODE:
case Node.CDATA_SECTION_NODE:
case Node.COMMENT_NODE:
return getNodeValue();
default:
return concatenateChildTextContent();
}
}
private String concatenateChildTextContent() {
final StringBuilder sb = new StringBuilder();
final NodeList nlist = getChildNodes();
for(int i = 0; i < nlist.getLength(); i++) {
Node node = nlist.item(i);
if((node.getNodeType() != Node.COMMENT_NODE) && (node.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE)) {
String text = node.getTextContent();
if(text != null)
sb.append(text);
}
}
return sb.toString();
}
Element getElementById(String elementId) {
org.jsoup.nodes.Element elementById = jsoupElement.getElementById(elementId);
if(elementById == null)
return null;
else
return HTMLElementImpl.create(elementById, getOwnerDocument());
}
@Override
public NamedNodeMap getAttributes() {
NamedNodeMapImpl map = new NamedNodeMapImpl();
for(Attribute a: jsoupElement.attributes())
map.addNode(a.getKey(), new AttrImpl(a.getKey(), a.getValue(), this, getOwnerDocument()));
return map;
}
@Override
public boolean hasAttributes() {
return jsoupElement.attributes().size() > 0;
}
@Override
public String getAttribute(String name) {
if(jsoupElement.hasAttr(name))
return jsoupElement.attr(name);
else if(getTagName().equals("LABEL") && name.equals("htmlFor") && jsoupElement.hasAttr("for"))
return jsoupElement.attr("for");
else if(name.equals("className") && jsoupElement.hasAttr("class"))
return jsoupElement.attr("class");
else
return null;
}
@Override
public void setAttribute(String name, String value) throws DOMException {
throw createReadOnlyException();
}
@Override
public void removeAttribute(String name) throws DOMException {
throw createReadOnlyException();
}
@Override
public Attr getAttributeNode(String name) {
if(jsoupElement.hasAttr(name)) {
return new AttrImpl(name, getAttribute(name), this, getOwnerDocument());
} else {
return null;
}
}
@Override
public Attr setAttributeNode(Attr newAttr) throws DOMException {
throw createReadOnlyException();
}
@Override
public Attr removeAttributeNode(Attr oldAttr) throws DOMException {
throw createReadOnlyException();
}
@Override
public NodeList getElementsByTagName(String name) {
final List<NodeImpl> elements = new ArrayList<NodeImpl>();
// Special case
if(getTagName().equals("HTML") && name.equalsIgnoreCase("html")) {
elements.add(this);
return new NodeListImpl(elements);
}
for(org.jsoup.nodes.Element e: jsoupElementsForTag(name)) {
if(e != jsoupElement)
elements.add(HTMLElementImpl.create(e, getOwnerDocument()));
}
return new NodeListImpl(elements);
}
private Elements jsoupElementsForTag(String name) {
if("*".equals(name)) {
return jsoupElement.getAllElements();
}
else
return jsoupElement.getElementsByTag(name);
}
@Override
public String getAttributeNS(String namespaceURI, String localName)
throws DOMException {
throw createNoXMLSupportException();
}
@Override
public void setAttributeNS(String namespaceURI, String qualifiedName,
String value) throws DOMException {
throw createNoXMLSupportException();
}
@Override
public void removeAttributeNS(String namespaceURI, String localName)
throws DOMException {
throw createNoXMLSupportException();
}
@Override
public Attr getAttributeNodeNS(String namespaceURI, String localName)
throws DOMException {
throw createNoXMLSupportException();
}
@Override
public Attr setAttributeNodeNS(Attr newAttr) throws DOMException {
throw createNoXMLSupportException();
}
@Override
public NodeList getElementsByTagNameNS(String namespaceURI, String localName)
throws DOMException {
throw createNoXMLSupportException();
}
@Override
public boolean hasAttribute(String name) {
return jsoupElement.hasAttr(name);
}
@Override
public boolean hasAttributeNS(String namespaceURI, String localName)
throws DOMException {
throw createNoXMLSupportException();
}
@Override
public TypeInfo getSchemaTypeInfo() {
throw createNoLevel3SupportException();
}
@Override
public void setIdAttribute(String name, boolean isId) throws DOMException {
throw createNoLevel3SupportException();
}
@Override
public void setIdAttributeNS(String namespaceURI, String localName,
boolean isId) throws DOMException {
throw createNoLevel3SupportException();
}
@Override
public void setIdAttributeNode(Attr idAttr, boolean isId)
throws DOMException {
throw createNoLevel3SupportException();
}
}