From 486a67a013068de6838e4486a5adb6f872bed8dd Mon Sep 17 00:00:00 2001 From: Fuzzlemann Date: Fri, 18 Aug 2017 12:28:11 +0200 Subject: [PATCH 1/9] Simplify PlayersTableCreator#getActivityString Remove @SafeVarargs annotation --- .../main/java/com/djrapitops/plan/Log.java | 1 - .../djrapitops/plan/database/sql/Select.java | 4 +-- .../ui/html/tables/PlayersTableCreator.java | 13 +++++++--- .../plan/utilities/file/dump/DumpLog.java | 3 +-- .../com/djrapitops/plan/SettingsTest.java | 1 - .../data/cache/queue/DataCacheQueueTest.java | 26 +++++++------------ .../utilities/analysis/MathUtilsTest.java | 3 ++- .../plan/utilities/dump/HastebinTest.java | 1 - Plan/test/test/java/utils/TestInit.java | 2 +- 9 files changed, 25 insertions(+), 29 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/Log.java b/Plan/src/main/java/com/djrapitops/plan/Log.java index e218366f9..3215a1a09 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Log.java +++ b/Plan/src/main/java/com/djrapitops/plan/Log.java @@ -77,7 +77,6 @@ public class Log { * @param messages All messages to add to the debug log. * @return full debug complex so far. */ - @SafeVarargs public static DebugInfo debug(String task, String... messages) { DebugInfo debug = getDebug(task); long time = MiscUtils.getTime(); diff --git a/Plan/src/main/java/com/djrapitops/plan/database/sql/Select.java b/Plan/src/main/java/com/djrapitops/plan/database/sql/Select.java index 54bdbd029..44290f9f7 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/sql/Select.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/sql/Select.java @@ -27,11 +27,11 @@ public class Select extends SqlParser { public Select where(String... conditions) { append(" WHERE "); - for (int i = 0; i < conditions.length; i++) { + for (String condition : conditions) { if (this.conditions > 0) { append(" AND "); } - append("(").append(conditions[i]).append(")"); + append("(").append(condition).append(")"); this.conditions++; } return this; diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/html/tables/PlayersTableCreator.java b/Plan/src/main/java/com/djrapitops/plan/ui/html/tables/PlayersTableCreator.java index f9fb368c2..860edc65b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ui/html/tables/PlayersTableCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/ui/html/tables/PlayersTableCreator.java @@ -66,9 +66,14 @@ public class PlayersTableCreator { } private static String getActivityString(boolean isBanned, boolean isUnknown, boolean isActive) { - return isBanned ? "Banned" - : (isUnknown ? "Unknown" - : (isActive ? "Active" - : "Inactive")); + if (isBanned) { + return "Banned"; + } + + if (isUnknown) { + return "Unknown"; + } + + return isActive ? "Active" : "Inactive"; } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/DumpLog.java b/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/DumpLog.java index ff9f92403..6d83af7cb 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/DumpLog.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/DumpLog.java @@ -18,8 +18,7 @@ public class DumpLog { * @param header The name of the header */ public void addHeader(String header) { - addLine(""); - addLine("--- " + header + " ---"); + addLines("", "--- " + header + " ---"); } /** diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/SettingsTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/SettingsTest.java index e591641df..139ea0deb 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/SettingsTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/SettingsTest.java @@ -74,5 +74,4 @@ public class SettingsTest { public void testGetPath() { assertEquals("Settings.WebServer.Enabled", Settings.WEBSERVER_ENABLED.getPath()); } - } diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/data/cache/queue/DataCacheQueueTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/data/cache/queue/DataCacheQueueTest.java index 0a51a584a..93f0f0f15 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/data/cache/queue/DataCacheQueueTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/data/cache/queue/DataCacheQueueTest.java @@ -106,14 +106,11 @@ public class DataCacheQueueTest { public void testGetQueue_cache() { List calls = new ArrayList<>(); List errors = new ArrayList<>(); - handler.getUserDataForProcessing(new DBCallableProcessor() { - @Override - public void process(UserData data) { - if (data.equals(data1)) { - calls.add(1); - } else { - errors.add(1); - } + handler.getUserDataForProcessing(data -> { + if (data.equals(data1)) { + calls.add(1); + } else { + errors.add(1); } }, uuid1); while (calls.size() < 1) { @@ -131,14 +128,11 @@ public class DataCacheQueueTest { public void testGetQueue_dontCache() { List getCalls = new ArrayList<>(); List errors = new ArrayList<>(); - handler.getUserDataForProcessing(new DBCallableProcessor() { - @Override - public void process(UserData data) { - if (data.equals(data1)) { - getCalls.add(1); - } else { - errors.add(1); - } + handler.getUserDataForProcessing(data -> { + if (data.equals(data1)) { + getCalls.add(1); + } else { + errors.add(1); } }, uuid1, false); while (getCalls.size() < 1) { diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/analysis/MathUtilsTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/analysis/MathUtilsTest.java index 96ca6279e..c2bccf330 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/analysis/MathUtilsTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/analysis/MathUtilsTest.java @@ -10,6 +10,7 @@ import org.junit.Test; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Random; @@ -46,7 +47,7 @@ public class MathUtilsTest { */ @Test public void testAverageIntEmpty() { - List l = new ArrayList<>(); + List l = Collections.emptyList(); double exp = 0; double result = MathUtils.averageInt(l.stream()); assertTrue(result + "/" + exp, Double.compare(exp, result) == 0); diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/dump/HastebinTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/dump/HastebinTest.java index be4618503..c0601f67a 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/dump/HastebinTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/dump/HastebinTest.java @@ -46,7 +46,6 @@ public class HastebinTest { /* Ignored */ } - Log.info(link); testLink.set(link); }); diff --git a/Plan/test/test/java/utils/TestInit.java b/Plan/test/test/java/utils/TestInit.java index c24d4c9af..fe6af2826 100644 --- a/Plan/test/test/java/utils/TestInit.java +++ b/Plan/test/test/java/utils/TestInit.java @@ -139,7 +139,7 @@ public class TestInit { @Override public ITask runTask() { - new Thread(() -> runnable.run()).start(); + new Thread(runnable::run).start(); return null; } From bcd008cbbe045b4da2a8fcee4af5c3f96247d152 Mon Sep 17 00:00:00 2001 From: Fuzzlemann Date: Fri, 18 Aug 2017 17:15:23 +0200 Subject: [PATCH 2/9] Sorting ignores now the case --- .../java/com/djrapitops/plan/utilities/file/dump/DumpUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/DumpUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/DumpUtils.java index 23e1fd85f..1f43bd583 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/DumpUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/DumpUtils.java @@ -145,7 +145,7 @@ public class DumpUtils { List plugins = Arrays.stream(server.getPluginManager().getPlugins()) .map(Plugin::getDescription) .map(description -> description.getName() + " " + description.getVersion()) - .sorted() + .sorted(String::compareToIgnoreCase) .collect(Collectors.toList()); log.addHeader("Server Details"); From 82cf6e62fde942eec732a8ffe273593a1a207008 Mon Sep 17 00:00:00 2001 From: Fuzzlemann Date: Fri, 18 Aug 2017 18:00:39 +0200 Subject: [PATCH 3/9] Remove "/" at the CommandInfo --- .../plan/data/listeners/PlanCommandPreprocessListener.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanCommandPreprocessListener.java b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanCommandPreprocessListener.java index 4e74dee7a..5f83ed729 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanCommandPreprocessListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanCommandPreprocessListener.java @@ -43,20 +43,20 @@ public class PlanCommandPreprocessListener implements Listener { return; } - String commandName = event.getMessage().split(" ")[0].toLowerCase(); + String commandName = event.getMessage().substring(1).split(" ")[0].toLowerCase(); boolean doNotLogUnknownCommands = Settings.DO_NOT_LOG_UNKNOWN_COMMANDS.isTrue(); boolean combineCommandAliasesToMainCommand = Settings.COMBINE_COMMAND_ALIASES_TO_MAIN_COMMAND.isTrue(); if (doNotLogUnknownCommands || combineCommandAliasesToMainCommand) { - Command command = plugin.getServer().getPluginCommand(commandName.substring(1, commandName.length())); + Command command = plugin.getServer().getPluginCommand(commandName); if (command == null) { if (doNotLogUnknownCommands) { Log.debug("Ignored command, command is unknown"); return; } } else if (combineCommandAliasesToMainCommand) { - commandName = "/" + command.getName(); + commandName = command.getName(); } } From 751719b35711b1db05e765950fc9885fc315940f Mon Sep 17 00:00:00 2001 From: Fuzzlemann Date: Sat, 19 Aug 2017 16:55:34 +0200 Subject: [PATCH 4/9] Add the Web API for Bukkit --- .../plan/command/commands/AnalyzeCommand.java | 51 ----- .../plan/data/cache/AnalysisCacheHandler.java | 4 +- .../plan/data/cache/InspectCacheHandler.java | 9 +- .../plan/data/cache/PageCacheHandler.java | 12 +- .../plan/ui/webserver/WebServer.java | 197 ++++++++++++++++-- .../response/api/BadRequestResponse.java | 18 ++ .../webserver/response/api/JsonResponse.java | 21 ++ .../response/api/SuccessResponse.java | 18 ++ .../plan/utilities/analysis/Analysis.java | 4 +- .../plan/utilities/file/dump/Hastebin.java | 2 +- 10 files changed, 257 insertions(+), 79 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/ui/webserver/response/api/BadRequestResponse.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/ui/webserver/response/api/JsonResponse.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/ui/webserver/response/api/SuccessResponse.java diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/AnalyzeCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/AnalyzeCommand.java index 9b16bb4d1..7c1df6d7a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/AnalyzeCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/AnalyzeCommand.java @@ -9,14 +9,11 @@ import com.djrapitops.plugin.task.AbsRunnable; import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Permissions; import main.java.com.djrapitops.plan.Plan; -import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.command.ConditionUtils; import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler; import main.java.com.djrapitops.plan.locale.Locale; import main.java.com.djrapitops.plan.locale.Msg; -import main.java.com.djrapitops.plan.ui.text.TextUI; import main.java.com.djrapitops.plan.utilities.Check; -import main.java.com.djrapitops.plan.utilities.HtmlUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils; import org.bukkit.ChatColor; @@ -95,52 +92,4 @@ public class AnalyzeCommand extends SubCommand { analysisCache.sendAnalysisMessage(sender); } } - - private void runMessageSenderTask(ISender sender) { - plugin.getRunnableFactory().createNew("AnalysisMessageSenderTask", new AbsRunnable() { - private int timesRun = 0; - - @Override - public void run() { - timesRun++; - if (analysisCache.isCached() && (!analysisCache.isAnalysisBeingRun() || !analysisCache.isAnalysisEnabled())) { - sendAnalysisMessage(sender); - this.cancel(); - return; - } - if (timesRun > 10) { - Log.debug("Command Timeout Message, Analysis."); - sender.sendMessage(Locale.get(Msg.CMD_FAIL_TIMEOUT).parse("Analysis")); - this.cancel(); - } - } - }).runTaskTimer(TimeAmount.SECOND.ticks(), 5 * TimeAmount.SECOND.ticks()); - } - - /** - * Used to send the message after /plan analysis. - *

