package org.archive.util.iterator; import java.io.IOException; import java.util.Iterator; import java.util.LinkedList; public class CloseableCompositeIterator<E> implements CloseableIterator<E> { protected LinkedList<CloseableIterator<E>> iters; protected Iterator<CloseableIterator<E>> iterPtr; protected CloseableIterator<E> currIter; public CloseableCompositeIterator() { iters = new LinkedList<CloseableIterator<E>>(); } public void addFirst(CloseableIterator<E> e) { iters.addFirst(e); } public void addLast(CloseableIterator<E> e) { iters.addLast(e); } @Override public boolean hasNext() { if (iterPtr == null) { iterPtr = iters.iterator(); currIter = iterPtr.next(); } if (currIter == null) { return false; } while (currIter != null) { if (currIter.hasNext()) { return true; } currIter = (iterPtr.hasNext() ? iterPtr.next() : null); } return false; } @Override public E next() { return currIter.next(); } @Override public void remove() { currIter.remove(); } @Override public void close() throws IOException { for (CloseableIterator<E> e : iters) { if (e != null) { try { e.close(); } catch (IOException io) { } } } } }