package org.basex.query.path; import org.basex.query.item.ANode; import org.basex.query.iter.AxisIter; /** * XPath axes. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public enum Axis { // ...order is important here for parsing the Query; // axes with longer names are parsed first /** Ancestor-or-self axis. */ ANCORSELF("ancestor-or-self", false) { @Override AxisIter iter(final ANode n) { return n.ancestorOrSelf(); } }, /** Ancestor axis. */ ANC("ancestor", false) { @Override AxisIter iter(final ANode n) { return n.ancestor(); } }, /** Attribute axis. */ ATTR("attribute", true) { @Override AxisIter iter(final ANode n) { return n.attributes(); } }, /** Child Axis. */ CHILD("child", true) { @Override AxisIter iter(final ANode n) { return n.children(); } }, /** Descendant-or-self axis. */ DESCORSELF("descendant-or-self", true) { @Override AxisIter iter(final ANode n) { return n.descendantOrSelf(); } }, /** Descendant axis. */ DESC("descendant", true) { @Override AxisIter iter(final ANode n) { return n.descendant(); } }, /** Following-Sibling axis. */ FOLLSIBL("following-sibling", false) { @Override AxisIter iter(final ANode n) { return n.followingSibling(); } }, /** Following axis. */ FOLL("following", false) { @Override AxisIter iter(final ANode n) { return n.following(); } }, /** Parent axis. */ PARENT("parent", true) { @Override AxisIter iter(final ANode n) { return n.parentIter(); } }, /** Preceding-Sibling axis. */ PRECSIBL("preceding-sibling", false) { @Override AxisIter iter(final ANode n) { return n.precedingSibling(); } }, /** Preceding axis. */ PREC("preceding", false) { @Override AxisIter iter(final ANode n) { return n.preceding(); } }, /** Step axis. */ SELF("self", true) { @Override AxisIter iter(final ANode n) { return n.self(); } }; /** Axis string. */ public final String name; /** Descendant axis flag. */ public final boolean down; /** * Constructor. * @param n axis string * @param d descendant flag */ Axis(final String n, final boolean d) { name = n; down = d; } /** * Returns a node iterator. * @param n input node * @return node iterator */ abstract AxisIter iter(final ANode n); @Override public String toString() { return name; } /** * Inverts the axis. * @return inverted axis */ final Axis invert() { switch(this) { case ANC: return DESC; case ANCORSELF: return DESCORSELF; case ATTR: case CHILD: return PARENT; case DESC: return ANC; case DESCORSELF: return ANCORSELF; case FOLLSIBL: return PRECSIBL; case FOLL: return PREC; case PARENT: return CHILD; case PRECSIBL: return FOLLSIBL; case PREC: return FOLL; case SELF: return SELF; default: return null; } } }