package net.sitemorph.protostore; import java.util.Iterator; import java.util.NoSuchElementException; /** * Iterator adaptor that */ public class IteratorAdaptor<T> implements Iterator<T> { private volatile CrudReader reader; private volatile CrudIterator<T> iterator; private volatile boolean closed = false; public IteratorAdaptor(CrudIterator<T> iterator, CrudReader reader) { this.iterator = iterator; this.reader = reader; } @Override public boolean hasNext() { try { boolean hasNext = iterator.hasNext(); if (!hasNext && !closed) { iterator.close(); closed = true; reader.closed(this); } return hasNext; } catch (CrudException e) { throw new IteratorAdaptorException("Storage exception checking for " + "hasNext item", e); } } @Override public T next() { try { boolean hasNext = iterator.hasNext(); if (!hasNext && !closed) { iterator.close(); closed = true; reader.closed(this); throw new NoSuchElementException("Attempted to access next when " + "none exists"); } return iterator.next(); } catch (CrudException e) { throw new IteratorAdaptorException("Storage error getting next item", e); } } @Override public void remove() { throw new UnsupportedOperationException("Remove operation not supported " + "for crud backed iterator"); } public void close() throws CrudException { if (!closed) { iterator.close(); closed = true; reader.closed(this); } } }