package mil.nga.giat.geowave.core.store;
import java.io.Closeable;
import java.io.IOException;
import java.util.Iterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* This is a simple wrapper around an iterator and a closeable to ensure that
* the caller can close the closeable when it is finished being used by the
* iterator.
*
* @param <E>
* The type to iterate on
*/
public class CloseableIteratorWrapper<E> implements
CloseableIterator<E>
{
private final static Logger LOGGER = LoggerFactory.getLogger(CloseableIteratorWrapper.class);
private final Closeable closeable;
private final Iterator<E> iterator;
private Integer limit = null;
private int count = 0;
public CloseableIteratorWrapper(
final Closeable closable,
final Iterator<E> iterator ) {
this.closeable = closable;
this.iterator = iterator;
}
public CloseableIteratorWrapper(
final Closeable closable,
final Iterator<E> iterator,
Integer limit ) {
this.closeable = closable;
this.iterator = iterator;
this.limit = limit;
}
@Override
public boolean hasNext() {
final boolean hasNext = iterator.hasNext();
if (!hasNext) {
try {
closeable.close();
}
catch (final IOException e) {
LOGGER.warn(
"Unable to close iterator",
e);
}
}
if (limit != null && limit > 0 && count > limit) return false;
return hasNext;
}
@Override
public E next() {
count++;
return iterator.next();
}
@Override
public void remove() {
iterator.remove();
}
@Override
protected void finalize()
throws Throwable {
super.finalize();
closeable.close();
}
@Override
public void close()
throws IOException {
try {
closeable.close();
}
catch (final IOException e) {
LOGGER.warn(
"Unable to close iterator",
e);
}
}
}