From f50d8dc90c8e6fef6a0caa124d8ecbf85d07ce41 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 23 Jan 2018 18:16:09 +0200 Subject: [PATCH] CacheInspectPluginsTabRequest --- .../plan/data/plugin/HookHandler.java | 27 +++++- .../operation/TransferOperations.java | 6 +- .../CacheInspectPluginsTabRequest.java | 90 +++++++++++++++++++ .../GenerateInspectPluginsTabRequest.java | 72 +++++++++++++++ .../parts/InspectPagePluginsContent.java | 36 +++++++- .../info/BukkitInformationManager.java | 24 +---- .../InspectPluginsTabContentCreator.java | 53 ----------- 7 files changed, 228 insertions(+), 80 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/system/info/request/CacheInspectPluginsTabRequest.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateInspectPluginsTabRequest.java delete mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/InspectPluginsTabContentCreator.java diff --git a/Plan/src/main/java/com/djrapitops/plan/data/plugin/HookHandler.java b/Plan/src/main/java/com/djrapitops/plan/data/plugin/HookHandler.java index d6e3c3e45..ed0f3b7d7 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/plugin/HookHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/plugin/HookHandler.java @@ -1,11 +1,11 @@ package com.djrapitops.plan.data.plugin; import com.djrapitops.plan.Plan; +import com.djrapitops.plan.data.element.InspectContainer; import com.djrapitops.plugin.StaticHolder; import com.djrapitops.plugin.api.utility.log.Log; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * Class responsible for hooking to other plugins and managing the %plugins% @@ -35,6 +35,10 @@ public class HookHandler { } } + public static HookHandler getInstance() { + return null;// TODO + } + /** * Adds a new PluginData source to the list. *

@@ -72,4 +76,23 @@ public class HookHandler { public List getAdditionalDataSources() { return additionalDataSources; } + + public Map getInspectContainersFor(UUID uuid) { + List plugins = getAdditionalDataSources(); + Map containers = new HashMap<>(); + for (PluginData pluginData : plugins) { + InspectContainer inspectContainer = new InspectContainer(); + try { + InspectContainer container = pluginData.getPlayerData(uuid, inspectContainer); + if (container != null && !container.isEmpty()) { + containers.put(pluginData, container); + } + } catch (Exception e) { + String sourcePlugin = pluginData.getSourcePlugin(); + Log.error("PluginData caused exception: " + sourcePlugin); + Log.toLog(this.getClass().getName() + " " + sourcePlugin, e); + } + } + return containers; + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/database/databases/operation/TransferOperations.java b/Plan/src/main/java/com/djrapitops/plan/system/database/databases/operation/TransferOperations.java index 84201fb98..c385f693a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/database/databases/operation/TransferOperations.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/database/databases/operation/TransferOperations.java @@ -11,7 +11,7 @@ import java.util.UUID; /** * Operations for transferring data via Database to another server. - * + *

* Receiving server has to be using the same database. * * @author Rsl1122 @@ -26,6 +26,8 @@ public interface TransferOperations { void storeNetworkPageContent(UUID serverUUID, String encodedHtml) throws DBException; + void storePlayerPluginsTab(UUID player, UUID serverUUID, String encodedHtml) throws DBException; + // Get Map getEncodedPlayerHtml() throws DBException; @@ -35,4 +37,6 @@ public interface TransferOperations { Map getEncodedServerHtml() throws DBException; UUID getServerPlayerIsOnline(UUID playerUUID) throws DBException; + + Map getEncodedPlayerPluginsTabs(UUID playerUUID) throws DBException; } \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/request/CacheInspectPluginsTabRequest.java b/Plan/src/main/java/com/djrapitops/plan/system/info/request/CacheInspectPluginsTabRequest.java new file mode 100644 index 000000000..2f81dc2c6 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/request/CacheInspectPluginsTabRequest.java @@ -0,0 +1,90 @@ +/* + * 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 com.djrapitops.plan.system.info.request; + +import com.djrapitops.plan.api.exceptions.connection.BadRequestException; +import com.djrapitops.plan.api.exceptions.connection.TransferDatabaseException; +import com.djrapitops.plan.api.exceptions.connection.WebException; +import com.djrapitops.plan.api.exceptions.database.DBException; +import com.djrapitops.plan.system.database.databases.Database; +import com.djrapitops.plan.system.info.server.ServerInfo; +import com.djrapitops.plan.system.webserver.pages.DefaultResponses; +import com.djrapitops.plan.system.webserver.response.Response; +import com.djrapitops.plan.system.webserver.response.cache.PageId; +import com.djrapitops.plan.system.webserver.response.cache.ResponseCache; +import com.djrapitops.plan.system.webserver.response.pages.parts.InspectPagePluginsContent; +import com.djrapitops.plan.utilities.Base64Util; +import com.djrapitops.plan.utilities.NullCheck; +import com.djrapitops.plugin.utilities.Verify; + +import java.util.Map; +import java.util.UUID; + +/** + * InfoRequest used to place HTML of player's Plugins Tab to ResponseCache. + * + * @author Rsl1122 + */ +public class CacheInspectPluginsTabRequest extends InfoRequestWithVariables implements CacheRequest { + + private static final String SPLIT = ";;SPLIT;;"; + private final UUID player; + private final String navAndHtml; + + private CacheInspectPluginsTabRequest() { + player = null; + navAndHtml = null; + } + + public CacheInspectPluginsTabRequest(UUID player, String nav, String html) { + Verify.nullCheck(player, nav); + variables.put("player", player.toString()); + this.player = player; + this.navAndHtml = nav + SPLIT + html; + } + + public static CacheInspectPluginsTabRequest createHandler() { + return new CacheInspectPluginsTabRequest(); + } + + @Override + public void placeDataToDatabase() throws WebException { + Verify.nullCheck(player, navAndHtml); + + String encodedHtml = Base64Util.encode(navAndHtml); + try { + Database.getActive().transfer().storePlayerPluginsTab(player, ServerInfo.getServerUUID(), encodedHtml); + } catch (DBException e) { + throw new TransferDatabaseException(e); + } + } + + @Override + public Response handleRequest(Map variables) throws WebException { + // Available variables: sender, player + + String player = variables.get("player"); + NullCheck.check(player, new BadRequestException("Player UUID 'player' variable not supplied.")); + + UUID uuid = UUID.fromString(player); + + try { + Map pages = Database.getActive().transfer().getEncodedPlayerPluginsTabs(uuid); + + InspectPagePluginsContent pluginsTab = (InspectPagePluginsContent) + ResponseCache.loadResponse(PageId.PLAYER_PLUGINS_TAB.of(uuid), InspectPagePluginsContent::new); + + for (Map.Entry entry : pages.entrySet()) { + UUID serverUUID = entry.getKey(); + String[] html = Base64Util.decode(entry.getValue()).split(SPLIT); + + pluginsTab.addTab(serverUUID, html[0], html[1]); + } + } catch (DBException e) { + throw new TransferDatabaseException(e); + } + return DefaultResponses.SUCCESS.get(); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateInspectPluginsTabRequest.java b/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateInspectPluginsTabRequest.java new file mode 100644 index 000000000..e6557a995 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateInspectPluginsTabRequest.java @@ -0,0 +1,72 @@ +/* + * 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 com.djrapitops.plan.system.info.request; + +import com.djrapitops.plan.api.exceptions.connection.BadRequestException; +import com.djrapitops.plan.api.exceptions.connection.WebException; +import com.djrapitops.plan.system.info.InfoSystem; +import com.djrapitops.plan.system.webserver.pages.DefaultResponses; +import com.djrapitops.plan.system.webserver.response.Response; +import com.djrapitops.plan.system.webserver.response.cache.PageId; +import com.djrapitops.plan.system.webserver.response.cache.ResponseCache; +import com.djrapitops.plan.system.webserver.response.pages.parts.InspectPagePluginsContent; +import com.djrapitops.plan.utilities.NullCheck; +import com.djrapitops.plugin.utilities.Verify; + +import java.util.Map; +import java.util.UUID; + +/** + * InfoRequest for Generating Inspect page plugins tab on receiving WebServer. + * + * @author Rsl1122 + */ +public class GenerateInspectPluginsTabRequest extends InfoRequestWithVariables implements GenerateRequest { + + private final UUID playerUUID; + + private GenerateInspectPluginsTabRequest() { + playerUUID = null; + } + + public GenerateInspectPluginsTabRequest(UUID uuid) { + Verify.nullCheck(uuid); + playerUUID = uuid; + variables.put("player", uuid.toString()); + } + + public static GenerateInspectPluginsTabRequest createHandler() { + return new GenerateInspectPluginsTabRequest(); + } + + @Override + public void placeDataToDatabase() { + // No data required in a Generate request + } + + @Override + public Response handleRequest(Map variables) throws WebException { + // Available variables: sender, player + + String player = variables.get("player"); + NullCheck.check(player, new BadRequestException("Player UUID 'player' variable not supplied.")); + + UUID uuid = UUID.fromString(player); + String[] navAndhtml = getNavAndHtml(uuid); + + InfoSystem.getInstance().sendRequest(new CacheInspectPluginsTabRequest(uuid, navAndhtml[0], navAndhtml[1])); + + return DefaultResponses.SUCCESS.get(); + } + + private String[] getNavAndHtml(UUID uuid) { + return ((InspectPagePluginsContent) ResponseCache.loadResponse(PageId.PLAYER_PLUGINS_TAB.of(uuid), + InspectPagePluginsContent::new)).getContents(); + } + + public UUID getPlayerUUID() { + return playerUUID; + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/parts/InspectPagePluginsContent.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/parts/InspectPagePluginsContent.java index 691711f6a..bc976bed0 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/parts/InspectPagePluginsContent.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/parts/InspectPagePluginsContent.java @@ -4,8 +4,14 @@ */ package com.djrapitops.plan.system.webserver.response.pages.parts; +import com.djrapitops.plan.data.element.InspectContainer; +import com.djrapitops.plan.data.plugin.HookHandler; +import com.djrapitops.plan.data.plugin.PluginData; +import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.webserver.response.Response; +import com.djrapitops.plan.utilities.comparators.PluginDataNameComparator; import com.djrapitops.plan.utilities.html.HtmlStructure; +import com.djrapitops.plan.utilities.html.structure.AnalysisPluginsTabContentCreator; import java.util.*; @@ -26,11 +32,37 @@ public class InspectPagePluginsContent extends Response { } public InspectPagePluginsContent(UUID serverUUID, String nav, String html) { - pluginsTab = new HashMap<>(); - + this(); addTab(serverUUID, nav, html); } + public static InspectPagePluginsContent generateForThisServer(UUID uuid) { + HookHandler hookHandler = HookHandler.getInstance(); + Map containers = hookHandler.getInspectContainersFor(uuid); + String serverName = ServerInfo.getServerName(); + String actualServerName = serverName.equals("Plan") ? "Server " + ServerInfo.getServerID() : serverName; + if (containers.isEmpty()) { + new InspectPagePluginsContent(uuid, "

  • " + actualServerName + "(No Data)
  • ", ""); + } + + String nav = "
  • " + actualServerName + "
  • "; + + StringBuilder tab = new StringBuilder(); + tab.append("
    "); + + List order = new ArrayList<>(containers.keySet()); + order.sort(new PluginDataNameComparator()); + + for (PluginData pluginData : order) { + InspectContainer container = containers.get(pluginData); + AnalysisPluginsTabContentCreator.appendThird(pluginData, container, tab); + } + + tab.append("
    "); + + return new InspectPagePluginsContent(ServerInfo.getServerUUID(), nav, tab.toString()); + } + public void addTab(UUID serverUUID, String nav, String html) { pluginsTab.put(serverUUID, new String[]{nav, html}); } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java index fd65773d8..74a95f9fc 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java @@ -12,9 +12,6 @@ import com.djrapitops.plan.api.exceptions.connection.WebException; import com.djrapitops.plan.api.exceptions.connection.WebFailException; import com.djrapitops.plan.command.commands.AnalyzeCommand; import com.djrapitops.plan.data.AnalysisData; -import com.djrapitops.plan.data.element.InspectContainer; -import com.djrapitops.plan.data.plugin.HookHandler; -import com.djrapitops.plan.data.plugin.PluginData; import com.djrapitops.plan.settings.theme.Theme; import com.djrapitops.plan.system.cache.DataCache; import com.djrapitops.plan.system.processing.processors.Processor; @@ -31,6 +28,7 @@ import com.djrapitops.plan.system.webserver.response.errors.InternalErrorRespons import com.djrapitops.plan.system.webserver.response.errors.NotFoundResponse; import com.djrapitops.plan.system.webserver.response.pages.AnalysisPageResponse; import com.djrapitops.plan.system.webserver.response.pages.InspectPageResponse; +import com.djrapitops.plan.system.webserver.response.pages.parts.InspectPagePluginsContent; import com.djrapitops.plan.system.webserver.webapi.WebAPIManager; import com.djrapitops.plan.system.webserver.webapi.bukkit.AnalysisReadyWebAPI; import com.djrapitops.plan.system.webserver.webapi.bukkit.AnalyzeWebAPI; @@ -40,7 +38,6 @@ import com.djrapitops.plan.utilities.MiscUtils; import com.djrapitops.plan.utilities.analysis.Analysis; import com.djrapitops.plan.utilities.file.export.HtmlExport; import com.djrapitops.plan.utilities.html.HtmlStructure; -import com.djrapitops.plan.utilities.html.structure.InspectPluginsTabContentCreator; import com.djrapitops.plugin.api.utility.log.ErrorLogger; import com.djrapitops.plugin.api.utility.log.Log; @@ -162,24 +159,7 @@ public class BukkitInformationManager extends InformationManager { cacheInspectPluginsTab(uuid, origin); } } else { - HookHandler hookHandler = plugin.getHookHandler(); - List plugins = hookHandler.getAdditionalDataSources(); - Map containers = new HashMap<>(); - for (PluginData pluginData : plugins) { - InspectContainer inspectContainer = new InspectContainer(); - try { - InspectContainer container = pluginData.getPlayerData(uuid, inspectContainer); - if (container != null && !container.isEmpty()) { - containers.put(pluginData, container); - } - } catch (Exception e) { - String sourcePlugin = pluginData.getSourcePlugin(); - Log.error("PluginData caused exception: " + sourcePlugin); - Log.toLog(this.getClass().getName() + " " + sourcePlugin, e); - } - } - - cacheInspectPluginsTab(uuid, InspectPluginsTabContentCreator.createContent(containers)); + cacheInspectPluginsTab(uuid, InspectPagePluginsContent.generateForThisServer(uuid).getContents()); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/InspectPluginsTabContentCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/InspectPluginsTabContentCreator.java deleted file mode 100644 index 46f9f383b..000000000 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/InspectPluginsTabContentCreator.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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 com.djrapitops.plan.utilities.html.structure; - -import com.djrapitops.plan.Plan; -import com.djrapitops.plan.data.element.InspectContainer; -import com.djrapitops.plan.data.plugin.PluginData; -import com.djrapitops.plan.system.info.server.BukkitServerInfo; -import com.djrapitops.plan.system.info.server.ServerInfo; -import com.djrapitops.plan.utilities.comparators.PluginDataNameComparator; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * HTML utility class for parsing HTML for Inspect page plugins tabs. - * - * @author Rsl1122 - */ -public class InspectPluginsTabContentCreator { - - public static String[] createContent(Map containers) { - BukkitServerInfo serverInfoManager = Plan.getInstance().getServerInfoManager(); - String serverName = ServerInfo.getServerName(); - String actualServerName = serverName.equals("Plan") ? "Server " + ServerInfo.getServerID() : serverName; - - if (containers.isEmpty()) { - return new String[]{"
  • " + actualServerName + "(No Data)
  • ", - ""}; - } - - String nav = "
  • " + actualServerName + "
  • "; - - StringBuilder tab = new StringBuilder(); - tab.append("
    "); - - List order = new ArrayList<>(containers.keySet()); - order.sort(new PluginDataNameComparator()); - - for (PluginData pluginData : order) { - InspectContainer container = containers.get(pluginData); - AnalysisPluginsTabContentCreator.appendThird(pluginData, container, tab); - } - - tab.append("
    "); - - return new String[]{nav, tab.toString()}; - } - -} \ No newline at end of file