package edu.uw.zookeeper.server;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.google.common.base.Function;
import com.google.common.collect.Iterators;
import edu.uw.zookeeper.common.Configuration;
import edu.uw.zookeeper.common.ParameterizedFactory;
import edu.uw.zookeeper.protocol.Session;
import edu.uw.zookeeper.protocol.server.SessionExecutor;
public class SimpleSessionManager<T extends SessionExecutor> extends AbstractSessionManager {
public static <T extends SessionExecutor> SimpleSessionManager<T> fromConfiguration(
short id,
ConcurrentMap<Long, T> sessions,
ParameterizedFactory<? super Session, ? extends T> factory,
Configuration configuration) {
DefaultSessionParametersPolicy policy = DefaultSessionParametersPolicy.fromConfiguration(id, configuration);
return create(factory, sessions, policy);
}
public static <T extends SessionExecutor> SimpleSessionManager<T> create(
ParameterizedFactory<? super Session, ? extends T> factory,
Map<Long, T> sessions,
SessionParametersPolicy policy) {
return new SimpleSessionManager<T>(factory, sessions, policy);
}
protected final Logger logger;
protected final Map<Long, T> executors;
protected final ParameterizedFactory<? super Session, ? extends T> factory;
protected SimpleSessionManager(
ParameterizedFactory<? super Session, ? extends T> factory,
Map<Long, T> sessions,
SessionParametersPolicy policy) {
super(policy);
this.logger = LogManager.getLogger(getClass());
this.factory = factory;
this.executors = sessions;
}
public Map<Long, T> executors() {
return executors;
}
@Override
public Session remove(long id) {
SessionExecutor executor = executors.remove(Long.valueOf(id));
if (executor != null) {
if (logger.isDebugEnabled()) {
logger.debug("Removed session {}", Session.toString(id));
}
return executor.session();
}
return null;
}
@Override
public Session get(long id) {
T executor = executors.get(Long.valueOf(id));
return (executor != null) ? executor.session() : null;
}
@Override
public Session put(Session session) {
Long k = Long.valueOf(session.id());
T existing = executors.get(k);
if (existing != null) {
if (existing.session().equals(session)) {
return null;
} else {
throw new IllegalArgumentException(String.valueOf(session));
}
}
existing = executors.put(k, factory.get(session));
if (existing != null) {
throw new IllegalStateException();
}
return null;
}
@Override
public Iterator<Session> iterator() {
return Iterators.transform(executors.values().iterator(),
new Function<T, Session>() {
@Override
public Session apply(T input) {
return input.session();
}
});
}
}