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  IColossusMail mailObject
           
private  int maxClients
           
private  WebServerOptions options
           
private  int port
           
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  java.net.ServerSocket serverSocket
           
private  boolean shutdownRequested
           
 
Fields inherited from interface net.sf.colossus.webcommon.IWebServer
Cancel, ChangePassword, ChatSubmit, ConfirmRegistration, Echo, Enroll, generalChatName, LocallyGameOver, Login, Logout, Propose, RegisterUser, ShutdownServer, Start, StartAtPlayer, StartedByPlayer, Unenroll, WebProtocolSeparator
 
Constructor Summary
WebServer(java.lang.String optionsFile)
           
 
Method Summary
 void allTellGameInfo(GameInfo gi)
           
 void allTellUserCounts()
           
 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)
           
private  IGameRunner getGameOnServer(GameInfo gi)
           
(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)
           
 void informLocallyGameOver(java.lang.String gameId)
           
 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)
           
 void reEnrollIfNecessary(WebServerClientSocketThread newCst)
           
 java.lang.String registerUser(java.lang.String username, java.lang.String password, java.lang.String email)
           
(package private)  void runSocketServer()
           
 void saveGamesIfNeeded()
           
 void shutdownServer()
           
 void startGame(java.lang.String gameId)
           
 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  boolean 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 tellEnrolledGameStarted(GameInfo gi)
           
 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 st, 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

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

port

private final int port

serverSocket

private java.net.ServerSocket serverSocket

generalChat

private final ChatChannel generalChat
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

tellEnrolledGameStarted

public void tellEnrolledGameStarted(GameInfo gi)
Specified by:
tellEnrolledGameStarted 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)
Specified by:
startGame in interface IWebServer

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

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

tellLastChatMessagesToOne

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

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 boolean startOneGame(GameInfo gi)

unregisterGame

public void unregisterGame(GameInfo st,
                           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)