package com.mongodb.internal.operation;
import com.mongodb.MongoException;
import com.mongodb.internal.async.AsyncBatchCursor;
import com.mongodb.internal.async.SingleResultCallback;
import com.mongodb.internal.connection.QueryResult;
import java.util.List;
import static com.mongodb.assertions.Assertions.isTrue;
class AsyncSingleBatchQueryCursor<T> implements AsyncBatchCursor<T> {
private volatile QueryResult<T> firstBatch;
private volatile boolean closed;
AsyncSingleBatchQueryCursor(final QueryResult<T> firstBatch) {
this.firstBatch = firstBatch;
isTrue("Empty Cursor", firstBatch.getCursor() == null);
}
@Override
public void close() {
closed = true;
}
@Override
public void next(final SingleResultCallback<List<T>> callback) {
if (closed) {
callback.onResult(null, new MongoException("next() called after the cursor was closed."));
} else if (firstBatch != null && !firstBatch.getResults().isEmpty()) {
List<T> results = firstBatch.getResults();
firstBatch = null;
callback.onResult(results, null);
} else {
closed = true;
callback.onResult(null, null);
}
}
@Override
public void tryNext(final SingleResultCallback<List<T>> callback) {
next(callback);
}
@Override
public void setBatchSize(final int batchSize) {
}
@Override
public int getBatchSize() {
return 0;
}
@Override
public boolean isClosed() {
return closed;
}
}