19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: NodeTest.java 468655 2006-10-28 07:12:06Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath.patterns;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMFilter;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.Expression;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.ExpressionOwner;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPath;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathVisitor;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XNumber;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XObject;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This is the basic node test class for both match patterns and location path
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * steps.
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class NodeTest extends Expression
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = -5736721866747906182L;
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The namespace or local name for node tests with a wildcard.
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @see <a href="http://www.w3.org/TR/xpath#NT-NameTest">the XPath NameTest production.</a>
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final String WILD = "*";
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The URL to pass to the Node#supports method, to see if the
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * DOM has already been stripped of whitespace nodes.
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final String SUPPORTS_PRE_STRIPPING =
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    "http://xml.apache.org/xpath/features/whitespace-pre-stripping";
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This attribute determines which node types are accepted.
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int m_whatToShow;
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Special bitmap for match patterns starting with a function.
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Make sure this does not conflict with {@link org.w3c.dom.traversal.NodeFilter}.
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int SHOW_BYFUNCTION = 0x00010000;
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This attribute determines which node types are accepted.
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * These constants are defined in the {@link org.w3c.dom.traversal.NodeFilter}
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * interface.
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return bitset mainly defined in {@link org.w3c.dom.traversal.NodeFilter}.
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getWhatToShow()
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_whatToShow;
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This attribute determines which node types are accepted.
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * These constants are defined in the {@link org.w3c.dom.traversal.NodeFilter}
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * interface.
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param what bitset mainly defined in {@link org.w3c.dom.traversal.NodeFilter}.
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setWhatToShow(int what)
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_whatToShow = what;
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The namespace to be tested for, which may be null.
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  String m_namespace;
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the namespace to be tested.
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The namespace to be tested for, or {@link #WILD}, or null.
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getNamespace()
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_namespace;
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the namespace to be tested.
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param ns The namespace to be tested for, or {@link #WILD}, or null.
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setNamespace(String ns)
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_namespace = ns;
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The local name to be tested for.
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected String m_name;
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the local name to be tested.
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the local name to be tested, or {@link #WILD}, or an empty string.
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getLocalName()
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (null == m_name) ? "" : m_name;
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the local name to be tested.
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name the local name to be tested, or {@link #WILD}, or an empty string.
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setLocalName(String name)
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_name = name;
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Statically calculated score for this test.  One of
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  {@link #SCORE_NODETEST},
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  {@link #SCORE_NONE},
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  {@link #SCORE_NSWILD},
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  {@link #SCORE_QNAME}, or
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  {@link #SCORE_OTHER}.
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XNumber m_score;
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The match score if the pattern consists of just a NodeTest.
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final XNumber SCORE_NODETEST =
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    new XNumber(XPath.MATCH_SCORE_NODETEST);
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The match score if the pattern pattern has the form NCName:*.
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final XNumber SCORE_NSWILD =
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    new XNumber(XPath.MATCH_SCORE_NSWILD);
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The match score if the pattern has the form
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of a QName optionally preceded by an @ character.
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final XNumber SCORE_QNAME =
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    new XNumber(XPath.MATCH_SCORE_QNAME);
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The match score if the pattern consists of something
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * other than just a NodeTest or just a qname.
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final XNumber SCORE_OTHER =
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    new XNumber(XPath.MATCH_SCORE_OTHER);
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The match score if no match is made.
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final XNumber SCORE_NONE =
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    new XNumber(XPath.MATCH_SCORE_NONE);
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an NodeTest that tests for namespaces and node names.
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace The namespace to be tested.
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name to be tested.
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeTest(int whatToShow, String namespace, String name)
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    initNodeTest(whatToShow, namespace, name);
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an NodeTest that doesn't test for node names.
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeTest(int whatToShow)
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    initNodeTest(whatToShow);
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see Expression#deepEquals(Expression)
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean deepEquals(Expression expr)
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(!isSameClass(expr))
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		return false;
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	NodeTest nt = (NodeTest)expr;
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(null != nt.m_name)
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	{
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		if(null == m_name)
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  			return false;
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		else if(!nt.m_name.equals(m_name))
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  			return false;
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	}
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	else if(null != m_name)
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		return false;
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(null != nt.m_namespace)
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	{
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		if(null == m_namespace)
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  			return false;
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		else if(!nt.m_namespace.equals(m_namespace))
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  			return false;
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	}
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	else if(null != m_namespace)
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		return false;
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(m_whatToShow != nt.m_whatToShow)
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		return false;
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(m_isTotallyWild != nt.m_isTotallyWild)
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		return false;
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	return true;
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Null argument constructor.
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public NodeTest(){}
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Initialize this node test by setting the whatToShow property, and
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * calculating the score that this test will return if a test succeeds.
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void initNodeTest(int whatToShow)
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_whatToShow = whatToShow;
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    calcScore();
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Initialize this node test by setting the whatToShow property and the
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * namespace and local name, and
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * calculating the score that this test will return if a test succeeds.
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace The namespace to be tested.
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name to be tested.
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void initNodeTest(int whatToShow, String namespace, String name)
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_whatToShow = whatToShow;
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_namespace = namespace;
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_name = name;
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    calcScore();
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * True if this test has a null namespace and a local name of {@link #WILD}.
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean m_isTotallyWild;
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the static score for this node test.
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Should be one of the SCORE_XXX constants.
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XNumber getStaticScore()
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_score;
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the static score for this node test.
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param score Should be one of the SCORE_XXX constants.
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setStaticScore(XNumber score)
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_score = score;
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Static calc of match score.
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void calcScore()
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((m_namespace == null) && (m_name == null))
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_score = SCORE_NODETEST;
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (((m_namespace == WILD) || (m_namespace == null))
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             && (m_name == WILD))
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_score = SCORE_NODETEST;
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if ((m_namespace != WILD) && (m_name == WILD))
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_score = SCORE_NSWILD;
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_score = SCORE_QNAME;
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_isTotallyWild = (m_namespace == null && m_name == WILD);
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the score that this test will return if a test succeeds.
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the score that this test will return if a test succeeds.
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public double getDefaultScore()
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_score.num();
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell what node type to test, if not DTMFilter.SHOW_ALL.
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whatToShow Bit set defined mainly by
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        {@link org.apache.xml.dtm.DTMFilter}.
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the node type for the whatToShow.  Since whatToShow can specify
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         multiple types, it will return the first bit tested that is on,
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         so the caller of this function should take care that this is
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         the function they really want to call.  If none of the known bits
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         are set, this function will return zero.
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static int getNodeTypeTest(int whatToShow)
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // %REVIEW% Is there a better way?
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_ELEMENT))
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.ELEMENT_NODE;
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_ATTRIBUTE))
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.ATTRIBUTE_NODE;
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_TEXT))
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.TEXT_NODE;
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT))
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.DOCUMENT_NODE;
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT_FRAGMENT))
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.DOCUMENT_FRAGMENT_NODE;
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_NAMESPACE))
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.NAMESPACE_NODE;
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_COMMENT))
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.COMMENT_NODE;
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_PROCESSING_INSTRUCTION))
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.PROCESSING_INSTRUCTION_NODE;
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT_TYPE))
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.DOCUMENT_TYPE_NODE;
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_ENTITY))
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.ENTITY_NODE;
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_ENTITY_REFERENCE))
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.ENTITY_REFERENCE_NODE;
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_NOTATION))
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.NOTATION_NODE;
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_CDATA_SECTION))
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return DTM.CDATA_SECTION_NODE;
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return 0;
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Do a diagnostics dump of a whatToShow bit set.
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whatToShow Bit set defined mainly by
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        {@link org.apache.xml.dtm.DTMFilter}.
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static void debugWhatToShow(int whatToShow)
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    java.util.Vector v = new java.util.Vector();
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_ATTRIBUTE))
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_ATTRIBUTE");
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_NAMESPACE))
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_NAMESPACE");
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_CDATA_SECTION))
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_CDATA_SECTION");
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_COMMENT))
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_COMMENT");
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT))
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_DOCUMENT");
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT_FRAGMENT))
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_DOCUMENT_FRAGMENT");
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT_TYPE))
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_DOCUMENT_TYPE");
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_ELEMENT))
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_ELEMENT");
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_ENTITY))
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_ENTITY");
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_ENTITY_REFERENCE))
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_ENTITY_REFERENCE");
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_NOTATION))
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_NOTATION");
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_PROCESSING_INSTRUCTION))
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_PROCESSING_INSTRUCTION");
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (whatToShow & DTMFilter.SHOW_TEXT))
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      v.addElement("SHOW_TEXT");
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = v.size();
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < n; i++)
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (i > 0)
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.out.print(" | ");
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.print(v.elementAt(i));
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 == n)
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.print("empty whatToShow: " + whatToShow);
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    System.out.println();
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Two names are equal if they and either both are null or
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the name t is wild and the name p is non-null, or the two
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * strings are equal.
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param p part string from the node.
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param t target string, which may be {@link #WILD}.
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the strings match according to the rules of this method.
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final boolean subPartMatch(String p, String t)
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // boolean b = (p == t) || ((null != p) && ((t == WILD) || p.equals(t)));
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // System.out.println("subPartMatch - p: "+p+", t: "+t+", result: "+b);
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (p == t) || ((null != p) && ((t == WILD) || p.equals(t)));
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This is temporary to patch over Xerces issue with representing DOM
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * namespaces as "".
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param p part string from the node, which may represent the null namespace
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *        as null or as "".
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param t target string, which may be {@link #WILD}.
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the strings match according to the rules of this method.
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final boolean subPartMatchNS(String p, String t)
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (p == t)
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           || ((null != p)
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               && ((p.length() > 0)
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                   ? ((t == WILD) || p.equals(t)) : null == t));
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell what the test score is for the given node.
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt XPath runtime context.
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param context The node being tested.
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject execute(XPathContext xctxt, int context)
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTM dtm = xctxt.getDTM(context);
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    short nodeType = dtm.getNodeType(context);
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_whatToShow == DTMFilter.SHOW_ALL)
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_score;
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nodeBit = (m_whatToShow & (0x00000001 << (nodeType - 1)));
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    switch (nodeBit)
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_DOCUMENT_FRAGMENT :
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_DOCUMENT :
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return SCORE_OTHER;
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_COMMENT :
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_score;
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_CDATA_SECTION :
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_TEXT :
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // was:
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // return (!xctxt.getDOMHelper().shouldStripSourceNode(context))
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //       ? m_score : SCORE_NONE;
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_score;
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_PROCESSING_INSTRUCTION :
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return subPartMatch(dtm.getNodeName(context), m_name)
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             ? m_score : SCORE_NONE;
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // From the draft: "Two expanded names are equal if they
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // have the same local part, and either both have no URI or
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // both have the same URI."
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // "A node test * is true for any node of the principal node type.
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // For example, child::* will select all element children of the
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // context node, and attribute::* will select all attributes of
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // the context node."
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // "A node test can have the form NCName:*. In this case, the prefix
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // is expanded in the same way as with a QName using the context
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // namespace declarations. The node test will be true for any node
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // of the principal type whose expanded name has the URI to which
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // the prefix expands, regardless of the local part of the name."
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_NAMESPACE :
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String ns = dtm.getLocalName(context);
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (subPartMatch(ns, m_name)) ? m_score : SCORE_NONE;
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_ATTRIBUTE :
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_ELEMENT :
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (m_isTotallyWild || (subPartMatchNS(dtm.getNamespaceURI(context), m_namespace) && subPartMatch(dtm.getLocalName(context), m_name)))
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             ? m_score : SCORE_NONE;
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    default :
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return SCORE_NONE;
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }  // end switch(testType)
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell what the test score is for the given node.
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt XPath runtime context.
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param context The node being tested.
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject execute(XPathContext xctxt, int context,
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         DTM dtm, int expType)
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_whatToShow == DTMFilter.SHOW_ALL)
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_score;
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nodeBit = (m_whatToShow & (0x00000001
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                   << ((dtm.getNodeType(context)) - 1)));
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    switch (nodeBit)
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_DOCUMENT_FRAGMENT :
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_DOCUMENT :
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return SCORE_OTHER;
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_COMMENT :
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_score;
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_CDATA_SECTION :
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_TEXT :
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // was:
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // return (!xctxt.getDOMHelper().shouldStripSourceNode(context))
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      //       ? m_score : SCORE_NONE;
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_score;
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_PROCESSING_INSTRUCTION :
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return subPartMatch(dtm.getNodeName(context), m_name)
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             ? m_score : SCORE_NONE;
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // From the draft: "Two expanded names are equal if they
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // have the same local part, and either both have no URI or
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // both have the same URI."
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // "A node test * is true for any node of the principal node type.
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // For example, child::* will select all element children of the
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // context node, and attribute::* will select all attributes of
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // the context node."
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // "A node test can have the form NCName:*. In this case, the prefix
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // is expanded in the same way as with a QName using the context
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // namespace declarations. The node test will be true for any node
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // of the principal type whose expanded name has the URI to which
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // the prefix expands, regardless of the local part of the name."
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_NAMESPACE :
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String ns = dtm.getLocalName(context);
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (subPartMatch(ns, m_name)) ? m_score : SCORE_NONE;
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_ATTRIBUTE :
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_ELEMENT :
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (m_isTotallyWild || (subPartMatchNS(dtm.getNamespaceURI(context), m_namespace) && subPartMatch(dtm.getLocalName(context), m_name)))
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson             ? m_score : SCORE_NONE;
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    default :
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return SCORE_NONE;
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }  // end switch(testType)
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Test the current node to see if it matches the given node test.
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt XPath runtime context.
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject execute(XPathContext xctxt)
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return execute(xctxt, xctxt.getCurrentNode());
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Node tests by themselves do not need to fix up variables.
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void fixupVariables(java.util.Vector vars, int globalsSize)
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // no-op
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	assertion(false, "callVisitors should not be called for this object!!!");
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
693