- * Final because - * - * @param sender Command sender. - */ - private void sendAnalysisMessage(ISender sender) { - boolean textUI = Settings.USE_ALTERNATIVE_UI.isTrue(); - sender.sendMessage(Locale.get(Msg.CMD_HEADER_ANALYZE).toString()); - if (textUI) { - sender.sendMessage(TextUI.getAnalysisMessages()); - } else { - // Link - String url = HtmlUtils.getServerAnalysisUrlWithProtocol(); - String message = Locale.get(Msg.CMD_INFO_LINK).toString(); - boolean console = !CommandUtils.isPlayer(sender); - if (console) { - sender.sendMessage(message + url); - } else { - sender.sendMessage(message); - sender.sendLink(" ", Locale.get(Msg.CMD_INFO_CLICK_ME).toString(), url); - } - } - sender.sendMessage(Locale.get(Msg.CMD_CONSTANT_FOOTER).toString()); - } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/AnalysisCacheHandler.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/AnalysisCacheHandler.java index b2f1148ce..5ae3c3409 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/AnalysisCacheHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/AnalysisCacheHandler.java @@ -64,9 +64,7 @@ public class AnalysisCacheHandler { cache = data; for (UUID uuid : notifyWhenCached) { Optional player = plugin.fetch().getPlayer(uuid); - if (player.isPresent()) { - sendAnalysisMessage(player.get()); - } + player.ifPresent(this::sendAnalysisMessage); } notifyWhenCached.clear(); } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/InspectCacheHandler.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/InspectCacheHandler.java index 75474227f..dc92bee39 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/InspectCacheHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/InspectCacheHandler.java @@ -5,6 +5,7 @@ import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.database.Database; import main.java.com.djrapitops.plan.ui.webserver.response.InspectPageResponse; +import main.java.com.djrapitops.plan.ui.webserver.response.api.JsonResponse; import main.java.com.djrapitops.plan.utilities.HtmlUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.analysis.ExportUtility; @@ -46,9 +47,13 @@ public class InspectCacheHandler { */ public void cache(UUID uuid) { DBCallableProcessor cacher = data -> { - cache.put(uuid, new UserData(data)); + UserData userData = new UserData(data); + + cache.put(uuid, userData); cacheTimes.put(uuid, MiscUtils.getTime()); - PageCacheHandler.cachePage("inspectPage: " + uuid.toString(), () -> new InspectPageResponse(Plan.getInstance().getUiServer().getDataReqHandler(), uuid)); + + PageCacheHandler.cachePage("inspectPage: " + uuid, () -> new InspectPageResponse(Plan.getInstance().getUiServer().getDataReqHandler(), uuid)); + PageCacheHandler.cachePage("inspectionJson: " + uuid, () -> new JsonResponse(userData)); try { ExportUtility.writeInspectHtml(data, ExportUtility.getPlayersFolder(ExportUtility.getFolder()), HtmlUtils.getStringFromResource("player.html")); diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/PageCacheHandler.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/PageCacheHandler.java index 55af7836a..dfd4a9553 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/PageCacheHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/PageCacheHandler.java @@ -44,7 +44,7 @@ public class PageCacheHandler { * @return The Response that was cached or created by the {@link PageLoader loader} */ public static Response loadPage(String identifier, PageLoader loader) { - Response response = pageCache.getIfPresent(identifier); + Response response = loadPage(identifier); if (response != null) { return response; @@ -57,6 +57,16 @@ public class PageCacheHandler { return response; } + /** + * Loads the page from the page cache. + * + * @param identifier The identifier of the page + * @return The Response that was cached or {@code null} if it wasn't + */ + public static Response loadPage(String identifier) { + return pageCache.getIfPresent(identifier); + } + /** * Puts the page into the page cache. *

diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java index b8fb2903d..fc04459e2 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java @@ -5,6 +5,7 @@ import com.sun.net.httpserver.*; import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Settings; +import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.WebUser; import main.java.com.djrapitops.plan.data.cache.PageCacheHandler; import main.java.com.djrapitops.plan.database.tables.SecurityTable; @@ -12,11 +13,15 @@ import main.java.com.djrapitops.plan.locale.Locale; import main.java.com.djrapitops.plan.locale.Msg; import main.java.com.djrapitops.plan.ui.html.DataRequestHandler; import main.java.com.djrapitops.plan.ui.webserver.response.*; +import main.java.com.djrapitops.plan.ui.webserver.response.api.BadRequestResponse; +import main.java.com.djrapitops.plan.ui.webserver.response.api.JsonResponse; +import main.java.com.djrapitops.plan.ui.webserver.response.api.SuccessResponse; import main.java.com.djrapitops.plan.utilities.Benchmark; import main.java.com.djrapitops.plan.utilities.HtmlUtils; import main.java.com.djrapitops.plan.utilities.PassEncryptUtil; import main.java.com.djrapitops.plan.utilities.uuid.UUIDUtility; import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; import javax.net.ssl.*; import java.io.*; @@ -26,9 +31,7 @@ import java.nio.file.Paths; import java.security.*; import java.security.cert.Certificate; import java.security.cert.CertificateException; -import java.util.Base64; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -84,11 +87,30 @@ public class WebServer { @Override public void handle(HttpExchange exchange) throws IOException { try { + Headers responseHeaders = exchange.getResponseHeaders(); URI uri = exchange.getRequestURI(); String target = uri.toString(); - Headers responseHeaders = exchange.getResponseHeaders(); - responseHeaders.set("Content-Type", "text/html;"); + boolean apiRequest = "POST".equals(exchange.getRequestMethod()); + Response response = null; + + String type = "text/html;"; + + if (apiRequest) { + response = getAPIResponse(target, exchange); + + if (response instanceof JsonResponse) { + type = "application/json;"; + } + } + + responseHeaders.set("Content-Type", type); + + if (apiRequest) { + sendData(responseHeaders, exchange, response); + return; + } + WebUser user = null; if (usingHttps) { @@ -100,21 +122,9 @@ public class WebServer { } } - responseHeaders.set("Content-Encoding", "gzip"); + response = getResponse(target, user); - Response response = getResponse(target, user); - - String content = response.getContent(); - exchange.sendResponseHeaders(response.getCode(), 0); - - try (GZIPOutputStream out = new GZIPOutputStream(exchange.getResponseBody()); - ByteArrayInputStream bis = new ByteArrayInputStream(content.getBytes())) { - byte[] buffer = new byte[2048]; - int count; - while ((count = bis.read(buffer)) != -1) { - out.write(buffer, 0, count); - } - } + sendData(responseHeaders, exchange, response); } catch (Exception e) { Log.toLog(this.getClass().getName(), e); throw e; @@ -136,6 +146,20 @@ public class WebServer { } } + private void sendData(Headers header, HttpExchange exchange, Response response) throws IOException { + header.set("Content-Encoding", "gzip"); + exchange.sendResponseHeaders(response.getCode(), 0); + + try (GZIPOutputStream out = new GZIPOutputStream(exchange.getResponseBody()); + ByteArrayInputStream bis = new ByteArrayInputStream(response.getContent().getBytes())) { + byte[] buffer = new byte[2048]; + int count; + while ((count = bis.read(buffer)) != -1) { + out.write(buffer, 0, count); + } + } + } + private WebUser getUser(Headers requestHeaders) { Benchmark.start("getUser"); try { @@ -243,6 +267,137 @@ public class WebServer { return startSuccessful; } + private String readPOSTRequest(HttpExchange exchange) throws IOException { + try (InputStream in = exchange.getRequestBody()) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte buf[] = new byte[4096]; + for (int n = in.read(buf); n > 0; n = in.read(buf)) { + out.write(buf, 0, n); + } + return new String(out.toByteArray(), "ISO-8859-1"); + } + } + + private Response getAPIResponse(String target, HttpExchange exchange) throws IOException { + String[] args = target.split("/"); + + if (args.length < 3) { + String error = "API Method not specified"; + return PageCacheHandler.loadPage(error, () -> new NotFoundResponse(error)); + } + + String method = args[2]; + String response = readPOSTRequest(exchange); + Map variables = readVariables(response); + + //TODO ADD CHECK IF SERVER KEY VALID + + Plan plan = Plan.getInstance(); + + String playerString; + UUID uuid; + String identifier; + + switch (method) { + //TODO Add Bungee APIs + case "analyze": + plan.getAnalysisCache().updateCache(); + return PageCacheHandler.loadPage("success", SuccessResponse::new); + case "inspect": + playerString = variables.get("player"); + + if (playerString == null) { + String error = "Player String not included"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + uuid = UUIDUtility.getUUIDOf(playerString); + + if (uuid == null) { + String error = "UUID not found"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + Plan.getInstance().getInspectCache().cache(uuid); + + return PageCacheHandler.loadPage("success", SuccessResponse::new); + case "analysis": + case "analytics": + identifier = "analysisJson"; + if (!PageCacheHandler.isCached(identifier)) { + return PageCacheHandler.loadPage("No Analysis Data", () -> new BadRequestResponse("No analysis data available")); + } + + return PageCacheHandler.loadPage(identifier); + case "inspection": + playerString = variables.get("player"); + + if (playerString == null) { + String error = "Player String not included"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + uuid = UUIDUtility.getUUIDOf(playerString); + + if (uuid == null) { + String error = "UUID not found"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + UserData userData = plan.getInspectCache().getFromCache(uuid); + + if (userData == null) { + String error = "User not cached"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + return PageCacheHandler.loadPage("inspectionJson: " + uuid, () -> new JsonResponse(plan.getInspectCache().getFromCache(uuid))); + case "configure": + String key = variables.get("configKey"); + + if (key == null) { + String error = "Config Key null"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + String value = variables.get("configValue"); + + if (value == null) { + String error = "Config Value null"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + if (value.equals("null")) { + value = null; + } + + FileConfiguration config = plan.getConfig(); + config.set(key, value); + plan.saveConfig(); + + return PageCacheHandler.loadPage("success", SuccessResponse::new); + default: + String error = "API Method not found"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + } + + private Map readVariables(String response) { + Map variableMap = new HashMap<>(); + String[] variables = response.split("&"); + + for (String variable : variables) { + String[] splittedVariables = variable.split("=", 2); + if (splittedVariables.length != 2) { + continue; + } + + variableMap.put(splittedVariables[0], splittedVariables[1]); + } + + return variableMap; + } + private Response getResponse(String target, WebUser user) { if ("/favicon.ico".equals(target)) { return PageCacheHandler.loadPage("Redirect: favicon", () -> new RedirectResponse("https://puu.sh/tK0KL/6aa2ba141b.ico")); @@ -259,6 +414,7 @@ public class WebServer { return forbiddenResponse(permLevel, required); } } + String[] args = target.split("/"); if (args.length < 2) { return rootPageResponse(user); @@ -294,6 +450,7 @@ public class WebServer { if (user == null) { return notFoundResponse(); } + switch (user.getPermLevel()) { case 0: return serverResponse(); @@ -333,7 +490,7 @@ public class WebServer { return PageCacheHandler.loadPage("notFound: " + error, () -> new NotFoundResponse(error)); } - return PageCacheHandler.loadPage("inspectPage: " + uuid.toString(), () -> new InspectPageResponse(dataReqHandler, uuid)); + return PageCacheHandler.loadPage("inspectPage: " + uuid, () -> new InspectPageResponse(dataReqHandler, uuid)); } private Response notFoundResponse() { diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/response/api/BadRequestResponse.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/response/api/BadRequestResponse.java new file mode 100644 index 000000000..b56aa996c --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/response/api/BadRequestResponse.java @@ -0,0 +1,18 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package main.java.com.djrapitops.plan.ui.webserver.response.api; + +import main.java.com.djrapitops.plan.ui.webserver.response.Response; + +/** + * @author Fuzzlemann + */ +public class BadRequestResponse extends Response { + + public BadRequestResponse(String error) { + super.setHeader("HTTP/1.1 400 Bad Request"); + super.setContent(error); + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/response/api/JsonResponse.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/response/api/JsonResponse.java new file mode 100644 index 000000000..65b388215 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/response/api/JsonResponse.java @@ -0,0 +1,21 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package main.java.com.djrapitops.plan.ui.webserver.response.api; + +import com.google.gson.Gson; +import main.java.com.djrapitops.plan.ui.webserver.response.Response; + +/** + * @author Fuzzlemann + */ +public class JsonResponse extends Response { + + public JsonResponse(T object) { + Gson gson = new Gson(); + + super.setHeader("HTTP/1.1 200 OK"); + super.setContent(gson.toJson(object)); + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/response/api/SuccessResponse.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/response/api/SuccessResponse.java new file mode 100644 index 000000000..d4356f0c2 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/response/api/SuccessResponse.java @@ -0,0 +1,18 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package main.java.com.djrapitops.plan.ui.webserver.response.api; + +import main.java.com.djrapitops.plan.ui.webserver.response.Response; + +/** + * @author Fuzzlemann + */ +public class SuccessResponse extends Response { + + public SuccessResponse() { + super.setHeader("HTTP/1.1 200 OK"); + super.setContent("Success"); + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java index 739e05891..5988d18b4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java @@ -20,6 +20,7 @@ import main.java.com.djrapitops.plan.locale.Msg; import main.java.com.djrapitops.plan.ui.html.tables.PlayersTableCreator; import main.java.com.djrapitops.plan.ui.webserver.response.AnalysisPageResponse; import main.java.com.djrapitops.plan.ui.webserver.response.PlayersPageResponse; +import main.java.com.djrapitops.plan.ui.webserver.response.api.JsonResponse; import main.java.com.djrapitops.plan.utilities.Benchmark; import main.java.com.djrapitops.plan.utilities.HtmlUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils; @@ -165,8 +166,9 @@ public class Analysis { Log.info(Locale.get(Msg.ANALYSIS_FINISHED).parse(String.valueOf(time), HtmlUtils.getServerAnalysisUrlWithProtocol())); } - PageCacheHandler.removeIf(identifier -> identifier.startsWith("inspectPage: ")); + PageCacheHandler.removeIf(identifier -> identifier.startsWith("inspectPage: ") || identifier.startsWith("inspectionJson: ")); PageCacheHandler.cachePage("analysisPage", () -> new AnalysisPageResponse(plugin.getUiServer().getDataReqHandler())); + PageCacheHandler.cachePage("analysisJson", () -> new JsonResponse(analysisData)); PageCacheHandler.cachePage("players", () -> new PlayersPageResponse(plugin)); ExportUtility.export(analysisData, rawData); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/Hastebin.java b/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/Hastebin.java index ed8266088..d6f17206d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/Hastebin.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/Hastebin.java @@ -37,7 +37,7 @@ public class Hastebin { */ public static String safeUpload(String content) { List parts = ImmutableList.copyOf(split(content)).reverse(); - + String lastLink = null; try { for (String part : parts) { From 67152ea5cca12ceb92efdf5fc15822b05b214835 Mon Sep 17 00:00:00 2001 From: Fuzzlemann Date: Sat, 19 Aug 2017 17:18:38 +0200 Subject: [PATCH 5/9] Remove a whitespace --- .../java/com/djrapitops/plan/utilities/file/dump/Hastebin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/Hastebin.java b/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/Hastebin.java index d6f17206d..ed8266088 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/Hastebin.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/Hastebin.java @@ -37,7 +37,7 @@ public class Hastebin { */ public static String safeUpload(String content) { List parts = ImmutableList.copyOf(split(content)).reverse(); - + String lastLink = null; try { for (String part : parts) { From 971007b5898d8a395f7408ec16f9fa6c9830c27e Mon Sep 17 00:00:00 2001 From: Fuzzlemann Date: Sat, 19 Aug 2017 18:03:56 +0200 Subject: [PATCH 6/9] Outsource the Web APIs into their own separate classes --- .../main/java/com/djrapitops/plan/Plan.java | 15 ++- .../plan/ui/webserver/WebServer.java | 95 ++----------------- .../webserver/api/bukkit/AnalyticsWebAPI.java | 29 ++++++ .../webserver/api/bukkit/AnalyzeWebAPI.java | 24 +++++ .../webserver/api/bukkit/ConfigureWebAPI.java | 47 +++++++++ .../webserver/api/bukkit/InspectWebAPI.java | 42 ++++++++ .../api/bukkit/InspectionWebAPI.java | 48 ++++++++++ .../plan/utilities/webserver/api/WebAPI.java | 18 ++++ .../webserver/api/WebAPIManager.java | 23 +++++ 9 files changed, 253 insertions(+), 88 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/AnalyticsWebAPI.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/AnalyzeWebAPI.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/ConfigureWebAPI.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/InspectWebAPI.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/InspectionWebAPI.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/webserver/api/WebAPI.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/webserver/api/WebAPIManager.java diff --git a/Plan/src/main/java/com/djrapitops/plan/Plan.java b/Plan/src/main/java/com/djrapitops/plan/Plan.java index 2717d5455..a2e0e28bf 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Plan.java +++ b/Plan/src/main/java/com/djrapitops/plan/Plan.java @@ -40,10 +40,12 @@ import main.java.com.djrapitops.plan.database.databases.SQLiteDB; import main.java.com.djrapitops.plan.locale.Locale; import main.java.com.djrapitops.plan.locale.Msg; import main.java.com.djrapitops.plan.ui.webserver.WebServer; +import main.java.com.djrapitops.plan.ui.webserver.api.bukkit.*; import main.java.com.djrapitops.plan.utilities.Benchmark; import main.java.com.djrapitops.plan.utilities.Check; import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.metrics.BStats; +import main.java.com.djrapitops.plan.utilities.webserver.api.WebAPIManager; import org.apache.logging.log4j.LogManager; import org.bukkit.ChatColor; @@ -174,6 +176,7 @@ public class Plan extends BukkitPlugin { if (analysisRefreshTaskIsEnabled) { startAnalysisRefreshTask(analysisRefreshMinutes); } + Benchmark.stop("Enable", "Analysis refresh task registration"); Benchmark.start("WebServer Initialization"); @@ -185,6 +188,7 @@ public class Plan extends BukkitPlugin { uiServer = new WebServer(this); if (webserverIsEnabled) { + registerWebAPIs(); uiServer.initServer(); if (!uiServer.isEnabled()) { @@ -198,6 +202,7 @@ public class Plan extends BukkitPlugin { if (!usingAlternativeIP && serverVariableHolder.getIp().isEmpty()) { Log.infoColor(Locale.get(Msg.ENABLE_NOTIFY_EMPTY_IP).toString()); } + Benchmark.stop("Enable", "WebServer Initialization"); registerCommand(new PlanCommand(this)); @@ -293,6 +298,14 @@ public class Plan extends BukkitPlugin { Benchmark.stop("Enable", "Register Listeners"); } + private void registerWebAPIs() { + WebAPIManager.registerNewAPI("analytics", new AnalyticsWebAPI()); + WebAPIManager.registerNewAPI("analyze", new AnalyzeWebAPI()); + WebAPIManager.registerNewAPI("configure", new ConfigureWebAPI()); + WebAPIManager.registerNewAPI("inspection", new InspectionWebAPI()); + WebAPIManager.registerNewAPI("inspect", new InspectWebAPI()); + } + /** * Initializes the database according to settings in the config. *

@@ -300,7 +313,7 @@ public class Plan extends BukkitPlugin { * * @return true if init was successful, false if not. */ - public boolean initDatabase() { + private boolean initDatabase() { databases = new HashSet<>(); databases.add(new MySQLDB(this)); databases.add(new SQLiteDB(this)); diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java index fc04459e2..da7d0236b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java @@ -5,7 +5,6 @@ import com.sun.net.httpserver.*; import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Settings; -import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.WebUser; import main.java.com.djrapitops.plan.data.cache.PageCacheHandler; import main.java.com.djrapitops.plan.database.tables.SecurityTable; @@ -15,13 +14,13 @@ import main.java.com.djrapitops.plan.ui.html.DataRequestHandler; import main.java.com.djrapitops.plan.ui.webserver.response.*; import main.java.com.djrapitops.plan.ui.webserver.response.api.BadRequestResponse; import main.java.com.djrapitops.plan.ui.webserver.response.api.JsonResponse; -import main.java.com.djrapitops.plan.ui.webserver.response.api.SuccessResponse; import main.java.com.djrapitops.plan.utilities.Benchmark; import main.java.com.djrapitops.plan.utilities.HtmlUtils; import main.java.com.djrapitops.plan.utilities.PassEncryptUtil; import main.java.com.djrapitops.plan.utilities.uuid.UUIDUtility; +import main.java.com.djrapitops.plan.utilities.webserver.api.WebAPI; +import main.java.com.djrapitops.plan.utilities.webserver.api.WebAPIManager; import org.bukkit.ChatColor; -import org.bukkit.configuration.file.FileConfiguration; import javax.net.ssl.*; import java.io.*; @@ -294,92 +293,14 @@ public class WebServer { Plan plan = Plan.getInstance(); - String playerString; - UUID uuid; - String identifier; + WebAPI api = WebAPIManager.getAPI(method); - switch (method) { - //TODO Add Bungee APIs - case "analyze": - plan.getAnalysisCache().updateCache(); - return PageCacheHandler.loadPage("success", SuccessResponse::new); - case "inspect": - playerString = variables.get("player"); - - if (playerString == null) { - String error = "Player String not included"; - return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); - } - - uuid = UUIDUtility.getUUIDOf(playerString); - - if (uuid == null) { - String error = "UUID not found"; - return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); - } - - Plan.getInstance().getInspectCache().cache(uuid); - - return PageCacheHandler.loadPage("success", SuccessResponse::new); - case "analysis": - case "analytics": - identifier = "analysisJson"; - if (!PageCacheHandler.isCached(identifier)) { - return PageCacheHandler.loadPage("No Analysis Data", () -> new BadRequestResponse("No analysis data available")); - } - - return PageCacheHandler.loadPage(identifier); - case "inspection": - playerString = variables.get("player"); - - if (playerString == null) { - String error = "Player String not included"; - return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); - } - - uuid = UUIDUtility.getUUIDOf(playerString); - - if (uuid == null) { - String error = "UUID not found"; - return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); - } - - UserData userData = plan.getInspectCache().getFromCache(uuid); - - if (userData == null) { - String error = "User not cached"; - return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); - } - - return PageCacheHandler.loadPage("inspectionJson: " + uuid, () -> new JsonResponse(plan.getInspectCache().getFromCache(uuid))); - case "configure": - String key = variables.get("configKey"); - - if (key == null) { - String error = "Config Key null"; - return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); - } - - String value = variables.get("configValue"); - - if (value == null) { - String error = "Config Value null"; - return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); - } - - if (value.equals("null")) { - value = null; - } - - FileConfiguration config = plan.getConfig(); - config.set(key, value); - plan.saveConfig(); - - return PageCacheHandler.loadPage("success", SuccessResponse::new); - default: - String error = "API Method not found"; - return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + if (api == null) { + String error = "API Method not found"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); } + + return api.onResponse(plan, variables); } private Map readVariables(String response) { diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/AnalyticsWebAPI.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/AnalyticsWebAPI.java new file mode 100644 index 000000000..bb5dba3ac --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/AnalyticsWebAPI.java @@ -0,0 +1,29 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package main.java.com.djrapitops.plan.ui.webserver.api.bukkit; + +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.data.cache.PageCacheHandler; +import main.java.com.djrapitops.plan.ui.webserver.response.Response; +import main.java.com.djrapitops.plan.ui.webserver.response.api.BadRequestResponse; +import main.java.com.djrapitops.plan.utilities.webserver.api.WebAPI; + +import java.util.Map; + +/** + * @author Fuzzlemann + */ +public class AnalyticsWebAPI implements WebAPI { + @Override + public Response onResponse(Plan plan, Map variables) { + String identifier = "analysisJson"; + + if (!PageCacheHandler.isCached(identifier)) { + return PageCacheHandler.loadPage("No Analysis Data", () -> new BadRequestResponse("No analysis data available")); + } + + return PageCacheHandler.loadPage(identifier); + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/AnalyzeWebAPI.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/AnalyzeWebAPI.java new file mode 100644 index 000000000..37d1838d3 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/AnalyzeWebAPI.java @@ -0,0 +1,24 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package main.java.com.djrapitops.plan.ui.webserver.api.bukkit; + +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.data.cache.PageCacheHandler; +import main.java.com.djrapitops.plan.ui.webserver.response.Response; +import main.java.com.djrapitops.plan.ui.webserver.response.api.SuccessResponse; +import main.java.com.djrapitops.plan.utilities.webserver.api.WebAPI; + +import java.util.Map; + +/** + * @author Fuzzlemann + */ +public class AnalyzeWebAPI implements WebAPI { + @Override + public Response onResponse(Plan plan, Map variables) { + plan.getAnalysisCache().updateCache(); + return PageCacheHandler.loadPage("success", SuccessResponse::new); + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/ConfigureWebAPI.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/ConfigureWebAPI.java new file mode 100644 index 000000000..562a01d9e --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/ConfigureWebAPI.java @@ -0,0 +1,47 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package main.java.com.djrapitops.plan.ui.webserver.api.bukkit; + +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.data.cache.PageCacheHandler; +import main.java.com.djrapitops.plan.ui.webserver.response.Response; +import main.java.com.djrapitops.plan.ui.webserver.response.api.BadRequestResponse; +import main.java.com.djrapitops.plan.ui.webserver.response.api.SuccessResponse; +import main.java.com.djrapitops.plan.utilities.webserver.api.WebAPI; +import org.bukkit.configuration.file.FileConfiguration; + +import java.util.Map; + +/** + * @author Fuzzlemann + */ +public class ConfigureWebAPI implements WebAPI { + @Override + public Response onResponse(Plan plan, Map variables) { + String key = variables.get("configKey"); + + if (key == null) { + String error = "Config Key null"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + String value = variables.get("configValue"); + + if (value == null) { + String error = "Config Value null"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + if (value.equals("null")) { + value = null; + } + + FileConfiguration config = plan.getConfig(); + config.set(key, value); + plan.saveConfig(); + + return PageCacheHandler.loadPage("success", SuccessResponse::new); + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/InspectWebAPI.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/InspectWebAPI.java new file mode 100644 index 000000000..0b4d759b8 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/InspectWebAPI.java @@ -0,0 +1,42 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package main.java.com.djrapitops.plan.ui.webserver.api.bukkit; + +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.data.cache.PageCacheHandler; +import main.java.com.djrapitops.plan.ui.webserver.response.Response; +import main.java.com.djrapitops.plan.ui.webserver.response.api.BadRequestResponse; +import main.java.com.djrapitops.plan.ui.webserver.response.api.SuccessResponse; +import main.java.com.djrapitops.plan.utilities.uuid.UUIDUtility; +import main.java.com.djrapitops.plan.utilities.webserver.api.WebAPI; + +import java.util.Map; +import java.util.UUID; + +/** + * @author Fuzzlemann + */ +public class InspectWebAPI implements WebAPI { + @Override + public Response onResponse(Plan plan, Map variables) { + String playerString = variables.get("player"); + + if (playerString == null) { + String error = "Player String not included"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + UUID uuid = UUIDUtility.getUUIDOf(playerString); + + if (uuid == null) { + String error = "UUID not found"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + Plan.getInstance().getInspectCache().cache(uuid); + + return PageCacheHandler.loadPage("success", SuccessResponse::new); + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/InspectionWebAPI.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/InspectionWebAPI.java new file mode 100644 index 000000000..95c975f7d --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/InspectionWebAPI.java @@ -0,0 +1,48 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package main.java.com.djrapitops.plan.ui.webserver.api.bukkit; + +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.data.UserData; +import main.java.com.djrapitops.plan.data.cache.PageCacheHandler; +import main.java.com.djrapitops.plan.ui.webserver.response.Response; +import main.java.com.djrapitops.plan.ui.webserver.response.api.BadRequestResponse; +import main.java.com.djrapitops.plan.ui.webserver.response.api.JsonResponse; +import main.java.com.djrapitops.plan.utilities.uuid.UUIDUtility; +import main.java.com.djrapitops.plan.utilities.webserver.api.WebAPI; + +import java.util.Map; +import java.util.UUID; + +/** + * @author Fuzzlemann + */ +public class InspectionWebAPI implements WebAPI { + @Override + public Response onResponse(Plan plan, Map variables) { + String playerString = variables.get("player"); + + if (playerString == null) { + String error = "Player String not included"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + UUID uuid = UUIDUtility.getUUIDOf(playerString); + + if (uuid == null) { + String error = "UUID not found"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + UserData userData = plan.getInspectCache().getFromCache(uuid); + + if (userData == null) { + String error = "User not cached"; + return PageCacheHandler.loadPage(error, () -> new BadRequestResponse(error)); + } + + return PageCacheHandler.loadPage("inspectionJson: " + uuid, () -> new JsonResponse(plan.getInspectCache().getFromCache(uuid))); + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/webserver/api/WebAPI.java b/Plan/src/main/java/com/djrapitops/plan/utilities/webserver/api/WebAPI.java new file mode 100644 index 000000000..7cf63fe41 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/webserver/api/WebAPI.java @@ -0,0 +1,18 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package main.java.com.djrapitops.plan.utilities.webserver.api; + +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.ui.webserver.response.Response; + +import java.util.Map; + +/** + * @author Fuzzlemann + */ +public interface WebAPI { + + Response onResponse(Plan plan, Map variables); +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/webserver/api/WebAPIManager.java b/Plan/src/main/java/com/djrapitops/plan/utilities/webserver/api/WebAPIManager.java new file mode 100644 index 000000000..e72429808 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/webserver/api/WebAPIManager.java @@ -0,0 +1,23 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package main.java.com.djrapitops.plan.utilities.webserver.api; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Fuzzlemann + */ +public class WebAPIManager { + private static Map registry = new HashMap<>(); + + public static void registerNewAPI(String method, WebAPI api) { + registry.put(method.toLowerCase(), api); + } + + public static WebAPI getAPI(String method) { + return registry.get(method.toLowerCase()); + } +} From c37b0c8941dd2d32b0b66e021ad13e2f1149a116 Mon Sep 17 00:00:00 2001 From: Fuzzlemann Date: Sun, 20 Aug 2017 02:07:19 +0200 Subject: [PATCH 7/9] Replace the old placeholder system with the new one (%PLACEHOLDER% -> ${PLACEHOLDER}) --- .../plan/data/analysis/RawData.java | 25 ++----- .../plan/ui/webserver/WebServer.java | 2 +- .../webserver/api/bukkit/ConfigureWebAPI.java | 1 + .../djrapitops/plan/utilities/HtmlUtils.java | 10 +-- .../webserver/api/WebAPIManager.java | 8 +++ .../plan/utilities/HtmlUtilsTest.java | 70 ++++++++----------- 6 files changed, 46 insertions(+), 70 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/data/analysis/RawData.java b/Plan/src/main/java/com/djrapitops/plan/data/analysis/RawData.java index fd0b485d4..71aebb51c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/analysis/RawData.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/analysis/RawData.java @@ -72,24 +72,7 @@ public abstract class RawData { * @param value Any value the placeholder should be replaced with. */ public void addValue(String placeholder, Serializable value) { - replaceMap.put(addPlaceholderSigns(placeholder), value.toString()); - } - - private String addPlaceholderSigns(String placeholder) { - StringBuilder newPlaceholder = new StringBuilder(); - - if (placeholder.charAt(0) != '%') { - newPlaceholder.append("%"); - } - - newPlaceholder.append(placeholder); - int lastIndex = placeholder.length() - 1; - - if (placeholder.charAt(lastIndex) != '%') { - newPlaceholder.append("%"); - } - - return newPlaceholder.toString(); + replaceMap.put(placeholder, value.toString()); } /** @@ -102,12 +85,12 @@ public abstract class RawData { } /** - * Used to get the value for a placeholder with or without the % symbols. + * Used to get the value for a placeholder without the placeholder prefix and suffix. * - * @param key placeholder with or without % symbols. + * @param key placeholder without the prefix and suffix * @return Value the placeholder should be replaced with or null. */ public String get(String key) { - return replaceMap.get(addPlaceholderSigns(key)); + return replaceMap.get(key); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java index da7d0236b..7e2a9626c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/WebServer.java @@ -269,7 +269,7 @@ public class WebServer { private String readPOSTRequest(HttpExchange exchange) throws IOException { try (InputStream in = exchange.getRequestBody()) { ByteArrayOutputStream out = new ByteArrayOutputStream(); - byte buf[] = new byte[4096]; + byte[] buf = new byte[4096]; for (int n = in.read(buf); n > 0; n = in.read(buf)) { out.write(buf, 0, n); } diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/ConfigureWebAPI.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/ConfigureWebAPI.java index 562a01d9e..57e3964e3 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/ConfigureWebAPI.java +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/api/bukkit/ConfigureWebAPI.java @@ -10,6 +10,7 @@ import main.java.com.djrapitops.plan.ui.webserver.response.Response; import main.java.com.djrapitops.plan.ui.webserver.response.api.BadRequestResponse; import main.java.com.djrapitops.plan.ui.webserver.response.api.SuccessResponse; import main.java.com.djrapitops.plan.utilities.webserver.api.WebAPI; +import org.apache.commons.lang3.text.translate.CharSequenceTranslator; import org.bukkit.configuration.file.FileConfiguration; import java.util.Map; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/HtmlUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/HtmlUtils.java index 71953505b..10bf9a1f0 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/HtmlUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/HtmlUtils.java @@ -7,6 +7,7 @@ import main.java.com.djrapitops.plan.locale.Msg; import main.java.com.djrapitops.plan.ui.html.Html; import main.java.com.djrapitops.plan.ui.webserver.WebServer; import main.java.com.djrapitops.plan.utilities.file.FileUtil; +import org.apache.commons.lang.text.StrSubstitutor; import java.io.FileNotFoundException; import java.io.Serializable; @@ -40,14 +41,9 @@ public class HtmlUtils { * @return */ public static String replacePlaceholders(String html, Map replaceMap) { - for (Map.Entry entrySet : replaceMap.entrySet()) { - String placeholder = entrySet.getKey(); - String replacer = entrySet.getValue().toString(); + StrSubstitutor sub = new StrSubstitutor(replaceMap); - html = html.replace(placeholder, replacer); - } - - return html; + return sub.replace(html); } /** diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/webserver/api/WebAPIManager.java b/Plan/src/main/java/com/djrapitops/plan/utilities/webserver/api/WebAPIManager.java index e72429808..ad258ccd4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/webserver/api/WebAPIManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/webserver/api/WebAPIManager.java @@ -11,6 +11,14 @@ import java.util.Map; * @author Fuzzlemann */ public class WebAPIManager { + + /** + * Constructor used to hide the public constructor + */ + private WebAPIManager() { + throw new IllegalStateException("Utility class"); + } + private static Map registry = new HashMap<>(); public static void registerNewAPI(String method, WebAPI api) { diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/HtmlUtilsTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/HtmlUtilsTest.java index 930622cde..c8ce3d0e4 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/HtmlUtilsTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/HtmlUtilsTest.java @@ -5,21 +5,21 @@ */ package test.java.main.java.com.djrapitops.plan.utilities; +import com.google.common.collect.ImmutableMap; import main.java.com.djrapitops.plan.utilities.HtmlUtils; import org.bukkit.plugin.java.JavaPlugin; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import test.java.utils.RandomData; import test.java.utils.TestInit; import java.io.Serializable; -import java.util.HashMap; import java.util.Map; +import static junit.framework.TestCase.assertFalse; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; /** * @author Rsl1122 @@ -28,62 +28,50 @@ import static org.junit.Assert.assertTrue; @PrepareForTest(JavaPlugin.class) public class HtmlUtilsTest { - /** - * - */ - public HtmlUtilsTest() { - } - - /** - * - */ - @Before - public void setUp() throws Exception { - } - - /** - * @throws Exception - */ @Test public void testGetHtmlStringFromResource() throws Exception { TestInit.init(); + String fileName = "player.html"; String result = HtmlUtils.getStringFromResource(fileName); - assertTrue("Result empty", !result.isEmpty()); + + assertFalse("Result empty", result.isEmpty()); } - /** - * - */ @Test public void testReplacePlaceholders() { - String html = "%test%"; - Map replaceMap = new HashMap<>(); - replaceMap.put("%test%", "Success"); - String expResult = "Success"; + String randomString = RandomData.randomString(100); + String randomIdentifier = RandomData.randomString(5); + + String html = "${" + randomIdentifier + "}" + randomString; + + Map replaceMap = ImmutableMap.of(randomIdentifier, "Success"); + + String expResult = "Success" + randomString; String result = HtmlUtils.replacePlaceholders(html, replaceMap); + assertEquals(expResult, result); } - /** - * - */ @Test public void testReplacePlaceholdersBackslash() { - Map replace = new HashMap<>(); - replace.put("%test%", "/\\"); - String result = HtmlUtils.replacePlaceholders("%test% alright %test%", replace); - String exp = "/\\ alright /\\"; - assertEquals(result, exp); + String randomIdentifier = RandomData.randomString(5); + + Map replace = ImmutableMap.of(randomIdentifier, "/\\"); + + String expResult = "/\\ alright /\\"; + String result = HtmlUtils.replacePlaceholders("${" + randomIdentifier + "} alright ${" + randomIdentifier + "}", replace); + + assertEquals(result, expResult); } - /** - * - */ @Test public void testRemoveXSS() { - String xss = "