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: MatchPatternIterator.java 469314 2006-10-30 23:31:59Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath.axes;
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.DTMIterator;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.compiler.Compiler;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.compiler.OpMap;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XObject;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.patterns.NodeTest;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.patterns.StepPattern;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class treats a
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <a href="http://www.w3.org/TR/xpath#location-paths">LocationPath</a> as a
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * filtered iteration over the tree, evaluating each node in a super axis
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * traversal against the LocationPath interpreted as a match pattern.  This
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * class is useful to find nodes in document order that are complex paths
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * whose steps probably criss-cross each other.
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class MatchPatternIterator extends LocPathIterator
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = -5201153767396296474L;
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** This is the select pattern, translated into a match pattern. */
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected StepPattern m_pattern;
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The traversal axis from where the nodes will be filtered. */
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int m_superAxis = -1;
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The DTM inner traversal class, that corresponds to the super axis. */
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected DTMAxisTraverser m_traverser;
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** DEBUG flag for diagnostic dumps. */
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final boolean DEBUG = false;
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  protected int m_nsElemBase = DTM.NULL;
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a LocPathIterator object, including creation
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of step walkers from the opcode list, and call back
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * into the Compiler to create predicate expressions.
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param compiler The Compiler which is creating
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this expression.
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param opPos The position of this iterator in the
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * opcode list from the compiler.
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param analysis Analysis bits that give general information about the
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * LocationPath.
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  MatchPatternIterator(Compiler compiler, int opPos, int analysis)
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super(compiler, opPos, analysis, false);
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int firstStepPos = OpMap.getFirstChildPos(opPos);
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_pattern = WalkerFactory.loadSteps(this, compiler, firstStepPos, 0);
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean fromRoot = false;
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean walkBack = false;
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean walkDescendants = false;
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean walkAttributes = false;
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (analysis & (WalkerFactory.BIT_ROOT |
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          WalkerFactory.BIT_ANY_DESCENDANT_FROM_ROOT)))
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      fromRoot = true;
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (analysis
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              & (WalkerFactory.BIT_ANCESTOR
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 | WalkerFactory.BIT_ANCESTOR_OR_SELF
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 | WalkerFactory.BIT_PRECEDING
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 | WalkerFactory.BIT_PRECEDING_SIBLING
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 | WalkerFactory.BIT_FOLLOWING
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 | WalkerFactory.BIT_FOLLOWING_SIBLING
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 | WalkerFactory.BIT_PARENT | WalkerFactory.BIT_FILTER)))
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      walkBack = true;
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (analysis
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              & (WalkerFactory.BIT_DESCENDANT_OR_SELF
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 | WalkerFactory.BIT_DESCENDANT
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                 | WalkerFactory.BIT_CHILD)))
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      walkDescendants = true;
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 != (analysis
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              & (WalkerFactory.BIT_ATTRIBUTE | WalkerFactory.BIT_NAMESPACE)))
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      walkAttributes = true;
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(false || DEBUG)
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.print("analysis: "+Integer.toBinaryString(analysis));
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.println(", "+WalkerFactory.getAnalysisString(analysis));
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(fromRoot || walkBack)
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(walkAttributes)
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_superAxis = Axis.ALL;
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_superAxis = Axis.DESCENDANTSFROMROOT;
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if(walkDescendants)
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(walkAttributes)
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_superAxis = Axis.ALLFROMNODE;
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_superAxis = Axis.DESCENDANTORSELF;
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_superAxis = Axis.ALL;
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(false || DEBUG)
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.println("axis: "+Axis.getNames(m_superAxis));
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Initialize the context values for this expression
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * after it is cloned.
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param context The XPath runtime context for this
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * transformation.
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setRoot(int context, Object environment)
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super.setRoot(context, environment);
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_traverser = m_cdtm.getAxisTraverser(m_superAxis);
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  Detaches the iterator from the set which it iterated over, releasing
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * any computational resources and placing the iterator in the INVALID
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * state. After<code>detach</code> has been invoked, calls to
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <code>nextNode</code> or<code>previousNode</code> will raise the
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * exception INVALID_STATE_ERR.
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void detach()
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(m_allowDetach)
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_traverser = null;
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Always call the superclass detach last!
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      super.detach();
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the next node via getNextXXX.  Bottlenecked for derived class override.
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The next node on the axis, or DTM.NULL.
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected int getNextNode()
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_lastFetched = (DTM.NULL == m_lastFetched)
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                     ? m_traverser.first(m_context)
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                     : m_traverser.next(m_context, m_lastFetched);
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_lastFetched;
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  Returns the next node in the set and advances the position of the
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * iterator in the set. After a NodeIterator is created, the first call
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to nextNode() returns the first node in the set.
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return  The next <code>Node</code> in the set being iterated over, or
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   <code>null</code> if there are no more members in that set.
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int nextNode()
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(m_foundLast)
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		return DTM.NULL;
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int next;
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    org.apache.xpath.VariableStack vars;
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int savedStart;
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (-1 != m_stackFrame)
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      vars = m_execContext.getVarStack();
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // These three statements need to be combined into one operation.
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      savedStart = vars.getStackFrame();
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      vars.setStackFrame(m_stackFrame);
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Yuck.  Just to shut up the compiler!
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      vars = null;
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      savedStart = 0;
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(DEBUG)
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.out.println("m_pattern"+m_pattern.toString());
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      do
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        next = getNextNode();
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (DTM.NULL != next)
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if(DTMIterator.FILTER_ACCEPT == acceptNode(next, m_execContext))
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            break;
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            continue;
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          break;
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (next != DTM.NULL);
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (DTM.NULL != next)
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(DEBUG)
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          System.out.println("next: "+next);
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          System.out.println("name: "+m_cdtm.getNodeName(next));
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        incrementCurrentPos();
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return next;
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_foundLast = true;
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return DTM.NULL;
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (-1 != m_stackFrame)
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // These two statements need to be combined into one operation.
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        vars.setStackFrame(savedStart);
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  Test whether a specified node is visible in the logical view of a
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * TreeWalker or NodeIterator. This function will be called by the
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * implementation of TreeWalker and NodeIterator; it is not intended to
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * be called directly from user code.
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param n  The node to check to see if it passes the filter or not.
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return  a constant to determine whether the node is accepted,
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   rejected, or skipped, as defined  above .
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public short acceptNode(int n, XPathContext xctxt)
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.pushCurrentNode(n);
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.pushIteratorRoot(m_context);
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(DEBUG)
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.out.println("traverser: "+m_traverser);
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.out.print("node: "+n);
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.out.println(", "+m_cdtm.getNodeName(n));
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // if(m_cdtm.getNodeName(n).equals("near-east"))
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.out.println("pattern: "+m_pattern.toString());
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_pattern.debugWhatToShow(m_pattern.getWhatToShow());
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XObject score = m_pattern.execute(xctxt);
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(DEBUG)
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // System.out.println("analysis: "+Integer.toBinaryString(m_analysis));
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.out.println("score: "+score);
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.out.println("skip: "+(score == NodeTest.SCORE_NONE));
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // System.out.println("\n::acceptNode - score: "+score.num()+"::");
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return (score == NodeTest.SCORE_NONE) ? DTMIterator.FILTER_SKIP
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    : DTMIterator.FILTER_ACCEPT;
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (javax.xml.transform.TransformerException se)
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // TODO: Fix this.
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(se.getMessage());
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popCurrentNode();
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popIteratorRoot();
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
332