net.sf.colossus.webserver
Class WebServer

java.lang.Object
  extended by net.sf.colossus.webserver.WebServer
All Implemented Interfaces:
IRunWebServer, IWebServer

public class WebServer
extends java.lang.Object
implements IWebServer, IRunWebServer

The main class for the WebServer - brings up the WebServer GUI - starts the ServerSocket and listens there for WebClients - based on actions coming from clients, keeps book of "instant" and "running" games (both GameInfo objects), and tell the GameInfo objects when to start the game.

Author:
Clemens Katzer

Nested Class Summary
(package private)  class WebServer.GameThreadReaper
          Check whether any game executed in an own process has been finished.
private static class WebServer.NullWebServerGUI
          A Null Object for the web server GUI interface.
 
Field Summary
private  java.util.ArrayList<GameInfo> endingGames
           
private  ChatChannel generalChat
           
private  IWebServerGUI gui
           
private static java.util.logging.Logger LOGGER
           
private static java.util.ArrayList<java.lang.String> loginMessage
           
private  IColossusMail mailObject
           
private  int maxClients
           
private static int MIN_FREE_GAME_PORTS
           
private  WebServerOptions options
           
private  PortBookKeeper portBookKeeper
           
private  java.util.HashMap<java.lang.String,GameInfo> proposedGames
           
private  java.lang.String proposedGamesFilename
           
private  boolean proposedGamesListModified
           
private  boolean runGUI
          Controls whether the GUI is shown or not.
private  java.util.ArrayList<GameInfo> runningGames
           
private static java.lang.String sep
           
private  int serverPort
          Server port where we listen for WebClient connections
private  java.net.ServerSocket serverSocket
          Server actual socket where we listen for WebClient connections
private  boolean shutdownRequested
           
private  ClientWatchDog watchDog
           
 
Fields inherited from interface net.sf.colossus.webcommon.IWebServer
Cancel, ChangePassword, ChatSubmit, ConfirmRegistration, Echo, Enroll, generalChatName, LocallyGameOver, Login, Logout, PingResponse, Propose, RegisterUser, RequestUserAttention, ShutdownServer, Start, StartAtPlayer, StartedByPlayer, Unenroll, WebProtocolSeparator
 
Constructor Summary
WebServer(java.lang.String optionsFile)
           
 
Method Summary
 void allTellGameInfo(GameInfo gi)
           
 void allTellUserCounts()
           
private  void attemptStartOnServer(GameInfo gi, User byUser)
           
 void cancelGame(java.lang.String gameId, java.lang.String byUser)
           
 java.lang.String changeProperties(java.lang.String username, java.lang.String oldPW, java.lang.String newPW, java.lang.String email, java.lang.Boolean isAdminObj)
           
 void chatSubmit(java.lang.String chatId, java.lang.String sender, java.lang.String message)
           
private  void closeAllWscst()
           
 java.lang.String confirmRegistration(java.lang.String username, java.lang.String confirmationCode)
           
private  int countProposedGames(boolean shallBeScheduled)
           
 void enrollUserToGame(java.lang.String gameId, java.lang.String username)
           
private  GameInfo findByGameId(java.lang.String gameId)
           
private  GameInfo findFromRunningGames(java.lang.String gameId)
           
 void gameFailed(GameInfo gi, java.lang.String reason)
           
 void gameStarted(GameInfo gi)
           
private  IGameRunner getGameOnServer(GameInfo gi)
           
private  int getMaximumGameIdFromFiles()
           
(package private)  java.lang.String getPlayerName()
          Each user server thread's name is set to it user's name.
 PortBookKeeper getPortBookKeeper()
           
 java.lang.String getStringOption(java.lang.String key)
           
private  void handlePing(java.lang.String sender, java.lang.String pingCommand)
           
 void informAllEnrolledThatStartFailed(GameInfo gi, java.lang.String reason, User byUser)
           
 void informLocallyGameOver(java.lang.String gameId)
           
private  void informPingFailed(java.lang.String sender, java.lang.String failMessage)
           
 void informStartedByPlayer(java.lang.String gameId)
           
 void initiateShutdown(java.lang.String byUserName)
           
 void logout()
           
static void main(java.lang.String[] args)
           
 void makeDummyConnection()
           
 GameInfo proposeGame(java.lang.String initiator, java.lang.String variant, java.lang.String viewmode, long startAt, int duration, java.lang.String summary, java.lang.String expire, boolean unlimitedMulligans, boolean balancedTowers, int min, int target, int max)
           
private  void readGamesFromFile(java.lang.String filename, java.util.HashMap<java.lang.String,GameInfo> proposedGames)
           
private  void readLoginMessageFromFile(java.lang.String filename)
           
 void reEnrollIfNecessary(WebServerClientSocketThread newCst)
           
 java.lang.String registerUser(java.lang.String username, java.lang.String password, java.lang.String email)
           
 void requestUserAttention(long when, java.lang.String sender, boolean isAdmin, java.lang.String recipient, java.lang.String message, int beepCount, long beepInterval, boolean windows)
           
