Started to completely rewrite the xml structure...

This commit is contained in:
Pascal Koenig
2011-09-06 01:26:34 +02:00
parent b325e0f2dd
commit aa82666069
8 changed files with 266 additions and 269 deletions

View File

@@ -3,10 +3,14 @@
*/
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;
@@ -26,4 +30,30 @@ public class AchievementsDS extends Datasource {
}
else return new HashMap<String, AchievementListData>();
}
public PlayerAchievement getPlayerAchievement(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;
}
}

View File

@@ -75,40 +75,38 @@ public class Webserver {
this.server = HttpServer.create(this.address, 0);
this.server.createContext("/users.xml", new XmlWorkerUsers());
this.server.createContext("/users_list.xml", new XmlWorkerUsers());
this.server.start();
}
protected void startiConomy(){
if (this.isRunning() && XmlStats.checkiConomy()){
server.createContext("/money.xml", new XmlWorkerMoney());
XmlStats.LogInfo("iConomy seems to be loaded correctly. Enabling /money.xml.");
server.createContext("/users_balances.xml", new XmlWorkerMoney());
XmlStats.LogInfo("iConomy seems to be loaded correctly. Enabling /users_balances.xml");
}
else {
XmlStats.LogWarn("iConomy or webserver not loaded correctly. Disabling /money.xml");
XmlStats.LogWarn("iConomy or webserver not loaded correctly. Disabling /users_balances.xml");
}
}
protected void startAchievements(){
if(this.isRunning() && XmlStats.checkAchievements()){
server.createContext("/achievements.xml", new XmlWorkerAchievements());
XmlStats.LogInfo("Achievements seems to be loaded correctly. Enabling /achievements.xml");
server.createContext("/user_achievements.xml", new XmlWorkerAchievements());
XmlStats.LogInfo("Achievements seems to be loaded correctly. Enabling /user_achievements.xml");
}
else {
XmlStats.LogWarn("Achievements or webserver not loaded correctly. Disabling /achievements.xml");
XmlStats.LogWarn("Achievements or webserver not loaded correctly. Disabling /user_achievements.xml");
}
}
protected void startStats(){
if(this.isRunning() && XmlStats.checkStats()){
server.createContext("/userstats.xml", new XmlWorkerUserstats());
XmlStats.LogInfo("Stats seems to be loaded correctly. Enabling /userstats.xml");
server.createContext("/user_stats.xml", new XmlWorkerUserstats());
XmlStats.LogInfo("Stats seems to be loaded correctly. Enabling /user_stats.xml");
}
else {
XmlStats.LogWarn("Stats or webserver not loaded correctly. Disabling /userstats.xml");
XmlStats.LogWarn("Stats or webserver not loaded correctly. Disabling /user_stats.xml");
}
}
}

View File

@@ -0,0 +1,17 @@
/**
*
*/
package de.sockenklaus.XmlStats;
/**
* @author socrates
*
*/
public class XmlStatsException extends Throwable {
/**
*
*/
private static final long serialVersionUID = 1L;
}

View File

@@ -28,12 +28,16 @@ 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;
@@ -69,48 +73,90 @@ 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();
HttpContext context = exchange.getHttpContext();
String filename = context.getPath().substring(1);
Element root = this.doc.createElement("xmlstats");
this.doc.appendChild(root);
/*
* Actually create the XML
*/
root.appendChild(getXML(parameters));
/*
* Build string from XML
*/
}
catch(TransformerConfigurationException e){
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();
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();
}
@@ -165,7 +211,7 @@ public abstract class XmlWorker implements HttpHandler {
* @param parameters the parameters
* @return the xML
*/
abstract String getXML(Map<String, List<String>> parameters);
abstract Element getXML(Map<String, List<String>> parameters);
private byte[] compressData(byte[] input){
ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -202,4 +248,17 @@ 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;
}
}

View File

@@ -3,21 +3,13 @@
*/
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.DocumentBuilderFactory;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Element;
import com.nidefawl.Achievements.AchievementListData;
import com.nidefawl.Stats.Stats;
import de.sockenklaus.XmlStats.Datasource.AchievementsDS;
@@ -37,45 +29,31 @@ public class XmlWorkerAchievements extends XmlWorker {
* @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map)
*/
@Override
String getXML(Map<String, List<String>> parameters) {
try {
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();
Element getXML(Map<String, List<String>> parameters) {
HashMap<String, AchievementListData> achList = achDS.getAchievementsList();
HashMap<String, AchievementListData> achList = achDS.getAchievementsList();
Element root = this.doc.createElement("xmlstats");
Element elem_achs = this.doc.createElement("achievements");
this.doc.appendChild(root);
root.appendChild(elem_achs);
Element elem_achs = this.doc.createElement("achievements");
/*
* Hier wird das XML aufgebaut
*/
/*
* Hier wird das XML aufgebaut
*/
if(parameters.containsKey("user")){
for (String playerName : parameters.get("user")){
elem_achs.appendChild(getPlayerAchievement(playerName));
}
}
else {
for(String achName : achList.keySet()){
elem_achs.appendChild(getAchievement(achList.get(achName)));
}
}
/*
* Hier endet der XML-Aufbau
*/
this.transformer.transform(this.source, result);
return this.writer.toString();
}
catch (Exception e){
Stats.log.log(Level.SEVERE, "Something went terribly wrong!");
Stats.log.log(Level.SEVERE, e.getMessage());
return "";
}
/*
* Hier endet der XML-Aufbau
*/
return elem_achs;
}
@@ -105,5 +83,12 @@ public class XmlWorkerAchievements extends XmlWorker {
return elem_ach;
}
private Element getPlayerAchievement(String playerName){
Element elem_player = this.doc.createElement("user");
elem_player.appendChild(getTextElem("name", playerName));
return null;
}
}

