KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jaxen > util > FollowingAxisIterator


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 JavaDoc;
65 import java.util.NoSuchElementException JavaDoc;
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 JavaDoc
73 {
74     private Object JavaDoc contextNode;
75     
76     private Navigator navigator;
77
78     private Iterator JavaDoc siblings;
79
80     private Iterator JavaDoc currentSibling;
81
82     public FollowingAxisIterator(Object JavaDoc 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 JavaDoc 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 JavaDoc next() throws NoSuchElementException JavaDoc
153     {
154         if ( ! hasNext() )
155         {
156             throw new NoSuchElementException JavaDoc();
157         }
158
159         return currentSibling.next();
160     }
161
162     public void remove() throws UnsupportedOperationException JavaDoc
163     {
164         throw new UnsupportedOperationException JavaDoc();
165     }
166 }
167
Popular Tags