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.5 2005/01/19 13:35:38 elharo Exp $
5    * $Revision: 1.5 $
6    * $Date: 2005/01/19 13:35:38 $
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.5 2005/01/19 13:35:38 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 }