sboag       01/06/02 20:09:25

  Modified:    java/src/org/apache/xpath/axes Tag: DTM_EXP
                        AttributeIterator.java ChildIterator.java
                        ChildTestIterator.java DescendantIterator.java
                        FilterExprWalker.java LocPathIterator.java
                        MatchPatternIterator.java OneStepIterator.java
                        OneStepIteratorForward.java PredicatedNodeTest.java
                        ReverseAxesWalker.java SelfIteratorNoPredicate.java
                        UnionPathIterator.java WalkerFactory.java
                        WalkingIterator.java WalkingIteratorSorted.java
  Added:       java/src/org/apache/xpath/axes Tag: DTM_EXP
                        IteratorPool.java
  Log:
  Added self pooling for iterators.  Instead of cloning all the time,
  the asNodeIterator can return an iterator from the pool.  This is
  a major performance improvement.  For the moment this is just
  used from the ElemForEach#traverse method, but it will be extended
  to be used universally.  Must be applied against the threading tests,
  since the pools themselves are kept in the static structure.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.7.2.3   +1 -1      
xml-xalan/java/src/org/apache/xpath/axes/AttributeIterator.java
  
  Index: AttributeIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/AttributeIterator.java,v
  retrieving revision 1.7.2.2
  retrieving revision 1.7.2.3
  diff -u -r1.7.2.2 -r1.7.2.3
  --- AttributeIterator.java    2001/05/27 02:28:47     1.7.2.2
  +++ AttributeIterator.java    2001/06/03 03:09:23     1.7.2.3
  @@ -85,7 +85,7 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public AttributeIterator(Compiler compiler, int opPos, int analysis)
  +  AttributeIterator(Compiler compiler, int opPos, int analysis)
             throws javax.xml.transform.TransformerException
     {
       super(compiler, opPos, analysis);
  
  
  
  1.6.2.5   +4 -4      
xml-xalan/java/src/org/apache/xpath/axes/ChildIterator.java
  
  Index: ChildIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/ChildIterator.java,v
  retrieving revision 1.6.2.4
  retrieving revision 1.6.2.5
  diff -u -r1.6.2.4 -r1.6.2.5
  --- ChildIterator.java        2001/05/29 14:31:37     1.6.2.4
  +++ ChildIterator.java        2001/06/03 03:09:23     1.6.2.5
  @@ -66,6 +66,7 @@
   //import org.w3c.dom.Node;
   //import org.w3c.dom.DOMException;
   import org.apache.xml.dtm.DTM;
  +import org.apache.xml.dtm.DTMIterator;
   
   /**
    * <meta name="usage" content="advanced"/>
  @@ -87,7 +88,7 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public ChildIterator(Compiler compiler, int opPos, int analysis)
  +  ChildIterator(Compiler compiler, int opPos, int analysis)
             throws javax.xml.transform.TransformerException
     {
       super(compiler, opPos, analysis, false);
  @@ -141,11 +142,10 @@
         return DTM.NULL;
   
       int next;
  -    DTM dtm = m_cdtm;
   
       m_lastFetched = next = (DTM.NULL == m_lastFetched)
  -                           ? dtm.getFirstChild(m_context)
  -                           : dtm.getNextSibling(m_lastFetched);
  +                           ? m_cdtm.getFirstChild(m_context)
  +                           : m_cdtm.getNextSibling(m_lastFetched);
   
       // m_lastFetched = next;
       if (DTM.NULL != next)
  
  
  
  1.8.2.4   +1 -1      
xml-xalan/java/src/org/apache/xpath/axes/ChildTestIterator.java
  
  Index: ChildTestIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/ChildTestIterator.java,v
  retrieving revision 1.8.2.3
  retrieving revision 1.8.2.4
  diff -u -r1.8.2.3 -r1.8.2.4
  --- ChildTestIterator.java    2001/05/27 02:28:48     1.8.2.3
  +++ ChildTestIterator.java    2001/06/03 03:09:23     1.8.2.4
  @@ -88,7 +88,7 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public ChildTestIterator(Compiler compiler, int opPos, int analysis)
  +  ChildTestIterator(Compiler compiler, int opPos, int analysis)
             throws javax.xml.transform.TransformerException
     {
   
  
  
  
  1.8.2.10  +20 -4     
xml-xalan/java/src/org/apache/xpath/axes/DescendantIterator.java
  
  Index: DescendantIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/DescendantIterator.java,v
  retrieving revision 1.8.2.9
  retrieving revision 1.8.2.10
  diff -u -r1.8.2.9 -r1.8.2.10
  --- DescendantIterator.java   2001/05/29 14:31:37     1.8.2.9
  +++ DescendantIterator.java   2001/06/03 03:09:23     1.8.2.10
  @@ -87,7 +87,7 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public DescendantIterator(Compiler compiler, int opPos, int analysis)
  +  DescendantIterator(Compiler compiler, int opPos, int analysis)
             throws javax.xml.transform.TransformerException
     {
   
  @@ -292,9 +292,9 @@
      * @param execContext The XPath runtime context for this
      * transformation.
      */
  -  public void initContext(XPathContext execContext)
  +  public void setRoot(int context, Object environment)
     {
  -    super.initContext(execContext);
  +    super.setRoot(context, environment);
       m_traverser = m_cdtm.getAxisTraverser(m_axis);
       
       String localName = getLocalName();
  @@ -354,6 +354,22 @@
         return traverser.first(current, extendedType);
       }
     }
  +  
  +  /**
  +   *  Detaches the iterator from the set which it iterated over, releasing
  +   * any computational resources and placing the iterator in the INVALID
  +   * state. After<code>detach</code> has been invoked, calls to
  +   * <code>nextNode</code> or<code>previousNode</code> will raise the
  +   * exception INVALID_STATE_ERR.
  +   */
  +  public void detach()
  +  {    
  +    m_traverser = null;    
  +    m_extendedTypeID = 0;
  +    
  +    // Always call the superclass detach last!
  +    super.detach();
  +  }
   
     
     /** The traverser to use to navigate over the descendants. */
  @@ -362,7 +378,7 @@
     /** The axis that we are traversing. */
     protected int m_axis;
     
  -  /** The extended type ID, not set until initContext. */
  +  /** The extended type ID, not set until setRoot. */
     protected int m_extendedTypeID;
     
   }
  
  
  
  1.14.2.7  +1 -1      
