/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.ast.xpath.saxon; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import net.sourceforge.pmd.lang.ast.Node; import net.sf.saxon.om.Axis; import net.sf.saxon.om.AxisIterator; import net.sf.saxon.om.DocumentInfo; import net.sf.saxon.om.Navigator; import net.sf.saxon.om.NodeInfo; import net.sf.saxon.om.SingleNodeIterator; import net.sf.saxon.type.Type; /** * A Saxon OM Document node for an AST Node. */ public class DocumentNode extends AbstractNodeInfo implements DocumentInfo { /** * The root ElementNode of the DocumentNode. */ protected final ElementNode rootNode; /** * Mapping from AST Node to corresponding ElementNode. */ public final Map<Node, ElementNode> nodeToElementNode = new HashMap<>(); /** * Construct a DocumentNode, with the given AST Node serving as the root * ElementNode. * * @param node * The root AST Node. * * @see ElementNode */ public DocumentNode(Node node) { this.rootNode = new ElementNode(this, new IdGenerator(), null, node, -1); } /** * {@inheritDoc} */ @Override public String[] getUnparsedEntity(String name) { throw createUnsupportedOperationException("DocumentInfo.getUnparsedEntity(String)"); } /** * {@inheritDoc} */ @Override public Iterator getUnparsedEntityNames() { throw createUnsupportedOperationException("DocumentInfo.getUnparsedEntityNames()"); } /** * {@inheritDoc} */ @Override public NodeInfo selectID(String id) { throw createUnsupportedOperationException("DocumentInfo.selectID(String)"); } @Override public int getNodeKind() { return Type.DOCUMENT; } @Override public DocumentInfo getDocumentRoot() { return this; } @Override public boolean hasChildNodes() { return true; } @Override public AxisIterator iterateAxis(byte axisNumber) { switch (axisNumber) { case Axis.DESCENDANT: return new Navigator.DescendantEnumeration(this, false, true); case Axis.DESCENDANT_OR_SELF: return new Navigator.DescendantEnumeration(this, true, true); case Axis.CHILD: return SingleNodeIterator.makeIterator(rootNode); default: return super.iterateAxis(axisNumber); } } }