/** * Copyright (C) 2012-2014 Gist Labs, LLC. (http://gistlabs.com) * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package com.gistlabs.mechanize.document.html; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import org.jsoup.nodes.Element; import com.gistlabs.mechanize.document.node.AbstractNode; import com.gistlabs.mechanize.document.node.Node; import com.gistlabs.mechanize.util.Util; import com.gistlabs.mechanize.util.css_query.NodeSelector; /** * Represents a node. * * <p>Note: The HtmlNode.toString() returns the HTML representation of this node and all its child nodes being the * exactly same as org.jsoup.nodes.Node.toString().</p> * @author Martin Kersten <Martin.Kersten.mk@gmail.com> */ public class HtmlNode extends AbstractNode { private final HtmlDocument page; private final org.jsoup.nodes.Node node; public HtmlNode(final HtmlDocument page, final org.jsoup.nodes.Node node) { if (page==null || node==null) throw new NullPointerException(String.format("page=%s, node=%s", page, node)); this.page = page; this.node = node; } public org.jsoup.nodes.Node getJsoupNode() { return node; } public HtmlDocument getPage() { return page; } @Override public String getName() { return null; } @Override public String getValue() { return null; } @SuppressWarnings("unchecked") @Override public <T extends Node> T find(final String query) { org.jsoup.nodes.Node found = JsoupNodeHelper.find(node, query); return found==null ? null : (T) getPage().htmlElements().getHtmlNode(found); } @Override public List<? extends Node> findAll(final String query) { return convert(JsoupNodeHelper.findAll(node, query)); } @Override protected NodeSelector<? extends Node> buildNodeSelector() { throw new UnsupportedOperationException("must reimplment this"); } @Override public boolean hasAttribute(final String attributeKey) { return false; } @Override public String getAttribute(final String attributeKey) { return null; } @Override public List<String> getAttributeNames() { return Util.newEmptyList(); } @Override public List<HtmlNode> getChildren() { List<org.jsoup.nodes.Node> nodes = node.childNodes(); return convert(nodes); } protected List<HtmlNode> convert(final List<org.jsoup.nodes.Node> nodes) { List<HtmlNode> result = new ArrayList<HtmlNode>(); for(org.jsoup.nodes.Node child : nodes) result.add(getPage().htmlElements().getHtmlNode(child)); return result; } @Override public List<HtmlNode> getChildren(final String... names) { Collection<String> namesColl = Arrays.asList(names); boolean emptyOrStar = namesColl.isEmpty() || namesColl.contains("*"); List<HtmlNode> result = new ArrayList<HtmlNode>(); for(org.jsoup.nodes.Node child : node.childNodes()) if (emptyOrStar || namesColl.contains(maybeElementTag(node))) result.add(getPage().htmlElements().getHtmlNode(child)); return result; } @Override public HtmlNode getParent() { org.jsoup.nodes.Node parent = getJsoupNode().parent(); return parent != null ? getPage().htmlElements().getHtmlNode(parent) : null; } protected String maybeElementTag(final org.jsoup.nodes.Node node) { if (node instanceof Element) return ((Element)node).tagName(); else return null; } @Override public String toString() { return ""+node; } }