diff --git a/build.xml b/build.xml index 0fc50c1..c0a1822 100644 --- a/build.xml +++ b/build.xml @@ -5,13 +5,16 @@ - + - + + + + diff --git a/src/de/sockenklaus/XmlStats/Datasource/AchievementsDS.java b/src/de/sockenklaus/XmlStats/Datasource/AchievementsDS.java new file mode 100644 index 0000000..d5de98e --- /dev/null +++ b/src/de/sockenklaus/XmlStats/Datasource/AchievementsDS.java @@ -0,0 +1,69 @@ +/** + * + */ +package de.sockenklaus.XmlStats.Datasource; + +import java.io.File; +import java.util.HashMap; + +import com.nidefawl.Achievements.AchievementListData; +import com.nidefawl.Achievements.Achievements; +import com.nidefawl.Achievements.PlayerAchievement; +import com.nidefawl.Achievements.PlayerAchievementFile; +import com.nidefawl.Achievements.PlayerAchievementSQL; + +import de.sockenklaus.XmlStats.XmlStats; +import de.sockenklaus.XmlStats.XmlStatsRegistry; + +/** + * @author socrates + * + */ +public class AchievementsDS extends Datasource { + + //HashMap playerAchievementsList; + + public HashMap getAchievementsList(){ + Achievements ach = (Achievements)XmlStatsRegistry.get("achievements"); + + if(XmlStats.checkAchievements()){ + return ach.achievementList; + } + else return new HashMap(); + } + + /*public void refreshPlayerAchievements(){ + PlayerAchievement pa; + Achievements ach = (Achievements)XmlStatsRegistry.get("achievements"); + + if(ach.useSQL){ + + } + }*/ + + public PlayerAchievement getUserAchievement(String playerName){ + + PlayerAchievement pa; + Achievements ach = (Achievements)XmlStatsRegistry.get("achievements"); + + if(ach.useSQL){ + String location = ach.getDataFolder().getPath() + File.separator + playerName + ".txt"; + File fold = new File(location); + + pa = new PlayerAchievementSQL(playerName); + if(fold.exists()){ + PlayerAchievement paold = new PlayerAchievementFile(ach.getDataFolder().getPath(), playerName); + paold.load(); + File fnew = new File(location + ".old"); + fold.renameTo(fnew); + pa.copy(paold); + pa.save(); + } + } + else pa = new PlayerAchievementFile(ach.getDataFolder().getPath(), playerName); + + pa.load(); + + return pa; + } +} diff --git a/src/de/sockenklaus/XmlStats/Datasource/MoneyDS.java b/src/de/sockenklaus/XmlStats/Datasource/MoneyDS.java index bd0be8e..eabfdb5 100644 --- a/src/de/sockenklaus/XmlStats/Datasource/MoneyDS.java +++ b/src/de/sockenklaus/XmlStats/Datasource/MoneyDS.java @@ -16,6 +16,7 @@ package de.sockenklaus.XmlStats.Datasource; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import com.iConomy.iConomy; import com.iConomy.system.Account; @@ -48,10 +49,10 @@ public class MoneyDS extends Datasource { } @SuppressWarnings("static-access") - private Double getBalance(String playerName){ + public Double getBalance(String playerName){ Double result = 0.0; - if (XmlStats.isiConomyHooked()){ + if (XmlStats.checkiConomy()){ if(this.iConomy.hasAccount(playerName)){ Account account = this.iConomy.getAccount(playerName); @@ -69,4 +70,18 @@ public class MoneyDS extends Datasource { return result; } + + /** + * @param list + * @return + */ + public int getSum(List list) { + int result = 0; + + for(String playerName : list){ + result+=this.getBalance(playerName); + } + + return result; + } } diff --git a/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java b/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java index 0da6ba6..67ec6a9 100644 --- a/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java +++ b/src/de/sockenklaus/XmlStats/Datasource/UserstatsDS.java @@ -16,6 +16,7 @@ package de.sockenklaus.XmlStats.Datasource; import java.io.File; import java.util.HashMap; +import java.util.List; import com.nidefawl.Stats.Stats; import com.nidefawl.Stats.datasource.Category; @@ -57,10 +58,10 @@ public class UserstatsDS extends Datasource { return this.statsPlugin.getDataFolder(); } - public HashMap> getAddedStats(){ + public HashMap> getAddedStats(List playerList){ HashMap > result = new HashMap>(); - for(String playerName : this.fetchAllPlayers()){ + for(String playerName : playerList){ PlayerStat player = this.getPlayerStat(playerName); for(String catName : player.getCats()){ diff --git a/src/de/sockenklaus/XmlStats/Webserver.java b/src/de/sockenklaus/XmlStats/Webserver.java index 7992ca1..585501c 100644 --- a/src/de/sockenklaus/XmlStats/Webserver.java +++ b/src/de/sockenklaus/XmlStats/Webserver.java @@ -74,25 +74,42 @@ public class Webserver { this.address = new InetSocketAddress(port); this.server = HttpServer.create(this.address, 0); + + this.server.createContext("/user_list.xml", new UserList()); - 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"); - } - else { - XmlStats.LogWarn("Stats not loaded correctly. Disabling /userstats.xml"); - } - - if (XmlStats.isiConomyHooked()){ - server.createContext("/money.xml", new XmlWorkerMoney()); - XmlStats.LogInfo("iConomy seems to be loaded correctly. Enabling /money.xml."); - } - else { - XmlStats.LogWarn("iConomy not loaded correctly. Disabling /money.xml"); - } - + this.server.start(); + this.server.start(); } + + protected void startiConomy(){ + if (this.isRunning() && XmlStats.checkiConomy()){ + server.createContext("/user_balances.xml", new UserBalances()); + XmlStats.LogInfo("iConomy seems to be loaded correctly. Enabling /user_balances.xml"); + } + else { + XmlStats.LogWarn("iConomy or webserver not loaded correctly. Disabling /users_balances.xml"); + } + } + + protected void startAchievements(){ + if(this.isRunning() && XmlStats.checkAchievements()){ + server.createContext("/user_achievements.xml", new UserAchievements()); + server.createContext("/achievements_list.xml", new AchievementsList()); + XmlStats.LogInfo("Achievements seems to be loaded correctly. Enabling /user_achievements.xml"); + } + else { + XmlStats.LogWarn("Achievements or webserver not loaded correctly. Disabling /user_achievements.xml"); + } + } + + protected void startStats(){ + if(this.isRunning() && XmlStats.checkStats()){ + server.createContext("/user_stats.xml", new UserStats()); + XmlStats.LogInfo("Stats seems to be loaded correctly. Enabling /user_stats.xml"); + } + else { + XmlStats.LogWarn("Stats or webserver not loaded correctly. Disabling /user_stats.xml"); + } + } } diff --git a/src/de/sockenklaus/XmlStats/XmlStats.java b/src/de/sockenklaus/XmlStats/XmlStats.java index 8232acf..0afc5fd 100644 --- a/src/de/sockenklaus/XmlStats/XmlStats.java +++ b/src/de/sockenklaus/XmlStats/XmlStats.java @@ -19,6 +19,8 @@ import java.util.logging.Logger; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.event.Event.Priority; +import org.bukkit.event.Event.Type; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; @@ -75,15 +77,15 @@ public class XmlStats extends JavaPlugin { LogDebug("options.webserver-enabled: "+settingsTemp.getBoolean("options.webserver-enabled")); LogDebug("options.webserver-port: "+settingsTemp.getInt("options.webserver-port")); LogDebug("options.verbose-enabled: "+settingsTemp.getBoolean("options.verbose-enabled")); - - this.hookPlugins(); - + if (settingsTemp.getBoolean("options.webserver-enabled")){ try { XmlStatsRegistry.put("webserver", new Webserver()); this.enabled = true; LogInfo("XmStats "+this.version+" enabled"); + this.hookPlugins(); + this.registerEvents(); } catch (Exception ex){ LogError("Fehler beim Erstellen des Webservers:"); @@ -141,41 +143,62 @@ public class XmlStats extends JavaPlugin { * Hook plugins. */ protected void hookPlugins(){ - Plugin StatsTemp = getServer().getPluginManager().getPlugin("Stats"); + this.hookAchievements(); + this.hookiConomy(); + this.hookStats(); + } + + protected void hookiConomy(){ Plugin iConomyTemp = getServer().getPluginManager().getPlugin("iConomy"); + Webserver webserver = (Webserver)XmlStatsRegistry.get("webserver"); - if(StatsTemp != null){ - if(StatsTemp.isEnabled() && StatsTemp.getClass().getName().equals("com.nidefawl.Stats.Stats")){ - XmlStatsRegistry.put("stats", (Stats)StatsTemp); - LogInfo("Hooked into Stats!"); - } - } - else { - LogWarn("Stats not found! Can't hook into it."); - } - - if (iConomyTemp != null) { - if (iConomyTemp.isEnabled() && iConomyTemp.getClass().getName().equals("com.iConomy.iConomy")) { - XmlStatsRegistry.put("iconomy", (iConomy)iConomyTemp); - LogInfo("Hooked into iConomy"); - } + if (iConomyTemp != null && iConomyTemp.isEnabled() && iConomyTemp.getClass().getName().equals("com.iConomy.iConomy")) { + XmlStatsRegistry.put("iconomy", (iConomy)iConomyTemp); + LogInfo("Hooked into iConomy"); + webserver.startiConomy(); } else { LogWarn("iConomy not found! Can't hook into it."); } - } + } + + protected void hookAchievements(){ + Plugin AchievementsTemp = getServer().getPluginManager().getPlugin("Achievements"); + Webserver webserver = (Webserver)XmlStatsRegistry.get("webserver"); + + if(AchievementsTemp != null && AchievementsTemp.isEnabled() && AchievementsTemp.getClass().getName().equals("com.nidefawl.Achievements.Achievements")){ + XmlStatsRegistry.put("achievements", (Achievements)AchievementsTemp); + LogInfo("Hooked into Achievements!"); + webserver.startAchievements(); + } + else { + LogWarn("Achievements not found! Can't hook into it."); + } + } + + protected void hookStats(){ + Plugin StatsTemp = getServer().getPluginManager().getPlugin("Stats"); + Webserver webserver = (Webserver)XmlStatsRegistry.get("webserver"); + + if(StatsTemp != null && StatsTemp.isEnabled() && StatsTemp.getClass().getName().equals("com.nidefawl.Stats.Stats")){ + XmlStatsRegistry.put("stats", (Stats)StatsTemp); + LogInfo("Hooked into Stats!"); + webserver.startStats(); + } + else { + LogWarn("Stats not found! Can't hook into it."); + } + } /** * Checks if is stats hooked. * * @return true, if is stats hooked */ - public static boolean isStatsHooked(){ + public static boolean checkStats(){ Stats StatsTemp = (Stats)XmlStatsRegistry.get("stats"); - if (StatsTemp != null){ - if(StatsTemp.getClass().getName().equals("com.nidefawl.Stats.Stats") && StatsTemp.isEnabled()) return true; - } + if(StatsTemp != null && StatsTemp.getClass().getName().equals("com.nidefawl.Stats.Stats") && StatsTemp.isEnabled()) return true; return false; } @@ -184,15 +207,25 @@ public class XmlStats extends JavaPlugin { * * @return true, if is i conomy hooked */ - public static boolean isiConomyHooked(){ + public static boolean checkiConomy(){ iConomy iConomyTemp = (iConomy)XmlStatsRegistry.get("iconomy"); - if (iConomyTemp != null){ - if (iConomyTemp.getClass().getName().equals("com.iConomy.iConomy") && iConomyTemp.isEnabled()) return true; - } + if (iConomyTemp != null && iConomyTemp.getClass().getName().equals("com.iConomy.iConomy") && iConomyTemp.isEnabled()) return true; return false; } - + + /** + * Checks if is Achievements hooked. + * + * @return true, if is Achievements hooked + */ + public static boolean checkAchievements(){ + Achievements AchievementsTemp = (Achievements)XmlStatsRegistry.get("achievements"); + + if(AchievementsTemp != null && AchievementsTemp.getClass().getName().equals("com.nidefawl.Achievements.Achievements") && AchievementsTemp.isEnabled()) return true; + return false; + } + /* (non-Javadoc) * @see org.bukkit.plugin.java.JavaPlugin#onCommand(org.bukkit.command.CommandSender, org.bukkit.command.Command, java.lang.String, java.lang.String[]) */ @@ -223,4 +256,10 @@ public class XmlStats extends JavaPlugin { this.onEnable(); } + 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/XmlStatsException.java b/src/de/sockenklaus/XmlStats/XmlStatsException.java new file mode 100644 index 0000000..74202f5 --- /dev/null +++ b/src/de/sockenklaus/XmlStats/XmlStatsException.java @@ -0,0 +1,17 @@ +/** + * + */ +package de.sockenklaus.XmlStats; + +/** + * @author socrates + * + */ +public class XmlStatsException extends Throwable { + + /** + * + */ + private static final long serialVersionUID = 1L; + +} diff --git a/src/de/sockenklaus/XmlStats/XmlStatsServerListener.java b/src/de/sockenklaus/XmlStats/XmlStatsServerListener.java new file mode 100644 index 0000000..504a8b3 --- /dev/null +++ b/src/de/sockenklaus/XmlStats/XmlStatsServerListener.java @@ -0,0 +1,58 @@ +/** + * + */ +package de.sockenklaus.XmlStats; + +import org.bukkit.event.server.PluginDisableEvent; +import org.bukkit.event.server.PluginEnableEvent; +import org.bukkit.event.server.ServerListener; + +/** + * @author socrates + * + */ +public class XmlStatsServerListener extends ServerListener { + private XmlStats plugin; + + public XmlStatsServerListener(XmlStats plugin){ + this.plugin = plugin; + } + + public void onPluginDisable(PluginDisableEvent event){ + /* + * TODO + * Not implemented yet! + */ + + /*Plugin iConomy = (Plugin)XmlStatsRegistry.get("iconomy"); + Plugin Stats = (Plugin)XmlStatsRegistry.get("stats"); + Plugin Achievements = (Plugin)XmlStatsRegistry.get("achievements"); + + if (!XmlStats.checkAchievements()){ + + } + if(!XmlStats.checkiConomy()){ + + } + if(!XmlStats.checkStats()){ + + }*/ + + } + + public void onPluginEnable(PluginEnableEvent event){ + if(this.identifyPlugin(event, "stats")){ + this.plugin.hookStats(); + } + if(this.identifyPlugin(event, "achievements")){ + this.plugin.hookAchievements(); + } + if(this.identifyPlugin(event, "iconomy")){ + this.plugin.hookiConomy(); + } + } + + private boolean identifyPlugin(PluginEnableEvent event, String name){ + return event.getPlugin().getDescription().getName().equalsIgnoreCase(name); + } +} diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/AchievementsList.java b/src/de/sockenklaus/XmlStats/XmlWorkers/AchievementsList.java new file mode 100644 index 0000000..940e8f7 --- /dev/null +++ b/src/de/sockenklaus/XmlStats/XmlWorkers/AchievementsList.java @@ -0,0 +1,82 @@ +/** + * + */ +package de.sockenklaus.XmlStats.XmlWorkers; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.w3c.dom.Element; + +import com.nidefawl.Achievements.AchievementListData; + +import de.sockenklaus.XmlStats.Datasource.AchievementsDS; + +/** + * @author socrates + * + */ +public class AchievementsList extends XmlWorker { + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXml(java.util.Map) + */ + @Override + protected Element getXml(Map> parameters) { + HashMap achList = new AchievementsDS().getAchievementsList(); + + Element elem_achs = this.doc.createElement("achievements"); + + for(String achName : achList.keySet()){ + elem_achs.appendChild(getAchievement(achList.get(achName))); + } + + return elem_achs; + } + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getSumXml(java.util.List, java.util.Map) + */ + @Override + protected Element getSumXml(List playerList, Map> parameters) { + return this.getXml(parameters); + } + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getUserXml(java.util.List, java.util.Map) + */ + @Override + protected Element getUserXml(List playerList, Map> parameters) { + return this.getXml(parameters); + } + + private Element getAchievement(AchievementListData data){ + Element elem_ach = this.doc.createElement("achievement"); + elem_ach.setAttribute("enabled", data.isEnabled()?"true":"false"); + + Element elem_category = this.doc.createElement("category"); + elem_category.setTextContent(data.getCategory()); + elem_ach.appendChild(elem_category); + + Element elem_stat = this.doc.createElement("stat"); + elem_stat.setTextContent(data.getKey()); + elem_ach.appendChild(elem_stat); + + Element elem_value = this.doc.createElement("value"); + elem_value.setTextContent(String.valueOf(data.getValue())); + elem_ach.appendChild(elem_value); + + Element elem_maxawards = this.doc.createElement("maxawards"); + elem_maxawards.setTextContent(String.valueOf(data.getMaxawards())); + elem_ach.appendChild(elem_maxawards); + + Element elem_commands = this.doc.createElement("commands"); + elem_commands.setTextContent(data.commands.toString()); + elem_ach.appendChild(elem_commands); + + return elem_ach; + + } + +} diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/UserAchievements.java b/src/de/sockenklaus/XmlStats/XmlWorkers/UserAchievements.java new file mode 100644 index 0000000..f0fc040 --- /dev/null +++ b/src/de/sockenklaus/XmlStats/XmlWorkers/UserAchievements.java @@ -0,0 +1,92 @@ +/** + * + */ +package de.sockenklaus.XmlStats.XmlWorkers; + +import java.util.List; +import java.util.Map; + +import org.w3c.dom.Element; + +import com.nidefawl.Achievements.PlayerAchievement; + +import de.sockenklaus.XmlStats.Datasource.AchievementsDS; + +/** + * @author socrates + * + */ +public class UserAchievements extends XmlWorker { + + AchievementsDS achDS; + + public UserAchievements(){ + this.achDS = new AchievementsDS(); + } + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map) + */ + @Override + protected Element getXml(Map> parameters) { + Element elem_error = this.doc.createElement("error"); + elem_error.setAttribute("code", "1"); + elem_error.setTextContent("No data provided with this query!"); + + return elem_error; + } + + private Element getUserAchievement(String userName){ + Element elem_player = this.doc.createElement("user"); + elem_player.appendChild(getTextElem("name", userName)); + + PlayerAchievement pa = achDS.getUserAchievement(userName); + + Element elem_achs = this.doc.createElement("achievements"); + + for(String achName : pa.achievements.keySet()){ + Element elem_ach = this.doc.createElement("achievement"); + elem_ach.appendChild(getTextElem("name", achName)); + elem_ach.appendChild(getTextElem("count", pa.achievements.get(achName).getCount())); + + elem_achs.appendChild(elem_ach); + } + elem_player.appendChild(elem_achs); + + return elem_player; + } + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getSumXml(java.util.List, java.util.Map) + */ + @Override + protected Element getSumXml(List playerList, Map> parameters) { + if(parameters.containsKey("user")){ + return null; + } + else { + Element elem_error = this.doc.createElement("error"); + elem_error.setAttribute("code", "1"); + elem_error.setTextContent("No data provided with this query!"); + + return elem_error; + } + } + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getUserXml(java.util.List, java.util.Map) + */ + @Override + protected Element getUserXml(List userList, Map> parameters) { + Element elem_users = this.doc.createElement("users"); + elem_users.setAttribute("count", String.valueOf(userList.size())); + + for(String userName : userList){ + + elem_users.appendChild(this.getUserAchievement(userName)); + } + + return elem_users; + } + +} diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/UserBalances.java b/src/de/sockenklaus/XmlStats/XmlWorkers/UserBalances.java new file mode 100644 index 0000000..2068c94 --- /dev/null +++ b/src/de/sockenklaus/XmlStats/XmlWorkers/UserBalances.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) [2011] [Pascal König] +* +* This program is free software; you can redistribute it and/or modify it under the terms of +* the GNU General Public License as published by the Free Software Foundation; either version +* 3 of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with this program; +* if not, see . +*/ +package de.sockenklaus.XmlStats.XmlWorkers; + +import java.util.List; +import java.util.Map; + +import org.w3c.dom.Element; + +import de.sockenklaus.XmlStats.XmlStats; +import de.sockenklaus.XmlStats.Datasource.MoneyDS; + +// TODO: Auto-generated Javadoc +/** + * The Class XmlWorkerMoney. + */ +public class UserBalances extends XmlWorker { + + private MoneyDS moneyDS; + + public UserBalances(){ + this.moneyDS = new MoneyDS(); + } + + + protected Element getUserXml(List playerList, Map> parameters){ + + Element elem_users = this.doc.createElement("users"); + elem_users.setAttribute("count", String.valueOf(playerList.size())); + + for(String userName : playerList){ + Element elem_user = this.doc.createElement("user"); + elem_user.appendChild(getTextElem("name", userName)); + elem_user.appendChild(getTextElem("balance", String.valueOf(moneyDS.getBalance(userName)))); + + elem_users.appendChild(elem_user); + } + + return elem_users; + } + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map) + */ + @Override + public Element getXml(Map> parameters) { + Element elem_error = this.doc.createElement("error"); + elem_error.setAttribute("code", "1"); + elem_error.setTextContent("No data provided with this query!"); + + return elem_error; + } + + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getSumXml(java.util.List, java.util.Map) + */ + @Override + protected Element getSumXml(List userList, Map> parameters) { + + Element elem_sum = this.doc.createElement("sum"); + Element elem_users = this.doc.createElement("users"); + elem_users.setAttribute("count", String.valueOf(userList.size())); + elem_users.setAttribute("type", "name"); + elem_sum.appendChild(elem_users); + + for(String userName : userList){ + Element elem_user = this.doc.createElement("user"); + elem_user.appendChild(getTextElem("name", userName)); + elem_users.appendChild(elem_user); + XmlStats.LogDebug("Got "+userName); + } + + int sum = moneyDS.getSum(userList); + + elem_sum.appendChild(getTextElem("balance", String.valueOf(sum))); + + return elem_sum; + } +} diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/UserList.java b/src/de/sockenklaus/XmlStats/XmlWorkers/UserList.java new file mode 100644 index 0000000..e58a1d5 --- /dev/null +++ b/src/de/sockenklaus/XmlStats/XmlWorkers/UserList.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) [2011] [Pascal König] +* +* This program is free software; you can redistribute it and/or modify it under the terms of +* the GNU General Public License as published by the Free Software Foundation; either version +* 3 of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with this program; +* if not, see . +*/ +package de.sockenklaus.XmlStats.XmlWorkers; + +import java.util.ArrayList; +import java.util.Map; +import java.util.List; + +import org.bukkit.entity.Player; +import org.w3c.dom.Element; + +import de.sockenklaus.XmlStats.XmlStats; +import de.sockenklaus.XmlStats.XmlStatsRegistry; +import de.sockenklaus.XmlStats.Datasource.UsersDS; + +// TODO: Auto-generated Javadoc +/** + * The Class XmlWorkerUsers. + */ +public class UserList extends XmlWorker { + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map) + */ + @Override + public Element getXml(Map> parameters) { + UsersDS users = new UsersDS(); + + Element elem_users = this.doc.createElement("users"); + elem_users.setAttribute("count", String.valueOf(users.getAllPlayers().size())); + + /* + * Get list online player names + */ + XmlStats pluginTemp= (XmlStats)XmlStatsRegistry.get("xmlstats"); + + Player[] onlinePlayers = pluginTemp.getServer().getOnlinePlayers(); + List onlinePlayerNames = new ArrayList(); + + if (onlinePlayers != null){ + for (int i = 0; i < onlinePlayers.length; i++){ + onlinePlayerNames.add(onlinePlayers[i].getName()); + } + } + /* + * Got list of online player names + */ + + /* + * Hier wird das XML aufgebaut + */ + + for(String playerName : users.getAllPlayers()){ + + Element elem_player = this.doc.createElement("user"); + elem_player.appendChild(getTextElem("name", playerName)); + + elem_player.setAttribute("status", onlinePlayerNames.contains(playerName) ? "online":"offline"); + + elem_users.appendChild(elem_player); + } + /* + * Hier endet der XML-Aufbau + */ + return elem_users; + } + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getSumXml(java.util.List, java.util.Map) + */ + @Override + protected Element getSumXml(List playerList, Map> parameters) { + return this.getXml(parameters); + } + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getUserXml(java.util.List, java.util.Map) + */ + @Override + protected Element getUserXml(List playerList, Map> parameters) { + return this.getXml(parameters); + } + +} diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/UserStats.java b/src/de/sockenklaus/XmlStats/XmlWorkers/UserStats.java new file mode 100644 index 0000000..2eeca59 --- /dev/null +++ b/src/de/sockenklaus/XmlStats/XmlWorkers/UserStats.java @@ -0,0 +1,170 @@ +/* + * Copyright (C) [2011] [Pascal König] +* +* This program is free software; you can redistribute it and/or modify it under the terms of +* the GNU General Public License as published by the Free Software Foundation; either version +* 3 of the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with this program; +* if not, see . +*/ +package de.sockenklaus.XmlStats.XmlWorkers; + +import java.util.HashMap; +import java.util.Map; +import java.util.List; + +import org.w3c.dom.Element; + +import com.nidefawl.Stats.datasource.Category; +import com.nidefawl.Stats.datasource.PlayerStat; + +import de.sockenklaus.XmlStats.Datasource.UserstatsDS; + +// TODO: Auto-generated Javadoc +/** + * The Class XmlWorkerUserstats. + */ +public class UserStats extends XmlWorker { + + /** The stats ds. */ + private UserstatsDS statsDS; + + /** + * Instantiates a new xml worker userstats. + */ + public UserStats(){ + this.statsDS = new UserstatsDS(); + } + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map) + */ + public Element getXml(Map> parameters) { + Element elem_error = this.doc.createElement("error"); + elem_error.setAttribute("code", "1"); + elem_error.setTextContent("No data provided with this query!"); + + return elem_error; + } + + /** + * Build a XML subtree for the given player. + * + * @param playerName the player name + * @return Returns a XML subtree for the given playerName. + * @paramthis.doc thethis.doc + */ + private Element getUserElement(String playerName){ + PlayerStat player_stats = statsDS.getPlayerStat(playerName); + + Element elem_player = this.doc.createElement("user"); + Element elem_cats = this.doc.createElement("categories"); + + elem_player.appendChild(getTextElem("name", playerName)); + elem_player.appendChild(elem_cats); + + for(String catName : player_stats.getCats()){ + Category cat = player_stats.get(catName); + Element elem_cat = this.doc.createElement("category"); + Element elem_items = this.doc.createElement("items"); + + elem_cat.appendChild(getTextElem("name", catName)); + elem_cat.appendChild(elem_items); + elem_cats.appendChild(elem_cat); + + for(String valName : cat.stats.keySet()){ + elem_items.appendChild(getItemElem(valName, cat.get(valName))); + } + } + return elem_player; + } + + /** + * Gets the added up stats element. + * + * @return the added up stats element + */ + private Element getAddedUpStatsElement(List playerList){ + HashMap> addedStats = statsDS.getAddedStats(playerList); + Element elem_stats = this.doc.createElement("stats"); + Element elem_cats = this.doc.createElement("categories"); + + elem_stats.appendChild(elem_cats); + + for (String catName : addedStats.keySet()){ + Element elem_cat = this.doc.createElement("category"); + Element elem_items = this.doc.createElement("items"); + + elem_cat.appendChild(getTextElem("name", catName)); + elem_cat.appendChild(elem_items); + elem_cats.appendChild(elem_cat); + + for(String entryName : addedStats.get(catName).keySet()){ + elem_items.appendChild(getItemElem(entryName, addedStats.get(catName).get(entryName))); + } + elem_cat.appendChild(elem_items); + } + + return elem_stats; + } + + /** + * Gets the item elem. + * + * @param key the key + * @param value the value + * @return the item elem + */ + private Element getItemElem(String key, int value){ + Element elem_item = this.doc.createElement("item"); + + elem_item.appendChild(getTextElem("name", key)); + elem_item.appendChild(getTextElem("value", String.valueOf(value))); + + return elem_item; + } + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getSumXml(java.util.List, java.util.Map) + */ + @Override + protected Element getSumXml(List playerList, Map> parameters) { + Element elem_sum = this.doc.createElement("sum"); + Element elem_users = this.doc.createElement("users"); + elem_users.setAttribute("count", String.valueOf(playerList.size())); + + for (String userName : playerList){ + Element elem_user = this.doc.createElement("user"); + elem_user.appendChild(getTextElem("name", userName)); + + elem_users.appendChild(elem_user); + } + + elem_sum.appendChild(elem_users); + elem_sum.appendChild(this.getAddedUpStatsElement(playerList)); + + return elem_sum; + } + + /* (non-Javadoc) + * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getUserXml(java.util.List, java.util.Map) + */ + @Override + protected Element getUserXml(List playerList, Map> parameters) { + Element elem_users = this.doc.createElement("users"); + elem_users.setAttribute("count", String.valueOf(playerList.size())); + + for(String playerName : playerList){ + elem_users.appendChild(this.getUserElement(playerName)); + } + + return elem_users; + } + + +} diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorker.java b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorker.java index f532fed..59f829d 100644 --- a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorker.java +++ b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorker.java @@ -16,6 +16,7 @@ package de.sockenklaus.XmlStats.XmlWorkers; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URLDecoder; @@ -25,19 +26,42 @@ import java.util.List; import java.util.Map; import java.util.zip.GZIPOutputStream; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpContext; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpExchange; import de.sockenklaus.XmlStats.XmlStats; +import de.sockenklaus.XmlStats.Datasource.Datasource; +import de.sockenklaus.XmlStats.Datasource.UsersDS; // TODO: Auto-generated Javadoc /** * The Class XmlWorker. */ public abstract class XmlWorker implements HttpHandler { - + protected DocumentBuilderFactory factory; + protected DocumentBuilder builder; + protected Document doc; + protected DOMSource source; + protected StringWriter writer; + protected StreamResult result; + protected TransformerFactory tf; + protected Transformer transformer; + /* (non-Javadoc) * @see com.sun.net.httpserver.HttpHandler#handle(com.sun.net.httpserver.HttpExchange) */ @@ -51,53 +75,140 @@ public abstract class XmlWorker implements HttpHandler { String xmlResponse = ""; byte[] byteResponse = null; + /* + * Parse the parameters + */ try { parameters = parseParameters(queryString); - } catch(UnsupportedEncodingException ex){ - XmlStats.LogWarn("Fehler beim Parsen des HTTP-Query-Strings."); - XmlStats.LogWarn(ex.getMessage()); - } - - xmlResponse = getXML(parameters); - - - /* - * Check if the clients sends the header "Accept-encoding", the option "gzip-enabled" is true and the clients supports gzip. - */ - - - - if(parameters.containsKey("gzip") && parameters.get("gzip").contains("true")){ - XmlStats.LogDebug("Raw gzip requested."); + + /* + * Create the XML doc stuff.... + */ + this.factory = DocumentBuilderFactory.newInstance(); + this.builder = this.factory.newDocumentBuilder(); + this.doc = this.builder.newDocument(); + this.source = new DOMSource(this.doc); + this.writer = new StringWriter(); + this.result = new StreamResult(this.writer); + this.tf = TransformerFactory.newInstance(); + this.transformer = this.tf.newTransformer(); + Datasource ds = new UsersDS(); + Element root = this.doc.createElement("xmlstats"); + List playerList; + this.doc.appendChild(root); + /* + * Actually create the XML + */ - HttpContext context = exchange.getHttpContext(); - String filename = context.getPath().substring(1); + if(parameters.isEmpty()){ + root.appendChild(getXml(parameters)); + } - byteResponse = compressData(xmlResponse.getBytes()); - exchange.getResponseHeaders().set("Content-type", "application/gzip"); - exchange.getResponseHeaders().set("Content-disposition", "attachment; filename="+filename+".gzip"); + else if(parameters.containsKey("user")){ + if (parameters.get("user").contains("*")){ + playerList = ds.fetchAllPlayers(); + } + else { + playerList = parameters.get("user"); + } + + root.appendChild(getUserXml(playerList, parameters)); + } + + if(parameters.containsKey("sum")){ + if(parameters.get("sum").contains("*")){ + playerList = ds.fetchAllPlayers(); + } + else { + playerList = parameters.get("sum"); + } + root.appendChild(getSumXml(playerList, parameters)); + } + + /* + * Build string from XML + */ } - else if(clientAcceptsGzip(headers)) { - byteResponse = compressData(xmlResponse.getBytes()); - exchange.getResponseHeaders().set("Content-encoding", "gzip"); - } - else { - byteResponse = xmlResponse.getBytes(); + catch(TransformerConfigurationException e){ + } - + catch(ParserConfigurationException e){ + + } + catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + try { + this.transformer.transform(this.source, this.result); + + xmlResponse = this.writer.toString(); + + + /* + * Check if the clients sends the header "Accept-encoding", the option "gzip-enabled" is true and the clients supports gzip. + */ + + if(parameters.containsKey("gzip") && parameters.get("gzip").contains("true")){ + XmlStats.LogDebug("Raw gzip requested."); + + HttpContext context = exchange.getHttpContext(); + String filename = context.getPath().substring(1); + + byteResponse = compressData(xmlResponse.getBytes()); + exchange.getResponseHeaders().set("Content-type", "application/gzip"); + exchange.getResponseHeaders().set("Content-disposition", "attachment; filename="+filename+".gzip"); + } + else if(clientAcceptsGzip(headers)) { + byteResponse = compressData(xmlResponse.getBytes()); + exchange.getResponseHeaders().set("Content-encoding", "gzip"); + } + else { + byteResponse = xmlResponse.getBytes(); + } + + exchange.sendResponseHeaders(HttpURLConnection.HTTP_OK, byteResponse.length); - exchange.getResponseBody().write(byteResponse); + exchange.getResponseBody().write(byteResponse); + } + + catch(UnsupportedEncodingException e){ } catch(IOException ex){ XmlStats.LogError("Fehler beim Senden der HTTP-Antwort."); XmlStats.LogError(ex.getMessage()); } + catch (TransformerException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } exchange.close(); } } + /** + * @param parameters + * @return + */ + protected abstract Element getXml(Map> parameters); + + /** + * @param playerList + * @param parameters + * @return + */ + protected abstract Element getSumXml(List playerList, Map> parameters); + + /** + * @param playerList + * @param parameters + * @return + */ + protected abstract Element getUserXml(List playerList, Map> parameters); + /** * Parses the parameters. * @@ -115,52 +226,43 @@ public abstract class XmlWorker implements HttpHandler { String param[] = pair.split("[=]"); String key = null; - String value = null; + String[] valueArr = null; if(param.length > 0){ key = URLDecoder.decode(param[0].toLowerCase(), System.getProperty("file.encoding")); + valueArr = new String[1]; + valueArr[0] = ""; } if(param.length > 1){ - value = URLDecoder.decode(param[1].toLowerCase(), System.getProperty("file.encoding")); + valueArr = URLDecoder.decode(param[1].toLowerCase(), System.getProperty("file.encoding")).split(","); } - if (result.containsKey(key)){ - List values = result.get(key); - - values.add(value); + List values = new ArrayList(); + for (String value : valueArr){ + if (!values.contains(value)){ + values.add(value); + } } - else { - List values = new ArrayList(); - values.add(value); - result.put(key, values); - } + result.put(key, values); } } return result; } - /** - * Gets the xML. - * - * @param parameters the parameters - * @return the xML - */ - abstract String getXML(Map> parameters); - private byte[] compressData(byte[] input){ ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] output; try { XmlStats.LogDebug("OK... let's try gzip compression..."); - XmlStats.LogDebug("Actual size of the xml file: "+input.length+"Bytes"); + XmlStats.LogDebug("Actual size of the xml file: "+input.length+" B"); GZIPOutputStream gzip = new GZIPOutputStream(out); gzip.write(input); gzip.close(); output = out.toByteArray(); - XmlStats.LogDebug("Compressed size of the xml file: "+output.length+"Bytes"); + XmlStats.LogDebug("Compressed size of the xml file: "+output.length+" B"); } catch(IOException e){ XmlStats.LogError("GZIP-Compression failed! Returning empty byte[]"); @@ -184,4 +286,23 @@ public abstract class XmlWorker implements HttpHandler { return false; } + + /** + * Gets the text elem. + * + * @param elemName the elem name + * @param text the text + * @return the text elem + */ + protected Element getTextElem(String elemName, String text){ + Element result = this.doc.createElement(elemName); + result.setTextContent(text); + return result; + } + + protected Element getTextElem(String elemName, int value){ + Element result = this.doc.createElement(elemName); + result.setTextContent(String.valueOf(value)); + return result; + } } diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerMoney.java b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerMoney.java deleted file mode 100644 index 3a03c51..0000000 --- a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerMoney.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) [2011] [Pascal König] -* -* This program is free software; you can redistribute it and/or modify it under the terms of -* the GNU General Public License as published by the Free Software Foundation; either version -* 3 of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -* See the GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License along with this program; -* if not, see . -*/ -package de.sockenklaus.XmlStats.XmlWorkers; - -import java.io.StringWriter; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -import com.nidefawl.Stats.Stats; - -import de.sockenklaus.XmlStats.Datasource.MoneyDS; - -// TODO: Auto-generated Javadoc -/** - * The Class XmlWorkerMoney. - */ -public class XmlWorkerMoney extends XmlWorker { - - private MoneyDS moneyDS; - - public XmlWorkerMoney(){ - this.moneyDS = new MoneyDS(); - } - - /* (non-Javadoc) - * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map) - */ - @Override - public String getXML(Map> parameters) { - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - Document doc = builder.newDocument(); - DOMSource source = new DOMSource(doc); - StringWriter writer = new StringWriter(); - StreamResult result = new StreamResult(writer); - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer transformer = tf.newTransformer(); - - HashMap balances = moneyDS.getBalances(); - - Element root = doc.createElement("money"); - doc.appendChild(root); - - /* - * Hier wird das XML aufgebaut - */ - - for (String playerName : balances.keySet()){ - Element elem_player = doc.createElement("player"); - elem_player.setAttribute("name", playerName); - elem_player.setAttribute("balance", String.valueOf(balances.get(playerName))); - - root.appendChild(elem_player); - } - - /* - * Hier endet der XML-Aufbau - */ - - transformer.transform(source, result); - return writer.toString(); - } - - catch (Exception e){ - Stats.log.log(Level.SEVERE, "Something went terribly wrong!"); - Stats.log.log(Level.SEVERE, e.getMessage()); - } - - return ""; - } -} diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUsers.java b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUsers.java deleted file mode 100644 index 0853cc0..0000000 --- a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUsers.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) [2011] [Pascal König] -* -* This program is free software; you can redistribute it and/or modify it under the terms of -* the GNU General Public License as published by the Free Software Foundation; either version -* 3 of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -* See the GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License along with this program; -* if not, see . -*/ -package de.sockenklaus.XmlStats.XmlWorkers; - -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Map; -import java.util.logging.Level; -import java.util.List; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - -import org.bukkit.entity.Player; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -import com.nidefawl.Stats.Stats; - -import de.sockenklaus.XmlStats.XmlStats; -import de.sockenklaus.XmlStats.XmlStatsRegistry; -import de.sockenklaus.XmlStats.Datasource.UsersDS; - -// TODO: Auto-generated Javadoc -/** - * The Class XmlWorkerUsers. - */ -public class XmlWorkerUsers extends XmlWorker { - - /* (non-Javadoc) - * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map) - */ - @Override - public String getXML(Map> parameters) { - UsersDS users = new UsersDS(); - - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - Document doc = builder.newDocument(); - DOMSource source = new DOMSource(doc); - StringWriter writer = new StringWriter(); - StreamResult result = new StreamResult(writer); - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer transformer = tf.newTransformer(); - - Element root = doc.createElement("players"); - root.setAttribute("count", String.valueOf(users.getAllPlayers().size())); - doc.appendChild(root); - - /* - * Get list online player names - */ - XmlStats pluginTemp= (XmlStats)XmlStatsRegistry.get("xmlstats"); - - Player[] onlinePlayers = pluginTemp.getServer().getOnlinePlayers(); - List onlinePlayerNames = new ArrayList(); - - if (onlinePlayers != null){ - for (int i = 0; i < onlinePlayers.length; i++){ - onlinePlayerNames.add(onlinePlayers[i].getName()); - } - } - /* - * Got list of online player names - */ - - /* - * Hier wird das XML aufgebaut - */ - - for(String playerName : users.getAllPlayers()){ - - Element elem_player = doc.createElement("player"); - elem_player.setAttribute("name", playerName); - - elem_player.setAttribute("status", onlinePlayerNames.contains(playerName) ? "online":"offline"); - - root.appendChild(elem_player); - } - /* - * Hier endet der XML-Aufbau - */ - - transformer.transform(source, result); - return writer.toString(); - } - - catch (Exception e) - { - Stats.log.log(Level.SEVERE, "Something went terribly wrong!"); - Stats.log.log(Level.SEVERE, e.getMessage()); - } - - return ""; - } - -} diff --git a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUserstats.java b/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUserstats.java deleted file mode 100644 index 0d8015d..0000000 --- a/src/de/sockenklaus/XmlStats/XmlWorkers/XmlWorkerUserstats.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) [2011] [Pascal König] -* -* This program is free software; you can redistribute it and/or modify it under the terms of -* the GNU General Public License as published by the Free Software Foundation; either version -* 3 of the License, or (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -* See the GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License along with this program; -* if not, see . -*/ -package de.sockenklaus.XmlStats.XmlWorkers; - -import java.io.File; -import java.io.StringWriter; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; -import java.util.List; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -import com.nidefawl.Stats.Stats; -import com.nidefawl.Stats.ItemResolver.hModItemResolver; -import com.nidefawl.Stats.datasource.Category; -import com.nidefawl.Stats.datasource.PlayerStat; - -import de.sockenklaus.XmlStats.Datasource.UserstatsDS; - -// TODO: Auto-generated Javadoc -/** - * The Class XmlWorkerUserstats. - */ -public class XmlWorkerUserstats extends XmlWorker { - - /** The stats ds. */ - private UserstatsDS statsDS; - private hModItemResolver itemResolver; - private String[] resolveCats; - - /** - * Instantiates a new xml worker userstats. - */ - public XmlWorkerUserstats(){ - this.statsDS = new UserstatsDS(); - itemResolver = new hModItemResolver(new File(statsDS.getDataFolder(),"items.txt")); - resolveCats = new String[]{"blockdestroy", "blockcreate", "itemdrop", "itempickup"}; - } - - /* (non-Javadoc) - * @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map) - */ - public String getXML(Map> parameters) { - try { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - DocumentBuilder builder = factory.newDocumentBuilder(); - Document doc = builder.newDocument(); - DOMSource source = new DOMSource(doc); - StringWriter writer = new StringWriter(); - StreamResult result = new StreamResult(writer); - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer transformer = tf.newTransformer(); - - Element root = doc.createElement("stats"); - doc.appendChild(root); - - /* - * Hier wird das XML aufgebaut - */ - if (!parameters.containsKey("player")){ - // Generate a summarized XML - - root.appendChild(getAddedUpStatsElement(doc)); - - } - else { - // Generate the XML for the given user(s) - for(String playerName : statsDS.fetchAllPlayers()){ - if (parameters.containsKey("player") && parameters.get("player").contains(playerName.toLowerCase())){ - root.appendChild(getPlayerElement(playerName, doc)); - } - } - } - - /* - * Hier endet der XML-Aufbau - */ - - transformer.transform(source, result); - return writer.toString(); - } - - catch (Exception e){ - Stats.log.log(Level.SEVERE, "Something went terribly wrong!"); - Stats.log.log(Level.SEVERE, e.getMessage()); - } - - return ""; - } - - /** - * Build a XML subtree for the given player. - * - * @param playerName the player name - * @param doc the doc - * @return Returns a XML subtree for the given playerName. - */ - private Element getPlayerElement(String playerName, Document doc){ - PlayerStat player_stats = statsDS.getPlayerStat(playerName); - - Element elem_player = doc.createElement("player"); - elem_player.setAttribute("name", playerName); - - for(String catName : player_stats.getCats()){ - Category cat = player_stats.get(catName); - Element elem_cat = doc.createElement("category"); - elem_cat.setAttribute("name", catName); - - for(String valName : cat.stats.keySet()){ - int value = cat.get(valName); - Element elem_value = doc.createElement("stat"); - - elem_value.setAttribute("name", valName); - - if (Arrays.asList(resolveCats).contains(catName)){ - elem_value.setAttribute("id", String.valueOf(itemResolver.getItem(valName))); - } - elem_value.setAttribute("value", String.valueOf(value)); - - elem_cat.appendChild(elem_value); - } - - - elem_player.appendChild(elem_cat); - } - return elem_player; - } - - private Element getAddedUpStatsElement(Document doc){ - HashMap> addedStats = statsDS.getAddedStats(); - - Element elem_player = doc.createElement("player"); - elem_player.setAttribute("name", "*"); - - for (String catName : addedStats.keySet()){ - Element elem_cat = doc.createElement("category"); - elem_cat.setAttribute("name", catName); - - for(String entryName : addedStats.get(catName).keySet()){ - Element elem_stat = doc.createElement("stat"); - elem_stat.setAttribute("name", entryName); - - if(Arrays.asList(resolveCats).contains(catName)){ - elem_stat.setAttribute("id", String.valueOf(itemResolver.getItem(entryName))); - } - elem_stat.setAttribute("value", String.valueOf(addedStats.get(catName).get(entryName))); - - elem_cat.appendChild(elem_stat); - } - elem_player.appendChild(elem_cat); - } - - return elem_player; - } -}