
se.ugli.durian.j.dom.query.jaxen.DurianNavigator Maven / Gradle / Ivy
package se.ugli.durian.j.dom.query.jaxen;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.jaxen.FunctionCallException;
import org.jaxen.Navigator;
import org.jaxen.UnsupportedAxisException;
import org.jaxen.XPath;
import org.jaxen.pattern.Pattern;
import org.jaxen.saxpath.SAXPathException;
import org.jaxen.util.AncestorAxisIterator;
import org.jaxen.util.AncestorOrSelfAxisIterator;
import org.jaxen.util.DescendantAxisIterator;
import org.jaxen.util.DescendantOrSelfAxisIterator;
import org.jaxen.util.FollowingAxisIterator;
import org.jaxen.util.FollowingSiblingAxisIterator;
import org.jaxen.util.PrecedingAxisIterator;
import org.jaxen.util.PrecedingSiblingAxisIterator;
import org.jaxen.util.SelfAxisIterator;
import se.ugli.durian.j.dom.node.Attribute;
import se.ugli.durian.j.dom.node.Content;
import se.ugli.durian.j.dom.node.Element;
import se.ugli.durian.j.dom.node.Node;
import se.ugli.durian.j.dom.node.Text;
class DurianNavigator implements Navigator {
private static final long serialVersionUID = 2313253033675992336L;
private final Document document;
public DurianNavigator(final Element element) {
document = new Document(getRoot(element));
}
private Element getRoot(final Element element) {
if (element.parent().isPresent())
return getRoot(element.parent().get());
return element;
}
@Override
public String getAttributeName(final Object attr) {
final Attribute attribute = (Attribute) attr;
return attribute.name();
}
@Override
public String getAttributeNamespaceUri(final Object attr) {
return null;
}
@Override
public String getAttributeQName(final Object attr) {
throw new UnsupportedOperationException();
}
@Override
public String getAttributeStringValue(final Object attr) {
final Attribute attribute = (Attribute) attr;
return attribute.value();
}
@Override
public String getCommentStringValue(final Object comment) {
throw new UnsupportedOperationException();
}
@Override
public String getElementName(final Object object) {
final Element element = (Element) object;
return element.name();
}
@Override
public String getElementNamespaceUri(final Object object) {
return null;
}
@Override
public String getElementQName(final Object object) {
throw new UnsupportedOperationException();
}
@Override
public String getElementStringValue(final Object object) {
final Element element = (Element) object;
final StringBuilder stringBuilder = new StringBuilder();
element.texts().forEach(text -> {
stringBuilder.append(text.value());
});
return stringBuilder.toString();
}
@Override
public String getNamespacePrefix(final Object ns) {
throw new UnsupportedOperationException();
}
@Override
public String getNamespaceStringValue(final Object ns) {
throw new UnsupportedOperationException();
}
@Override
public String getTextStringValue(final Object text) {
final Text textObject = (Text) text;
return textObject.value();
}
@Override
public boolean isAttribute(final Object object) {
return object instanceof Attribute;
}
@Override
public boolean isComment(final Object object) {
return false;
}
@Override
public boolean isDocument(final Object object) {
return object instanceof Document;
}
@Override
public boolean isElement(final Object object) {
return object instanceof Element;
}
@Override
public boolean isNamespace(final Object object) {
return false;
}
@Override
public boolean isProcessingInstruction(final Object object) {
return false;
}
@Override
public boolean isText(final Object object) {
return object instanceof Text;
}
@Override
public XPath parseXPath(final String xpath) throws SAXPathException {
throw new UnsupportedOperationException();
}
@Override
public Iterator getChildAxisIterator(final Object contextNode) {
if (contextNode instanceof Document) {
final List rootContent = new ArrayList<>();
rootContent.add(document.root);
return rootContent.iterator();
}
else if (contextNode instanceof Element) {
final Element element = (Element) contextNode;
return element.content().iterator();
}
else if (contextNode instanceof Text)
return new ArrayList().iterator();
else
throw new IllegalStateException(contextNode.getClass().getName());
}
@Override
public Iterator> getDescendantAxisIterator(final Object contextNode) throws UnsupportedAxisException {
return new DescendantAxisIterator(contextNode, this);
}
@Override
public Iterator getParentAxisIterator(final Object contextNode) {
if (contextNode instanceof Element) {
final Element element = (Element) contextNode;
if (element.parent().isPresent())
return Collections.singletonList(element.parent().get()).iterator();
}
return new ArrayList().iterator();
}
@Override
public Iterator> getAncestorAxisIterator(final Object contextNode) throws UnsupportedAxisException {
return new AncestorAxisIterator(contextNode, this);
}
@Override
public Iterator> getFollowingSiblingAxisIterator(final Object contextNode) throws UnsupportedAxisException {
return new FollowingSiblingAxisIterator(contextNode, this);
}
@Override
public Iterator> getPrecedingSiblingAxisIterator(final Object contextNode) throws UnsupportedAxisException {
return new PrecedingSiblingAxisIterator(contextNode, this);
}
@Override
public Iterator> getFollowingAxisIterator(final Object contextNode) throws UnsupportedAxisException {
return new FollowingAxisIterator(contextNode, this);
}
@Override
public Iterator> getPrecedingAxisIterator(final Object contextNode) throws UnsupportedAxisException {
return new PrecedingAxisIterator(contextNode, this);
}
@Override
public Iterator getAttributeAxisIterator(final Object contextNode) {
if (contextNode instanceof Element) {
final Element element = (Element) contextNode;
return element.attributes().iterator();
}
return new ArrayList().iterator();
}
@Override
public Iterator> getNamespaceAxisIterator(final Object contextNode) throws UnsupportedAxisException {
return new ArrayList<>().iterator();
}
@Override
public Iterator> getSelfAxisIterator(final Object contextNode) throws UnsupportedAxisException {
return new SelfAxisIterator(contextNode);
}
@Override
public Iterator> getDescendantOrSelfAxisIterator(final Object contextNode) throws UnsupportedAxisException {
return new DescendantOrSelfAxisIterator(contextNode, this);
}
@Override
public Iterator> getAncestorOrSelfAxisIterator(final Object contextNode) throws UnsupportedAxisException {
return new AncestorOrSelfAxisIterator(contextNode, this);
}
@Override
public Object getDocument(final String uri) throws FunctionCallException {
throw new UnsupportedOperationException();
}
@Override
public Object getDocumentNode(final Object contextNode) {
return document;
}
@Override
public Object getParentNode(final Object contextNode) throws UnsupportedAxisException {
final Node node = (Node) contextNode;
return node.parent().orElse(null);
}
@Override
public String getProcessingInstructionTarget(final Object pi) {
throw new UnsupportedOperationException();
}
@Override
public String getProcessingInstructionData(final Object pi) {
throw new UnsupportedOperationException();
}
@Override
public String translateNamespacePrefixToUri(final String prefix, final Object element) {
throw new UnsupportedOperationException();
}
@Override
public Object getElementById(final Object contextNode, final String elementId) {
throw new UnsupportedOperationException();
}
@Override
public short getNodeType(final Object node) {
if (isElement(node))
return Pattern.ELEMENT_NODE;
else if (isAttribute(node))
return Pattern.ATTRIBUTE_NODE;
else if (isText(node))
return Pattern.TEXT_NODE;
else if (isComment(node))
return Pattern.COMMENT_NODE;
else if (isDocument(node))
return Pattern.DOCUMENT_NODE;
else if (isProcessingInstruction(node))
return Pattern.PROCESSING_INSTRUCTION_NODE;
else if (isNamespace(node))
return Pattern.NAMESPACE_NODE;
else
return Pattern.UNKNOWN_NODE;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy