package net.sf.colossus.server;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* For communication between Game/Server and WebServer.
*
* Perhaps later replaced with a two-way socket connection?
* Class is always created, no matter whether we have a web
* server ( => active == true) or not ( => active == false);
* but this way, we can have all the
* "if (we have a web server) { } "
* checking done inside this class and do not clutter the
* main server code.
*/
public class NotifyWebServerViaFile implements INotifyWebServer
{
private static final Logger LOGGER = Logger
.getLogger(NotifyWebServerViaFile.class.getName());
private final String flagFilename;
private PrintWriter out;
private File flagFile = null;
// Do we even have a web server to notify at all?
private final boolean active;
private boolean suspended = false;
public NotifyWebServerViaFile(String name)
{
if (name != null && !name.equals(""))
{
flagFilename = name;
active = true;
}
else
{
flagFilename = null;
active = false;
}
}
public boolean isActive()
{
return active;
}
public void readyToAcceptClients()
{
if (active)
{
createFlagfile();
}
}
public void gotClient(String playerName, boolean remote)
{
if (active)
{
out.println((remote ? "Remote" : "Local") + " client connected: "
+ playerName);
}
}
public void allClientsConnected()
{
if (active)
{
out.println(ALL_CLIENTS_CONNECTED);
}
}
public void gameStartupCompleted()
{
if (active)
{
out.println(GAME_STARTUP_COMPLETED);
}
}
public void gameStartupFailed(String reason)
{
if (active)
{
out.println(GAME_STARTUP_FAILED + reason);
gameIsSuspended();
}
}
public void serverStoppedRunning()
{
if (active)
{
if (suspended)
{
LOGGER.finest("Server stopped running and suspended "
+ "set; no need to remove a file.");
}
else
{
removeFlagfile();
}
}
}
private void createFlagfile()
{
if (active)
{
flagFile = new File(flagFilename);
try
{
out = new PrintWriter(new FileWriter(flagFile), true);
}
catch (IOException e)
{
LOGGER.log(Level.SEVERE,
"Could not create web server flag file " + flagFilename
+ "!!", (Throwable)null);
}
}
}
private void removeFlagfile()
{
LOGGER.info("removeFlagFile called??");
if (active)
{
try
{
out.close();
flagFile.delete();
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE,
"Could not delete web server flag file " + flagFilename
+ "!!" + e.toString(), (Throwable)null);
}
}
}
public void gameIsSuspended()
{
suspended = true;
if (active)
{
renameFlagfile(flagFilename + ".suspended");
}
}
private void renameFlagfile(String suspendedFilename)
{
try
{
out.close();
flagFile.renameTo(new File(suspendedFilename));
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "Could not rename web server flag file "
+ flagFilename + " to new name " + suspendedFilename + "!!"
+ e.toString(), (Throwable)null);
}
}
} // END Class NotifyWebServerViaFile