/** * */ package edu.harvard.econcs.turkserver.server; import javax.swing.SwingUtilities; import org.apache.commons.configuration.Configuration; import org.cometd.bayeux.server.ServerSession; import com.google.inject.Inject; import com.google.inject.Singleton; import edu.harvard.econcs.turkserver.mturk.HITController; import edu.harvard.econcs.turkserver.server.gui.ServerPanel; import edu.harvard.econcs.turkserver.server.gui.TSTabbedPanel; import edu.harvard.econcs.turkserver.server.mysql.ExperimentDataTracker; /** * @author mao * * A simple experiment server supporting one-way communication via JSON * with javascript clients. * * Useful for experiments that don't require interaction between clients * */ @Singleton public final class SimpleExperimentServer extends SessionServer { GUIListener guiListener; @Inject public SimpleExperimentServer( ExperimentDataTracker tracker, HITController hitCont, WorkerAuthenticator workerAuth, Experiments experiments, Configuration config ) throws Exception { super(tracker, hitCont, workerAuth, experiments, config); } @Inject(optional=true) public void injectWebServer(JettyCometD jetty) { super.injectWebServer(jetty); jetty.addServlet(SessionServlet.class, "/exp"); } @Inject(optional=true) public void injectGUI(final TSTabbedPanel guiTabs) { // TODO: divide up a null lobby from a mock lobby final ServerPanel serverGUI = new ServerPanel(this, new Lobby.NullLobby()); SwingUtilities.invokeLater(new Runnable() { public void run() { guiTabs.addPanel("Server", serverGUI); } }); this.guiListener = new GUIListener(this, serverGUI); experiments.registerListener(guiListener); } // TODO: refactor these somewhere better @Override public int getExpsInProgress() { return guiListener.inProgress.get(); } @Override public int getExpsCompleted() { return guiListener.completed.get(); } @Override protected HITWorkerImpl sessionAccept(ServerSession conn, String hitId, String assignmentId, String workerId) { /* * At this point, the session is successfully authenticated, so we create an experiment */ HITWorkerImpl hitw = super.sessionAccept(conn, hitId, assignmentId, workerId); if( hitw == null ) return null; if( experiments.workerIsInProgress(hitw) ) { super.sessionReconnect(conn, hitw); } else { ExperimentControllerImpl exp = experiments.startSingle(hitw); } return hitw; } @Override protected void runServerInit() { logger.info("Simple server...nothing to do here"); } }