001: /* CompositeIterator
002: *
003: * $Id: CompositeIterator.java 4644 2006-09-20 22:40:21Z paul_jack $
004: *
005: * Created on Mar 3, 2004
006: *
007: * Copyright (C) 2004 Internet Archive.
008: *
009: * This file is part of the Heritrix web crawler (crawler.archive.org).
010: *
011: * Heritrix is free software; you can redistribute it and/or modify
012: * it under the terms of the GNU Lesser Public License as published by
013: * the Free Software Foundation; either version 2.1 of the License, or
014: * any later version.
015: *
016: * Heritrix is distributed in the hope that it will be useful,
017: * but WITHOUT ANY WARRANTY; without even the implied warranty of
018: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
019: * GNU Lesser Public License for more details.
020: *
021: * You should have received a copy of the GNU Lesser Public License
022: * along with Heritrix; if not, write to the Free Software
023: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024: */
025: package org.archive.util.iterator;
026:
027: import java.util.ArrayList;
028: import java.util.Iterator;
029: import java.util.NoSuchElementException;
030:
031: /**
032: * An iterator that's built up out of any number of other iterators.
033: * @author gojomo
034: */
035: public class CompositeIterator implements Iterator {
036: ArrayList<Iterator> iterators = new ArrayList<Iterator>();
037: Iterator currentIterator;
038: int indexOfCurrentIterator = -1;
039:
040: /**
041: * Moves to the next (non empty) iterator. Returns false if there are no
042: * more (non empty) iterators, true otherwise.
043: * @return false if there are no more (non empty) iterators, true otherwise.
044: */
045: private boolean nextIterator() {
046: if (++indexOfCurrentIterator < iterators.size()) {
047: currentIterator = (Iterator) iterators
048: .get(indexOfCurrentIterator);
049: // If the new iterator was empty this will move us to the next one.
050: return hasNext();
051: } else {
052: currentIterator = null;
053: return false;
054: }
055: }
056:
057: /* (non-Javadoc)
058: * @see java.util.Iterator#hasNext()
059: */
060: public boolean hasNext() {
061: if (currentIterator != null && currentIterator.hasNext()) {
062: // Got more
063: return true;
064: } else {
065: // Have got more if we can queue up a new iterator.
066: return nextIterator();
067: }
068: }
069:
070: /* (non-Javadoc)
071: * @see java.util.Iterator#next()
072: */
073: public Object next() {
074: if (hasNext()) {
075: return currentIterator.next();
076: } else {
077: throw new NoSuchElementException();
078: }
079: }
080:
081: /* (non-Javadoc)
082: * @see java.util.Iterator#remove()
083: */
084: public void remove() {
085: throw new UnsupportedOperationException();
086: }
087:
088: /**
089: * Create an empty CompositeIterator. Internal
090: * iterators may be added later.
091: */
092: public CompositeIterator() {
093: super ();
094: }
095:
096: /**
097: * Convenience method for concatenating together
098: * two iterators.
099: * @param i1
100: * @param i2
101: */
102: public CompositeIterator(Iterator i1, Iterator i2) {
103: this ();
104: add(i1);
105: add(i2);
106: }
107:
108: /**
109: * Add an iterator to the internal chain.
110: *
111: * @param i an iterator to add.
112: */
113: public void add(Iterator i) {
114: iterators.add(i);
115: }
116:
117: }
|