// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.core.store; import org.openstreetmap.osmosis.core.OsmosisRuntimeException; import org.openstreetmap.osmosis.core.lifecycle.Closeable; import org.openstreetmap.osmosis.core.lifecycle.ReleasableIterator; /** * This class allows an underlying store to be released along with the iterator * accessing it. As such it acts as an iterator delegating all calls to a * provided iterator, but during release it also releases the data store. * * @param <DataType> * The type of data to be returned by the iterator. * @author Brett Henderson */ public class StoreReleasingIterator<DataType> implements ReleasableIterator<DataType> { private Closeable store; private ReleasableIterator<DataType> iterator; /** * Creates a new instance. * * @param iterator * The underlying iterator to read from. * @param store * The store to be released after use. */ public StoreReleasingIterator(ReleasableIterator<DataType> iterator, Closeable store) { this.iterator = iterator; this.store = store; } /** * {@inheritDoc} */ public boolean hasNext() { if (iterator == null) { throw new OsmosisRuntimeException("Iterator has been released."); } return iterator.hasNext(); } /** * {@inheritDoc} */ public DataType next() { if (iterator == null) { throw new OsmosisRuntimeException("Iterator has been released."); } return iterator.next(); } /** * {@inheritDoc} */ public void remove() { if (iterator == null) { throw new OsmosisRuntimeException("Iterator has been released."); } iterator.remove(); } /** * {@inheritDoc} */ public void close() { if (iterator != null) { iterator.close(); iterator = null; } if (store != null) { store.close(); store = null; } } }