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.
This commit is contained in:
Pascal Koenig
2011-08-29 01:31:48 +02:00
parent 265989c5c4
commit b8821b9208
8 changed files with 69 additions and 76 deletions

View File

@@ -28,7 +28,7 @@ public abstract class Datasource {
*
* @return the array list
*/
protected ArrayList<String> fetchAllPlayers(){
public ArrayList<String> fetchAllPlayers(){
File[] files = new File("world/players").listFiles();
ArrayList<String> result = new ArrayList<String>();

View File

@@ -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<String> allPlayerNames;
private HashMap<String, PlayerStat> stats = new HashMap<String, PlayerStat>();
/**
* 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<String, PlayerStat> fetchPlayerStats(ArrayList<String> pPlayerNames){
HashMap<String, PlayerStat> result = new HashMap<String, PlayerStat>();
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<String, PlayerStat> getStats(){
return this.stats;
}
public HashMap<String, HashMap<String, Integer>> getAddedStats(){
HashMap <String, HashMap<String, Integer>> result = new HashMap<String, HashMap<String, Integer>>();
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);
@@ -130,7 +97,11 @@ 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;
}
}

View File

@@ -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;
}

View File

@@ -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());
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;
}
}

View File

@@ -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);
@@ -78,9 +75,12 @@ public class XmlStats extends JavaPlugin {
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);
}
}

View File

@@ -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;

View File

@@ -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<String, List<String>> parameters = new HashMap<String, List<String>>();
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<String, List<String>> parseParameters(String queryString) throws UnsupportedEncodingException {
private Map<String, List<String>> parseParameters(String queryString) throws UnsupportedEncodingException {
Map<String, List<String>> result = new HashMap<String, List<String>>();
if (queryString != null){

View File

@@ -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<String, HashMap<String, Integer>> addedStats = statsDS.getAddedStats();
Element elem_player = doc.createElement("player");