From b8821b9208cc831dbc84fd3e6d79887d3871bfd7 Mon Sep 17 00:00:00 2001 From: Pascal Koenig Date: Mon, 29 Aug 2011 01:31:48 +0200 Subject: [PATCH] Added a possibility to reload the webserver (not accessible for the user though) and fixed a bug that prevented the userstats.xml from delivering up-to-date data. --- .../XmlStats/Datasource/Datasource.java | 2 +- .../XmlStats/Datasource/UserstatsDS.java | 45 +++----------- src/de/sockenklaus/XmlStats/Settings.java | 3 +- src/de/sockenklaus/XmlStats/Webserver.java | 62 +++++++++++++------ src/de/sockenklaus/XmlStats/XmlStats.java | 17 +++-- .../XmlStats/XmlStatsServerListener.java | 1 - .../XmlStats/XmlWorkers/XmlWorker.java | 5 +- .../XmlWorkers/XmlWorkerUserstats.java | 10 ++- 8 files changed, 69 insertions(+), 76 deletions(-) diff --git a/src/de/sockenklaus/XmlStats/Datasource/Datasource.java b/src/de/sockenklaus/XmlStats/Datasource/Datasource.java index 1d648cc..7323e20 100644 --- a/src/de/sockenklaus/XmlStats/Datasource/Datasource.java +++ b/src/de/sockenklaus/XmlStats/Datasource/Datasource.java @@ -28,7 +28,7 @@ public abstract class Datasource { * * @return the array list */ - protected ArrayList fetchAllPlayers(){ + public ArrayList fetchAllPlayers(){ File[] files = new File("world/players").listFiles(); ArrayList result = new ArrayList(); diff --git a/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java b/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java index 032a660..0da6ba6 100644 --- a/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java +++ b/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java @@ -15,7 +15,6 @@ package de.sockenklaus.XmlStats.Datasource; import java.io.File; -import java.util.ArrayList; import java.util.HashMap; import com.nidefawl.Stats.Stats; @@ -32,16 +31,12 @@ import de.sockenklaus.XmlStats.XmlStatsRegistry; public class UserstatsDS extends Datasource { private Stats statsPlugin; - private ArrayList allPlayerNames; - private HashMap stats = new HashMap(); /** * Instantiates a new stats ds. */ public UserstatsDS() { this.statsPlugin = (Stats)XmlStatsRegistry.get("stats"); - this.allPlayerNames = fetchAllPlayers(); - this.stats = fetchPlayerStats(allPlayerNames); } /** @@ -62,39 +57,11 @@ public class UserstatsDS extends Datasource { return this.statsPlugin.getDataFolder(); } - /** - * Fetch all player stats. - * - * @param pPlayerNames the player names - * @return the hash map - */ - private HashMap fetchPlayerStats(ArrayList pPlayerNames){ - HashMap result = new HashMap(); - - for (String playerName : pPlayerNames){ - - PlayerStat ps = new PlayerStatSQL(playerName, statsPlugin); - ps.load(); - result.put(playerName, ps); - } - - return result; - } - - /** - * Gets the stats. - * - * @return the stats - */ - public HashMap getStats(){ - return this.stats; - } - public HashMap> getAddedStats(){ HashMap > result = new HashMap>(); - for(String playerName : this.stats.keySet()){ - PlayerStat player = this.stats.get(playerName); + for(String playerName : this.fetchAllPlayers()){ + PlayerStat player = this.getPlayerStat(playerName); for(String catName : player.getCats()){ Category cat = player.get(catName); @@ -129,8 +96,12 @@ public class UserstatsDS extends Datasource { return result; } - - public void sortStats(){ + + public PlayerStat getPlayerStat(String playerName){ + PlayerStat result = new PlayerStatSQL(playerName, this.statsPlugin); + result.load(); + + return result; } } diff --git a/src/de/sockenklaus/XmlStats/Settings.java b/src/de/sockenklaus/XmlStats/Settings.java index 74e5702..bb14dd5 100644 --- a/src/de/sockenklaus/XmlStats/Settings.java +++ b/src/de/sockenklaus/XmlStats/Settings.java @@ -42,7 +42,6 @@ public class Settings { else { conf.setProperty("options.webserver-enabled", false); conf.setProperty("options.webserver-port", 9123); - conf.setProperty("options.gzip-enabled", false); conf.setProperty("options.verbose-enabled", false); conf.save(); } @@ -93,7 +92,7 @@ public class Settings { * * @return the settings filename */ - public String getSettingsFilename(){ + protected String getSettingsFilename(){ return configFilename; } diff --git a/src/de/sockenklaus/XmlStats/Webserver.java b/src/de/sockenklaus/XmlStats/Webserver.java index f043346..285cd32 100644 --- a/src/de/sockenklaus/XmlStats/Webserver.java +++ b/src/de/sockenklaus/XmlStats/Webserver.java @@ -37,13 +37,51 @@ public class Webserver { * @param port the port * @throws IOException Signals that an I/O exception has occurred. */ - public Webserver(int port) throws IOException { + public Webserver() throws IOException { + Settings settingsTemp = (Settings)XmlStatsRegistry.get("settings"); + + this.start(settingsTemp.getInt("options.webserver-port")); + } + + /** + * Stop server. + */ + public void stop() { + server.stop(0); + this.server = null; + } + + /** + * Server running. + * + * @return true, if successful + */ + public boolean isRunning(){ + return (this.server == null) ? false : true; + } + + public void reload() throws IOException { + this.stop(); + + Settings settingsTemp = (Settings)XmlStatsRegistry.get("settings"); + + this.start(settingsTemp.getInt("options.webserver-port")); + } + + private void start(int port) throws IOException { + this.address = null; + this.server = null; + this.address = new InetSocketAddress(port); - server = HttpServer.create(address, 0); + this.server = HttpServer.create(this.address, 0); - server.createContext("/users.xml", new XmlWorkerUsers()); - server.createContext("/userstats.xml", new XmlWorkerUserstats()); + this.server.createContext("/users.xml", new XmlWorkerUsers()); + + if(XmlStats.isStatsHooked()){ + server.createContext("/userstats.xml", new XmlWorkerUserstats()); + XmlStats.LogInfo("Stats seems to be loaded correctly. Enabling /userstats.xml"); + } if (XmlStats.isiConomyHooked()){ server.createContext("/money.xml", new XmlWorkerMoney()); @@ -55,20 +93,4 @@ public class Webserver { this.server.start(); } - - /** - * Stop server. - */ - public void stopServer() { - server.stop(0); - } - - /** - * Server running. - * - * @return true, if successful - */ - public boolean isRunning(){ - return (this.server == null) ? false : true; - } } diff --git a/src/de/sockenklaus/XmlStats/XmlStats.java b/src/de/sockenklaus/XmlStats/XmlStats.java index 98458d0..01d7eb7 100644 --- a/src/de/sockenklaus/XmlStats/XmlStats.java +++ b/src/de/sockenklaus/XmlStats/XmlStats.java @@ -17,11 +17,8 @@ package de.sockenklaus.XmlStats; import java.util.logging.Level; import java.util.logging.Logger; -import org.bukkit.Server; import org.bukkit.event.Event.Priority; import org.bukkit.event.Event.Type; -import org.bukkit.event.server.PluginDisableEvent; -import org.bukkit.event.server.PluginEnableEvent; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; @@ -49,7 +46,7 @@ public class XmlStats extends JavaPlugin { if(this.enabled && webserverTemp.isRunning()){ this.enabled = false; - webserverTemp.stopServer(); + webserverTemp.stop(); getServer().getScheduler().cancelTasks(this); @@ -77,10 +74,13 @@ public class XmlStats extends JavaPlugin { LogDebug("options.verbose-enabled: "+settingsTemp.getBoolean("options.verbose-enabled")); this.hookPlugins(); + + this.registerEvents(); + if (settingsTemp.getBoolean("options.webserver-enabled")){ try { - XmlStatsRegistry.put("webserver", new Webserver(settingsTemp.getInt("options.webserver-port"))); + XmlStatsRegistry.put("webserver", new Webserver()); this.enabled = true; LogInfo("Plugin Enabled"); @@ -172,4 +172,11 @@ public class XmlStats extends JavaPlugin { } return false; } + + private void registerEvents(){ + XmlStatsServerListener listener = new XmlStatsServerListener(this); + + getServer().getPluginManager().registerEvent(Type.PLUGIN_ENABLE, listener, Priority.Monitor, this); + getServer().getPluginManager().registerEvent(Type.PLUGIN_DISABLE, listener, Priority.Monitor, this); + } } diff --git a/src/de/sockenklaus/XmlStats/XmlStatsServerListener.java b/src/de/sockenklaus/XmlStats/XmlStatsServerListener.java index 2dee615..2082407 100644 --- a/src/de/sockenklaus/XmlStats/XmlStatsServerListener.java +++ b/src/de/sockenklaus/XmlStats/XmlStatsServerListener.java @@ -6,7 +6,6 @@ package de.sockenklaus.XmlStats; import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.event.server.PluginEnableEvent; import org.bukkit.event.server.ServerListener; -import org.bukkit.plugin.Plugin; import com.iConomy.iConomy; import com.nidefawl.Stats.Stats; diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorker.java b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorker.java index c90f6ba..7c99dec 100644 --- a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorker.java +++ b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorker.java @@ -30,9 +30,7 @@ import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpExchange; -import de.sockenklaus.XmlStats.Settings; import de.sockenklaus.XmlStats.XmlStats; -import de.sockenklaus.XmlStats.XmlStatsRegistry; // TODO: Auto-generated Javadoc /** @@ -48,7 +46,6 @@ public abstract class XmlWorker implements HttpHandler { Map> parameters = new HashMap>(); Headers headers = exchange.getRequestHeaders(); - Settings settingsTemp = (Settings)XmlStatsRegistry.get("settings"); if("get".equalsIgnoreCase(exchange.getRequestMethod())){ String queryString = exchange.getRequestURI().getRawQuery(); @@ -109,7 +106,7 @@ public abstract class XmlWorker implements HttpHandler { * @return the map * @throws UnsupportedEncodingException the unsupported encoding exception */ - public Map> parseParameters(String queryString) throws UnsupportedEncodingException { + private Map> parseParameters(String queryString) throws UnsupportedEncodingException { Map> result = new HashMap>(); if (queryString != null){ diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUserstats.java b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUserstats.java index c03b391..02deecc 100644 --- a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUserstats.java +++ b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUserstats.java @@ -59,8 +59,6 @@ public class XmlWorkerUserstats extends XmlWorker { resolveCats = new String[]{"blockdestroy", "blockcreate", "itemdrop", "itempickup"}; } - - /* (non-Javadoc) * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map) */ @@ -84,12 +82,12 @@ public class XmlWorkerUserstats extends XmlWorker { if (!parameters.containsKey("player")){ // Generate a summarized XML - root.appendChild(getAddedUpStats(doc)); + root.appendChild(getAddedUpStatsElement(doc)); } else { // Generate the XML for the given user(s) - for(String playerName : statsDS.getStats().keySet()){ + for(String playerName : statsDS.fetchAllPlayers()){ if (parameters.containsKey("player") && parameters.get("player").contains(playerName)){ root.appendChild(getPlayerElement(playerName, doc)); } @@ -120,7 +118,7 @@ public class XmlWorkerUserstats extends XmlWorker { * @return Returns a XML subtree for the given playerName. */ private Element getPlayerElement(String playerName, Document doc){ - PlayerStat player_stats = statsDS.getStats().get(playerName); + PlayerStat player_stats = statsDS.getPlayerStat(playerName); Element elem_player = doc.createElement("player"); elem_player.setAttribute("name", playerName); @@ -150,7 +148,7 @@ public class XmlWorkerUserstats extends XmlWorker { return elem_player; } - private Element getAddedUpStats(Document doc){ + private Element getAddedUpStatsElement(Document doc){ HashMap> addedStats = statsDS.getAddedStats(); Element elem_player = doc.createElement("player");