xml-xalan/java/src/org/apache/xpath/axes/FilterExprWalker.java
  
  Index: FilterExprWalker.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/FilterExprWalker.java,v
  retrieving revision 1.14.2.6
  retrieving revision 1.14.2.7
  diff -u -r1.14.2.6 -r1.14.2.7
  --- FilterExprWalker.java     2001/05/28 04:07:39     1.14.2.6
  +++ FilterExprWalker.java     2001/06/03 03:09:23     1.14.2.7
  @@ -87,7 +87,7 @@
      *
      * @param locPathIterator non-null reference to the parent iterator.
      */
  -  public FilterExprWalker(WalkingIterator locPathIterator)
  +  FilterExprWalker(WalkingIterator locPathIterator)
     {
       super(locPathIterator, Axis.FILTEREDLIST);
     }
  
  
  
  1.24.2.10 +78 -78    
xml-xalan/java/src/org/apache/xpath/axes/LocPathIterator.java
  
  Index: LocPathIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/LocPathIterator.java,v
  retrieving revision 1.24.2.9
  retrieving revision 1.24.2.10
  diff -u -r1.24.2.9 -r1.24.2.10
  --- LocPathIterator.java      2001/05/29 14:31:38     1.24.2.9
  +++ LocPathIterator.java      2001/06/03 03:09:23     1.24.2.10
  @@ -105,7 +105,7 @@
      * @param nscontext The namespace context for this iterator,
      * should be OK if null.
      */
  -  public LocPathIterator(PrefixResolver nscontext)
  +  protected LocPathIterator(PrefixResolver nscontext)
     {
   
       setLocPathIterator(this);
  @@ -125,7 +125,7 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public LocPathIterator(Compiler compiler, int opPos, int analysis)
  +  protected LocPathIterator(Compiler compiler, int opPos, int analysis)
             throws javax.xml.transform.TransformerException
     {
       this(compiler, opPos, analysis, true);
  @@ -146,7 +146,7 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public LocPathIterator(
  +  protected LocPathIterator(
             Compiler compiler, int opPos, int analysis, boolean 
shouldLoadWalkers)
               throws javax.xml.transform.TransformerException
     {
  @@ -221,7 +221,8 @@
         // if (null == clone)
         LocPathIterator clone = (LocPathIterator) this.clone();
   
  -      clone.initContext(xctxt);
  +      int current = xctxt.getCurrentNode();
  +      clone.setRoot(current, xctxt);
   
         return new XNodeSet(clone);
       }
  @@ -232,6 +233,31 @@
     }
     
     /**
  +   * <meta name="usage" content="experimental"/>
  +   * Given an select expression and a context, evaluate the XPath
  +   * and return the resulting iterator.
  +   * 
  +   * @param xctxt The execution context.
  +   * @param contextNode The node that "." expresses.
  +   * @param namespaceContext The context in which namespaces in the
  +   * XPath are supposed to be expanded.
  +   * 
  +   * @throws TransformerException thrown if the active ProblemListener 
decides
  +   * the error condition is severe enough to halt processing.
  +   *
  +   * @throws javax.xml.transform.TransformerException
  +   */
  +  public DTMIterator asIterator(
  +          XPathContext xctxt, int contextNode)
  +            throws javax.xml.transform.TransformerException
  +  {
  +    LocPathIterator clone = (LocPathIterator)m_clones.getInstance();
  +    clone.setRoot(contextNode, xctxt);
  +    return clone;
  +  }
  +
  +  
  +  /**
      * Tell if the expression is a nodeset expression.  In other words, tell 
      * if you can execute [EMAIL PROTECTED] asNode() asNode} without an 
exception.
      * @return true if the expression can be represented as a nodeset.
  @@ -252,21 +278,15 @@
     public int asNode(XPathContext xctxt)
       throws javax.xml.transform.TransformerException
     {
  -    try
  -    {
  +    LocPathIterator iter = (LocPathIterator)m_clones.getInstance();
   
  -      // LocPathIterator clone = (LocPathIterator) 
m_pool.getInstanceIfFree();
  -      // if (null == clone)
  -      LocPathIterator clone = (LocPathIterator) this.clone();
  -
  -      clone.initContext(xctxt);
  -
  -      return clone.nextNode();
  -    }
  -    catch (CloneNotSupportedException ncse)
  -    {
  -      throw new javax.xml.transform.TransformerException(ncse);
  -    }
  +    int current = xctxt.getCurrentNode();
  +    
  +    iter.setRoot(current, xctxt);
  +
  +    int next = iter.nextNode();
  +    m_clones.freeInstance(iter);
  +    return next;
     }
   
     /**
  @@ -294,31 +314,6 @@
     {
       return m_isTopLevel;
     }
  -
  -  /**
  -   * Initialize the context values for this expression
  -   * after it is cloned.
  -   *
  -   * @param execContext The XPath runtime context for this
  -   * transformation.
  -   */
  -  public void initContext(XPathContext execContext)
  -  {
  -
  -    this.m_context = execContext.getCurrentNode();
  -    m_cdtm = execContext.getDTM(m_context);
  -    this.m_currentContextNode = execContext.getCurrentExpressionNode();
  -    this.m_execContext = execContext;
  -    this.m_prefixResolver = execContext.getNamespaceContext();
  -
  -    if (m_isTopLevel)
  -    {
  -      VariableStack vars = execContext.getVarStack();
  -
  -      this.m_varStackPos = vars.getSearchStartOrTop();
  -      this.m_varStackContext = vars.getContextPos();
  -    }
  -  }
     
     /**
      * Initialize the context values for this expression
  @@ -327,22 +322,30 @@
      * @param execContext The XPath runtime context for this
      * transformation.
      */
  -  public void initContext(XPathContext execContext, int context)
  +  public void setRoot(int context, Object environment)
     {
   
  -    this.m_context = context;
  -    m_cdtm = execContext.getDTM(m_context);
  -    this.m_currentContextNode = context;
  -    this.m_execContext = execContext;
  -    this.m_prefixResolver = execContext.getNamespaceContext();
  +    m_context = context;
  +    XPathContext xctxt = (XPathContext)environment;
  +    m_execContext = xctxt;
  +    m_cdtm = xctxt.getDTM(context);
  +    m_currentContextNode = context;
  +    m_prefixResolver = xctxt.getNamespaceContext();
  +    
  +//    m_lastFetched = DTM.NULL;
  +//    m_currentContextNode = DTM.NULL;
  +//    m_foundLast = false;
  +//    m_last = 0;
  +//    m_next = 0;
   
       if (m_isTopLevel)
       {
  -      VariableStack vars = execContext.getVarStack();
  +      VariableStack vars = xctxt.getVarStack();
   
         this.m_varStackPos = vars.getSearchStartOrTop();
         this.m_varStackContext = vars.getContextPos();
       }
  +    reset();
     }
   
     /**
  @@ -628,16 +631,13 @@
      * exception INVALID_STATE_ERR.
      */
     public void detach()
  -  {
  -
  -    this.m_context = DTM.NULL;
  +  {    
  +    m_cachedNodes = null;
  +    m_execContext = null;
  +    m_prefixResolver = null;
       m_cdtm = null;
  -    this.m_execContext = null;
  -    this.m_prefixResolver = null;
  -    this.m_varStackPos = -1;
  -    this.m_varStackContext = 0;
  -
  -    // m_pool.freeInstance(this);
  +    
  +    m_clones.freeInstance(this);
     }
   
     /**
  @@ -778,7 +778,7 @@
      * The XPath execution context we are operating on.
      *
      * @return XPath execution context this iterator is operating on,
  -   * or null if initContext has not been called.
  +   * or null if setRoot has not been called.
      */
     public final XPathContext getXPathContext()
     {
  @@ -816,17 +816,16 @@
       m_currentContextNode = n;
     }
     
  -  /**
  -   * Set the current context node for this iterator.
  -   *
  -   * @param n Must be a non-null reference to the node context.
  -   */
  -  public void setRoot(int n)
  -  {
  -    m_context = n;
  -    m_cdtm = m_execContext.getDTM(n);
  -  }
  -
  +//  /**
  +//   * Set the current context node for this iterator.
  +//   *
  +//   * @param n Must be a non-null reference to the node context.
  +//   */
  +//  public void setRoot(int n)
  +//  {
  +//    m_context = n;
  +//    m_cdtm = m_execContext.getDTM(n);
  +//  }
   
     /**
      * Return the saved reference to the prefix resolver that
  @@ -924,6 +923,13 @@
     //============= State Data =============
     
     /** 
  +   * The pool for cloned iterators.  Iterators need to be cloned
  +   * because the hold running state, and thus the original iterator
  +   * expression from the stylesheet pool can not be used.          
  +   */
  +  protected IteratorPool m_clones = new IteratorPool(this);
  +  
  +  /** 
      * The dtm of the context node.  Careful about using this... it may not 
      * be the dtm of the current node.
      */
  @@ -954,12 +960,6 @@
     /** The index of the last node in the iteration. */
     transient private int m_last = 0;
     
  -  /* The pool for cloned iterators.  Iterators need to be cloned
  -   * because the hold running state, and thus the original iterator
  -   * expression from the stylesheet pool can not be used.          */
  -
  -  // ObjectPool m_pool = new ObjectPool(this.getClass());
  -
     /** The last node that was fetched, usually by nextNode. */
     transient public int m_lastFetched = DTM.NULL;
   
  @@ -1004,7 +1004,7 @@
      * is a cached iterator, and is being used as random access
      * NodeList.
      */
  -  transient protected int m_next = 0;
  +  transient protected int m_next;
   
   //  /**
   //   * The analysis pattern built by the WalkerFactory.
  
  
  
  1.1.2.4   +5 -7      
xml-xalan/java/src/org/apache/xpath/axes/Attic/MatchPatternIterator.java
  
  Index: MatchPatternIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/Attic/MatchPatternIterator.java,v
  retrieving revision 1.1.2.3
  retrieving revision 1.1.2.4
  diff -u -r1.1.2.3 -r1.1.2.4
  --- MatchPatternIterator.java 2001/05/27 02:28:49     1.1.2.3
  +++ MatchPatternIterator.java 2001/06/03 03:09:23     1.1.2.4
  @@ -114,7 +114,7 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public MatchPatternIterator(Compiler compiler, int opPos, int analysis)
  +  MatchPatternIterator(Compiler compiler, int opPos, int analysis)
             throws javax.xml.transform.TransformerException
     {
   
  @@ -199,9 +199,9 @@
      * @param execContext The XPath runtime context for this
      * transformation.
      */
  -  public void initContext(XPathContext execContext)
  +  public void setRoot(int context, Object environment)
     {
  -    super.initContext(execContext);
  +    super.setRoot(context, environment);
       m_traverser = m_cdtm.getAxisTraverser(m_superAxis);
     }
     
  @@ -277,7 +277,7 @@
     
           if (DTM.NULL != next)
           {
  -          if(DTMIterator.FILTER_ACCEPT == acceptNode(next))
  +          if(DTMIterator.FILTER_ACCEPT == acceptNode(next, m_execContext))
               break;
             else
               continue;
  @@ -329,10 +329,8 @@
      * @return  a constant to determine whether the node is accepted,
      *   rejected, or skipped, as defined  above .
      */
  -  public short acceptNode(int n)
  +  public short acceptNode(int n, XPathContext xctxt)
     {
  -
  -    XPathContext xctxt = m_lpi.getXPathContext();
   
       try
       {
  
  
  
  1.1.2.3   +10 -8     
xml-xalan/java/src/org/apache/xpath/axes/Attic/OneStepIterator.java
  
  Index: OneStepIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/Attic/OneStepIterator.java,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- OneStepIterator.java      2001/05/28 04:07:39     1.1.2.2
  +++ OneStepIterator.java      2001/06/03 03:09:23     1.1.2.3
  @@ -36,7 +36,7 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public OneStepIterator(Compiler compiler, int opPos, int analysis)
  +  OneStepIterator(Compiler compiler, int opPos, int analysis)
             throws javax.xml.transform.TransformerException
     {
       super(compiler, opPos, analysis);
  @@ -53,9 +53,9 @@
      * @param execContext The XPath runtime context for this
      * transformation.
      */
  -  public void initContext(XPathContext execContext)
  +  public void setRoot(int context, Object environment)
     {
  -    super.initContext(execContext);
  +    super.setRoot(context, environment);
       m_iterator = m_cdtm.getAxisIterator(m_axis);
       m_iterator.setStartNode(m_context);
     }
  @@ -127,10 +127,11 @@
         try
         {
           OneStepIterator clone = (OneStepIterator) this.clone();
  +        
  +        int root = getRoot();
  +        xctxt.pushCurrentNode(root);
  +        clone.setRoot(root, xctxt);
   
  -        xctxt.pushCurrentNode(getRoot());
  -        clone.initContext(xctxt);
  -
           clone.setPredicateCount(predicateIndex);
   
           // Count 'em all
  @@ -191,8 +192,9 @@
       {
         OneStepIterator clone = (OneStepIterator) this.clone();
   
  -      xctxt.pushCurrentNode(getRoot());
  -      clone.initContext(xctxt);
  +      int root = getRoot();
  +      xctxt.pushCurrentNode(root);
  +      clone.setRoot(root, xctxt);
   
         clone.setPredicateCount(this.getPredicateCount() - 1);
   
  
  
  
  1.1.2.3   +3 -3      
xml-xalan/java/src/org/apache/xpath/axes/Attic/OneStepIteratorForward.java
  
  Index: OneStepIteratorForward.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/Attic/OneStepIteratorForward.java,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- OneStepIteratorForward.java       2001/05/29 14:31:40     1.1.2.2
  +++ OneStepIteratorForward.java       2001/06/03 03:09:23     1.1.2.3
  @@ -38,7 +38,7 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public OneStepIteratorForward(Compiler compiler, int opPos, int analysis)
  +  OneStepIteratorForward(Compiler compiler, int opPos, int analysis)
             throws javax.xml.transform.TransformerException
     {
       super(compiler, opPos, analysis);
  @@ -57,9 +57,9 @@
      * @param execContext The XPath runtime context for this
      * transformation.
      */
  -  public void initContext(XPathContext execContext)
  +  public void setRoot(int context, Object environment)
     {
  -    super.initContext(execContext);
  +    super.setRoot(context, environment);
       m_traverser = m_cdtm.getAxisTraverser(m_axis);
     }
     
  
  
  
  1.3.2.5   +2 -2      
xml-xalan/java/src/org/apache/xpath/axes/PredicatedNodeTest.java
  
  Index: PredicatedNodeTest.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/PredicatedNodeTest.java,v
  retrieving revision 1.3.2.4
  retrieving revision 1.3.2.5
  diff -u -r1.3.2.4 -r1.3.2.5
  --- PredicatedNodeTest.java   2001/05/28 04:07:40     1.3.2.4
  +++ PredicatedNodeTest.java   2001/06/03 03:09:23     1.3.2.5
  @@ -23,7 +23,7 @@
      *
      * @param locPathIterator non-null reference to the parent iterator.
      */
  -  public PredicatedNodeTest(LocPathIterator locPathIterator)
  +  PredicatedNodeTest(LocPathIterator locPathIterator)
     {
       m_lpi = locPathIterator;
     }
  @@ -32,7 +32,7 @@
      * Construct an AxesWalker.  The location path iterator will have to be set
      * before use.
      */
  -  public PredicatedNodeTest()
  +  PredicatedNodeTest()
     {
     }
     
  
  
  
  1.6.2.5   +1 -1      
xml-xalan/java/src/org/apache/xpath/axes/ReverseAxesWalker.java
  
  Index: ReverseAxesWalker.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/ReverseAxesWalker.java,v
  retrieving revision 1.6.2.4
  retrieving revision 1.6.2.5
  diff -u -r1.6.2.4 -r1.6.2.5
  --- ReverseAxesWalker.java    2001/05/28 04:07:40     1.6.2.4
  +++ ReverseAxesWalker.java    2001/06/03 03:09:23     1.6.2.5
  @@ -83,7 +83,7 @@
      *
      * @param locPathIterator The location path iterator that 'owns' this 
walker.
      */
  -  public ReverseAxesWalker(LocPathIterator locPathIterator, int axis)
  +  ReverseAxesWalker(LocPathIterator locPathIterator, int axis)
     {
       super(locPathIterator, axis);
     }
  
  
  
  1.1.2.3   +15 -1     
xml-xalan/java/src/org/apache/xpath/axes/Attic/SelfIteratorNoPredicate.java
  
  Index: SelfIteratorNoPredicate.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/Attic/SelfIteratorNoPredicate.java,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- SelfIteratorNoPredicate.java      2001/05/29 14:31:41     1.1.2.2
  +++ SelfIteratorNoPredicate.java      2001/06/03 03:09:23     1.1.2.3
  @@ -30,7 +30,7 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public SelfIteratorNoPredicate(Compiler compiler, int opPos, int analysis)
  +  SelfIteratorNoPredicate(Compiler compiler, int opPos, int analysis)
             throws javax.xml.transform.TransformerException
     {
       super(compiler, opPos, analysis, false);
  @@ -103,5 +103,19 @@
     {
       return xctxt.getCurrentNode();
     }
  +  
  +  /**
  +   * Get the index of the last node that can be itterated to.
  +   * This probably will need to be overridded by derived classes.
  +   *
  +   * @param xctxt XPath runtime context.
  +   *
  +   * @return the index of the last node that can be itterated to.
  +   */
  +  public int getLastPos(XPathContext xctxt)
  +  {
  +    return 1;
  +  }
  +
   
   }
  
  
  
  1.15.2.8  +14 -14    
xml-xalan/java/src/org/apache/xpath/axes/UnionPathIterator.java
  
  Index: UnionPathIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/UnionPathIterator.java,v
  retrieving revision 1.15.2.7
  retrieving revision 1.15.2.8
  diff -u -r1.15.2.7 -r1.15.2.8
  --- UnionPathIterator.java    2001/05/27 02:28:50     1.15.2.7
  +++ UnionPathIterator.java    2001/06/03 03:09:23     1.15.2.8
  @@ -67,6 +67,7 @@
   import org.apache.xml.dtm.DTMIterator;
   import org.apache.xml.dtm.DTMFilter;
   import org.apache.xml.dtm.DTMManager;
  +import org.apache.xml.dtm.DTMIterator;
   
   // Xalan Imports
   import org.apache.xpath.NodeSet;
  @@ -110,20 +111,19 @@
      * @param execContext The XPath runtime context for this 
      * transformation.
      */
  -  public void initContext(XPathContext execContext)
  +  public void setRoot(int context, Object environment)
     {
  +    this.m_execContext = (XPathContext)environment;
  +    this.m_currentContextNode = context;
  +    this.m_context = context;
   
  -    this.m_execContext = execContext;
  -    this.m_currentContextNode = execContext.getCurrentExpressionNode();
  -    this.m_context = execContext.getCurrentNode();
  -
       if (null != m_iterators)
       {
         int n = m_iterators.length;
   
         for (int i = 0; i < n; i++)
         {
  -        m_iterators[i].initContext(execContext);
  +        m_iterators[i].setRoot(context, environment);
           m_iterators[i].nextNode();
         }
       }
  @@ -179,7 +179,8 @@
         if (null == clone)
           clone = (UnionPathIterator) this.clone();
   
  -      clone.initContext(xctxt);
  +      int current = xctxt.getCurrentNode();
  +      clone.setRoot(current, xctxt);
   
         return new XNodeSet(clone);
       }
  @@ -352,7 +353,7 @@
       }
       else
       {
  -      LocPathIterator[] iters = m_iterators;
  +      DTMIterator[] iters = m_iterators;
         int len = m_iterators.length;
   
         m_iterators = new LocPathIterator[len + 1];
  @@ -471,7 +472,7 @@
       {
         loadLocationPaths(compiler, compiler.getNextOpPos(opPos), count + 1);
   
  -      m_iterators[count] = createLocPathIterator(compiler, opPos);
  +      m_iterators[count] = createDTMIterator(compiler, opPos);
       }
       else
       {
  @@ -515,12 +516,11 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  protected LocPathIterator createLocPathIterator(
  +  protected DTMIterator createDTMIterator(
             Compiler compiler, int opPos) throws 
javax.xml.transform.TransformerException
     {
  -    LocPathIterator lpi = WalkerFactory.newLocPathIterator(compiler, opPos);
  -    if(compiler.getLocationPathDepth() <= 0)
  -      lpi.setIsTopLevel(true);
  +    DTMIterator lpi = WalkerFactory.newDTMIterator(compiler, opPos, 
  +                                      (compiler.getLocationPathDepth() <= 
0));
       return lpi;
     }
   
  @@ -808,7 +808,7 @@
      * path</a> contained in the union expression.
      * @serial
      */
  -  protected LocPathIterator[] m_iterators;
  +  protected DTMIterator[] m_iterators;
     
     /**
      * The last index in the list.
  
  
  
  1.13.2.8  +18 -11    
xml-xalan/java/src/org/apache/xpath/axes/WalkerFactory.java
  
  Index: WalkerFactory.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/WalkerFactory.java,v
  retrieving revision 1.13.2.7
  retrieving revision 1.13.2.8
  diff -u -r1.13.2.7 -r1.13.2.8
  --- WalkerFactory.java        2001/05/30 20:31:18     1.13.2.7
  +++ WalkerFactory.java        2001/06/03 03:09:23     1.13.2.8
  @@ -67,6 +67,7 @@
   import org.apache.xpath.objects.XNumber;
   
   import org.apache.xml.dtm.DTMFilter;
  +import org.apache.xml.dtm.DTMIterator;
   import org.apache.xml.dtm.Axis;
   
   /**
  @@ -193,14 +194,16 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public static LocPathIterator newLocPathIterator(
  -          Compiler compiler, int opPos)
  +  public static DTMIterator newDTMIterator(
  +          Compiler compiler, int opPos,
  +          boolean isTopLevel)
               throws javax.xml.transform.TransformerException
     {
   
       int firstStepPos = compiler.getFirstChildPos(opPos);
       int analysis = analyze(compiler, firstStepPos, 0);
       boolean isOneStep = isOneStep(analysis);
  +    DTMIterator iter;
   
       // Is the iteration a one-step attribute pattern (i.e. select="@foo")?
       if (isOneStep && walksSelfOnly(analysis) && 
  @@ -211,7 +214,7 @@
   
         // Then use a simple iteration of the attributes, with node test 
         // and predicate testing.
  -      return new SelfIteratorNoPredicate(compiler, opPos, analysis);
  +      iter = new SelfIteratorNoPredicate(compiler, opPos, analysis);
       }
       // Is the iteration exactly one child step?
       else if (walksChildrenOnly(analysis) && isOneStep)
  @@ -224,7 +227,7 @@
             diagnoseIterator("ChildIterator", analysis, compiler);
   
           // Use simple child iteration without any test.
  -        return new ChildIterator(compiler, opPos, analysis);
  +        iter = new ChildIterator(compiler, opPos, analysis);
         }
         else
         {
  @@ -232,7 +235,7 @@
             diagnoseIterator("ChildTestIterator", analysis, compiler);
   
           // Else use simple node test iteration with predicate test.
  -        return new ChildTestIterator(compiler, opPos, analysis);
  +        iter = new ChildTestIterator(compiler, opPos, analysis);
         }
       }
       // Is the iteration a one-step attribute pattern (i.e. select="@foo")?
  @@ -243,7 +246,7 @@
   
         // Then use a simple iteration of the attributes, with node test 
         // and predicate testing.
  -      return new AttributeIterator(compiler, opPos, analysis);
  +      iter = new AttributeIterator(compiler, opPos, analysis);
       }
       else if(isOneStep && !walksFilteredList(analysis))
       {
  @@ -255,7 +258,7 @@
     
           // Then use a simple iteration of the attributes, with node test 
           // and predicate testing.
  -        return new OneStepIteratorForward(compiler, opPos, analysis);
  +        iter = new OneStepIteratorForward(compiler, opPos, analysis);
         }
         else
         {
  @@ -264,7 +267,7 @@
     
           // Then use a simple iteration of the attributes, with node test 
           // and predicate testing.
  -        return new OneStepIterator(compiler, opPos, analysis);
  +        iter = new OneStepIterator(compiler, opPos, analysis);
         }
       }
   
  @@ -288,7 +291,7 @@
         if (DEBUG_ITERATOR_CREATION)
           diagnoseIterator("DescendantIterator", analysis, compiler);
   
  -      return new DescendantIterator(compiler, opPos, analysis);
  +      iter = new DescendantIterator(compiler, opPos, analysis);
       }
       else
       { 
  @@ -302,7 +305,7 @@
           if (DEBUG_ITERATOR_CREATION)
             diagnoseIterator("WalkingIteratorSorted", analysis, compiler);
   
  -        return new WalkingIteratorSorted(compiler, opPos, analysis, true);
  +        iter = new WalkingIteratorSorted(compiler, opPos, analysis, true);
   
   
         }
  @@ -313,9 +316,13 @@
             diagnoseIterator("WalkingIterator", analysis, compiler);
           }
     
  -        return new WalkingIterator(compiler, opPos, analysis, true);
  +        iter = new WalkingIterator(compiler, opPos, analysis, true);
         }
       }
  +    if(iter instanceof LocPathIterator)
  +      ((LocPathIterator)iter).setIsTopLevel(isTopLevel);
  +      
  +    return iter;
     }
     
     /**
  
  
  
  1.1.2.3   +25 -3     
xml-xalan/java/src/org/apache/xpath/axes/Attic/WalkingIterator.java
  
  Index: WalkingIterator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/Attic/WalkingIterator.java,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- WalkingIterator.java      2001/05/30 20:31:19     1.1.2.2
  +++ WalkingIterator.java      2001/06/03 03:09:23     1.1.2.3
  @@ -44,7 +44,7 @@
      *
      * @throws javax.xml.transform.TransformerException
      */
  -  public WalkingIterator(
  +  WalkingIterator(
             Compiler compiler, int opPos, int analysis, boolean 
shouldLoadWalkers)
               throws javax.xml.transform.TransformerException
     {
  @@ -65,7 +65,7 @@
      * @param nscontext The namespace context for this iterator,
      * should be OK if null.
      */
  -  public WalkingIterator(PrefixResolver nscontext)
  +  protected WalkingIterator(PrefixResolver nscontext)
     {
   
       super(nscontext);
  @@ -109,6 +109,13 @@
   
         m_firstWalker.setRoot(m_context);
       }
  +    if (null != m_firstWalker)
  +    {
  +      m_lastUsedWalker = m_firstWalker;
  +
  +      m_firstWalker.setRoot(m_context);
  +    }
  +
     }
     
     /**
  @@ -147,7 +154,7 @@
       // expression need to reset the variable stack, while iterators 
       // in predicates do not need to, and should not, since their execution
       // may be much later than top-level iterators.  
  -    // m_varStackPos is set in initContext, which is called 
  +    // m_varStackPos is set in setRoot, which is called 
       // from the execute method.
       if (-1 == m_varStackPos)
       {
  @@ -221,6 +228,21 @@
     public final AxesWalker getLastUsedWalker()
     {
       return m_lastUsedWalker;
  +  }
  +  
  +  /**
  +   *  Detaches the iterator from the set which it iterated over, releasing
  +   * any computational resources and placing the iterator in the INVALID
  +   * state. After<code>detach</code> has been invoked, calls to
  +   * <code>nextNode</code> or<code>previousNode</code> will raise the
  +   * exception INVALID_STATE_ERR.
  +   */
  +  public void detach()
  +  {    
  +    m_lastUsedWalker = null;
  +    
  +    // Always call the superclass detach last!
  +    super.detach();
     }
   
     
  
  
  
  1.1.2.2   +30 -12    
xml-xalan/java/src/org/apache/xpath/axes/Attic/WalkingIteratorSorted.java
  
  Index: WalkingIteratorSorted.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xpath/axes/Attic/WalkingIteratorSorted.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- WalkingIteratorSorted.java        2001/05/30 20:31:20     1.1.2.1
  +++ WalkingIteratorSorted.java        2001/06/03 03:09:23     1.1.2.2
  @@ -18,7 +18,6 @@
     {
   
       super(nscontext);
  -    this.setShouldCacheNodes(true);
     }
   
     /**
  @@ -49,17 +48,24 @@
      * @param execContext The XPath runtime context for this
      * transformation.
      */
  -  public void initContext(XPathContext execContext)
  +  public void setRoot(int context, Object environment)
     {
  -    super.initContext(execContext);
  +    super.setRoot(context, environment);
       
  +    this.setShouldCacheNodes(true);
  +
       setNextPosition(0);
  -    m_firstWalker.setRoot(m_context);
  +    m_firstWalker.setRoot(context);
   
       m_lastUsedWalker = m_firstWalker;
   
       int nextNode = DTM.NULL;
       AxesWalker walker = getLastUsedWalker();
  +    XPathContext execContext = (XPathContext)environment;
  +    execContext.pushCurrentNodeAndExpression(context, context);
  +    
  +    try
  +    {
   
       do
       {
  @@ -111,14 +117,13 @@
           walker = getLastUsedWalker();
         }
       }
  -
  -    // Not sure what is going on here, but we were loosing
  -    // the next node in the nodeset because it's coming from a 
  -    // different document. 
  -    while (
  -      (DTM.NULL != nextNode) /* && (DTM.NULL != m_prevReturned) */
  -      /* && getDTM(nextNode).getDocument() == 
getDTM(m_prevReturned).getDocument() */
  -      /* && getDTM(nextNode).isNodeAfter(nextNode, m_prevReturned) */);
  +      while (DTM.NULL != nextNode);
  +      
  +    }
  +    finally
  +    {
  +      execContext.popCurrentNodeAndExpression();
  +    }
   
       // m_prevReturned = nextNode;
       setNextPosition(0);
  @@ -127,6 +132,11 @@
       m_foundLast = true;
     }
     
  +  public int nextNode()
  +  {
  +    return super.nextNode();
  +  }
  +  
     /**
      * Reset the iterator.
      */
  @@ -138,6 +148,14 @@
       m_lastFetched = DTM.NULL;
       m_next = 0;
       // m_last = 0;
  +    
  +    if (null != m_firstWalker)
  +    {
  +      m_lastUsedWalker = m_firstWalker;
  +
  +      m_firstWalker.setRoot(m_context);
  +    }
  +
     }
   
   
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.1   +76 -0     
xml-xalan/java/src/org/apache/xpath/axes/Attic/IteratorPool.java
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to