From 26f4f7d9949733e8d57c033eabea27c5d7e9a90b Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Wed, 18 May 2011 23:29:33 -0500 Subject: [PATCH] Add support for WorldGuard on built-in server, fix getNodes() on new ConfigurationNode class --- .../java/org/dynmap/ConfigurationNode.java | 7 +- src/main/java/org/dynmap/DynmapPlugin.java | 11 ++- src/main/java/org/dynmap/JsonTimerTask.java | 2 +- .../org/dynmap/web/HttpServerConnection.java | 7 ++ .../dynmap/web/handlers/RegionHandler.java | 73 +++++++++++++++++++ 5 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/dynmap/web/handlers/RegionHandler.java diff --git a/src/main/java/org/dynmap/ConfigurationNode.java b/src/main/java/org/dynmap/ConfigurationNode.java index a1f094d4..4d8e3f10 100644 --- a/src/main/java/org/dynmap/ConfigurationNode.java +++ b/src/main/java/org/dynmap/ConfigurationNode.java @@ -132,10 +132,11 @@ public class ConfigurationNode implements Map { } public List getNodes(String path) { - Object o = getObject(path); - if (!(o instanceof List)) { + List o = getList(path); + + if(o == null) return new ArrayList(); - } + ArrayList nodes = new ArrayList(); for(Object i : (List)o) { if (i instanceof Map) { diff --git a/src/main/java/org/dynmap/DynmapPlugin.java b/src/main/java/org/dynmap/DynmapPlugin.java index ad8fd0ac..96d5ad9d 100644 --- a/src/main/java/org/dynmap/DynmapPlugin.java +++ b/src/main/java/org/dynmap/DynmapPlugin.java @@ -46,6 +46,7 @@ import org.dynmap.web.handlers.ClientConfigurationHandler; import org.dynmap.web.handlers.ClientUpdateHandler; import org.dynmap.web.handlers.FilesystemHandler; import org.dynmap.web.handlers.SendMessageHandler; +import org.dynmap.web.handlers.RegionHandler; public class DynmapPlugin extends JavaPlugin { public HttpServer webServer = null; @@ -141,7 +142,15 @@ public class DynmapPlugin extends JavaPlugin { webServer.handlers.put("/tiles/", new FilesystemHandler(tilesDirectory)); webServer.handlers.put("/up/", new ClientUpdateHandler(mapManager, playerList, getServer(), configuration.getBoolean("health-in-json", false))); webServer.handlers.put("/up/configuration", new ClientConfigurationHandler(configuration.getNode("web"))); - + /* See if regions configuration branch is present */ + for(ConfigurationNode type : configuration.getNode("web").getNodes("components")) { + if(type.getString("type").equalsIgnoreCase("regions")) { + String fname = type.getString("filename", "regions.yml"); + fname = "/standalone/" + fname.substring(0, fname.lastIndexOf('.')) + "_"; /* Find our path base */ + webServer.handlers.put(fname + "*", new RegionHandler(type)); + } + } + if (configuration.getNode("web").getBoolean("allowwebchat", false)) { SendMessageHandler messageHandler = new SendMessageHandler() {{ maximumMessageInterval = (configuration.getNode("web").getInteger("webchat-interval", 1) * 1000); diff --git a/src/main/java/org/dynmap/JsonTimerTask.java b/src/main/java/org/dynmap/JsonTimerTask.java index 77451d33..2f4d3db7 100644 --- a/src/main/java/org/dynmap/JsonTimerTask.java +++ b/src/main/java/org/dynmap/JsonTimerTask.java @@ -33,7 +33,7 @@ class JsonTimerTask extends TimerTask { this.server = this.plugin.getServer(); this.mapManager = this.plugin.getMapManager(); this.configuration = config; - for(ConfigurationNode type : configuration.getNodes("web/components")) + for(ConfigurationNode type : configuration.getNode("web").getNodes("components")) if(type.getString("type").equalsIgnoreCase("regions")) { this.regions = type; break; diff --git a/src/main/java/org/dynmap/web/HttpServerConnection.java b/src/main/java/org/dynmap/web/HttpServerConnection.java index 606eb3e3..e6d4eee5 100644 --- a/src/main/java/org/dynmap/web/HttpServerConnection.java +++ b/src/main/java/org/dynmap/web/HttpServerConnection.java @@ -161,6 +161,13 @@ public class HttpServerConnection extends Thread { handler = entry.getValue(); break; } + /* Wildcard handler for non-directory matches */ + else if(key.endsWith("*") && request.path.startsWith(key.substring(0, key.length()-1))) { relativePath = request.path.substring(entry.getKey().length()); + relativePath = request.path.substring(entry.getKey().length()-1); + relativePath = URLDecoder.decode(relativePath,"utf-8"); + handler = entry.getValue(); + break; + } } if (handler == null) { diff --git a/src/main/java/org/dynmap/web/handlers/RegionHandler.java b/src/main/java/org/dynmap/web/handlers/RegionHandler.java new file mode 100644 index 00000000..f1b42bae --- /dev/null +++ b/src/main/java/org/dynmap/web/handlers/RegionHandler.java @@ -0,0 +1,73 @@ +package org.dynmap.web.handlers; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.logging.Level; +import org.bukkit.util.config.Configuration; +import org.dynmap.ConfigurationNode; +import org.dynmap.web.HttpRequest; +import org.dynmap.web.HttpResponse; +import org.dynmap.web.Json; +import java.io.ByteArrayOutputStream; +import java.io.ByteArrayInputStream; + +public class RegionHandler extends FileHandler { + private ConfigurationNode regions; + public RegionHandler(ConfigurationNode regions) { + this.regions = regions; + } + @Override + protected InputStream getFileInput(String path, HttpRequest request, HttpResponse response) { + if(regions == null) + return null; + /* Right path? */ + if(path.endsWith(".json") == false) + return null; + + String worldname = path.substring(0, path.lastIndexOf(".json")); + Configuration regionConfig = null; + File infile; + String regionFile; + + /* If using worldpath, format is either plugins/// OR + * plugins//worlds// + */ + File basepath = new File("plugins", regions.getString("name", "WorldGuard")); + if(basepath.exists() == false) + return null; + if(regions.getBoolean("useworldpath", false)) { + regionFile = worldname + "/" + regions.getString("filename", "regions.yml"); + infile = new File(basepath, regionFile); + if(!infile.exists()) { + infile = new File(basepath, "worlds/" + regionFile); + } + } + else { /* Else, its plugins// */ + regionFile = regions.getString("filename", "regions.yml"); + infile = new File(basepath, regionFile); + } + if(infile.exists()) { + regionConfig = new Configuration(infile); + } + //File didn't exist + if(regionConfig == null) + return null; + regionConfig.load(); + /* Parse region data and store in MemoryInputStream */ + Map regionData = (Map) regionConfig.getProperty(regions.getString("basenode", "regions")); + try { + ByteArrayOutputStream fos = new ByteArrayOutputStream(); + fos.write(Json.stringifyJson(regionData).getBytes()); + fos.close(); + return new ByteArrayInputStream(fos.toByteArray()); + } catch (FileNotFoundException ex) { + log.log(Level.SEVERE, "Exception while writing JSON-file.", ex); + } catch (IOException ioe) { + log.log(Level.SEVERE, "Exception while writing JSON-file.", ioe); + } + return null; + } +}