View File

@@ -14,21 +14,12 @@
*/
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.DocumentBuilderFactory;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Element;
import com.nidefawl.Stats.Stats;
import de.sockenklaus.XmlStats.Datasource.MoneyDS;
// TODO: Auto-generated Javadoc
@@ -47,49 +38,27 @@ public class XmlWorkerMoney extends XmlWorker {
* @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map)
*/
@Override
public String getXML(Map<String, List<String>> parameters) {
public Element getXML(Map<String, List<String>> parameters) {
try {
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();
HashMap<String, Double> balances = moneyDS.getBalances();
Element root = this.doc.createElement("xmlstats");
Element elem_money = this.doc.createElement("money");
this.doc.appendChild(root);
root.appendChild(elem_money);
/*
* Hier wird das XML aufgebaut
*/
for (String playerName : balances.keySet()){
Element elem_player = this.doc.createElement("player");
elem_player.setAttribute("name", playerName);
elem_player.setAttribute("balance", String.valueOf(balances.get(playerName)));
elem_money.appendChild(elem_player);
}
/*
* Hier endet der XML-Aufbau
*/
transformer.transform(this.source, result);
return this.writer.toString();
}
HashMap<String, Double> balances = moneyDS.getBalances();
catch (Exception e){
Stats.log.log(Level.SEVERE, "Something went terribly wrong!");
Stats.log.log(Level.SEVERE, e.getMessage());
return "";
Element elem_users = this.doc.createElement("users");
/*
* Hier wird das XML aufgebaut
*/
for (String playerName : balances.keySet()){
Element elem_user = this.doc.createElement("user");
elem_user.appendChild(getTextElem("name", playerName));
elem_user.appendChild(getTextElem("balance", String.valueOf(balances.get(playerName))));
elem_users.appendChild(elem_user);
}
/*
* Hier endet der XML-Aufbau
*/
return elem_users;
}
}

View File

@@ -14,22 +14,13 @@
*/
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.DocumentBuilderFactory;
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.Element;
import com.nidefawl.Stats.Stats;
import de.sockenklaus.XmlStats.XmlStats;
import de.sockenklaus.XmlStats.XmlStatsRegistry;
import de.sockenklaus.XmlStats.Datasource.UsersDS;
@@ -44,68 +35,46 @@ public class XmlWorkerUsers extends XmlWorker {
* @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map)
*/
@Override
public String getXML(Map<String, List<String>> parameters) {
public Element getXML(Map<String, List<String>> parameters) {
UsersDS users = new UsersDS();
Element elem_users = this.doc.createElement("users");
elem_users.setAttribute("count", String.valueOf(users.getAllPlayers().size()));
try {
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(writer);
this.tf = TransformerFactory.newInstance();
this.transformer = tf.newTransformer();
Element root = this.doc.createElement("xmlstats");
Element elem_users = this.doc.createElement("users");
elem_users.setAttribute("count", String.valueOf(users.getAllPlayers().size()));
this.doc.appendChild(root);
root.appendChild(elem_users);
/*
* Get list online player names
*/
XmlStats pluginTemp= (XmlStats)XmlStatsRegistry.get("xmlstats");
/*
* Get list online player names
*/
XmlStats pluginTemp= (XmlStats)XmlStatsRegistry.get("xmlstats");
Player[] onlinePlayers = pluginTemp.getServer().getOnlinePlayers();
List<String> onlinePlayerNames = new ArrayList<String>();
Player[] onlinePlayers = pluginTemp.getServer().getOnlinePlayers();
List<String> onlinePlayerNames = new ArrayList<String>();
if (onlinePlayers != null){
for (int i = 0; i < onlinePlayers.length; i++){
onlinePlayerNames.add(onlinePlayers[i].getName());
}
if (onlinePlayers != null){
for (int i = 0; i < onlinePlayers.length; i++){
onlinePlayerNames.add(onlinePlayers[i].getName());
}
/*
* Got list of online player names
*/
}
/*
* Got list of online player names
*/
/*
* Hier wird das XML aufgebaut
*/
/*
* Hier wird das XML aufgebaut
*/
for(String playerName : users.getAllPlayers()){
for(String playerName : users.getAllPlayers()){
Element elem_player = this.doc.createElement("player");
elem_player.setTextContent(playerName);
Element elem_player = this.doc.createElement("user");
elem_player.appendChild(getTextElem("name", playerName));
elem_player.setAttribute("status", onlinePlayerNames.contains(playerName) ? "online":"offline");
elem_player.setAttribute("status", onlinePlayerNames.contains(playerName) ? "online":"offline");
elem_users.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 "";
}
elem_users.appendChild(elem_player);
}
/*
* Hier endet der XML-Aufbau
*/
return elem_users;
}
}

View File

@@ -14,20 +14,12 @@
*/
package de.sockenklaus.XmlStats.XmlWorkers;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Element;
import com.nidefawl.Stats.Stats;
import com.nidefawl.Stats.datasource.Category;
import com.nidefawl.Stats.datasource.PlayerStat;
@@ -52,65 +44,43 @@ public class XmlWorkerUserstats extends XmlWorker {
/* (non-Javadoc)
* @see de.sockenklaus.XmlStats.XmlWorkers.XmlWorker#getXML(java.util.Map)
*/
public String getXML(Map<String, List<String>> parameters) {
try {
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(writer);
this.tf = TransformerFactory.newInstance();
this.transformer = this.tf.newTransformer();
Element root = this.doc.createElement("xmlstats");
Element elem_userstats = this.doc.createElement("userstats");
this.doc.appendChild(root);
root.appendChild(elem_userstats);
/*
* Hier wird das XML aufgebaut
*/
if (!parameters.containsKey("player")){
// Generate a summarized XML
elem_userstats.setAttribute("type", "sum");
elem_userstats.appendChild(getAddedUpStatsElement());
public Element getXML(Map<String, List<String>> parameters) {
Element elem_userstats = this.doc.createElement("userstats");
/*
* Hier wird das XML aufgebaut
*/
if (!parameters.containsKey("player")){
// Generate a summarized XML
elem_userstats.setAttribute("type", "sum");
elem_userstats.appendChild(getAddedUpStatsElement());
}
else {
// Generate the XML for the given user(s)
for(String playerName : statsDS.fetchAllPlayers()){
if (parameters.containsKey("player") && parameters.get("player").contains(playerName.toLowerCase())){
elem_userstats.appendChild(getPlayerElement(playerName));
}
else {
// Generate the XML for the given user(s)
for(String playerName : statsDS.fetchAllPlayers()){
if (parameters.containsKey("user") && parameters.get("user").contains(playerName.toLowerCase())){
elem_userstats.appendChild(getUserElement(playerName));
}
}
/*
* 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 "";
}
/*
* Hier endet der XML-Aufbau
*/
return elem_userstats;
}
/**
* Build a XML subtree for the given player.
*
* @param playerName the player name
* @paramthis.doc thethis.doc
* @return Returns a XML subtree for the given playerName.
* @paramthis.doc thethis.doc
*/
private Element getPlayerElement(String playerName){
private Element getUserElement(String playerName){
PlayerStat player_stats = statsDS.getPlayerStat(playerName);
Element elem_player = this.doc.createElement("player");
Element elem_player = this.doc.createElement("user");
Element elem_cats = this.doc.createElement("categories");
elem_player.appendChild(getTextElem("name", playerName));
@@ -125,22 +95,21 @@ public class XmlWorkerUserstats extends XmlWorker {
elem_cat.appendChild(elem_items);
elem_cats.appendChild(elem_cat);
for(String valName : cat.stats.keySet()){
int value = cat.get(valName);
Element elem_item = this.doc.createElement("item");
elem_item.appendChild(getTextElem("name", valName));
elem_item.appendChild(getTextElem("value", String.valueOf(value)));
elem_items.appendChild(elem_item);
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(){
HashMap<String, HashMap<String, Integer>> addedStats = statsDS.getAddedStats();
Element elem_player = this.doc.createElement("player");
Element elem_player = this.doc.createElement("user");
Element elem_cats = this.doc.createElement("categories");
elem_player.appendChild(elem_cats);
@@ -154,26 +123,27 @@ public class XmlWorkerUserstats extends XmlWorker {
elem_cats.appendChild(elem_cat);
for(String entryName : addedStats.get(catName).keySet()){
Element elem_item = this.doc.createElement("item");
elem_item.appendChild(getTextElem("name", entryName));
elem_item.appendChild(getTextElem("value", String.valueOf(addedStats.get(catName).get(entryName))));
elem_items.appendChild(elem_item);
elem_items.appendChild(getItemElem(entryName, addedStats.get(catName).get(entryName)));
}
elem_cat.appendChild(elem_items);
}
return elem_player;
}
private Element getTextElem(String elemName, String text){
Element result = this.doc.createElement(elemName);
result.setTextContent(text);
return result;
}
private Element getItemElem(String key, String value){
return null;
/**
* 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;
}
}