package com.revolsys.io; import java.util.Iterator; import java.util.NoSuchElementException; import javax.annotation.PreDestroy; import com.revolsys.collection.iterator.AbstractIterator; public abstract class AbstractMultipleIteratorReader<T> extends AbstractReader<T> implements Iterator<T> { private AbstractIterator<T> iterator; private boolean loadNext = true; private boolean open; @Override @PreDestroy public void close() { if (this.iterator != null) { this.iterator.close(); this.iterator = null; } } protected abstract AbstractIterator<T> getNextIterator(); @Override public boolean hasNext() { if (this.loadNext) { if (this.iterator == null) { this.iterator = getNextIterator(); if (this.iterator == null) { close(); return false; } } while (!this.iterator.hasNext()) { this.iterator.close(); this.iterator = getNextIterator(); if (this.iterator == null) { return false; } } this.loadNext = false; } return true; } @Override public Iterator<T> iterator() { open(); return this; } @Override public T next() { if (hasNext()) { final T object = this.iterator.next(); process(object); this.loadNext = true; return object; } else { throw new NoSuchElementException(); } } @Override public void open() { if (!this.open) { this.open = true; } } protected void process(final T object) { } @Override public void remove() { this.iterator.remove(); } }