package org.robotninjas.barge.log;
import com.google.common.collect.Queues;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListenableFutureTask;
import com.google.inject.Inject;
import org.robotninjas.barge.StateMachine;
import javax.annotation.Nonnull;
import javax.annotation.concurrent.ThreadSafe;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import static com.google.common.base.Preconditions.checkNotNull;
@ThreadSafe
class StateMachineProxy {
private final int BATCH_SIZE = 10;
private final Executor executor;
private final StateMachine stateMachine;
private final LinkedBlockingQueue<Runnable> operations;
private final AtomicBoolean running;
@Inject
StateMachineProxy(@Nonnull @StateExecutor Executor executor, @Nonnull StateMachine stateMachine) {
this.executor = checkNotNull(executor);
this.stateMachine = checkNotNull(stateMachine);
this.operations = Queues.newLinkedBlockingQueue();
this.running = new AtomicBoolean(false);
}
private <V> ListenableFuture<V> submit(Callable<V> runnable) {
ListenableFutureTask<V> operation =
ListenableFutureTask.create(runnable);
executor.execute(operation);
return operation;
}
@Nonnull
public ListenableFuture<Object> dispatchOperation(@Nonnull final ByteBuffer op) {
checkNotNull(op);
return submit(new Callable<Object>() {
@Override
public Object call() {
return stateMachine.applyOperation(op.asReadOnlyBuffer());
}
});
}
@Nonnull
public ListenableFuture takeSnapshot(@Nonnull final OutputStream out) throws IOException {
checkNotNull(out);
return submit(new Callable() {
@Override
public Object call() {
//stateMachine.takeSnapshot(out);
return null;
}
});
}
@Nonnull
public ListenableFuture installSnapshot() {
return Futures.immediateFailedFuture(new IllegalStateException());
}
}