package org.zwobble.mammoth.xml; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import java.util.List; import java.util.Map; import java.util.Optional; import static com.google.common.collect.Iterables.*; public class XmlElement implements XmlNode, XmlElementLike { private final String name; private final Map attributes; private final List children; public XmlElement(String name, Map attributes, List children) { this.name = name; this.attributes = attributes; this.children = children; } public String getName() { return name; } public Map getAttributes() { return attributes; } public String getAttribute(String name) { // TODO: throw more informative error message return getAttributeOrNone(name).get(); } @Override public Optional getAttributeOrNone(String name) { return Optional.ofNullable(attributes.get(name)); } public List getChildren() { return children; } @Override public String innerText() { return Joiner.on("").join(transform(children, XmlNode::innerText)); } @Override public T accept(XmlNodeVisitor visitor) { return visitor.visit(this); } public Iterable children() { return children; } @Override public String toString() { return "XmlElement(name=" + name + ", attributes=" + attributes + ", children=" + children + ")"; } public XmlElementList findChildren(String name) { Iterable filtered = findChildrenIterable(name); return new XmlElementList(ImmutableList.copyOf(filtered)); } public XmlElement findChild(String name) { return findChildrenIterable(name).iterator().next(); } @Override public XmlElementLike findChildOrEmpty(String name) { return getFirst(findChildrenIterable(name), NullXmlElement.INSTANCE); } private Iterable findChildrenIterable(String name) { return filter( filter(children, XmlElement.class), child -> child.getName().equals(name)); } }