package org.nate.internal.dom4j;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.dom4j.Branch;
import org.dom4j.Element;
import org.dom4j.Node;
import org.nate.encoder.NateDocument;
import org.nate.exception.BadCssExpressionException;
import org.nate.internal.dom4j.cssselectors.Dom4jNodeSelector;
import se.fishtank.css.selectors.NodeSelectorException;
public abstract class Dom4jBackedAbstactDocument extends Dom4jBackedAbstractNode implements NateDocument {
private final Branch root;
public Dom4jBackedAbstactDocument(Branch root) {
this.root = root;
}
@Override
public NateDocument copy(String selector) {
List<Element> newElements = new ArrayList<Element>();
for (Element element : findMatchingElements(selector)) {
newElements.add((Element) element.clone());
}
return new Dom4jBackedDocumentFragment(newElements);
}
@SuppressWarnings("unchecked")
@Override
public NateDocument copyContentOf(String selector) {
List<Node> nodes = new ArrayList<Node>();
for (Element element : findMatchingElements(selector)) {
for (Node node : (List<Node>) element.content()) {
nodes.add((Node) node.clone());
}
}
return new Dom4jBackedDocumentFragment(nodes);
}
@SuppressWarnings("unchecked")
protected Set<Element> findMatchingElements(String selector) {
try {
Set result = new Dom4jNodeSelector(root).querySelectorAll(selector);
return result;
} catch (NodeSelectorException e) {
throw new BadCssExpressionException("Invalid CSS Expression: " + selector, e);
}
}
}