(package private)  void runSocketServer()
           
 void saveGamesIfNeeded()
           
 void sendMessageOfTheDayToOne(WebServerClientSocketThread cst, java.lang.String chatId)
           
 void shutdownServer()
           
 void startGame(java.lang.String gameId, User byUser)
           
 void startGameOnPlayerHost(java.lang.String gameId, java.lang.String hostingPlayer, java.lang.String playerHost, int port)
          A game was started by a WebClient user locally on his computer and is ready to accept the other players as remote client; so we notify them and tell them host and port to where to connect.
private  java.lang.String startOneGame(GameInfo gi)
           
private  void storeGamesToFile(java.lang.String filename)
           
 void tellAllGamesFromListToOne(WebServerClientSocketThread cst, java.util.ArrayList<GameInfo> games)
           
 void tellAllProposedGamesToOne(WebServerClientSocketThread cst)
           
 void tellAllRunningGamesToOne(WebServerClientSocketThread cst)
           
 void tellEnrolledGameStartsNow(GameInfo gi, java.lang.String host, int port)
           
 void tellEnrolledGameStartsSoon(GameInfo gi)
           
 void tellLastChatMessagesToOne(WebServerClientSocketThread cst, java.lang.String chatId)
           
 void unenrollUserFromGame(java.lang.String gameId, java.lang.String username)
           
 void unregisterGame(GameInfo gi, int port)
           
 void unregisterGamePlayerPC(GameInfo gi)
           
 void updateGUI()
           
 void updateUserCounts()
           
private  boolean waitForUser()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

LOGGER

private static final java.util.logging.Logger LOGGER

options

private WebServerOptions options

portBookKeeper

private PortBookKeeper portBookKeeper

gui

private IWebServerGUI gui

mailObject

private final IColossusMail mailObject

MIN_FREE_GAME_PORTS

private static final int MIN_FREE_GAME_PORTS
See Also:
Constant Field Values

loginMessage

private static final java.util.ArrayList<java.lang.String> loginMessage

runGUI

private final boolean runGUI
Controls whether the GUI is shown or not. At the moment this is configured only by the possibility of doing so: if the environment supports running a GUI, we will, if not, we won't. It could be combined with a command line option to suppress the GUI even if it would be possible to show one.


shutdownRequested

private boolean shutdownRequested

proposedGamesFilename

private java.lang.String proposedGamesFilename

proposedGamesListModified

private boolean proposedGamesListModified

maxClients

private final int maxClients

proposedGames

private final java.util.HashMap<java.lang.String,GameInfo> proposedGames

runningGames

private final java.util.ArrayList<GameInfo> runningGames

endingGames

private final java.util.ArrayList<GameInfo> endingGames

sep

private static final java.lang.String sep
See Also:
Constant Field Values

serverPort

private final int serverPort
Server port where we listen for WebClient connections


serverSocket

private java.net.ServerSocket serverSocket
Server actual socket where we listen for WebClient connections


generalChat

private final ChatChannel generalChat

watchDog

private final ClientWatchDog watchDog
Constructor Detail

WebServer

public WebServer(java.lang.String optionsFile)
Method Detail

main

public static void main(java.lang.String[] args)

runSocketServer

void runSocketServer()

initiateShutdown

public void initiateShutdown(java.lang.String byUserName)

shutdownServer

public void shutdownServer()
Specified by:
shutdownServer in interface IWebServer

makeDummyConnection

public void makeDummyConnection()

waitForUser

private boolean waitForUser()

closeAllWscst

private void closeAllWscst()

getPlayerName

java.lang.String getPlayerName()
Each user server thread's name is set to it user's name.


getPortBookKeeper

public PortBookKeeper getPortBookKeeper()

updateGUI

public void updateGUI()

proposeGame

public GameInfo proposeGame(java.lang.String initiator,
                            java.lang.String variant,
                            java.lang.String viewmode,
                            long startAt,
                            int duration,
                            java.lang.String summary,
                            java.lang.String expire,
                            boolean unlimitedMulligans,
                            boolean balancedTowers,
                            int min,
                            int target,
                            int max)
Specified by:
proposeGame in interface IWebServer

reEnrollIfNecessary

public void reEnrollIfNecessary(WebServerClientSocketThread newCst)

tellAllGamesFromListToOne

public void tellAllGamesFromListToOne(WebServerClientSocketThread cst,
                                      java.util.ArrayList<GameInfo> games)

tellAllProposedGamesToOne

public void tellAllProposedGamesToOne(WebServerClientSocketThread cst)

tellAllRunningGamesToOne

public void tellAllRunningGamesToOne(WebServerClientSocketThread cst)

allTellGameInfo

public void allTellGameInfo(GameInfo gi)
Specified by:
allTellGameInfo in interface IRunWebServer

tellEnrolledGameStartsSoon

