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 }