1 package org.jaxen.util; 2 3 /* 4 * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/util/DescendantAxisIterator.java,v 1.9 2005/01/19 13:36:27 elharo Exp $ 5 * $Revision: 1.9 $ 6 * $Date: 2005/01/19 13:36:27 $ 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: DescendantAxisIterator.java,v 1.9 2005/01/19 13:36:27 elharo Exp $ 62 */ 63 64 import org.jaxen.Navigator; 65 import org.jaxen.UnsupportedAxisException; 66 import org.jaxen.JaxenRuntimeException; 67 68 import java.util.Iterator; 69 import java.util.NoSuchElementException; 70 import java.util.Stack; 71 72 public class DescendantAxisIterator implements Iterator 73 { 74 75 private Stack stack = new Stack(); 76 private Iterator children; 77 private Navigator navigator; 78 79 public DescendantAxisIterator(Object contextNode, 80 Navigator navigator) throws UnsupportedAxisException 81 { 82 this(navigator, navigator.getChildAxisIterator(contextNode)); 83 } 84 85 public DescendantAxisIterator(Navigator navigator, 86 Iterator iterator) 87 { 88 this.navigator = navigator; 89 this.children = iterator; 90 } 91 92 public boolean hasNext() 93 { 94 while (!children.hasNext()) 95 { 96 if (stack.isEmpty()) 97 { 98 return false; 99 } 100 children = (Iterator) stack.pop(); 101 } 102 return true; 103 } 104 105 public Object next() 106 { 107 try 108 { 109 if (hasNext()) 110 { 111 Object node = children.next(); 112 stack.push(children); 113 children = navigator.getChildAxisIterator(node); 114 return node; 115 } 116 throw new NoSuchElementException(); 117 } 118 catch (UnsupportedAxisException e) 119 { 120 throw new JaxenRuntimeException(e); 121 } 122 } 123 124 public void remove() 125 { 126 throw new UnsupportedOperationException(); 127 } 128 129 }