View Javadoc

    1   package org.jaxen.util;
    2
    3   /*
    4    * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/util/FollowingAxisIterator.java,v 1.6 2005/06/28 13:44:44 elharo Exp $
    5    * $Revision: 1.6 $
    6    * $Date: 2005/06/28 13:44:44 $
    7    *
    8    * ====================================================================
    9    *
    10   * Copyright (C) 2000-2005 bob mcwhirter & James Strachan.
    11   * All rights reserved.
    12   *
    13   * Redistribution and use in source and binary forms, with or without
    14   * modification, are permitted provided that the following conditions
    15   * are met:
    16   *
    17   * 1. Redistributions of source code must retain the above copyright
    18   *    notice, this list of conditions, and the following disclaimer.
    19   *
    20   * 2. Redistributions in binary form must reproduce the above copyright
    21   *    notice, this list of conditions, and the disclaimer that follows
    22   *    these conditions in the documentation and/or other materials
    23   *    provided with the distribution.
    24   *
    25   * 3. The name "Jaxen" must not be used to endorse or promote products
    26   *    derived from this software without prior written permission.  For
    27   *    written permission, please contact license@jaxen.org.
    28   *
    29   * 4. Products derived from this software may not be called "Jaxen", nor
    30   *    may "Jaxen" appear in their name, without prior written permission
    31   *    from the Jaxen Project Management (pm@jaxen.org).
    32   *
    33   * In addition, we request (but do not require) that you include in the
    34   * end-user documentation provided with the redistribution and/or in the
    35   * software itself an acknowledgement equivalent to the following:
    36   *     "This product includes software developed by the
    37   *      Jaxen Project <http://www.jaxen.org/>."
    38   * Alternatively, the acknowledgment may be graphical using the logos
    39   * available at http://www.jaxen.org/
    40   *
    41   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
    42   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
    43   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    44   * DISCLAIMED.  IN NO EVENT SHALL THE Jaxen AUTHORS OR THE PROJECT
    45   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    46   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    47   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    48   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    49   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    50   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    51   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    52   * SUCH DAMAGE.
    53   *
    54   * ====================================================================
    55   * This software consists of voluntary contributions made by many
    56   * individuals on behalf of the Jaxen Project and was originally
    57   * created by bob mcwhirter <bob@werken.com> and
    58   * James Strachan <jstrachan@apache.org>.  For more information on the
    59   * Jaxen Project, please see <http://www.jaxen.org/>.
    60   *
    61   * $Id: FollowingAxisIterator.java,v 1.6 2005/06/28 13:44:44 elharo Exp $
    62  */
    63
    64  import java.util.Iterator;
    65  import java.util.NoSuchElementException;
    66
    67  import org.jaxen.Navigator;
    68  import org.jaxen.UnsupportedAxisException;
    69  import org.jaxen.JaxenRuntimeException;
    70  import org.jaxen.JaxenConstants;
    71
    72  public class FollowingAxisIterator implements Iterator
    73  {
    74      private Object contextNode;
    75
    76      private Navigator navigator;
    77
    78      private Iterator siblings;
    79
    80      private Iterator currentSibling;
    81
    82      public FollowingAxisIterator(Object contextNode,
    83                                   Navigator navigator) throws UnsupportedAxisException
    84      {
    85          this.contextNode = contextNode;
    86          this.navigator = navigator;
    87          this.siblings = navigator.getFollowingSiblingAxisIterator(contextNode);
    88          this.currentSibling = JaxenConstants.EMPTY_ITERATOR;
    89      }
    90
    91      private boolean goForward()
    92      {
    93          while ( ! siblings.hasNext() )
    94          {
    95              if ( !goUp() )
    96              {
    97                  return false;
    98              }
    99          }
    100
    101         Object nextSibling = siblings.next();
    102
    103         this.currentSibling = new DescendantOrSelfAxisIterator(nextSibling, navigator);
    104
    105         return true;
    106     }
    107
    108     private boolean goUp()
    109     {
    110         if ( contextNode == null
    111              ||
    112              navigator.isDocument(contextNode) )
    113         {
    114             return false;
    115         }
    116
    117         try
    118         {
    119             contextNode = navigator.getParentNode( contextNode );
    120
    121             if ( contextNode != null
    122                  &&
    123                  !navigator.isDocument(contextNode) )
    124             {
    125                 siblings = navigator.getFollowingSiblingAxisIterator(contextNode);
    126                 return true;
    127             }
    128             else
    129             {
    130                 return false;
    131             }
    132         }
    133         catch (UnsupportedAxisException e)
    134         {
    135             throw new JaxenRuntimeException(e);
    136         }
    137     }
    138
    139     public boolean hasNext()
    140     {
    141         while ( ! currentSibling.hasNext() )
    142         {
    143             if ( ! goForward() )
    144             {
    145                 return false;
    146             }
    147         }
    148
    149         return true;
    150     }
    151
    152     public Object next() throws NoSuchElementException
    153     {
    154         if ( ! hasNext() )
    155         {
    156             throw new NoSuchElementException();
    157         }
    158
    159         return currentSibling.next();
    160     }
    161
    162     public void remove() throws UnsupportedOperationException
    163     {
    164         throw new UnsupportedOperationException();
    165     }
    166 }