diff --git a/README.md b/README.md index adf634f..65f5371 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # XmlStats -This plugin for the Bukkit Minecraft Server API ([Homepage](http://bukkig.org) | [Github](https://github.com/Bukkit/Bukkit )) offers the possibility to access some playerstats via xml files. The provided data is basically generated by [Stats](https://github.com/nidefawl/Stats). +This plugin for the Bukkit Minecraft Server API ([Homepage](http://bukkit.org) | [Github](https://github.com/Bukkit/Bukkit )) offers the possibility to access some playerstats via xml files. The provided data is basically generated by [Stats](https://github.com/nidefawl/Stats). ## Install diff --git a/src/de/sockenklaus/XmlStats/Datasource/Datasource.java b/src/de/sockenklaus/XmlStats/Datasource/Datasource.java index 3b4596d..1d648cc 100644 --- a/src/de/sockenklaus/XmlStats/Datasource/Datasource.java +++ b/src/de/sockenklaus/XmlStats/Datasource/Datasource.java @@ -23,8 +23,6 @@ import java.util.ArrayList; */ public abstract class Datasource { - - /** * Fetch all players. * diff --git a/src/de/sockenklaus/XmlStats/Datasource/MoneyDS.java b/src/de/sockenklaus/XmlStats/Datasource/MoneyDS.java index dd8653b..9cf0db3 100644 --- a/src/de/sockenklaus/XmlStats/Datasource/MoneyDS.java +++ b/src/de/sockenklaus/XmlStats/Datasource/MoneyDS.java @@ -22,6 +22,7 @@ import com.iConomy.system.Account; import com.iConomy.system.Holdings; import de.sockenklaus.XmlStats.XmlStats; +import de.sockenklaus.XmlStats.XmlStatsRegistry; /** * The Class MoneyDS. @@ -32,7 +33,7 @@ public class MoneyDS extends Datasource { private ArrayList allPlayers; public MoneyDS(){ - this.iConomy = XmlStats.getiConomyPlugin(); + this.iConomy = (iConomy)XmlStatsRegistry.get("iconomy"); this.allPlayers = fetchAllPlayers(); } diff --git a/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java b/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java index 1643ca5..032a660 100644 --- a/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java +++ b/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java @@ -23,7 +23,7 @@ import com.nidefawl.Stats.datasource.Category; import com.nidefawl.Stats.datasource.PlayerStat; import com.nidefawl.Stats.datasource.PlayerStatSQL; -import de.sockenklaus.XmlStats.XmlStats; +import de.sockenklaus.XmlStats.XmlStatsRegistry; // TODO: Auto-generated Javadoc /** @@ -39,7 +39,7 @@ public class UserstatsDS extends Datasource { * Instantiates a new stats ds. */ public UserstatsDS() { - this.statsPlugin = XmlStats.getStatsPlugin(); + this.statsPlugin = (Stats)XmlStatsRegistry.get("stats"); this.allPlayerNames = fetchAllPlayers(); this.stats = fetchPlayerStats(allPlayerNames); } diff --git a/src/de/sockenklaus/XmlStats/Settings.java b/src/de/sockenklaus/XmlStats/Settings.java index e0e0b29..74e5702 100644 --- a/src/de/sockenklaus/XmlStats/Settings.java +++ b/src/de/sockenklaus/XmlStats/Settings.java @@ -42,6 +42,8 @@ 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(); } } diff --git a/src/de/sockenklaus/XmlStats/WebServer.java b/src/de/sockenklaus/XmlStats/Webserver.java similarity index 92% rename from src/de/sockenklaus/XmlStats/WebServer.java rename to src/de/sockenklaus/XmlStats/Webserver.java index b390589..f043346 100644 --- a/src/de/sockenklaus/XmlStats/WebServer.java +++ b/src/de/sockenklaus/XmlStats/Webserver.java @@ -26,7 +26,7 @@ import de.sockenklaus.XmlStats.XmlWorkers.*; * The Class WebServer. */ @SuppressWarnings("restriction") -public class WebServer { +public class Webserver { private InetSocketAddress address; private HttpServer server = null; @@ -37,7 +37,7 @@ 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(int port) throws IOException { this.address = new InetSocketAddress(port); server = HttpServer.create(address, 0); diff --git a/src/de/sockenklaus/XmlStats/XmlStats.java b/src/de/sockenklaus/XmlStats/XmlStats.java index 9472ea0..98458d0 100644 --- a/src/de/sockenklaus/XmlStats/XmlStats.java +++ b/src/de/sockenklaus/XmlStats/XmlStats.java @@ -38,24 +38,18 @@ public class XmlStats extends JavaPlugin { private final static double version = 0.01; private final static String logprefix = "[XmlStats]"; private boolean enabled = false; - private static Stats Stats = null; - private static iConomy iConomy = null; - private static Server serverRef; - private WebServer webServer; - private Settings settings; /* (non-Javadoc) * @see org.bukkit.plugin.Plugin#onDisable() */ @Override public void onDisable() { - if(this.enabled && this.webServer.isRunning()){ + Webserver webserverTemp = (Webserver)XmlStatsRegistry.get("webserver"); + + if(this.enabled && webserverTemp.isRunning()){ this.enabled = false; - - iConomy = null; - Stats = null; - - this.webServer.stopServer(); + + webserverTemp.stopServer(); getServer().getScheduler().cancelTasks(this); @@ -70,15 +64,23 @@ public class XmlStats extends JavaPlugin { public void onEnable() { getDataFolder().mkdirs(); + + XmlStatsRegistry.put("settings", new Settings(this)); + XmlStatsRegistry.put("xmlstats", this); - serverRef = getServer(); - this.settings = new Settings(this); + Settings settingsTemp = (Settings)XmlStatsRegistry.get("settings"); + + LogDebug("Settings read:"); + LogDebug("options.webserver-enabled: "+settingsTemp.getBoolean("options.webserver-enabled")); + LogDebug("options.webserver-port: "+settingsTemp.getInt("options.webserver-port")); + LogDebug("options.gzip-enabled: "+settingsTemp.getBoolean("options.gzip-enabled")); + LogDebug("options.verbose-enabled: "+settingsTemp.getBoolean("options.verbose-enabled")); this.hookPlugins(); - if (this.settings.getBoolean("options.webserver-enabled")){ + if (settingsTemp.getBoolean("options.webserver-enabled")){ try { - this.webServer = new WebServer(settings.getInt("options.webserver-port")); + XmlStatsRegistry.put("webserver", new Webserver(settingsTemp.getInt("options.webserver-port"))); this.enabled = true; LogInfo("Plugin Enabled"); @@ -90,7 +92,7 @@ public class XmlStats extends JavaPlugin { } } else { - LogWarn("Webserver ist derzeit in der "+settings.getSettingsFilename()+" deaktiviert."); + LogWarn("Webserver ist derzeit in der "+settingsTemp.getSettingsFilename()+" deaktiviert."); } @@ -123,55 +125,20 @@ public class XmlStats extends JavaPlugin { log.log(Level.WARNING, logprefix + " "+ Message); } - /** - * Gets the stats plugin. - * - * @return the stats plugin - */ - public static Stats getStatsPlugin(){ - return Stats; - } - - /** - * Gets the server ref. - * - * @return the server ref - */ - public static Server getServerRef(){ - return serverRef; - } - - public static iConomy getiConomyPlugin(){ - return iConomy; - } - - public void onPluginDisable(PluginDisableEvent event){ - if(iConomy != null){ - if(event.getPlugin().getDescription().getName().equals("iConomy")){ - iConomy = null; - LogInfo("iConomy is disabled now. Unhooking."); - } + public static void LogDebug(String Message){ + Settings settingsTemp = (Settings)XmlStatsRegistry.get("settings"); + if(settingsTemp.getBoolean("options.verbose-enabled")){ + log.log(Level.INFO, logprefix+"[DEBUG] "+Message); } - if(Stats != null){ - if(event.getPlugin().getDescription().getName().equals("Stats")){ - Stats = null; - LogInfo("Stats is disabled now. Unhooking."); - } - } - } - public void onPluginEnable(PluginEnableEvent event){ - this.hookPlugins(); - } - - private void hookPlugins(){ + protected void hookPlugins(){ Plugin StatsTemp = getServer().getPluginManager().getPlugin("Stats"); Plugin iConomyTemp = getServer().getPluginManager().getPlugin("iConomy"); if(StatsTemp != null){ if(StatsTemp.isEnabled() && StatsTemp.getClass().getName().equals("com.nidefawl.Stats.Stats")){ - Stats = (Stats)StatsTemp; + XmlStatsRegistry.put("stats", (Stats)StatsTemp); LogInfo("Hooked into Stats!"); } } @@ -180,25 +147,28 @@ public class XmlStats extends JavaPlugin { } if (iConomyTemp != null) { if (iConomyTemp.isEnabled() && iConomyTemp.getClass().getName().equals("com.iConomy.iConomy")) { - iConomy = (iConomy)iConomyTemp; + XmlStatsRegistry.put("iconomy", (iConomy)iConomyTemp); LogInfo("Hooked into iConomy"); } } else { LogError("iConomy not found! Can't hook into it."); } - } - + } public static boolean isStatsHooked(){ - if (Stats != null){ - if(Stats.getClass().getName().equals("com.nidefawl.Stats.Stats") && Stats.isEnabled()) return true; + Stats StatsTemp = (Stats)XmlStatsRegistry.get("stats"); + + if (StatsTemp != null){ + if(StatsTemp.getClass().getName().equals("com.nidefawl.Stats.Stats") && StatsTemp.isEnabled()) return true; } return false; } public static boolean isiConomyHooked(){ - if (iConomy != null){ - if (iConomy.getClass().getName().equals("com.iConomy.iConomy") && iConomy.isEnabled()) return true; + iConomy iConomyTemp = (iConomy)XmlStatsRegistry.get("iconomy"); + + if (iConomyTemp != null){ + if (iConomyTemp.getClass().getName().equals("com.iConomy.iConomy") && iConomyTemp.isEnabled()) return true; } return false; } diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorker.java b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorker.java index 134f308..5a81bb0 100644 --- a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorker.java +++ b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorker.java @@ -14,6 +14,7 @@ */ package de.sockenklaus.XmlStats.XmlWorkers; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; @@ -22,11 +23,15 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.zip.GZIPOutputStream; +import com.sun.net.httpserver.Headers; 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 /** @@ -41,10 +46,13 @@ public abstract class XmlWorker implements HttpHandler { public void handle(HttpExchange exchange) { Map> parameters = new HashMap>(); + Headers headers = exchange.getRequestHeaders(); + Settings settingsTemp = (Settings)XmlStatsRegistry.get("settings"); + if("get".equalsIgnoreCase(exchange.getRequestMethod())){ String queryString = exchange.getRequestURI().getRawQuery(); String xmlResponse = ""; - byte[] byteResponse; + byte[] byteResponse = null; try { @@ -56,9 +64,50 @@ public abstract class XmlWorker implements HttpHandler { } xmlResponse = getXML(parameters); - - byteResponse = xmlResponse.getBytes(); - + + /* + * Check if the clients sends the header "Accept-encoding", the option "gzip-enabled" is true and the clients supports gzip. + */ + if(headers.containsKey("Accept-encoding") && settingsTemp.getBoolean("options.gzip-enabled")){ + XmlStats.LogDebug("Compression seems to be accepted by the client and activated in this plugin."); + List header = headers.get("Accept-encoding"); + try { + XmlStats.LogDebug("There are "+header.size()+" values in the header"); + XmlStats.LogDebug("Let's take a look at the headers values:"); + } + catch (Exception e){ + XmlStats.LogError(e.getMessage()); + e.printStackTrace(); + } + for(String val : header){ + XmlStats.LogDebug("Accept-encoding: "+val); + if(val.toLowerCase().indexOf("gzip") > -1){ + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try { + XmlStats.LogDebug("OK... let's try gzip compression..."); + XmlStats.LogDebug("Actual size of the xml file: "+xmlResponse.getBytes().length+"Bytes"); + GZIPOutputStream gzip = new GZIPOutputStream(out); + gzip.write(xmlResponse.getBytes()); + gzip.close(); + byteResponse = out.toByteArray(); + XmlStats.LogDebug("Compressed size of the xml file: "+byteResponse.length+"Bytes"); + exchange.getResponseHeaders().add("Content-encoding", "gzip"); + + } catch (Exception e) { + XmlStats.LogError("GZIP-Compression failed! Falling back to non-compressed output."); + XmlStats.LogError(e.getMessage()); + e.printStackTrace(); + byteResponse = xmlResponse.getBytes(); + } + } + } + + } + if (byteResponse == null || byteResponse.length == 0) { + XmlStats.LogDebug("Compression is not enabled or doesn't work properly. Fallback to uncompressed output."); + byteResponse = xmlResponse.getBytes(); + } + try { exchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, byteResponse.length); exchange.getResponseBody().write(byteResponse);