Package net.sf.colossus.webserver
Class WebServer
- java.lang.Object
-
- 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
Nested Classes Modifier and Type Class Description (package private) classWebServer.GameThreadReaperCheck whether any game executed in an own process has been finished.private static classWebServer.NullWebServerGUIA Null Object for the web server GUI interface.
-
Field Summary
Fields Modifier and Type Field Description private java.io.PrintWriterdumpInfoFileprivate java.util.ArrayList<GameInfo>endingGamesprivate ChatChannelgeneralChatprivate IWebServerGUIguiprivate static java.util.logging.LoggerLOGGERprivate static java.util.ArrayList<java.lang.String>loginMessageprivate IColossusMailmailObjectprivate intmaxClientsprivate static intMIN_FREE_GAME_PORTSprivate WebServerOptionsoptionsprivate PortBookKeeperportBookKeeperprivate java.util.HashMap<java.lang.String,GameInfo>proposedGamesprivate java.lang.StringproposedGamesFilenameprivate booleanproposedGamesListModifiedprivate booleanrunGUIControls whether the GUI is shown or not.private java.util.ArrayList<GameInfo>runningGamesprivate static java.lang.Stringsepprivate intserverPortServer port where we listen for WebClient connectionsprivate java.net.ServerSocketserverSocketServer actual socket where we listen for WebClient connectionsprivate booleanshutdownRequestedprivate UserDBuserDBprivate ClientWatchDogwatchDogprivate FormatWhenwhenFormatter-
Fields inherited from interface net.sf.colossus.webcommon.IWebServer
Cancel, ChangePassword, ChatSubmit, ConfirmCommand, ConfirmRegistration, DumpInfo, Echo, Enroll, generalChatName, LocallyGameOver, Login, Logout, PingResponse, Propose, RegisterUser, RequestUserAttention, RereadLoginMessage, ShutdownServer, Start, StartAtPlayer, StartedByPlayer, Unenroll, WatchGame, WebProtocolSeparator
-
-
Constructor Summary
Constructors Constructor Description WebServer(java.lang.String optionsFile)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidallTellGameInfo(GameInfo gi)voidallTellUserCounts()private voidattemptStartOnServer(GameInfo gi, User byUser)voidcancelGame(java.lang.String gameId, java.lang.String byUser)voidcancelIfNecessary(User user)java.lang.StringchangeProperties(java.lang.String username, java.lang.String oldPW, java.lang.String newPW, java.lang.String email, java.lang.Boolean isAdminObj)voidchatSubmit(java.lang.String chatId, java.lang.String sender, java.lang.String message)private voidcloseAllWebServerClientSocketThreads()java.lang.StringconfirmRegistration(java.lang.String username, java.lang.String confirmationCode)private intcountProposedGames(boolean shallBeScheduled)private voiddoReadGamesFromFile()private voiddoReadLoginMessage()private voiddoReadUsersFromFile()voiddumpInfo()Dump server state info into a static file, at the moment dump-info.txtvoiddumpInfo(java.io.PrintWriter pw)Dump info into given PrintWritervoidenrollUserToGame(java.lang.String gameId, java.lang.String username)private GameInfofindByGameId(java.lang.String gameId)private GameInfofindFromRunningGames(java.lang.String gameId)UserfindUserByName(java.lang.String name)voidgameFailed(GameInfo gi, java.lang.String reason)voidgameStarted(GameInfo gi)private IGameRunnergetGameOnServer(GameInfo gi)ChatChannelgetGeneralChat()private intgetMaximumGameIdFromFiles()Searches the game directory tree for highest game number for which a game directory had been earlier created.(package private) java.lang.StringgetPlayerName()Each user server thread's name is set to it user's name.PortBookKeepergetPortBookKeeper()IPortProvidergetPortProvider()java.lang.StringgetStringOption(java.lang.String key)UserDBgetUserDB()voidhandlePing(java.lang.String sender, java.lang.String pingCommand)voidhandlePingQuotedName(java.lang.String sender, java.lang.String pingCommand)voidinformAllEnrolledAbout(GameInfo gi, java.lang.String message)voidinformAllEnrolledThatStartFailed(GameInfo gi, java.lang.String reason, User byUser)voidinformLocallyGameOver(java.lang.String gameId)private voidinformPingFailed(java.lang.String sender, java.lang.String failMessage)voidinformStartedByPlayer(java.lang.String gameId)voidinitiateShutdown(java.lang.String byUserName)private GameInfoisInvolvedInInstantGame(java.lang.String initiatorName)voidlogout()static voidmain(java.lang.String[] args)voidmakeDummyConnection()GameInfoproposeGame(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 voidreadGamesFromFile(java.lang.String filename, java.util.HashMap<java.lang.String,GameInfo> proposedGames)private voidreadLoginMessageFromFile(java.lang.String filename)voidreEnrollIfNecessary(WebServerClient newclient)java.lang.StringregisterUser(java.lang.String username, java.lang.String password, java.lang.String email)private voidreject(java.net.Socket socket)voidrequestUserAttention(long when, java.lang.String sender, boolean isAdmin, java.lang.String recipient, java.lang.String message, int beepCount, long beepInterval, boolean windows)voidrereadLoginMessage()Triggered by remode admin connection(package private) voidrunSocketServer()voidsaveGamesIfNeeded()voidsendMessageOfTheDayToOne(WebServerClient client, java.lang.String chatId)voidsendOldVersionWarningToOne(WebServerClient client, java.lang.String userName, java.lang.String chatId)voidsendWatchGameInfo(java.lang.String userName, java.lang.String gameId, java.lang.String host, int port)voidshutdownServer()voidstartGame(java.lang.String gameId, User byUser)voidstartGameOnPlayerHost(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.StringstartOneGame(GameInfo gi)private voidstoreGamesToFile(java.lang.String filename)voidsystemMessageToAll(java.lang.String message)voidtellAllGamesFromListToOne(WebServerClient client, java.util.ArrayList<GameInfo> games)voidtellAllProposedGamesToOne(WebServerClient client)voidtellAllRunningGamesToOne(WebServerClient client)voidtellEnrolledGameStartsNow(GameInfo gi, java.lang.String host, int port)voidtellEnrolledGameStartsSoon(GameInfo gi)voidtellLastChatMessagesToOne(WebServerClient client, java.lang.String chatId)voidunenrollUserFromGame(java.lang.String gameId, java.lang.String username)voidunregisterGame(GameInfo gi, int port)unregister a game from runningGames (or proposedGames), and keep in endingGames until it's reapedvoidunregisterGamePlayerPC(GameInfo gi)unregister a game (run on player's PC) from runningGames, keep in endingGames until it's reapedvoidupdateGUI()voidupdateLoggedinStatus(User u, WebServerClient wsc)(package private) booleanupdateOnline(GameInfo gi)When a user logged in or out, this is called for every GameInfo to update how many of the enrolled players are currently online.voidupdateUserCounts()java.lang.StringverifyLogin(java.lang.String username, java.lang.String password)private booleanwaitForUser()voidwatchGame(java.lang.String gameId, java.lang.String userName)voidwriteBackUsers()
-
-
-
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
-
userDB
private UserDB userDB
-
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
-
whenFormatter
private final FormatWhen whenFormatter
-
dumpInfoFile
private java.io.PrintWriter dumpInfoFile
-
-
Method Detail
-
main
public static void main(java.lang.String[] args)
-
doReadGamesFromFile
private void doReadGamesFromFile()
-
doReadUsersFromFile
private void doReadUsersFromFile()
-
doReadLoginMessage
private void doReadLoginMessage()
-
rereadLoginMessage
public void rereadLoginMessage()
Triggered by remode admin connection- Specified by:
rereadLoginMessagein interfaceIWebServer
-
runSocketServer
void runSocketServer()
-
getGeneralChat
public ChatChannel getGeneralChat()
-
writeBackUsers
public void writeBackUsers()
-
updateLoggedinStatus
public void updateLoggedinStatus(User u, WebServerClient wsc)
-
initiateShutdown
public void initiateShutdown(java.lang.String byUserName)
-
shutdownServer
public void shutdownServer()
- Specified by:
shutdownServerin interfaceIWebServer
-
makeDummyConnection
public void makeDummyConnection()
-
waitForUser
private boolean waitForUser()
-
reject
private void reject(java.net.Socket socket)
-
closeAllWebServerClientSocketThreads
private void closeAllWebServerClientSocketThreads()
-
getPlayerName
java.lang.String getPlayerName()
Each user server thread's name is set to it user's name.
-
getUserDB
public UserDB getUserDB()
-
findUserByName
public User findUserByName(java.lang.String name)
-
verifyLogin
public java.lang.String verifyLogin(java.lang.String username, java.lang.String password)
-
getPortBookKeeper
public PortBookKeeper getPortBookKeeper()
-
getPortProvider
public IPortProvider getPortProvider()
- Specified by:
getPortProviderin interfaceIRunWebServer
-
updateGUI
public void updateGUI()
-
watchGame
public void watchGame(java.lang.String gameId, java.lang.String userName)- Specified by:
watchGamein interfaceIWebServer
-
sendWatchGameInfo
public void sendWatchGameInfo(java.lang.String userName, java.lang.String gameId, java.lang.String host, int port)
-
dumpInfo
public void dumpInfo()
Dump server state info into a static file, at the moment dump-info.txt- Specified by:
dumpInfoin interfaceIWebServer
-
dumpInfo
public void dumpInfo(java.io.PrintWriter pw)
Dump info into given PrintWriter- Parameters:
pw- PrintWriter for the file to print dump to
-
isInvolvedInInstantGame
private GameInfo isInvolvedInInstantGame(java.lang.String initiatorName)
-
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:
proposeGamein interfaceIWebServer
-
cancelIfNecessary
public void cancelIfNecessary(User user)
-
reEnrollIfNecessary
public void reEnrollIfNecessary(WebServerClient newclient)
-
tellAllGamesFromListToOne
public void tellAllGamesFromListToOne(WebServerClient client, java.util.ArrayList<GameInfo> games)
-
tellAllProposedGamesToOne
public void tellAllProposedGamesToOne(WebServerClient client)
-
tellAllRunningGamesToOne
public void tellAllRunningGamesToOne(WebServerClient client)
-
allTellGameInfo
public void allTellGameInfo(GameInfo gi)
- Specified by:
allTellGameInfoin interfaceIRunWebServer
-
tellEnrolledGameStartsSoon
public void tellEnrolledGameStartsSoon(GameInfo gi)
- Specified by:
tellEnrolledGameStartsSoonin interfaceIRunWebServer
-
tellEnrolledGameStartsNow
public void tellEnrolledGameStartsNow(GameInfo gi, java.lang.String host, int port)
- Specified by:
tellEnrolledGameStartsNowin interfaceIRunWebServer
-
gameStarted
public void gameStarted(GameInfo gi)
- Specified by:
gameStartedin interfaceIRunWebServer
-
gameFailed
public void gameFailed(GameInfo gi, java.lang.String reason)
- Specified by:
gameFailedin interfaceIRunWebServer
-
enrollUserToGame
public void enrollUserToGame(java.lang.String gameId, java.lang.String username)- Specified by:
enrollUserToGamein interfaceIWebServer
-
unenrollUserFromGame
public void unenrollUserFromGame(java.lang.String gameId, java.lang.String username)- Specified by:
unenrollUserFromGamein interfaceIWebServer
-
cancelGame
public void cancelGame(java.lang.String gameId, java.lang.String byUser)- Specified by:
cancelGamein interfaceIWebServer
-
startGame
public void startGame(java.lang.String gameId, User byUser)- Specified by:
startGamein interfaceIWebServer
-
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:
startGameOnPlayerHostin interfaceIWebServer
-
informStartedByPlayer
public void informStartedByPlayer(java.lang.String gameId)
- Specified by:
informStartedByPlayerin interfaceIWebServer
-
informAllEnrolledAbout
public void informAllEnrolledAbout(GameInfo gi, java.lang.String message)
- Specified by:
informAllEnrolledAboutin interfaceIRunWebServer
-
systemMessageToAll
public void systemMessageToAll(java.lang.String message)
-
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:
requestUserAttentionin interfaceIWebServer
-
informPingFailed
private void informPingFailed(java.lang.String sender, java.lang.String failMessage)
-
informLocallyGameOver
public void informLocallyGameOver(java.lang.String gameId)
- Specified by:
informLocallyGameOverin interfaceIWebServer
-
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:
chatSubmitin interfaceIWebServer
-
handlePingQuotedName
public void handlePingQuotedName(java.lang.String sender, java.lang.String pingCommand)
-
handlePing
public void handlePing(java.lang.String sender, java.lang.String pingCommand)
-
tellLastChatMessagesToOne
public void tellLastChatMessagesToOne(WebServerClient client, java.lang.String chatId)
-
sendMessageOfTheDayToOne
public void sendMessageOfTheDayToOne(WebServerClient client, java.lang.String chatId)
-
sendOldVersionWarningToOne
public void sendOldVersionWarningToOne(WebServerClient client, java.lang.String userName, java.lang.String chatId)
-
readLoginMessageFromFile
private void readLoginMessageFromFile(java.lang.String filename)
-
logout
public void logout()
- Specified by:
logoutin interfaceIWebServer
-
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:
changePropertiesin interfaceIWebServer
-
updateOnline
boolean updateOnline(GameInfo gi)
When a user logged in or out, this is called for every GameInfo to update how many of the enrolled players are currently online.- Parameters:
userDB- TODO- Returns:
- true if the count of online users was changed i.e. GameInfo needs to be updated to all clients
-
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)
unregister a game from runningGames (or proposedGames), and keep in endingGames until it's reaped- Specified by:
unregisterGamein interfaceIRunWebServer
-
unregisterGamePlayerPC
public void unregisterGamePlayerPC(GameInfo gi)
unregister a game (run on player's PC) from runningGames, keep in endingGames until it's reaped
-
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()
Searches the game directory tree for highest game number for which a game directory had been earlier created. Tree is expected to have groups per each 100 games; example: base base/nn00-nn99 base/nn00-nn99/nn00 base/nn00-nn99/nn04 base/nn00-nn99/nn98 base/mm00-mm99/mm12 base/mm00-mm99/mm87 Eventually, when we reach gameId 10000+, groupdirs will have the form base/kkk00-kkk99 base/kkk00-kkk99/kkk02 base/kkk00-kkk99/kkk87 Example, if last created game dir was 6789 ( "base/6700-6799/6789" ), this returns 6789.- Returns:
- The highest game number for which a directory already exists, (otherwise 0 if therre is no dir at all)
-
-