public void tellEnrolledGameStartsSoon(GameInfo gi)
Specified by:
tellEnrolledGameStartsSoon in interface IRunWebServer

tellEnrolledGameStartsNow

public void tellEnrolledGameStartsNow(GameInfo gi,
                                      java.lang.String host,
                                      int port)
Specified by:
tellEnrolledGameStartsNow in interface IRunWebServer

gameStarted

public void gameStarted(GameInfo gi)
Specified by:
gameStarted in interface IRunWebServer

gameFailed

public void gameFailed(GameInfo gi,
                       java.lang.String reason)
Specified by:
gameFailed in interface IRunWebServer

enrollUserToGame

public void enrollUserToGame(java.lang.String gameId,
                             java.lang.String username)
Specified by:
enrollUserToGame in interface IWebServer

unenrollUserFromGame

public void unenrollUserFromGame(java.lang.String gameId,
                                 java.lang.String username)
Specified by:
unenrollUserFromGame in interface IWebServer

cancelGame

public void cancelGame(java.lang.String gameId,
                       java.lang.String byUser)
Specified by:
cancelGame in interface IWebServer

startGame

public void startGame(java.lang.String gameId,
                      User byUser)
Specified by:
startGame in interface IWebServer

attemptStartOnServer

private void attemptStartOnServer(GameInfo gi,
                                  User byUser)

startGameOnPlayerHost

public void startGameOnPlayerHost(java.lang.String gameId,
                                  java.lang.String hostingPlayer,
                                  java.lang.String playerHost,
                                  int port)
A game was started by a WebClient user locally on his computer and is ready to accept the other players as remote client; so we notify them and tell them host and port to where to connect.

Specified by:
startGameOnPlayerHost in interface IWebServer

informStartedByPlayer

public void informStartedByPlayer(java.lang.String gameId)
Specified by:
informStartedByPlayer in interface IWebServer

informAllEnrolledThatStartFailed

public void informAllEnrolledThatStartFailed(GameInfo gi,
                                             java.lang.String reason,
                                             User byUser)

requestUserAttention

public void requestUserAttention(long when,
                                 java.lang.String sender,
                                 boolean isAdmin,
                                 java.lang.String recipient,
                                 java.lang.String message,
                                 int beepCount,
                                 long beepInterval,
                                 boolean windows)
Specified by:
requestUserAttention in interface IWebServer

informPingFailed

private void informPingFailed(java.lang.String sender,
                              java.lang.String failMessage)

informLocallyGameOver

public void informLocallyGameOver(java.lang.String gameId)
Specified by:
informLocallyGameOver in interface IWebServer

updateUserCounts

public void updateUserCounts()

allTellUserCounts

public void allTellUserCounts()

chatSubmit

public void chatSubmit(java.lang.String chatId,
                       java.lang.String sender,
                       java.lang.String message)
Specified by:
chatSubmit in interface IWebServer

handlePing

private void handlePing(java.lang.String sender,
                        java.lang.String pingCommand)

tellLastChatMessagesToOne

public void tellLastChatMessagesToOne(WebServerClientSocketThread cst,
                                      java.lang.String chatId)

sendMessageOfTheDayToOne

public void sendMessageOfTheDayToOne(WebServerClientSocketThread cst,
                                     java.lang.String chatId)

readLoginMessageFromFile

private void readLoginMessageFromFile(java.lang.String filename)

logout

public void logout()
Specified by:
logout in interface IWebServer

registerUser

public java.lang.String registerUser(java.lang.String username,
                                     java.lang.String password,
                                     java.lang.String email)

confirmRegistration

public java.lang.String confirmRegistration(java.lang.String username,
                                            java.lang.String confirmationCode)

changeProperties

public java.lang.String changeProperties(java.lang.String username,
                                         java.lang.String oldPW,
                                         java.lang.String newPW,
                                         java.lang.String email,
                                         java.lang.Boolean isAdminObj)
Specified by:
changeProperties in interface IWebServer

countProposedGames

private int countProposedGames(boolean shallBeScheduled)

findByGameId

private GameInfo findByGameId(java.lang.String gameId)

findFromRunningGames

private GameInfo findFromRunningGames(java.lang.String gameId)

getGameOnServer

private IGameRunner getGameOnServer(GameInfo gi)

startOneGame

private java.lang.String startOneGame(GameInfo gi)

unregisterGame

public void unregisterGame(GameInfo gi,
                           int port)
Specified by:
unregisterGame in interface IRunWebServer

unregisterGamePlayerPC

public void unregisterGamePlayerPC(GameInfo gi)

readGamesFromFile

private void readGamesFromFile(java.lang.String filename,
                               java.util.HashMap<java.lang.String,GameInfo> proposedGames)

saveGamesIfNeeded

public void saveGamesIfNeeded()

storeGamesToFile

private void storeGamesToFile(java.lang.String filename)

getStringOption

public java.lang.String getStringOption(java.lang.String key)

getMaximumGameIdFromFiles

private int getMaximumGameIdFromFiles()