From 538dd696ad7f4dfbe07c212454d191150da1608a Mon Sep 17 00:00:00 2001 From: magenoxx Date: Thu, 13 Oct 2011 17:50:29 +0400 Subject: [PATCH] Server statistics - server uptime in hours, games played count. --- .../src/main/java/mage/server/Main.java | 6 + .../java/mage/server/TableController.java | 2 + .../mage/server/util/ServerMessagesUtil.java | 206 ++++++++++-------- 3 files changed, 124 insertions(+), 90 deletions(-) diff --git a/Mage.Server/src/main/java/mage/server/Main.java b/Mage.Server/src/main/java/mage/server/Main.java index ba658a0ff39..695c4180bfd 100644 --- a/Mage.Server/src/main/java/mage/server/Main.java +++ b/Mage.Server/src/main/java/mage/server/Main.java @@ -45,6 +45,7 @@ import mage.server.game.PlayerFactory; import mage.server.tournament.TournamentFactory; import mage.server.util.PluginClassLoader; import mage.server.util.ConfigSettings; +import mage.server.util.ServerMessagesUtil; import mage.server.util.config.Plugin; import mage.server.util.config.GamePlugin; import mage.utils.MageVersion; @@ -122,6 +123,7 @@ public class Main { logger.info("Started MAGE server - listening on " + connection.toString()); if (testMode) logger.info("MAGE server running in test mode"); + initStatistics(); } else { logger.fatal("Unable to start MAGE server - another server is already started"); @@ -134,6 +136,10 @@ public class Main { } + static void initStatistics() { + ServerMessagesUtil.getInstance().setStartDate(System.currentTimeMillis()); + } + static boolean isAlreadyRunning(InvokerLocator serverLocator) { Map metadata = new HashMap(); metadata.put(SocketWrapper.WRITE_TIMEOUT, "2000"); diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index e5505be2813..3731a868e96 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -51,6 +51,7 @@ import mage.server.draft.DraftManager; import mage.server.game.*; import mage.server.tournament.TournamentFactory; import mage.server.tournament.TournamentManager; +import mage.server.util.ServerMessagesUtil; import org.apache.log4j.Logger; import java.util.Map.Entry; @@ -342,6 +343,7 @@ public class TableController { break; } } + ServerMessagesUtil.getInstance().incGamesStarted(); } catch (Exception ex) { logger.fatal("Error starting game", ex); diff --git a/Mage.Server/src/main/java/mage/server/util/ServerMessagesUtil.java b/Mage.Server/src/main/java/mage/server/util/ServerMessagesUtil.java index 68534d5c202..3ab4a80084c 100644 --- a/Mage.Server/src/main/java/mage/server/util/ServerMessagesUtil.java +++ b/Mage.Server/src/main/java/mage/server/util/ServerMessagesUtil.java @@ -34,11 +34,11 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Scanner; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -50,107 +50,133 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; */ public class ServerMessagesUtil { - private static final ServerMessagesUtil instance = new ServerMessagesUtil(); + private static final ServerMessagesUtil instance = new ServerMessagesUtil(); - private static final Logger log = Logger.getLogger(ServerMessagesUtil.class); - private static final String SERVER_MSG_TXT_FILE = "server.msg.txt"; + private static final Logger log = Logger.getLogger(ServerMessagesUtil.class); + private static final String SERVER_MSG_TXT_FILE = "server.msg.txt"; - private List messages = new ArrayList(); - private ReadWriteLock lock = new ReentrantReadWriteLock(); + private List messages = new ArrayList(); + private ReadWriteLock lock = new ReentrantReadWriteLock(); - private static String pathToExternalMessages = null; + private static String pathToExternalMessages = null; - private static boolean ignore = false; + private static boolean ignore = false; - static { - pathToExternalMessages = System.getProperty("messagesPath"); - } + private static long startDate; + private static AtomicInteger gamesStarted = new AtomicInteger(0); - public ServerMessagesUtil() { - timer.setInitialDelay(5000); - timer.start(); - } + static { + pathToExternalMessages = System.getProperty("messagesPath"); + } - public static ServerMessagesUtil getInstance() { - return instance; - } + public ServerMessagesUtil() { + timer.setInitialDelay(5000); + timer.start(); + } - public List getMessages() { - lock.readLock().lock(); - try { - return messages; - } finally { - lock.readLock().unlock(); - } - } + public static ServerMessagesUtil getInstance() { + return instance; + } - private void reloadMessages() { - log.debug("Reading server messages..."); - List newMessages = readFromFile(); - if (newMessages != null && !newMessages.isEmpty()) { - lock.writeLock().lock(); - try { - messages.clear(); - messages.addAll(newMessages); - } finally { - lock.writeLock().unlock(); - } - } - } + public List getMessages() { + lock.readLock().lock(); + try { + return messages; + } finally { + lock.readLock().unlock(); + } + } - private List readFromFile() { - if (ignore) { - return null; - } - File externalFile = null; - if (pathToExternalMessages != null) { - externalFile = new File(pathToExternalMessages); - if (!externalFile.exists()) { - log.warn("Couldn't find server.msg.txt using external path: " + pathToExternalMessages); - pathToExternalMessages = null; // not to repeat error action again - } else if (!externalFile.canRead()) { - log.warn("Couldn't read (no access) server.msg.txt using external path: " + pathToExternalMessages); - pathToExternalMessages = null; // not to repeat error action again - } - } - InputStream is = null; - if (externalFile != null) { - try { - is = new FileInputStream(externalFile); - } catch (Exception f) { - log.error(f, f); - pathToExternalMessages = null; // not to repeat error action again - } - } else { - File file = new File(SERVER_MSG_TXT_FILE); - if (!file.exists() || !file.canRead()) { - log.warn("Couldn't find server.msg.txt using path: " + SERVER_MSG_TXT_FILE); - } - try { - is = new FileInputStream(file); - } catch (Exception f) { - log.error(f, f); - ignore = true; - } - } - if (is == null) { - log.warn("Couldn't find server.msg"); - return null; - } - Scanner scanner = new Scanner(is); - List messages = new ArrayList(); - while (scanner.hasNextLine()) { - String message = scanner.nextLine(); - if (!message.trim().isEmpty()) { - messages.add(message.trim()); - } - } - return messages; - } + private void reloadMessages() { + log.debug("Reading server messages..."); + List motdMessages = readFromFile(); + List newMessages = new ArrayList(); + newMessages.add(getServerStatistics()); + newMessages.addAll(motdMessages); - private Timer timer = new Timer(1000 * 60, new ActionListener() { + lock.writeLock().lock(); + try { + messages.clear(); + messages.addAll(newMessages); + } finally { + lock.writeLock().unlock(); + } + } + + private List readFromFile() { + if (ignore) { + return null; + } + File externalFile = null; + if (pathToExternalMessages != null) { + externalFile = new File(pathToExternalMessages); + if (!externalFile.exists()) { + log.warn("Couldn't find server.msg.txt using external path: " + pathToExternalMessages); + pathToExternalMessages = null; // not to repeat error action again + } else if (!externalFile.canRead()) { + log.warn("Couldn't read (no access) server.msg.txt using external path: " + pathToExternalMessages); + pathToExternalMessages = null; // not to repeat error action again + } + } + InputStream is = null; + if (externalFile != null) { + try { + is = new FileInputStream(externalFile); + } catch (Exception f) { + log.error(f, f); + pathToExternalMessages = null; // not to repeat error action again + } + } else { + File file = new File(SERVER_MSG_TXT_FILE); + if (!file.exists() || !file.canRead()) { + log.warn("Couldn't find server.msg.txt using path: " + SERVER_MSG_TXT_FILE); + } + try { + is = new FileInputStream(file); + } catch (Exception f) { + log.error(f, f); + ignore = true; + } + } + if (is == null) { + log.warn("Couldn't find server.msg"); + return null; + } + Scanner scanner = new Scanner(is); + List messages = new ArrayList(); + while (scanner.hasNextLine()) { + String message = scanner.nextLine(); + if (!message.trim().isEmpty()) { + messages.add(message.trim()); + } + } + return messages; + } + + private String getServerStatistics() { + long current = System.currentTimeMillis(); + long hours = ((current - startDate)/(1000*60*60)); + StringBuilder statistics = new StringBuilder("Server uptime: "); + statistics.append(hours); + statistics.append(" hour(s), games played: "); + statistics.append(gamesStarted.get()); + return statistics.toString(); + } + + private Timer timer = new Timer(1000 * 60, new ActionListener() { public void actionPerformed(ActionEvent e) { - reloadMessages(); + reloadMessages(); } }); + + public void setStartDate(long milliseconds) { + this.startDate = milliseconds; + } + + public void incGamesStarted() { + int value; + do { + value = gamesStarted.get(); + } while (!gamesStarted.compareAndSet(value, value + 1)); + } }