package edu.uw.zookeeper.server; import static com.google.common.base.Preconditions.checkNotNull; import java.util.concurrent.ScheduledExecutorService; import org.apache.logging.log4j.LogManager; import net.engio.mbassy.common.IConcurrentSet; import net.engio.mbassy.common.StrongConcurrentSet; import com.google.common.base.Supplier; import com.google.common.util.concurrent.ListenableFuture; import edu.uw.zookeeper.common.Automatons; import edu.uw.zookeeper.common.ParameterizedFactory; import edu.uw.zookeeper.common.TaskExecutor; import edu.uw.zookeeper.protocol.Message; import edu.uw.zookeeper.protocol.ProtocolState; import edu.uw.zookeeper.protocol.ProtocolMessageAutomaton; import edu.uw.zookeeper.protocol.Session; import edu.uw.zookeeper.protocol.SessionListener; import edu.uw.zookeeper.protocol.SessionOperation; import edu.uw.zookeeper.protocol.SessionRequest; public final class SimpleSessionExecutor extends AbstractSessionExecutor { public static ParameterizedFactory<Session, SimpleSessionExecutor> factory( final ScheduledExecutorService scheduler, final Supplier<? extends TaskExecutor<? super SessionOperation.Request<?>, Message.ServerResponse<?>>> server) { checkNotNull(scheduler); checkNotNull(server); return new ParameterizedFactory<Session, SimpleSessionExecutor>() { @Override public SimpleSessionExecutor get(Session value) { Automatons.SynchronizedEventfulAutomaton<ProtocolState, Object,?> automaton = Automatons.createSynchronizedEventful( Automatons.createEventful( Automatons.createLogging( LogManager.getLogger(SimpleSessionExecutor.class), ProtocolMessageAutomaton.asAutomaton( ProtocolState.CONNECTED)))); return new SimpleSessionExecutor( value, automaton, new StrongConcurrentSet<SessionListener>(), scheduler, server.get()); } }; } protected final TaskExecutor<? super SessionOperation.Request<?>, Message.ServerResponse<?>> server; public SimpleSessionExecutor( Session session, Automatons.EventfulAutomaton<ProtocolState,Object> state, IConcurrentSet<SessionListener> listeners, ScheduledExecutorService scheduler, TaskExecutor<? super SessionOperation.Request<?>, Message.ServerResponse<?>> server) { super(session, state, listeners, scheduler); this.server = checkNotNull(server); } @Override protected ListenableFuture<Message.ServerResponse<?>> doSubmit(Message.ClientRequest<?> request) { return server.submit(SessionRequest.of(session.id(), request)); } }