View Javadoc

1   /* TransformingIteratorWrapper
2   *
3   * $Id: LookaheadIterator.java 4650 2006-09-25 18:09:42Z paul_jack $
4   *
5   * Created on Mar 25, 2005
6   *
7   * Copyright (C) 2005 Internet Archive.
8   *
9   * This file is part of the Heritrix web crawler (crawler.archive.org).
10  *
11  * Heritrix is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser Public License as published by
13  * the Free Software Foundation; either version 2.1 of the License, or
14  * any later version.
15  *
16  * Heritrix is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU Lesser Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser Public License
22  * along with Heritrix; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24  */ 
25  package org.archive.util.iterator;
26  
27  import java.util.Iterator;
28  import java.util.NoSuchElementException;
29  
30  /***
31   * Superclass for Iterators which must probe ahead to know if
32   * a 'next' exists, and thus have a cached next between a call
33   * to hasNext() and next().
34   * 
35   * @author gojomo
36   *
37   */
38  public abstract class LookaheadIterator<T> implements Iterator<T> {
39      protected T next;
40  
41      /*** 
42       * Test whether any items remain; loads next item into
43       * holding 'next' field. 
44       * 
45       * @see java.util.Iterator#hasNext()
46       */
47      public boolean hasNext() {
48          return (this.next != null)? true: lookahead();
49      }
50      
51      /***
52       * Caches the next item if available.
53       * 
54       * @return  true if there was a next item to cache, false otherwise
55       */
56      protected abstract boolean lookahead();
57  
58      /*** 
59       * Return the next item.
60       * 
61       * @see java.util.Iterator#next()
62       */
63      public T next() {
64          if (!hasNext()) {
65              throw new NoSuchElementException();
66          }
67          // 'next' is guaranteed non-null by a hasNext() which returned true
68          T returnObj = this.next;
69          this.next = null;
70          return returnObj;
71      }
72      
73      /* (non-Javadoc)
74       * @see java.util.Iterator#remove()
75       */
76      public void remove() {
77          throw new UnsupportedOperationException();
78      }
79  }