package tv.dyndns.kishibe.qmaclone.server.websocket;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
import com.google.common.base.Preconditions;
import com.google.inject.Inject;
import tv.dyndns.kishibe.qmaclone.server.Game;
import tv.dyndns.kishibe.qmaclone.server.GameManager;
import tv.dyndns.kishibe.qmaclone.server.exception.GameNotFoundException;
import tv.dyndns.kishibe.qmaclone.server.exception.InvalidGameSessionIdException;
/**
* ゲーム待機中状況を返すWebSocketの接続リクエストを処理する
*
* @author nodchip
*/
@SuppressWarnings("serial")
public class ReadyForGameWebSocketServlet extends WebSocketServlet {
@WebSocket
public static class ReadyForGameWebSocket {
private Session session;
private int gameSessionId;
@OnWebSocketConnect
public void onConnect(Session session) {
this.session = session;
try {
gameSessionId = GameUtil.extractGameSessionId(session);
} catch (InvalidGameSessionIdException e) {
logger.log(Level.WARNING, "WebSocketリクエストに含まれるゲームセッションIDが不正です", e);
session.close();
return;
}
Game game;
try {
game = gameManager.getSession(gameSessionId);
} catch (GameNotFoundException e) {
logger.log(Level.WARNING, "ゲームセッションが見つかりませんでした gameSessionId=" + gameSessionId, e);
session.close();
return;
}
game.getReadyForGameMessageSender().join(session);
}
@OnWebSocketClose
public void onClose(int statusCode, String reason) {
Game game;
try {
game = gameManager.getSession(gameSessionId);
} catch (GameNotFoundException e) {
logger.log(Level.WARNING, "ゲームセッションが見つかりませんでした gameSessionId=" + gameSessionId, e);
session.close();
return;
}
game.getReadyForGameMessageSender().bye(session);
this.session = null;
}
@OnWebSocketError
public void onError(Throwable cause) {
logger.log(Level.WARNING, "マッチング状況WebSocketセッションでエラーが起こりました。 remoteAddress="
+ session.getRemoteAddress().toString(), cause);
Game game;
try {
game = gameManager.getSession(gameSessionId);
} catch (GameNotFoundException e) {
logger.log(Level.WARNING, "ゲームセッションが見つかりませんでした gameSessionId=" + gameSessionId, e);
session.close();
return;
}
game.getReadyForGameMessageSender().bye(session);
this.session = null;
}
}
private static final Logger logger = Logger
.getLogger(ReadyForGameWebSocketServlet.class.toString());
private static GameManager gameManager;
@Inject
public ReadyForGameWebSocketServlet(GameManager gameManager) {
ReadyForGameWebSocketServlet.gameManager = Preconditions.checkNotNull(gameManager);
}
@Override
public void configure(WebSocketServletFactory factory) {
factory.register(ReadyForGameWebSocket.class);
}
}