001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements. See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership. The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the  "License");
007     * you may not use this file except in compliance with the License.
008     * You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    /*
019     * $Id: ChildIterator.java 468655 2006-10-28 07:12:06Z minchau $
020     */
021    package org.apache.xpath.axes;
022    
023    import org.apache.xml.dtm.DTM;
024    import org.apache.xml.dtm.DTMFilter;
025    import org.apache.xpath.XPathContext;
026    import org.apache.xpath.compiler.Compiler;
027    
028    /**
029     * This class implements an optimized iterator for
030     * "node()" patterns, that is, any children of the
031     * context node.
032     * @see org.apache.xpath.axes.LocPathIterator
033     * @xsl.usage advanced
034     */
035    public class ChildIterator extends LocPathIterator
036    {
037        static final long serialVersionUID = -6935428015142993583L;
038    
039      /**
040       * Create a ChildIterator object.
041       *
042       * @param compiler A reference to the Compiler that contains the op map.
043       * @param opPos The position within the op map, which contains the
044       * location path expression for this itterator.
045       * @param analysis Analysis bits of the entire pattern.
046       *
047       * @throws javax.xml.transform.TransformerException
048       */
049      ChildIterator(Compiler compiler, int opPos, int analysis)
050              throws javax.xml.transform.TransformerException
051      {
052        super(compiler, opPos, analysis, false);
053    
054        // This iterator matches all kinds of nodes
055        initNodeTest(DTMFilter.SHOW_ALL);
056      }
057      
058      /**
059       * Return the first node out of the nodeset, if this expression is 
060       * a nodeset expression.  This is the default implementation for 
061       * nodesets.
062       * <p>WARNING: Do not mutate this class from this function!</p>
063       * @param xctxt The XPath runtime context.
064       * @return the first node out of the nodeset, or DTM.NULL.
065       */
066      public int asNode(XPathContext xctxt)
067        throws javax.xml.transform.TransformerException
068      {
069        int current = xctxt.getCurrentNode();
070        
071        DTM dtm = xctxt.getDTM(current);
072        
073        return dtm.getFirstChild(current);
074      }
075    
076      /**
077       *  Returns the next node in the set and advances the position of the
078       * iterator in the set. After a NodeIterator is created, the first call
079       * to nextNode() returns the first node in the set.
080       *
081       * @return  The next <code>Node</code> in the set being iterated over, or
082       *   <code>null</code> if there are no more members in that set.
083       */
084      public int nextNode()
085      {
086            if(m_foundLast)
087                    return DTM.NULL;
088    
089        int next;
090    
091        m_lastFetched = next = (DTM.NULL == m_lastFetched)
092                               ? m_cdtm.getFirstChild(m_context)
093                               : m_cdtm.getNextSibling(m_lastFetched);
094    
095        // m_lastFetched = next;
096        if (DTM.NULL != next)
097        {
098          m_pos++;
099          return next;
100        }
101        else
102        {
103          m_foundLast = true;
104    
105          return DTM.NULL;
106        }
107      }
108      
109      /**
110       * Returns the axis being iterated, if it is known.
111       * 
112       * @return Axis.CHILD, etc., or -1 if the axis is not known or is of multiple 
113       * types.
114       */
115      public int getAxis()
116      {
117        return org.apache.xml.dtm.Axis.CHILD;
118      }
119    
120    
121    }