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 }