View Javadoc

1   /*
2    * $Header$
3    * $Revision: 1128 $
4    * $Date: 2006-02-05 13:49:04 -0800 (Sun, 05 Feb 2006) $
5    *
6    * ====================================================================
7    *
8    * Copyright 2000-2002 bob mcwhirter & James Strachan.
9    * All rights reserved.
10   *
11   * Redistribution and use in source and binary forms, with or without
12   * modification, are permitted provided that the following conditions are
13   * met:
14   * 
15   *   * Redistributions of source code must retain the above copyright
16   *     notice, this list of conditions and the following disclaimer.
17   * 
18   *   * Redistributions in binary form must reproduce the above copyright
19   *     notice, this list of conditions and the following disclaimer in the
20   *     documentation and/or other materials provided with the distribution.
21   * 
22   *   * Neither the name of the Jaxen Project nor the names of its
23   *     contributors may be used to endorse or promote products derived 
24   *     from this software without specific prior written permission.
25   * 
26   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
27   * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28   * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
29   * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
30   * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37   *
38   * ====================================================================
39   * This software consists of voluntary contributions made by many 
40   * individuals on behalf of the Jaxen Project and was originally 
41   * created by bob mcwhirter <bob@werken.com> and 
42   * James Strachan <jstrachan@apache.org>.  For more information on the 
43   * Jaxen Project, please see <http://www.jaxen.org/>.
44   * 
45   * $Id: StackedIterator.java 1128 2006-02-05 21:49:04Z elharo $
46   */
47  
48  
49  
50  package org.jaxen.util;
51  
52  import java.util.HashSet;
53  import java.util.Iterator;
54  import java.util.LinkedList;
55  import java.util.NoSuchElementException;
56  import java.util.Set;
57  
58  import org.jaxen.Navigator;
59  
60  /**
61   * @deprecated this iterator is no longer used to implement any of the Jaxen axes. If you have implemented
62   * a navigator-specific axis based on this class, take a look at the DescendantAxisIterator for ideas 
63   * on how to remove that dependency.
64   */
65  public abstract class StackedIterator implements Iterator
66  {
67  
68      private LinkedList iteratorStack;
69      private Navigator  navigator;
70  
71      private Set        created;
72  
73      public StackedIterator(Object contextNode,
74                             Navigator navigator)
75      {
76          this.iteratorStack = new LinkedList();
77          this.created       = new HashSet();
78  
79          init( contextNode,
80                navigator );
81      }
82  
83      protected StackedIterator()
84      {
85          this.iteratorStack = new LinkedList();
86          this.created       = new HashSet();
87      }
88  
89      protected void init(Object contextNode,
90                          Navigator navigator)
91      {
92          this.navigator     = navigator;
93          
94          //pushIterator( internalCreateIterator( contextNode ) );
95      }
96  
97      protected Iterator internalCreateIterator(Object contextNode)
98      {
99          if ( this.created.contains( contextNode ) )
100         {
101             return null;
102         }
103 
104         this.created.add( contextNode );
105 
106         return createIterator( contextNode );
107     }
108 
109     public boolean hasNext()
110     {
111         Iterator curIter = currentIterator();
112 
113         if ( curIter == null )
114         {
115             return false;
116         }
117 
118         return curIter.hasNext();
119     }
120 
121     public Object next() throws NoSuchElementException
122     {
123         if ( ! hasNext() )
124         {
125             throw new NoSuchElementException();
126         }
127 
128         Iterator curIter = currentIterator();
129         Object   object  = curIter.next();
130 
131         pushIterator( internalCreateIterator( object ) );
132 
133         return object;
134     }
135 
136     public void remove() throws UnsupportedOperationException
137     {
138         throw new UnsupportedOperationException();
139     }
140 
141     abstract protected Iterator createIterator(Object contextNode);
142 
143     protected void pushIterator(Iterator iter)
144     {
145         if ( iter != null )
146         {
147             this.iteratorStack.addFirst(iter); //addLast( iter );
148         }
149     }
150 
151     private Iterator currentIterator()
152     {
153         while ( iteratorStack.size() > 0 )
154         {
155             Iterator curIter = (Iterator) iteratorStack.getFirst();
156 
157             if ( curIter.hasNext() )
158             {
159                 return curIter;
160             }
161 
162             iteratorStack.removeFirst();
163         }
164 
165         return null;
166     }
167 
168     protected Navigator getNavigator()
169     {
170         return this.navigator;
171     }
172 }