?? gameprotocolhandler.java
字號:
// Copyright 2002 Nokia Corporation. // // THIS SOURCE CODE IS PROVIDED 'AS IS', WITH NO WARRANTIES WHATSOEVER, // EXPRESS OR IMPLIED, INCLUDING ANY WARRANTY OF MERCHANTABILITY, FITNESS // FOR ANY PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE // OR TRADE PRACTICE, RELATING TO THE SOURCE CODE OR ANY WARRANTY OTHERWISE // ARISING OUT OF ANY PROPOSAL, SPECIFICATION, OR SAMPLE AND WITH NO // OBLIGATION OF NOKIA TO PROVIDE THE LICENSEE WITH ANY MAINTENANCE OR // SUPPORT. FURTHERMORE, NOKIA MAKES NO WARRANTY THAT EXERCISE OF THE // RIGHTS GRANTED HEREUNDER DOES NOT INFRINGE OR MAY NOT CAUSE INFRINGEMENT // OF ANY PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OWNED OR CONTROLLED // BY THIRD PARTIES // // Furthermore, information provided in this source code is preliminary, // and may be changed substantially prior to final release. Nokia Corporation // retains the right to make changes to this source code at // any time, without notice. This source code is provided for informational // purposes only. // // Nokia and Nokia Connecting People are registered trademarks of Nokia// Corporation.// Java and all Java-based marks are trademarks or registered trademarks of// Sun Microsystems, Inc.// Other product and company names mentioned herein may be trademarks or// trade names of their respective owners.// // A non-exclusive, non-transferable, worldwide, limited license is hereby // granted to the Licensee to download, print, reproduce and modify the // source code. The licensee has the right to market, sell, distribute and // make available the source code in original or modified form only when // incorporated into the programs developed by the Licensee. No other // license, express or implied, by estoppel or otherwise, to any other // intellectual property rights is granted herein.package example.fruitmachine;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;class GameProtocolHandler { static class InvalidRequestException extends Exception { InvalidRequestException(String message) { super(message); } InvalidRequestException() { super(); } } private final UserDatabase userDatabase; GameProtocolHandler(UserDatabase userDatabase) { this.userDatabase = userDatabase; } void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String requestStr = getRequestString(request); ValueGenerator generator = new ValueGenerator(); ValueParser parser = new ValueParser(requestStr); String command = parser.getNextValue(); if ("login".equals(command)) { handleLoginRequest(parser, generator, request, response); } else { HttpSession session = request.getSession(false); if (session == null) { throw new IOException("Must login"); } else if ("spin".equals(command)) { handleSpinRequest(parser, generator, session); } else if ("buy".equals(command)) { handleBuyRequest(parser, generator, session); } else if ("logout".equals(command)) { handleLogoutRequest(generator, session); } else { throw new IOException("Invalid command"); } } String responseStr = generator.getString(); setResponseString(response, responseStr); } private String getRequestString(HttpServletRequest request) throws IOException { InputStream in = request.getInputStream(); int requestLength = request.getContentLength(); if (requestLength == -1) { throw new IOException("Need to know request length"); } StringBuffer buf = new StringBuffer(requestLength); for (int i = 0; i < requestLength; ++i) { int ch = in.read(); if (ch == -1) { break; } buf.append((char)ch); } in.close(); return buf.toString(); } private void setResponseString(HttpServletResponse response, String responseStr) throws IOException { response.setContentType("text/plain"); PrintWriter out = response.getWriter(); out.write(responseStr); out.close(); } private void handleLoginRequest(ValueParser parser, ValueGenerator generator, HttpServletRequest request, HttpServletResponse response) { try { String name = getStringValue(parser); String password = getStringValue(parser); if ((name == null) || (name.length() == 0) ) { throw new InvalidRequestException("Missing name"); } else if (password == null) // length 0 is OK { throw new InvalidRequestException("Missing password"); } else { User user = userDatabase.getUser(name); if ((user == null) || !user.isCorrectPassword(password)) { throw new InvalidRequestException( "Name or password incorrect"); } else { FruitMachine fruitMachine = new FruitMachine(user); HttpSession session = request.getSession(true); session.setAttribute("User", user); session.setAttribute("FruitMachine", fruitMachine); String requestUrl = request.getRequestURL().toString(); String rewrittenUrl = response.encodeURL(requestUrl); response.setHeader("X-RewrittenURL", rewrittenUrl); generator.addValue("login-OK"); generator.addValue(Integer.toString(user.getCredit())); } } } catch (InvalidRequestException e) { generateErrorResponse(generator, "login-error", e.getMessage()); } } private void generateErrorResponse(ValueGenerator generator, String errorName, String message) { generator.addValue(errorName); generator.addValue(message); } private void handleSpinRequest(ValueParser parser, ValueGenerator generator, HttpSession session) { try { User user = (User)(session.getAttribute("User")); FruitMachine fruitMachine = (FruitMachine)(session.getAttribute("FruitMachine")); int bet = getIntValue(parser); boolean hold0 = getBooleanValue(parser); boolean hold1 = getBooleanValue(parser); boolean hold2 = getBooleanValue(parser); FruitMachine.SpinResult result = fruitMachine.spin(bet, hold0, hold1, hold2); if (result.isWin()) { generator.addValue("spin-win"); generator.addValue(Integer.toString(result.getWinAmount())); } else { generator.addValue("spin-lose"); } generator.addValue(Integer.toString(user.getCredit())); generator.addValue(Integer.toString(result.getWheel(0))); generator.addValue(Integer.toString(result.getWheel(1))); generator.addValue(Integer.toString(result.getWheel(2))); } catch (FruitMachine.InvalidPlayException e) { generateErrorResponse(generator, "spin-error", e.getMessage()); } catch (InvalidRequestException e) { generateErrorResponse(generator, "spin-error", e.getMessage()); } } private void handleBuyRequest(ValueParser parser, ValueGenerator generator, HttpSession session) { try { User user = (User)(session.getAttribute("User")); int amount = getIntValue(parser); // this should go off to credit card issuer etc. user.addCredit(amount); generator.addValue("buy-OK"); generator.addValue(Integer.toString(user.getCredit())); } catch (InvalidRequestException e) { generateErrorResponse(generator, "buy-error", e.getMessage()); } } private void handleLogoutRequest(ValueGenerator generator, HttpSession session) { session.invalidate(); generator.addValue("logout-OK"); } private String getStringValue(ValueParser parser) throws InvalidRequestException { String value = parser.getNextValue(); if (value == null) { throw new InvalidRequestException("Missing value"); } return value; } private int getIntValue(ValueParser parser) throws InvalidRequestException { String valueStr = getStringValue(parser); int value; try { value = Integer.parseInt(valueStr); } catch (NumberFormatException e) { throw new InvalidRequestException("Value \"" + valueStr + "\" is not a valid integer"); } return value; } private boolean getBooleanValue(ValueParser parser) throws InvalidRequestException { String valueStr = getStringValue(parser); boolean value = false; if (valueStr.equals("true")) { value = true; } else if (valueStr.equals("false")) { value = false; } else { throw new InvalidRequestException("Value \"" + valueStr + "\" is not a valid boolean"); } return value; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -