Home | History | Annotate | Download | only in axes
      1 /*
      2  * Licensed to the Apache Software Foundation (ASF) under one
      3  * or more contributor license agreements. See the NOTICE file
      4  * distributed with this work for additional information
      5  * regarding copyright ownership. The ASF licenses this file
      6  * to you under the Apache License, Version 2.0 (the  "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *     http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  */
     18 /*
     19  * $Id: ChildTestIterator.java 468655 2006-10-28 07:12:06Z minchau $
     20  */
     21 package org.apache.xpath.axes;
     22 
     23 import org.apache.xml.dtm.Axis;
     24 import org.apache.xml.dtm.DTM;
     25 import org.apache.xml.dtm.DTMAxisTraverser;
     26 import org.apache.xml.dtm.DTMIterator;
     27 import org.apache.xpath.compiler.Compiler;
     28 
     29 /**
     30  * This class implements an optimized iterator for
     31  * children patterns that have a node test, and possibly a predicate.
     32  * @see org.apache.xpath.axes.BasicTestIterator
     33  * @xsl.usage advanced
     34  */
     35 public class ChildTestIterator extends BasicTestIterator
     36 {
     37     static final long serialVersionUID = -7936835957960705722L;
     38   /** The traverser to use to navigate over the descendants. */
     39   transient protected DTMAxisTraverser m_traverser;
     40 
     41   /** The extended type ID, not set until setRoot. */
     42 //  protected int m_extendedTypeID;
     43 
     44 
     45   /**
     46    * Create a ChildTestIterator object.
     47    *
     48    * @param compiler A reference to the Compiler that contains the op map.
     49    * @param opPos The position within the op map, which contains the
     50    * location path expression for this itterator.
     51    *
     52    * @throws javax.xml.transform.TransformerException
     53    */
     54   ChildTestIterator(Compiler compiler, int opPos, int analysis)
     55           throws javax.xml.transform.TransformerException
     56   {
     57     super(compiler, opPos, analysis);
     58   }
     59 
     60   /**
     61    * Create a ChildTestIterator object.
     62    *
     63    * @param traverser Traverser that tells how the KeyIterator is to be handled.
     64    *
     65    * @throws javax.xml.transform.TransformerException
     66    */
     67   public ChildTestIterator(DTMAxisTraverser traverser)
     68   {
     69 
     70     super(null);
     71 
     72     m_traverser = traverser;
     73   }
     74 
     75   /**
     76    * Get the next node via getNextXXX.  Bottlenecked for derived class override.
     77    * @return The next node on the axis, or DTM.NULL.
     78    */
     79   protected int getNextNode()
     80   {
     81     if(true /* 0 == m_extendedTypeID */)
     82     {
     83       m_lastFetched = (DTM.NULL == m_lastFetched)
     84                    ? m_traverser.first(m_context)
     85                    : m_traverser.next(m_context, m_lastFetched);
     86     }
     87 //    else
     88 //    {
     89 //      m_lastFetched = (DTM.NULL == m_lastFetched)
     90 //                   ? m_traverser.first(m_context, m_extendedTypeID)
     91 //                   : m_traverser.next(m_context, m_lastFetched,
     92 //                                      m_extendedTypeID);
     93 //    }
     94 
     95     return m_lastFetched;
     96   }
     97 
     98 
     99   /**
    100    *  Get a cloned Iterator that is reset to the beginning
    101    *  of the query.
    102    *
    103    *  @return A cloned NodeIterator set of the start of the query.
    104    *
    105    *  @throws CloneNotSupportedException
    106    */
    107   public DTMIterator cloneWithReset() throws CloneNotSupportedException
    108   {
    109 
    110     ChildTestIterator clone = (ChildTestIterator) super.cloneWithReset();
    111     clone.m_traverser = m_traverser;
    112 
    113     return clone;
    114   }
    115 
    116 
    117   /**
    118    * Initialize the context values for this expression
    119    * after it is cloned.
    120    *
    121    * @param context The XPath runtime context for this
    122    * transformation.
    123    */
    124   public void setRoot(int context, Object environment)
    125   {
    126     super.setRoot(context, environment);
    127     m_traverser = m_cdtm.getAxisTraverser(Axis.CHILD);
    128 
    129 //    String localName = getLocalName();
    130 //    String namespace = getNamespace();
    131 //    int what = m_whatToShow;
    132 //    // System.out.println("what: ");
    133 //    // NodeTest.debugWhatToShow(what);
    134 //    if(DTMFilter.SHOW_ALL == what ||
    135 //       ((DTMFilter.SHOW_ELEMENT & what) == 0)
    136 //       || localName == NodeTest.WILD
    137 //       || namespace == NodeTest.WILD)
    138 //    {
    139 //      m_extendedTypeID = 0;
    140 //    }
    141 //    else
    142 //    {
    143 //      int type = getNodeTypeTest(what);
    144 //      m_extendedTypeID = m_cdtm.getExpandedTypeID(namespace, localName, type);
    145 //    }
    146 
    147   }
    148 
    149   /**
    150    * Returns the axis being iterated, if it is known.
    151    *
    152    * @return Axis.CHILD, etc., or -1 if the axis is not known or is of multiple
    153    * types.
    154    */
    155   public int getAxis()
    156   {
    157     return org.apache.xml.dtm.Axis.CHILD;
    158   }
    159 
    160   /**
    161    *  Detaches the iterator from the set which it iterated over, releasing
    162    * any computational resources and placing the iterator in the INVALID
    163    * state. After<code>detach</code> has been invoked, calls to
    164    * <code>nextNode</code> or<code>previousNode</code> will raise the
    165    * exception INVALID_STATE_ERR.
    166    */
    167   public void detach()
    168   {
    169     if(m_allowDetach)
    170     {
    171       m_traverser = null;
    172 
    173       // Always call the superclass detach last!
    174       super.detach();
    175     }
    176   }
    177 
    178 }
    179