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 }