package com.limegroup.gnutella.library; import java.util.Iterator; import java.util.NoSuchElementException; /** An iterator over a FileView that does not need locks held while iterating. */ class ThreadSafeFileViewIterator implements Iterator<FileDesc> { private final AbstractFileCollection fileList; /** Points to the index that is to be examined next. */ private int index = 0; private FileDesc preview; public ThreadSafeFileViewIterator(AbstractFileCollection fileList) { this.fileList = fileList; this.index = fileList.getMinIndex(); } private boolean preview() { assert preview == null; fileList.getReadLock().lock(); try { while (index <= fileList.getMaxIndex()) { preview = fileList.getFileDescForIndex(index); index++; if (preview != null) { return true; } } return false; } finally { fileList.getReadLock().unlock(); } } @Override public boolean hasNext() { if (preview != null) { if (!fileList.contains(preview)) { // file was removed in the meantime preview = null; } } return preview != null || preview(); } @Override public FileDesc next() { if (hasNext()) { FileDesc item = preview; preview = null; return item; } throw new NoSuchElementException(); } @Override public void remove() { throw new UnsupportedOperationException(); } }