package org.signalml.plugin.newstager.logic.book;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.signalml.plugin.newstager.data.NewStagerBookData;
import org.signalml.plugin.newstager.data.NewStagerBookInfo;
import org.signalml.plugin.newstager.data.book.NewStagerBookSample;
public class NewStagerBookDataProvider {
private CountDownLatch event;
private AtomicBoolean shutdownFlag;
private NewStagerBookData bookData;
private AtomicInteger position;
public NewStagerBookDataProvider() {
this.event = new CountDownLatch(1);
this.position = new AtomicInteger();
this.shutdownFlag = new AtomicBoolean(false);
this.bookData = null;
}
public void setBookData(NewStagerBookData bookData) {
this.bookData = bookData;
this.event.countDown();
}
public NewStagerBookInfo getBookInfo() throws InterruptedException {
this.event.await();
if (this.shutdownFlag.get()) {
return null;
}
return this.bookData.bookInfo;
}
public NewStagerBookInfo tryGetBookInfo() {
boolean readyFlag = false;
try {
readyFlag = this.event.await(0, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
//do nothing
}
return readyFlag ? this.bookData.bookInfo : null;
}
public NewStagerBookSample getNextBookAtoms() throws InterruptedException {
this.event.await();
if (this.shutdownFlag.get()) {
return null;
}
int current = this.position.getAndIncrement();
if (current >= this.bookData.atoms.length) {
return null;
}
return new NewStagerBookSample(current, this.bookData.atoms[current], this.bookData.bookInfo);
}
public void shutdown() {
this.shutdownFlag.set(true);
this.event.countDown();
}
}