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: StepPattern.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.Axis;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMAxisTraverser;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMFilter;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.Expression;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.ExpressionOwner;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathVisitor;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.axes.SubContextList;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.compiler.PsuedoNames;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XObject;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class represents a single pattern match step.
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class StepPattern extends NodeTest implements SubContextList, ExpressionOwner
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = 9071668960168152644L;
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The axis for this test. */
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int m_axis;
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a StepPattern that tests for namespaces and node names.
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespace The namespace to be tested.
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param name The local name to be tested.
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc.
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param axisForPredicate No longer used.
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public StepPattern(int whatToShow, String namespace, String name, int axis,
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                     int axisForPredicate)
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super(whatToShow, namespace, name);
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_axis = axis;
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a StepPattern that doesn't test for node names.
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc.
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param axisForPredicate No longer used.
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public StepPattern(int whatToShow, int axis, int axisForPredicate)
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super(whatToShow);
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_axis = axis;
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The target local name or psuedo name, for hash table lookup optimization.
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  String m_targetString;  // only calculate on head
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Calculate the local name or psuedo name of the node that this pattern will test,
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for hash table lookup optimization.
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.apache.xpath.compiler.PsuedoNames
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void calcTargetString()
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int whatToShow = getWhatToShow();
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    switch (whatToShow)
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_COMMENT :
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_targetString = PsuedoNames.PSEUDONAME_COMMENT;
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_TEXT :
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_CDATA_SECTION :
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case (DTMFilter.SHOW_TEXT | DTMFilter.SHOW_CDATA_SECTION) :
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_targetString = PsuedoNames.PSEUDONAME_TEXT;
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_ALL :
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_targetString = PsuedoNames.PSEUDONAME_ANY;
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_DOCUMENT :
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_DOCUMENT | DTMFilter.SHOW_DOCUMENT_FRAGMENT :
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_targetString = PsuedoNames.PSEUDONAME_ROOT;
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case DTMFilter.SHOW_ELEMENT :
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (this.WILD == m_name)
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_targetString = PsuedoNames.PSEUDONAME_ANY;
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_targetString = m_name;
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    default :
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_targetString = PsuedoNames.PSEUDONAME_ANY;
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the local name or psuedo name of the node that this pattern will test,
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for hash table lookup optimization.
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return local name or psuedo name of the node.
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.apache.xpath.compiler.PsuedoNames
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getTargetString()
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_targetString;
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Reference to nodetest and predicate for
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * parent or ancestor.
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  StepPattern m_relativePathPattern;
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This function is used to fixup variables from QNames to stack frame
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * indexes at stylesheet build time.
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param vars List of QNames that correspond to variables.  This list
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * should be searched backwards for the first qualified name that
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * corresponds to the variable reference qname.  The position of the
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * QName in the vector from the start of the vector will be its position
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in the stack frame (but variables above the globalsTop value will need
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to be offset to the current stack frame).
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param globalsSize The number of variables in the global variable area.
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void fixupVariables(java.util.Vector vars, int globalsSize)
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super.fixupVariables(vars, globalsSize);
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_predicates)
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i = 0; i < m_predicates.length; i++)
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_predicates[i].fixupVariables(vars, globalsSize);
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_relativePathPattern)
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_relativePathPattern.fixupVariables(vars, globalsSize);
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the reference to nodetest and predicate for
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * parent or ancestor.
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param expr The relative pattern expression.
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setRelativePathPattern(StepPattern expr)
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_relativePathPattern = expr;
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    expr.exprSetParent(this);
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    calcScore();
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the reference to nodetest and predicate for
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * parent or ancestor.
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The relative pattern expression.
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public StepPattern getRelativePathPattern()
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_relativePathPattern;
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //  /**
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   * Set the list of predicate expressions for this pattern step.
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   * @param predicates List of expression objects.
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //   */
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //  public void setPredicates(Expression[] predicates)
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //  {
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //    m_predicates = predicates;
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  //  }
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the list of predicate expressions for this pattern step.
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return List of expression objects.
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Expression[] getPredicates()
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_predicates;
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The list of predicate expressions for this pattern step.
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  Expression[] m_predicates;
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell if this expression or it's subexpressions can traverse outside
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the current subtree.
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * NOTE: Ancestors tests with predicates are problematic, and will require
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * special treatment.
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if traversal outside the context node's subtree can occur.
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean canTraverseOutsideSubtree()
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = getPredicateCount();
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < n; i++)
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (getPredicate(i).canTraverseOutsideSubtree())
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return true;
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get a predicate expression.
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param i The index of the predicate.
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A predicate expression.
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Expression getPredicate(int i)
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_predicates[i];
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the number of predicates for this match pattern step.
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the number of predicates for this match pattern step.
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public final int getPredicateCount()
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (null == m_predicates) ? 0 : m_predicates.length;
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the predicates for this match pattern step.
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param predicates An array of expressions that define predicates
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                   for this step.
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setPredicates(Expression[] predicates)
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_predicates = predicates;
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null != predicates)
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	for(int i = 0; i < predicates.length; i++)
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	{
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    		predicates[i].exprSetParent(this);
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	}
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    calcScore();
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Static calc of match score.
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void calcScore()
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((getPredicateCount() > 0) || (null != m_relativePathPattern))
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_score = SCORE_OTHER;
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      super.calcScore();
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null == m_targetString)
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      calcTargetString();
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Execute this pattern step, including predicates.
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt XPath runtime context.
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param currentNode The current node context.
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject execute(XPathContext xctxt, int currentNode)
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTM dtm = xctxt.getDTM(currentNode);
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (dtm != null)
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int expType = dtm.getExpandedTypeID(currentNode);
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return execute(xctxt, currentNode, dtm, expType);
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return NodeTest.SCORE_NONE;
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Execute this pattern step, including predicates.
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt XPath runtime context.
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject execute(XPathContext xctxt)
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return execute(xctxt, xctxt.getCurrentNode());
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Execute an expression in the XPath runtime context, and return the
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * result of the expression.
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The XPath runtime context.
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param currentNode The currentNode.
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtm The DTM of the current node.
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param expType The expanded type ID of the current node.
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The result of the expression in the form of a <code>XObject</code>.
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException if a runtime exception
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         occurs.
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject execute(
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext xctxt, int currentNode, DTM dtm, int expType)
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_whatToShow == NodeTest.SHOW_BYFUNCTION)
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != m_relativePathPattern)
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return m_relativePathPattern.execute(xctxt);
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NodeTest.SCORE_NONE;
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XObject score;
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    score = super.execute(xctxt, currentNode, dtm, expType);
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (score == NodeTest.SCORE_NONE)
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return NodeTest.SCORE_NONE;
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (getPredicateCount() != 0)
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!executePredicates(xctxt, dtm, currentNode))
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return NodeTest.SCORE_NONE;
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_relativePathPattern)
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_relativePathPattern.executeRelativePathPattern(xctxt, dtm,
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              currentNode);
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return score;
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * New Method to check whether the current node satisfies a position predicate
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The XPath runtime context.
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param predPos Which predicate we're evaluating of foo[1][2][3].
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtm The DTM of the current node.
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param context The currentNode.
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param pos The position being requested, i.e. the value returned by
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            m_predicates[predPos].execute(xctxt).
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true of the position of the context matches pos, false otherwise.
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private final boolean checkProximityPosition(XPathContext xctxt,
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          int predPos, DTM dtm, int context, int pos)
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTMAxisTraverser traverser =
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        dtm.getAxisTraverser(Axis.PRECEDINGSIBLING);
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int child = traverser.first(context); DTM.NULL != child;
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              child = traverser.next(context, child))
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xctxt.pushCurrentNode(child);
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (NodeTest.SCORE_NONE != super.execute(xctxt, child))
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            boolean pass = true;
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              xctxt.pushSubContextList(this);
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              for (int i = 0; i < predPos; i++)
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              {
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                xctxt.pushPredicatePos(i);
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                try
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  XObject pred = m_predicates[i].execute(xctxt);
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  try
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  {
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if (XObject.CLASS_NUMBER == pred.getType())
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    {
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      throw new Error("Why: Should never have been called");
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    else if (!pred.boolWithSideEffects())
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    {
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      pass = false;
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      break;
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  }
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  finally
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  {
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    pred.detach();
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  }
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                finally
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  xctxt.popPredicatePos();
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            finally
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              xctxt.popSubContextList();
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (pass)
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              pos--;
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (pos < 1)
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              return false;
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        finally
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xctxt.popCurrentNode();
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (javax.xml.transform.TransformerException se)
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // TODO: should keep throw sax exception...
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new java.lang.RuntimeException(se.getMessage());
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (pos == 1);
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the proximity position index of the current node based on this
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * node test.
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt XPath runtime context.
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param predPos Which predicate we're evaluating of foo[1][2][3].
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param findLast If true, don't terminate when the context node is found.
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the proximity position index of the current node based on the
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         node test.
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private final int getProximityPosition(XPathContext xctxt, int predPos,
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    boolean findLast)
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int pos = 0;
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int context = xctxt.getCurrentNode();
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTM dtm = xctxt.getDTM(context);
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int parent = dtm.getParent(context);
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      DTMAxisTraverser traverser = dtm.getAxisTraverser(Axis.CHILD);
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int child = traverser.first(parent); DTM.NULL != child;
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              child = traverser.next(parent, child))
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xctxt.pushCurrentNode(child);
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (NodeTest.SCORE_NONE != super.execute(xctxt, child))
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            boolean pass = true;
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              xctxt.pushSubContextList(this);
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              for (int i = 0; i < predPos; i++)
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              {
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                xctxt.pushPredicatePos(i);
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                try
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  XObject pred = m_predicates[i].execute(xctxt);
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  try
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  {
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if (XObject.CLASS_NUMBER == pred.getType())
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    {
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      if ((pos + 1) != (int) pred.numWithSideEffects())
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      {
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        pass = false;
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        break;
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      }
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    else if (!pred.boolWithSideEffects())
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    {
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      pass = false;
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                      break;
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  }
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  finally
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  {
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    pred.detach();
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  }
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                finally
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  xctxt.popPredicatePos();
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            finally
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              xctxt.popSubContextList();
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (pass)
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              pos++;
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (!findLast && child == context)
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              return pos;
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        finally
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xctxt.popCurrentNode();
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (javax.xml.transform.TransformerException se)
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // TODO: should keep throw sax exception...
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new java.lang.RuntimeException(se.getMessage());
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return pos;
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the proximity position index of the current node based on this
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * node test.
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt XPath runtime context.
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the proximity position index of the current node based on the
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         node test.
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getProximityPosition(XPathContext xctxt)
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return getProximityPosition(xctxt, xctxt.getPredicatePos(), false);
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the count of the nodes that match the test, which is the proximity
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * position of the last node that can pass this test in the sub context
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * selection.  In XSLT 1-based indexing, this count is the index of the last
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * node.
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt XPath runtime context.
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the count of the nodes that match the test.
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getLastPos(XPathContext xctxt)
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return getProximityPosition(xctxt, xctxt.getPredicatePos(), true);
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Execute the match pattern step relative to another step.
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The XPath runtime context.
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtm The DTM of the current node.
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param currentNode The current node context.
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected final XObject executeRelativePathPattern(
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext xctxt, DTM dtm, int currentNode)
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XObject score = NodeTest.SCORE_NONE;
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int context = currentNode;
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    DTMAxisTraverser traverser;
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    traverser = dtm.getAxisTraverser(m_axis);
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int relative = traverser.first(context); DTM.NULL != relative;
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            relative = traverser.next(context, relative))
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        xctxt.pushCurrentNode(relative);
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        score = execute(xctxt);
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (score != NodeTest.SCORE_NONE)
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      finally
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        xctxt.popCurrentNode();
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return score;
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Execute the predicates on this step to determine if the current node
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * should be filtered or accepted.
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The XPath runtime context.
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param dtm The DTM of the current node.
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param currentNode The current node context.
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the node should be accepted, false otherwise.
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected final boolean executePredicates(
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext xctxt, DTM dtm, int currentNode)
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean result = true;
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean positionAlreadySeen = false;
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int n = getPredicateCount();
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.pushSubContextList(this);
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i = 0; i < n; i++)
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        xctxt.pushPredicatePos(i);
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XObject pred = m_predicates[i].execute(xctxt);
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          try
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (XObject.CLASS_NUMBER == pred.getType())
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              int pos = (int) pred.num();
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              if (positionAlreadySeen)
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              {
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                result = (pos == 1);
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                break;
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              else
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              {
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                positionAlreadySeen = true;
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (!checkProximityPosition(xctxt, i, dtm, currentNode, pos))
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                {
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  result = false;
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                  break;
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              }
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else if (!pred.boolWithSideEffects())
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              result = false;
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              break;
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          finally
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            pred.detach();
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        finally
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xctxt.popPredicatePos();
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popSubContextList();
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return result;
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the string represenentation of this step for diagnostic purposes.
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return A string representation of this step, built by reverse-engineering
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the contained info.
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String toString()
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    StringBuffer buf = new StringBuffer();
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (StepPattern pat = this; pat != null; pat = pat.m_relativePathPattern)
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (pat != this)
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        buf.append("/");
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      buf.append(Axis.getNames(pat.m_axis));
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      buf.append("::");
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (0x000005000 == pat.m_whatToShow)
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        buf.append("doc()");
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (DTMFilter.SHOW_BYFUNCTION == pat.m_whatToShow)
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        buf.append("function()");
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (DTMFilter.SHOW_ALL == pat.m_whatToShow)
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        buf.append("node()");
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (DTMFilter.SHOW_TEXT == pat.m_whatToShow)
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        buf.append("text()");
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (DTMFilter.SHOW_PROCESSING_INSTRUCTION == pat.m_whatToShow)
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        buf.append("processing-instruction(");
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != pat.m_name)
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          buf.append(pat.m_name);
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        buf.append(")");
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (DTMFilter.SHOW_COMMENT == pat.m_whatToShow)
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        buf.append("comment()");
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (null != pat.m_name)
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (DTMFilter.SHOW_ATTRIBUTE == pat.m_whatToShow)
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          buf.append("@");
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != pat.m_namespace)
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          buf.append("{");
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          buf.append(pat.m_namespace);
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          buf.append("}");
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        buf.append(pat.m_name);
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if (DTMFilter.SHOW_ATTRIBUTE == pat.m_whatToShow)
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        buf.append("@");
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else if ((DTMFilter.SHOW_DOCUMENT | DTMFilter.SHOW_DOCUMENT_FRAGMENT)
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               == pat.m_whatToShow)
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        buf.append("doc-root()");
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        buf.append("?" + Integer.toHexString(pat.m_whatToShow));
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != pat.m_predicates)
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int i = 0; i < pat.m_predicates.length; i++)
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          buf.append("[");
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          buf.append(pat.m_predicates[i]);
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          buf.append("]");
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return buf.toString();
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Set to true to send diagnostics about pattern matches to the consol. */
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final boolean DEBUG_MATCHES = false;
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the match score of the given node.
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The XPath runtime context.
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param context The node to be tested.
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public double getMatchScore(XPathContext xctxt, int context)
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xctxt.pushCurrentNode(context);
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xctxt.pushCurrentExpressionNode(context);
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XObject score = execute(xctxt);
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return score.num();
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popCurrentNode();
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popCurrentExpressionNode();
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // return XPath.MATCH_SCORE_NONE;
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the axis that this step should follow.
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc.
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setAxis(int axis)
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_axis = axis;
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the axis that this step follows.
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The Axis for this test, one of of Axes.ANCESTORORSELF, etc.
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getAxis()
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_axis;
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  class PredOwner implements ExpressionOwner
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	int m_index;
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	PredOwner(int index)
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	{
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		m_index = index;
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	}
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExpressionOwner#getExpression()
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public Expression getExpression()
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_predicates[m_index];
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see ExpressionOwner#setExpression(Expression)
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setExpression(Expression exp)
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	exp.exprSetParent(StepPattern.this);
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	m_predicates[m_index] = exp;
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	 	if(visitor.visitMatchPattern(owner, this))
9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	 	{
9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	 		callSubtreeVisitors(visitor);
9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	 	}
9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Call the visitors on the subtree.  Factored out from callVisitors
9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * so it may be called by derived classes.
9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void callSubtreeVisitors(XPathVisitor visitor)
9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_predicates)
9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int n = m_predicates.length;
9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      for (int i = 0; i < n; i++)
9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        ExpressionOwner predOwner = new PredOwner(i);
9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (visitor.visitPredicate(predOwner, m_predicates[i]))
9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_predicates[i].callVisitors(predOwner, visitor);
9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_relativePathPattern)
9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_relativePathPattern.callVisitors(this, visitor);
9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see ExpressionOwner#getExpression()
10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Expression getExpression()
10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_relativePathPattern;
10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see ExpressionOwner#setExpression(Expression)
10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setExpression(Expression exp)
10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    exp.exprSetParent(this);
10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	m_relativePathPattern = (StepPattern)exp;
10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see Expression#deepEquals(Expression)
10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean deepEquals(Expression expr)
10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(!super.deepEquals(expr))
10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		return false;
10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	StepPattern sp = (StepPattern)expr;
10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != m_predicates)
10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int n = m_predicates.length;
10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if ((null == sp.m_predicates) || (sp.m_predicates.length != n))
10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              return false;
10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int i = 0; i < n; i++)
10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (!m_predicates[i].deepEquals(sp.m_predicates[i]))
10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          	return false;
10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (null != sp.m_predicates)
10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	return false;
10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(null != m_relativePathPattern)
10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	{
10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		if(!m_relativePathPattern.deepEquals(sp.m_relativePathPattern))
10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  			return false;
10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	}
10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	else if(sp.m_relativePathPattern != null)
10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		return false;
10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	return true;
10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
1054