From 174043fa5835bf5e93e63f6e9cbfbd93b3ad3136 Mon Sep 17 00:00:00 2001 From: Steven Lawson Date: Mon, 26 Aug 2013 21:48:04 -0400 Subject: [PATCH] Getting HTTP server framework ready... --- .../HTTPD/HTMLGenerationTools.java | 37 ++++++++ .../TotalFreedomMod/HTTPD/Module_dump.java | 41 +++++++++ .../TotalFreedomMod/HTTPD/Module_help.java | 62 +++++++++++++ .../TotalFreedomMod/HTTPD/Module_list.java | 72 +++++++++++++++ .../HTTPD/TFM_HTTPDManager.java | 63 ------------- .../HTTPD/TFM_HTTPD_Manager.java | 91 +++++++++++++++++++ .../HTTPD/TFM_HTTPD_Module.java | 31 +++++++ .../HTTPD/TFM_HTTPD_PageBuilder.java | 44 +++++++++ .../TotalFreedomMod/TotalFreedomMod.java | 6 +- 9 files changed, 381 insertions(+), 66 deletions(-) create mode 100644 src/me/StevenLawson/TotalFreedomMod/HTTPD/HTMLGenerationTools.java create mode 100644 src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_dump.java create mode 100644 src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_help.java create mode 100644 src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_list.java delete mode 100644 src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPDManager.java create mode 100644 src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java create mode 100644 src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Module.java create mode 100644 src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_PageBuilder.java diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/HTMLGenerationTools.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/HTMLGenerationTools.java new file mode 100644 index 00000000..20949290 --- /dev/null +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/HTMLGenerationTools.java @@ -0,0 +1,37 @@ +package me.StevenLawson.TotalFreedomMod.HTTPD; + +import java.util.Iterator; +import java.util.Map; + +import static org.apache.commons.lang3.StringEscapeUtils.*; + +public class HTMLGenerationTools +{ + private HTMLGenerationTools() + { + throw new AssertionError(); + } + + public static String paragraph(String data) + { + return "

" + escapeHtml4(data) + "

\r\n"; + } + + public static String mapToHTMLList(Map map) + { + StringBuilder output = new StringBuilder(); + + output.append("\r\n"); + + return output.toString(); + } +} diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_dump.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_dump.java new file mode 100644 index 00000000..fa1d7fed --- /dev/null +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_dump.java @@ -0,0 +1,41 @@ +package me.StevenLawson.TotalFreedomMod.HTTPD; + +import java.util.Map; +import org.apache.commons.lang.StringUtils; + +import static me.StevenLawson.TotalFreedomMod.HTTPD.HTMLGenerationTools.*; + +public class Module_dump extends TFM_HTTPD_Module +{ + public Module_dump(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files) + { + super(uri, method, headers, params, files); + } + + @Override + public String getBody() + { + StringBuilder responseBody = new StringBuilder(); + + String[] args = StringUtils.split(uri, "/"); + + responseBody + .append(paragraph("URI: " + uri)) + .append(paragraph("args (Length: " + args.length + "): " + StringUtils.join(args, ","))) + .append(paragraph("Method: " + method.toString())) + .append(paragraph("Headers:")) + .append(mapToHTMLList(headers)) + .append(paragraph("Params:")) + .append(mapToHTMLList(params)) + .append(paragraph("Files:")) + .append(mapToHTMLList(files)); + + return responseBody.toString(); + } + + @Override + public String getTitle() + { + return "TotalFreedomMod :: Request Debug Dumper"; + } +} diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_help.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_help.java new file mode 100644 index 00000000..0cfd9628 --- /dev/null +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_help.java @@ -0,0 +1,62 @@ +package me.StevenLawson.TotalFreedomMod.HTTPD; + +import java.util.Iterator; +import java.util.Map; +import org.apache.commons.lang.StringEscapeUtils; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +public class Module_help extends TFM_HTTPD_Module +{ + public Module_help(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files) + { + super(uri, method, headers, params, files); + } + + @Override + public String getBody() + { + final StringBuilder body = new StringBuilder(); + + Plugin[] plugins = Bukkit.getPluginManager().getPlugins(); + for (Plugin plugin : plugins) + { + Map> commands = plugin.getDescription().getCommands(); + if (commands != null) + { + Iterator>> it1 = commands.entrySet().iterator(); + while (it1.hasNext()) + { + Map.Entry> next1 = it1.next(); + String key1 = next1.getKey(); + Map value1 = next1.getValue(); + + Iterator> it2 = value1.entrySet().iterator(); + while (it2.hasNext()) + { + Map.Entry next2 = it2.next(); + String key2 = next2.getKey(); + Object value2 = next2.getValue(); + + body + .append("

") + .append(StringEscapeUtils.escapeHtml(key1)) + .append(".") + .append(StringEscapeUtils.escapeHtml(key2)) + .append(" = ") + .append(StringEscapeUtils.escapeHtml(value2.toString())) + .append("

\r\n"); + } + } + } + } + + return body.toString(); + } + + @Override + public String getTitle() + { + return "Module_help"; + } +} diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_list.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_list.java new file mode 100644 index 00000000..561a047e --- /dev/null +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/Module_list.java @@ -0,0 +1,72 @@ +package me.StevenLawson.TotalFreedomMod.HTTPD; + +import java.util.Map; +import me.StevenLawson.TotalFreedomMod.TFM_SuperadminList; +import me.StevenLawson.TotalFreedomMod.TFM_Util; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class Module_list extends TFM_HTTPD_Module +{ + public Module_list(String uri, NanoHTTPD.Method method, Map headers, Map params, Map files) + { + super(uri, method, headers, params, files); + } + + @Override + public String getBody() + { + final StringBuilder body = new StringBuilder(); + + final Player[] onlinePlayers = Bukkit.getOnlinePlayers(); + + body.append("

There are ").append(onlinePlayers.length).append("/").append(Bukkit.getMaxPlayers()).append(" players online:

\r\n"); + + body.append("
    \r\n"); + + for (Player player : onlinePlayers) + { + String prefix = ""; + if (TFM_SuperadminList.isUserSuperadmin(player)) + { + if (TFM_SuperadminList.isSeniorAdmin(player)) + { + prefix = "[SrA]"; + } + else + { + prefix = "[SA]"; + } + + if (TFM_Util.DEVELOPERS.contains(player.getName())) + { + prefix = "[Dev]"; + } + + if (player.getName().equals("markbyron")) + { + prefix = "[Owner]"; + } + } + else + { + if (player.isOp()) + { + prefix = "[OP]"; + } + } + + body.append("
  • ").append(prefix).append(player.getName()).append("
  • \r\n"); + } + + body.append("
\r\n"); + + return body.toString(); + } + + @Override + public String getTitle() + { + return "Total Freedom - Online Users"; + } +} diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPDManager.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPDManager.java deleted file mode 100644 index 45f62e77..00000000 --- a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPDManager.java +++ /dev/null @@ -1,63 +0,0 @@ -package me.StevenLawson.TotalFreedomMod.HTTPD; - -import java.io.IOException; -import java.util.Date; -import java.util.Map; -import me.StevenLawson.TotalFreedomMod.TFM_Log; - -public class TFM_HTTPDManager -{ - public static final int PORT = 28966; - // - private final TFM_HTTPD httpd = new TFM_HTTPD(PORT); - - private TFM_HTTPDManager() - { - } - - public void start() - { - try - { - httpd.start(); - } - catch (IOException ex) - { - TFM_Log.severe(ex); - } - } - - public void stop() - { - httpd.stop(); - } - - private static class TFM_HTTPD extends NanoHTTPD - { - public TFM_HTTPD(int port) - { - super(port); - } - - public TFM_HTTPD(String hostname, int port) - { - super(hostname, port); - } - - @Override - public Response serve(String uri, Method method, Map headers, Map parms, Map files) - { - return new Response("

OK - " + new Date().toString() + "

"); - } - } - - public static TFM_HTTPDManager getInstance() - { - return TFM_HTTPDManagerHolder.INSTANCE; - } - - private static class TFM_HTTPDManagerHolder - { - private static final TFM_HTTPDManager INSTANCE = new TFM_HTTPDManager(); - } -} diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java new file mode 100644 index 00000000..41460d20 --- /dev/null +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Manager.java @@ -0,0 +1,91 @@ +package me.StevenLawson.TotalFreedomMod.HTTPD; + +import java.io.IOException; +import java.util.Map; +import me.StevenLawson.TotalFreedomMod.TFM_Log; +import org.apache.commons.lang.StringUtils; + +public class TFM_HTTPD_Manager +{ + public static final int PORT = 28966; + // + private final TFM_HTTPD httpd = new TFM_HTTPD(PORT); + + private TFM_HTTPD_Manager() + { + } + + public void start() + { + try + { + httpd.start(); + } + catch (IOException ex) + { + TFM_Log.severe(ex); + } + } + + public void stop() + { + httpd.stop(); + } + + private static class TFM_HTTPD extends NanoHTTPD + { + public TFM_HTTPD(int port) + { + super(port); + } + + public TFM_HTTPD(String hostname, int port) + { + super(hostname, port); + } + + @Override + public Response serve(String uri, Method method, Map headers, Map params, Map files) + { + Response response = null; + + final String[] args = StringUtils.split(uri, "/"); + if (args.length >= 1) + { + if ("dump".equalsIgnoreCase(args[0])) + { + response = new Module_dump(uri, method, headers, params, files).getResponse(); + } + else if ("list".equalsIgnoreCase(args[0])) + { + response = new Module_list(uri, method, headers, params, files).getResponse(); + } + else if ("help".equalsIgnoreCase(args[0])) + { + //The issue is that plugin.getDescription().getCommands() only shows commands in the plugin.yml file. + //I need to make another version of this that uses the CommandMap. + response = new Module_help(uri, method, headers, params, files).getResponse(); + } + } + + if (response == null) + { + return new Response(Response.Status.NOT_FOUND, MIME_PLAINTEXT, "Error 404: Not Found - The requested resource was not found on this server."); + } + else + { + return response; + } + } + } + + public static TFM_HTTPD_Manager getInstance() + { + return TFM_HTTPDManagerHolder.INSTANCE; + } + + private static class TFM_HTTPDManagerHolder + { + private static final TFM_HTTPD_Manager INSTANCE = new TFM_HTTPD_Manager(); + } +} diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Module.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Module.java new file mode 100644 index 00000000..d0b728e8 --- /dev/null +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_Module.java @@ -0,0 +1,31 @@ +package me.StevenLawson.TotalFreedomMod.HTTPD; + +import java.util.Map; +import me.StevenLawson.TotalFreedomMod.HTTPD.NanoHTTPD.*; + +public abstract class TFM_HTTPD_Module +{ + protected final String uri; + protected final Method method; + protected final Map headers; + protected final Map params; + protected final Map files; + + public TFM_HTTPD_Module(String uri, Method method, Map headers, Map params, Map files) + { + this.uri = uri; + this.method = method; + this.headers = headers; + this.params = params; + this.files = files; + } + + public abstract String getBody(); + + public abstract String getTitle(); + + public final Response getResponse() + { + return new TFM_HTTPD_PageBuilder(getBody(), getTitle()).getResponse(); + } +} diff --git a/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_PageBuilder.java b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_PageBuilder.java new file mode 100644 index 00000000..ea34b0b5 --- /dev/null +++ b/src/me/StevenLawson/TotalFreedomMod/HTTPD/TFM_HTTPD_PageBuilder.java @@ -0,0 +1,44 @@ +package me.StevenLawson.TotalFreedomMod.HTTPD; + +import me.StevenLawson.TotalFreedomMod.HTTPD.NanoHTTPD.Response; + +public class TFM_HTTPD_PageBuilder +{ + private static final String TEMPLATE = + "\n" + + "\n" + + "\n" + + "{$TITLE}\n" + + "\n" + + "\n" + + "{$BODY}\n" + + "\n"; + // + private String body; + private String title; + + public TFM_HTTPD_PageBuilder() + { + } + + public TFM_HTTPD_PageBuilder(String body, String title) + { + this.body = body; + this.title = title; + } + + public void setBody(String body) + { + this.body = body; + } + + public void setTitle(String title) + { + this.title = title; + } + + public Response getResponse() + { + return new Response(TEMPLATE.replace("{$TITLE}", title).replace("{$BODY}", body)); + } +} diff --git a/src/me/StevenLawson/TotalFreedomMod/TotalFreedomMod.java b/src/me/StevenLawson/TotalFreedomMod/TotalFreedomMod.java index 4f77c251..86a0ee79 100644 --- a/src/me/StevenLawson/TotalFreedomMod/TotalFreedomMod.java +++ b/src/me/StevenLawson/TotalFreedomMod/TotalFreedomMod.java @@ -6,7 +6,7 @@ import java.io.InputStream; import java.util.*; import me.StevenLawson.TotalFreedomMod.Commands.TFM_Command; import me.StevenLawson.TotalFreedomMod.Commands.TFM_CommandLoader; -import me.StevenLawson.TotalFreedomMod.HTTPD.TFM_HTTPDManager; +import me.StevenLawson.TotalFreedomMod.HTTPD.TFM_HTTPD_Manager; import me.StevenLawson.TotalFreedomMod.Listener.*; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.exception.ExceptionUtils; @@ -173,7 +173,7 @@ public class TotalFreedomMod extends JavaPlugin } }.runTaskLater(plugin, 20L); - TFM_HTTPDManager.getInstance().start(); + TFM_HTTPD_Manager.getInstance().start(); TFM_Log.info("Plugin enabled."); } @@ -183,7 +183,7 @@ public class TotalFreedomMod extends JavaPlugin { server.getScheduler().cancelTasks(plugin); - TFM_HTTPDManager.getInstance().stop(); + TFM_HTTPD_Manager.getInstance().stop(); TFM_Log.info("Plugin disabled."); }