diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/pages/NetworkPage.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/pages/NetworkPage.java index 5d693b4f6..02c91bd58 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/pages/NetworkPage.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/pages/NetworkPage.java @@ -16,8 +16,11 @@ */ package com.djrapitops.plan.delivery.rendering.pages; +import com.djrapitops.plan.delivery.domain.container.CachingSupplier; import com.djrapitops.plan.delivery.formatting.Formatters; import com.djrapitops.plan.delivery.formatting.PlaceholderReplacer; +import com.djrapitops.plan.delivery.webserver.cache.DataID; +import com.djrapitops.plan.delivery.webserver.cache.JSONCache; import com.djrapitops.plan.exceptions.ParseException; import com.djrapitops.plan.extension.implementation.results.ExtensionData; import com.djrapitops.plan.extension.implementation.storage.queries.ExtensionServerDataQuery; @@ -89,12 +92,13 @@ public class NetworkPage implements Page { placeholders.put("version", versionCheckSystem.getUpdateButton().orElse(versionCheckSystem.getCurrentVersionButton())); placeholders.put("updateModal", versionCheckSystem.getUpdateModal()); - List extensionData = dbSystem.getDatabase() - .query(new ExtensionServerDataQuery(serverUUID)); - ServerPluginTabs pluginTabs = new ServerPluginTabs(extensionData, formatters); + CachingSupplier pluginTabs = new CachingSupplier<>(() -> { + List extensionData = dbSystem.getDatabase().query(new ExtensionServerDataQuery(serverUUID)); + return new ServerPluginTabs(extensionData, formatters); + }); - String nav = pluginTabs.getNav(); - String tabs = pluginTabs.getTabs(); + String nav = JSONCache.getOrCacheString(DataID.EXTENSION_NAV, serverUUID, () -> pluginTabs.get().getNav()); + String tabs = JSONCache.getOrCacheString(DataID.EXTENSION_NAV, serverUUID, () -> pluginTabs.get().getTabs()); placeholders.put("navPluginsTabs", nav); placeholders.put("tabsPlugins", StringUtils.remove(tabs, "${backButton}")); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/pages/ServerPage.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/pages/ServerPage.java index 166539920..8a5df5125 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/pages/ServerPage.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/pages/ServerPage.java @@ -16,12 +16,15 @@ */ package com.djrapitops.plan.delivery.rendering.pages; +import com.djrapitops.plan.delivery.domain.container.CachingSupplier; import com.djrapitops.plan.delivery.domain.container.DataContainer; import com.djrapitops.plan.delivery.domain.container.RawDataContainer; import com.djrapitops.plan.delivery.domain.keys.AnalysisKeys; import com.djrapitops.plan.delivery.formatting.Formatters; import com.djrapitops.plan.delivery.formatting.PlaceholderReplacer; import com.djrapitops.plan.delivery.rendering.html.Html; +import com.djrapitops.plan.delivery.webserver.cache.DataID; +import com.djrapitops.plan.delivery.webserver.cache.JSONCache; import com.djrapitops.plan.exceptions.ParseException; import com.djrapitops.plan.extension.implementation.results.ExtensionData; import com.djrapitops.plan.extension.implementation.storage.queries.ExtensionServerDataQuery; @@ -37,6 +40,7 @@ import com.djrapitops.plan.version.VersionCheckSystem; import java.io.IOException; import java.util.List; +import java.util.UUID; import static com.djrapitops.plan.delivery.domain.keys.AnalysisKeys.*; @@ -80,7 +84,8 @@ public class ServerPage implements Page { public String toHtml() throws ParseException { PlaceholderReplacer placeholders = new PlaceholderReplacer(); - placeholders.put("serverUUID", server.getUuid().toString()); + UUID serverUUID = server.getUuid(); + placeholders.put("serverUUID", serverUUID.toString()); placeholders.put("serverName", server.getIdentifiableName()); placeholders.put("serverDisplayName", server.getName()); @@ -123,12 +128,13 @@ public class ServerPage implements Page { placeholders.put("version", versionCheckSystem.getUpdateButton().orElse(versionCheckSystem.getCurrentVersionButton())); placeholders.put("updateModal", versionCheckSystem.getUpdateModal()); - List extensionData = dbSystem.getDatabase() - .query(new ExtensionServerDataQuery(server.getUuid())); - ServerPluginTabs pluginTabs = new ServerPluginTabs(extensionData, formatters); + CachingSupplier pluginTabs = new CachingSupplier<>(() -> { + List extensionData = dbSystem.getDatabase().query(new ExtensionServerDataQuery(serverUUID)); + return new ServerPluginTabs(extensionData, formatters); + }); - String nav = pluginTabs.getNav(); - String tabs = pluginTabs.getTabs(); + String nav = JSONCache.getOrCacheString(DataID.EXTENSION_NAV, serverUUID, () -> pluginTabs.get().getNav()); + String tabs = JSONCache.getOrCacheString(DataID.EXTENSION_NAV, serverUUID, () -> pluginTabs.get().getTabs()); placeholders.put("navPluginsTabs", nav); placeholders.put("tabsPlugins", tabs); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/DataID.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/DataID.java index ef88d7aa6..1efd85f7d 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/DataID.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/DataID.java @@ -45,6 +45,8 @@ public enum DataID { PVP_PVE, PLAYERBASE_OVERVIEW, PERFORMANCE_OVERVIEW, + EXTENSION_NAV, + EXTENSION_TABS ; public String of(UUID serverUUID) { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONCache.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONCache.java index f3380d331..68133e5d6 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONCache.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONCache.java @@ -56,6 +56,17 @@ public class JSONCache { return new JSONResponse(found); } + public static String getOrCacheString(DataID dataID, UUID serverUUID, Supplier stringSupplier) { + String identifier = dataID.of(serverUUID); + String found = cache.getIfPresent(identifier); + if (found == null) { + String result = stringSupplier.get(); + cache.put(identifier, result); + return result; + } + return found; + } + public static Response getOrCache(DataID dataID, Supplier jsonResponseSupplier) { return getOrCache(dataID.name(), jsonResponseSupplier); } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/extension/ExtensionServiceImplementation.java b/Plan/common/src/main/java/com/djrapitops/plan/extension/ExtensionServiceImplementation.java index e478113d1..0b70088e7 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/extension/ExtensionServiceImplementation.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/extension/ExtensionServiceImplementation.java @@ -17,6 +17,8 @@ package com.djrapitops.plan.extension; import com.djrapitops.plan.DebugChannels; +import com.djrapitops.plan.delivery.webserver.cache.DataID; +import com.djrapitops.plan.delivery.webserver.cache.JSONCache; import com.djrapitops.plan.exceptions.DataExtensionMethodCallException; import com.djrapitops.plan.extension.implementation.CallerImplementation; import com.djrapitops.plan.extension.implementation.DataProviderExtractor; @@ -161,9 +163,9 @@ public class ExtensionServiceImplementation implements ExtensionService { // Try again updatePlayerValues(gatherer, playerUUID, playerName, event); } catch (Exception | NoClassDefFoundError | NoSuchFieldError | NoSuchMethodError unexpectedError) { - logger.warn("Encountered unexpected error with " + gatherer.getPluginName() + " Extension (please report this): " + unexpectedError + + logger.warn("Encountered unexpected error with " + gatherer.getPluginName() + " Extension: " + unexpectedError + " (but failed safely) when updating value for '" + playerName + - "', stack trace to follow:"); + "', stack trace to follow (please report this):"); errorHandler.log(L.WARN, gatherer.getClass(), unexpectedError); } } @@ -171,10 +173,10 @@ public class ExtensionServiceImplementation implements ExtensionService { private void logFailure(String playerName, DataExtensionMethodCallException methodCallFailed) { Throwable cause = methodCallFailed.getCause(); String causeName = cause.getClass().getSimpleName(); - logger.warn("Encountered " + causeName + " with " + methodCallFailed.getPluginName() + " Extension (please report this)" + + logger.warn("Encountered " + causeName + " with " + methodCallFailed.getPluginName() + " Extension" + " (failed safely) when updating value for '" + playerName + "', the method was disabled temporarily (won't be called until next Plan reload)" + - ", stack trace to follow:"); + ", stack trace to follow (please report this):"); errorHandler.log(L.WARN, getClass(), cause); } @@ -182,6 +184,9 @@ public class ExtensionServiceImplementation implements ExtensionService { for (ProviderValueGatherer gatherer : extensionGatherers.values()) { updateServerValues(gatherer, event); } + UUID serverUUID = serverInfo.getServerUUID(); + JSONCache.invalidate(DataID.EXTENSION_NAV, serverUUID); + JSONCache.invalidate(DataID.EXTENSION_TABS, serverUUID); } public void updateServerValues(ProviderValueGatherer gatherer, CallEvents event) { @@ -200,8 +205,8 @@ public class ExtensionServiceImplementation implements ExtensionService { // Try again updateServerValues(gatherer, event); } catch (Exception | NoClassDefFoundError | NoSuchFieldError | NoSuchMethodError unexpectedError) { - logger.warn("Encountered unexpected error with " + gatherer.getPluginName() + " Extension (please report this): " + unexpectedError + - " (failed safely) when updating value for server, stack trace to follow:"); + logger.warn("Encountered unexpected error with " + gatherer.getPluginName() + " Extension: " + unexpectedError + + " (failed safely) when updating value for server, stack trace to follow (please report this):"); errorHandler.log(L.WARN, gatherer.getClass(), unexpectedError); } }