/* $Id: Bingo.java,v 0.1 2002/12/29 18:27:25 remm Exp $ * */ package Bingo; import java.io.*; import java.text.*; //import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.logging.Logger; import java.util.logging.Level; import java.util.logging.LogManager; /* * @author Nobuhiko Ido */ public class bingoControl extends HttpServlet implements HttpSessionBindingListener { public static int dbgCount=0;//DBG protected static Logger logger = Logger.getLogger(bingoControl.class.getName()); public void init() { String prefix = getServletContext().getRealPath("/"); String file = getInitParameter("logApi-init-file"); // (I0)if the logApi-init-file is not set, then no point in trying if(file != null) { try{ FileInputStream inputStream = new FileInputStream(prefix+file); // 設定ファイルの読み込み LogManager.getLogManager().readConfiguration(inputStream); logger.fine("#################### logger configuration was set.("+bingoControl.class.getName()+")"); }catch (Exception e){ log("#W# Bingo.bingoControl:init,e="+e.getMessage());//DBG } } // (I1)database initialization String dbDriver = getInitParameter("db-driver"); String dbUrl = getInitParameter("db-url"); String dbUserName = getInitParameter("db-user-name"); String dbPassword = getInitParameter("db-password"); bingoDBAccess.initDB(dbDriver,dbUrl,dbUserName,dbPassword); logger.fine("#D#Bingo.bingoControl:init."); // (I2)bingoPlayer initialization bingoPlayer.init(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // (C0)DBG:デバッグ用 dbgCount++;//DBG logger.fine("#######D#######top dbgCount="+dbgCount);//DBG request.setAttribute("dbCount",String.valueOf(dbgCount));//DBG String dbg = request.getParameter("dbg");//DBG String operation = request.getParameter("operation"); // (C1)return entry:登録画面表示を送信 if(operation == null){ logger.fine("#D#(C1)return entry");//DBG gotoPage("/bingo/bingoEntry.jsp", request, response,"","","","",""); return; } // (C2)new hame:セッションからbingoPlayerを取り出し、ゲームを生成 HttpSession session = request.getSession(true); bingoGame game = new bingoGame(); game.setPlayer((bingoPlayer)session.getAttribute("player")); logger.fine("#D#(C2)sessionID="+session.getId()+",player="+game.getPlayer()+",operation="+operation);//DBG if(game.getPlayer() == null){ // (C2.1)new player:新たなbingoPlayerを生成 if(operation.equals("registrate")){ String name = request.getParameter("yourName"); String password = request.getParameter("password"); logger.fine("#D#(C2.1)new player:name="+name+",password="+password);//DBG game.setPlayer(bingoPlayer.newPlayer(name,password)); if(game.getPlayer() == null){ // (C2.1.1)busy:定員オーバーのため、もしくは同名のプレイヤーが // 存在するため、ビジー表示を送信 logger.fine("#D#(C2.1.1)busy");//DBG gotoPage("/bingo/bingoBusy.jsp", request, response,name,"","","",""); return; } session.setAttribute("player",game.getPlayer()); game.getPlayer().setPlayerId(bingoDBAccess.getPlayerId(name,password)); }else{ // (C2.2)timeout:セッション切れ(タイムアウト)を表示 logger.fine("#D#(C2.2)return entry");//DBG gotoPage("/bingo/bingoTimeOut.jsp", request, response,"","","","",""); return; } } // (C3)state transfer:状態遷移を実施 String figure = (String)request.getParameter("figure"); game.setFigure(figure); game.setOperation(operation); logger.fine("#D#(C3)player="+game.getPlayer().getName()+",opponent="+game.getPlayer().getOpponent()+",figure="+figure);//DBG game.stateTransfer(); // (C4)DB access:データベースへアクセス int state = game.getPlayer().getState(); if((state==bingoGame.STATE_NO_SESSION_WIN)|| (state==bingoGame.STATE_NO_SESSION_LOOSE)|| (state==bingoGame.STATE_NO_SESSION_DRAW)|| (state==bingoGame.STATE_WIN)|| (state==bingoGame.STATE_LOOSE)|| (state==bingoGame.STATE_DRAW)){ // (C4.1)get PID:データベースに登録されたPIDを取得 int playerPID = game.getPlayer().getPlayerId(); int opponentPID = game.getPlayer().getOpponent().getPlayerId(); if(playerPID>0){ if(opponentPID>0){ // (C4.2)insert game record:ゲームレコードを挿入 boolean draw = false; if(state==bingoGame.STATE_NO_SESSION_WIN){ bingoDBAccess.insertGameRecord(playerPID,opponentPID,false); logger.fine("#D#(C4.2.1)insertGameRecord:win="+playerPID+",loose"+opponentPID); }else if(state==bingoGame.STATE_NO_SESSION_LOOSE){ bingoDBAccess.insertGameRecord(opponentPID,playerPID,false); logger.fine("#D#(C4.2.2)insertGameRecord:win="+opponentPID+",loose"+playerPID); }else if(state==bingoGame.STATE_NO_SESSION_DRAW){ bingoDBAccess.insertGameRecord(playerPID,opponentPID,true); logger.fine("#D#(C4.2.3)insertGameRecord:draw,"+playerPID+" and "+opponentPID); } } // (C4.3)get game record:過去のゲームレコードを取得 String records = bingoDBAccess.getGameRecords(playerPID); request.setAttribute("records",records); } } // (C5)send page:表示ページを送信 // (C5.1)set names,cards,opponents:名前等を設定 request.setAttribute("player_name",game.getPlayer().getName()); request.setAttribute("my_bingoCard",game.getPlayer().getBingoCard()); if(game.getPlayer().getOpponent() != null){ logger.fine("#D#(C5.1)opponent is null."); request.setAttribute("opponent_name",game.getPlayer().getOpponent().getName()); request.setAttribute("op_bingoCard",game.getPlayer().getOpponent().getBingoCard()); } logger.fine("#D#(C5.1)send page");//DBG // (C5.2)set JSP:送信ページのJSPを設定 String address = "/bingo/bingoErr.jsp"; switch(game.getPlayer().getState()){ case bingoGame.STATE_NULL: logger.fine("#D#(C5.2.0)NULL");//DBG break; case bingoGame.STATE_WAIT_OP: logger.fine("#D#(C5.2.1)WAIT_OP");//DBG request.setAttribute("next_operation","wait_op"); address = "/bingo/bingoWait.jsp"; break; case bingoGame.STATE_FIND_OP: logger.fine("#D#(C5.2.2)FIND_OP");//DBG break; case bingoGame.STATE_THINK: logger.fine("#D#(C5.2.3)THINK:player:name="+game.getPlayer().getName()+",bingoCard="+game.getPlayer().getBingoCard()+" opponent:name="+game.getPlayer().getOpponent().getName()+",bingoCard="+game.getPlayer().getOpponent().getBingoCard());//DBG request.setAttribute("next_operation","think"); address = "/bingo/bingoOnGame.jsp"; break; case bingoGame.STATE_WAIT_FIG: logger.fine("#D#(C5.2.4)WAIT_FIG");//DBG request.setAttribute("next_operation","wait_fig"); address = "/bingo/bingoOnGame.jsp"; break; case bingoGame.STATE_READY_FIG: logger.fine("#D#(C5.2.5)READY_FIG");//DBG break; case bingoGame.STATE_WIN: logger.fine("#D#(C5.2.6)WIN");//DBG request.setAttribute("next_operation","win"); address = "/bingo/bingoOnGame.jsp"; break; case bingoGame.STATE_LOOSE: logger.fine("#D#(C4.1.7)LOOSE");//DBG request.setAttribute("next_operation","loose"); address = "/bingo/bingoOnGame.jsp"; break; case bingoGame.STATE_DRAW: logger.fine("#D#(C5.2.8)DRAW");//DBG request.setAttribute("next_operation","draw"); address = "/bingo/bingoOnGame.jsp"; break; case bingoGame.STATE_NO_SESSION_WIN: logger.fine("#D#(C5.2.9)NO_SESSION");//DBG address = "/bingo/bingoOnGame.jsp"; request.setAttribute("next_operation","win"); break; case bingoGame.STATE_NO_SESSION_LOOSE: logger.fine("#D#(C5.2.10)NO_SESSION");//DBG address = "/bingo/bingoOnGame.jsp"; request.setAttribute("next_operation","loose"); break; case bingoGame.STATE_NO_SESSION_DRAW: logger.fine("#D#(C5.2.11)NO_SESSION");//DBG address = "/bingo/bingoOnGame.jsp"; request.setAttribute("next_operation","draw"); break; case bingoGame.STATE_NO_SESSION: logger.fine("#D#(C5.2.12)NO_SESSION");//DBG address = "/bingo/bingoErr.jsp"; request.setAttribute("dbstring","player state=no session"); break; default: logger.fine("#D#(C5.2.13)default");//DBG break; } // (C5.3)do it!:送信 logger.fine("#D#(C5.3)forward:address="+address);//DBG RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(address); dispatcher.forward(request, response); // (C6)invalidate session:セッションの解放 if(game.isSessionInvalid() == true){ logger.fine("#D#(C6)invalidate session:sessionInvarid="+game.isSessionInvalid());//DBG session.invalidate(); } // (C7)invalidate players:bingoPlayerの解放 logger.fine("#D#(C7)invalidate players:isPlayerInvalid="+game.isPlayersInvalid());//DBG if(game.isPlayersInvalid() == true){ game.getPlayer().getOpponent().invalidate(); game.getPlayer().invalidate(); } } private void gotoPage(String address, HttpServletRequest request, HttpServletResponse response, String nextOperation, String playerName, String opponentName, String myBingoCard, String opBingoCard) throws IOException, ServletException { request.setAttribute("next_operation",nextOperation); request.setAttribute("player_name",playerName); request.setAttribute("opponent_name",opponentName); request.setAttribute("my_bingoCard",myBingoCard); request.setAttribute("op_bingoCard",opBingoCard); RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(address); dispatcher.forward(request, response); } public void valueBound(javax.servlet.http.HttpSessionBindingEvent event){ } public void valueUnbound(javax.servlet.http.HttpSessionBindingEvent event){ bingoControl.dbgCount++; logger.fine("#######D#######bingoPlayer:valueUnbound:(VU0) dbcount="+bingoControl.dbgCount+"\n");//DBG Object temp = event.getValue(); logger.fine("#D#bingoPlayer:event.getValue="+temp.toString()+"/n"); bingoPlayer player = (bingoPlayer)event.getValue(); // (VU1) check value if(player == null){ logger.fine("#D#bingoPlayer:valueUnbound:(VU1)\n");//DBG return; } // (VU2) check name if(player.getName() == null){ logger.fine("#D#bingoPlayer:valueUnbound:(VU2)\n");//DBG return; } // (VU3) state transfer bingoGame game = new bingoGame(); game.setPlayer(player); game.setOperation("time_out"); logger.fine("#D#(VU3)player="+game.getPlayer().getName()+",opponent="+game.getPlayer().getOpponent());//DBG game.stateTransfer(); // (VU4)invalidate players if(game.isPlayersInvalid() == true){ logger.fine("#D#(VU4)invalidate players");//DBG game.getPlayer().getOpponent().invalidate(); game.getPlayer().invalidate(); } } }