package tv.dyndns.kishibe.qmaclone.server.websocket; import java.util.logging.Level; import java.util.logging.Logger; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import com.google.gson.Gson; import com.google.inject.AbstractModule; import com.google.inject.Provides; import com.google.inject.Singleton; import tv.dyndns.kishibe.qmaclone.client.constant.Constant; import tv.dyndns.kishibe.qmaclone.client.packet.PacketChatMessages; import tv.dyndns.kishibe.qmaclone.client.packet.PacketGameStatus; import tv.dyndns.kishibe.qmaclone.client.packet.PacketMatchingStatus; import tv.dyndns.kishibe.qmaclone.client.packet.PacketReadyForGame; import tv.dyndns.kishibe.qmaclone.client.packet.PacketServerStatus; import tv.dyndns.kishibe.qmaclone.server.ThreadPool; public class WebSocketModule extends AbstractModule { private static final Logger logger = Logger.getLogger(WebSocketModule.class.toString()); private static final String PATH_PREFIX = "/QMAClone/websocket/"; @Override protected void configure() { // Do nothing. } @Provides private ServletContextHandler provideServletContextHandler( ChatMessagesWebSocketServlet chatMessagesWebSocketServlet, GameStatusWebSocketServlet gameStatusWebSocketServlet, MatchingStatusWebSocketServlet matchingStatusWebSocketServlet, ReadyForGameWebSocketServlet readyForGameWebSocketServlet, ServerStatusWebSocketServlet serverStatusWebSocketServlet) { ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS); handler.addServlet(new ServletHolder(chatMessagesWebSocketServlet), PATH_PREFIX + PacketChatMessages.class.getName()); handler.addServlet(new ServletHolder(gameStatusWebSocketServlet), PATH_PREFIX + PacketGameStatus.class.getName()); handler.addServlet(new ServletHolder(matchingStatusWebSocketServlet), PATH_PREFIX + PacketMatchingStatus.class.getName()); handler.addServlet(new ServletHolder(readyForGameWebSocketServlet), PATH_PREFIX + PacketReadyForGame.class.getName()); handler.addServlet(new ServletHolder(serverStatusWebSocketServlet), PATH_PREFIX + PacketServerStatus.class.getName()); return handler; } @Provides private HandlerList provideHandlerList(ServletContextHandler servletContextHandler) { HandlerList list = new HandlerList(); list.addHandler(servletContextHandler); return list; } @Provides @Singleton private Server provideServer(HandlerList handlerList) throws Exception { Server server = new Server(Constant.WEB_SOCKET_PORT); server.setHandler(handlerList); try { server.start(); } catch (Exception e) { logger.log(Level.SEVERE, "WebSocketサーバーの開始に失敗しました。", e); throw e; } return server; } @Provides private MessageSender<PacketChatMessages> provideChatMessagesWebSockets(ThreadPool threadPool) { return new MessageSender<PacketChatMessages>(threadPool) { @Override protected String encode(PacketChatMessages status) { return new Gson().toJson(status); } }; } @Provides private MessageSender<PacketMatchingStatus> provideMatchingStatusMessageSender( ThreadPool threadPool) { return new MessageSender<PacketMatchingStatus>(threadPool) { @Override protected String encode(PacketMatchingStatus status) { return new Gson().toJson(status); } }; } @Provides private MessageSender<PacketReadyForGame> provideReadyForGameMessageSender( ThreadPool threadPool) { return new MessageSender<PacketReadyForGame>(threadPool) { @Override protected String encode(PacketReadyForGame status) { return new Gson().toJson(status); } }; } @Provides private MessageSender<PacketGameStatus> provideGameStatusMessageSender(ThreadPool threadPool) { return new MessageSender<PacketGameStatus>(threadPool) { @Override protected String encode(PacketGameStatus status) { return new Gson().toJson(status); } }; } @Provides private MessageSender<PacketServerStatus> provideServerStatusMessageSender( ThreadPool threadPool) { return new MessageSender<PacketServerStatus>(threadPool) { @Override protected String encode(PacketServerStatus status) { return new Gson().toJson(status); } }; } }