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.ChatManager;
/**
* チャットメッセージを返すWebSocketの接続リクエストを処理する
*
* @author nodchip
*/
@SuppressWarnings("serial")
public class ChatMessagesWebSocketServlet extends WebSocketServlet {
@WebSocket
public static class ChatMessagesWebSocket {
private Session session;
@OnWebSocketConnect
public void onConnect(Session session) {
this.session = session;
chatManager.getChatMessagesMessageSender().join(session);
}
@OnWebSocketClose
public void onClose(int statusCode, String reason) {
chatManager.getChatMessagesMessageSender().bye(session);
this.session = null;
}
@OnWebSocketError
public void onError(Throwable cause) {
logger.log(Level.WARNING, "チャットメッセージWebSocketセッションでエラーが起こりました。 remoteAddress="
+ session.getRemoteAddress().toString(), cause);
chatManager.getChatMessagesMessageSender().bye(session);
this.session = null;
}
}
private static final Logger logger = Logger
.getLogger(ChatMessagesWebSocketServlet.class.toString());
private static ChatManager chatManager;
@Inject
public ChatMessagesWebSocketServlet(ChatManager chatManager) {
ChatMessagesWebSocketServlet.chatManager = Preconditions.checkNotNull(chatManager);
}
@Override
public void configure(WebSocketServletFactory factory) {
factory.register(ChatMessagesWebSocket.class);
}
}