package com.googlecode.totallylazy.xml.streaming;
import com.googlecode.totallylazy.Pair;
import com.googlecode.totallylazy.Sequence;
import com.googlecode.totallylazy.xml.Xml;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import javax.xml.stream.XMLStreamException;
import static com.googlecode.totallylazy.xml.streaming.XPath.node;
import static com.googlecode.totallylazy.xml.streaming.XPath.xpath;
public class DomConverter {
public static Node convert(Context context) throws Exception {
return children(copyAttributes(context, element(context.name())), context.relative());
}
static Element element(String name) {
return Xml.document("<" + name + "/>").getDocumentElement();
}
static Node children(Node parent, Sequence<Context> contexts) throws XMLStreamException {
if(contexts.isEmpty()) return parent;
for (Context child : contexts.filter(xpath(XPath.child(node())))) {
if(child.isText()) parent.appendChild(parent.getOwnerDocument().createTextNode(child.text()));
if(child.isElement()) children(child(parent, child), child.relative());
}
return parent;
}
static Node child(Node parent, Context start) {
return parent.appendChild(copyAttributes(start, parent.getOwnerDocument().createElement(start.name())));
}
static Element copyAttributes(Context source, Element destination) {
for (Pair<String, String> attribute : source.attributes()) {
destination.setAttribute(attribute.getKey(), attribute.getValue());
}
return destination;
}
}