package com.rubiconproject.oss.kv.distributed.test;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import com.rubiconproject.oss.kv.KeyValueStore;
import com.rubiconproject.oss.kv.backends.ConnectionFactory;
import com.rubiconproject.oss.kv.distributed.Node;
import com.rubiconproject.oss.kv.distributed.Operation;
import com.rubiconproject.oss.kv.distributed.OperationCallback;
import com.rubiconproject.oss.kv.distributed.OperationQueue;
import com.rubiconproject.oss.kv.distributed.OperationResult;
import com.rubiconproject.oss.kv.distributed.OperationStatus;
import com.rubiconproject.oss.kv.distributed.impl.DefaultOperationResult;
public class DummyOperationQueue implements OperationQueue {
private ConnectionFactory connectionFactory;
public DummyOperationQueue(ConnectionFactory connectionFactory) {
this.connectionFactory = connectionFactory;
}
public void setConnectionFactory(ConnectionFactory factory) {
this.connectionFactory = factory;
}
public void start() {
}
public void stop() {
}
public int getQueueSize() {
return 0;
}
public <V> Future<OperationResult<V>> submit(Operation<V> operation) {
Node node = null;
OperationResult<V> result = null;
long start = System.currentTimeMillis();
try {
node = operation.getNode();
KeyValueStore store = connectionFactory.getStore(null, node.getConnectionURI());
Callable<OperationResult<V>> callable = operation
.getCallable(store);
result = callable.call();
Future<OperationResult<V>> future = new DummyFuture<OperationResult<V>>(
result, null);
result = future.get();
return future;
} catch (Exception e) {
e.printStackTrace();
result = new DefaultOperationResult<V>(operation, null, OperationStatus.Error, System.currentTimeMillis() - start, e);
throw new RuntimeException(e);
} finally {
OperationCallback<V> callback = operation.getCallback();
if (callback != null)
callback.completed(result);
}
}
private static class DummyFuture<V> implements Future<V> {
private V v;
private Exception error;
public DummyFuture(V v, Exception error) {
this.v = v;
this.error = error;
}
public boolean cancel(boolean mayInterruptIfRunning) {
return false;
}
public V get() throws InterruptedException, ExecutionException {
if (error != null)
throw new ExecutionException(error);
else
return v;
}
public V get(long timeout, TimeUnit unit) throws InterruptedException,
ExecutionException, TimeoutException {
if (error != null)
throw new ExecutionException(error);
else
return v;
}
public boolean isCancelled() {
return false;
}
public boolean isDone() {
return true;
}
}
}