View Javadoc

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 }