package guang.crawler.siteManager.jobQueue;
import com.sleepycat.je.Cursor;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.OperationStatus;
/**
* 在JEQueue中遍历元素
*
* @author sun
*
* @param <T>
*/
public class JECursorIterator<T> implements MapQueueIterator<T> {
/**
* JEQueue的游标
*/
private final Cursor cursor;
/**
* 下一个需要获取的元素
*/
private DatabaseEntry value = null;
/**
* 数据元素转换器
*/
private final JEQueueElementTransfer<T> transfer;
public JECursorIterator(final Cursor cursor,
final JEQueueElementTransfer<T> transfer) {
this.cursor = cursor;
this.transfer = transfer;
}
@Override
public void close() {
this.cursor.close();
}
/**
* 一直返回true,因此该方法是不被支持的
*/
@Override
public boolean hasNext() {
if (this.value != null) {
return true;
} else {
DatabaseEntry key = new DatabaseEntry();
this.value = new DatabaseEntry();
OperationStatus result = this.cursor.getNext(key, this.value, null);
if (result == OperationStatus.SUCCESS) {
return true;
} else {
this.value = null;
return false;
}
}
}
@Override
public T next() {
T result = null;
if (this.hasNext()) {
result = this.transfer.entryToObject(this.value);
}
this.value = null;
return result;
}
@Override
public void remove() {
this.cursor.delete();
}
}