/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002-2006
* Sleepycat Software. All rights reserved.
*
* $Id: TreeIterator.java,v 1.1 2006/05/06 09:00:17 ckaestne Exp $
*/
package com.sleepycat.je.tree;
import java.util.Iterator;
import java.util.NoSuchElementException;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.latch.LatchNotHeldException;
/**
* TreeIterator implements an Iterator over Tree's. Not protected
* against insertions like cursors.
*/
public final class TreeIterator implements Iterator {
private Tree tree;
private BIN nextBin;
private int index;
public TreeIterator(Tree tree)
throws DatabaseException {
nextBin = (BIN) tree.getFirstNode();
if (nextBin != null) {
nextBin.releaseLatch();
}
index = -1;
this.tree = tree;
}
public boolean hasNext() {
boolean ret = false;
try {
if (nextBin != null) {
nextBin.latch();
}
advance();
ret = (nextBin != null) && (index < nextBin.getNEntries());
} catch (DatabaseException e) {
// eat exception
} finally {
try {
if (nextBin != null) {
nextBin.releaseLatch();
}
} catch (LatchNotHeldException e) {
/* Klockwork - ok */
}
}
return ret;
}
public Object next() {
Object ret = null;
try {
if (nextBin == null) {
throw new NoSuchElementException();
}
nextBin.latch();
ret = nextBin.getKey(index);
} catch (DatabaseException e) {
// eat exception, return null;
} finally {
try {
if (nextBin != null) {
nextBin.releaseLatch();
}
} catch (LatchNotHeldException e) {
/* Klockwork - ok */
}
}
return ret;
}
public void remove() {
throw new UnsupportedOperationException();
}
private void advance()
throws DatabaseException {
while (nextBin != null) {
if (++index < nextBin.getNEntries()) {
return;
}
nextBin = tree.getNextBin(nextBin, false /* traverseWithinDupTree */);
index = -1;
}
}
}