package edu.uw.zookeeper.server;
import java.util.Map;
import com.google.common.base.Function;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import edu.uw.zookeeper.common.TaskExecutor;
import edu.uw.zookeeper.protocol.ConnectMessage;
import edu.uw.zookeeper.protocol.ZxidReference;
public class SimpleConnectExecutor<T extends AbstractSessionExecutor> implements TaskExecutor<ConnectMessage.Request, ConnectMessage.Response> {
public static <T extends AbstractSessionExecutor> SimpleConnectExecutor<T> defaults(
Map<Long, T> executors,
SessionManager sessions,
ZxidReference lastZxid) {
ConnectMessageProcessor processor = ConnectMessageProcessor.defaults(sessions, lastZxid);
return create(executors, processor);
}
public static <T extends AbstractSessionExecutor> SimpleConnectExecutor<T> create(
Map<Long, T> executors,
Function<ConnectMessage.Request, ConnectMessage.Response> processor) {
return new SimpleConnectExecutor<T>(executors, processor);
}
protected final Map<Long, T> executors;
protected final Function<ConnectMessage.Request, ConnectMessage.Response> processor;
protected SimpleConnectExecutor(
Map<Long, T> executors,
Function<ConnectMessage.Request, ConnectMessage.Response> processor) {
this.executors = executors;
this.processor = processor;
}
@Override
public ListenableFuture<ConnectMessage.Response> submit(ConnectMessage.Request request) {
if (request instanceof ConnectMessage.Request.RenewRequest) {
T executor = executors.get(Long.valueOf(request.getSessionId()));
if (executor != null) {
executor.timer().send(request);
}
}
ConnectMessage.Response response;
try {
response = processor.apply(request);
} catch (IllegalArgumentException e) {
return Futures.immediateFailedFuture(e.getCause());
}
return Futures.immediateFuture(response);
}
}