package com.vaadin.addon.spreadsheet;
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import java.util.Queue;
@SuppressWarnings("serial")
class IteratorChain<E> implements Iterator<E>, Serializable {
private static class EmptyIterator<E> implements Iterator<E>,
Serializable {
@Override
public boolean hasNext() {
return false;
}
@Override
public E next() {
throw new NoSuchElementException();
}
@Override
public void remove() {
throw new UnsupportedOperationException("remove");
}
}
private final Queue<Iterator<? extends E>> iteratorChain = new LinkedList<Iterator<? extends E>>();
private Iterator<? extends E> currentIterator = null;
public IteratorChain(Collection<Iterator<? extends E>> iterators) {
iteratorChain.addAll(iterators);
}
private void updateCurrentIterator() {
if (currentIterator == null) {
if (iteratorChain.isEmpty()) {
currentIterator = new IteratorChain.EmptyIterator<E>();
} else {
currentIterator = iteratorChain.remove();
}
}
while (currentIterator.hasNext() == false
&& !iteratorChain.isEmpty()) {
currentIterator = iteratorChain.remove();
}
}
@Override
public boolean hasNext() {
updateCurrentIterator();
return currentIterator.hasNext();
}
@Override
public E next() {
updateCurrentIterator();
return currentIterator.next();
}
@Override
public void remove() {
throw new UnsupportedOperationException("remove");
}
}