diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ExportSystem.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ExportSystem.java index a4265f2b8..928551733 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ExportSystem.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ExportSystem.java @@ -77,10 +77,7 @@ public class ExportSystem implements SubSystem { processing.submitNonCritical(htmlExport::exportAvailablePlayers); } if (config.isTrue(ExportSettings.SERVER_PAGE)) { - processing.submitNonCritical(() -> { - htmlExport.cacheNetworkPage(); - htmlExport.exportAvailableServerPages(); - }); + processing.submitNonCritical(htmlExport::exportAvailableServerPages); } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/HtmlExport.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/HtmlExport.java index 343a25136..7f5b342a2 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/HtmlExport.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/HtmlExport.java @@ -20,9 +20,6 @@ import com.djrapitops.plan.delivery.rendering.json.JSONFactory; import com.djrapitops.plan.delivery.rendering.pages.NetworkPage; import com.djrapitops.plan.delivery.rendering.pages.PageFactory; import com.djrapitops.plan.delivery.rendering.pages.PlayerPage; -import com.djrapitops.plan.delivery.webserver.cache.PageId; -import com.djrapitops.plan.delivery.webserver.cache.ResponseCache; -import com.djrapitops.plan.delivery.webserver.response.pages.NetworkPageResponse; import com.djrapitops.plan.exceptions.ParseException; import com.djrapitops.plan.exceptions.database.DBOpException; import com.djrapitops.plan.gathering.domain.BaseUser; @@ -169,33 +166,13 @@ public class HtmlExport extends SpecificExport { } } - public void cacheNetworkPage() { - if (serverInfo.getServer().isNotProxy()) { - return; - } - - NetworkPage networkPage = pageFactory.networkPage(); - ResponseCache.cacheResponse(PageId.SERVER.of(serverInfo.getServerUUID()), () -> { - try { - return new NetworkPageResponse(networkPage); - } catch (ParseException e) { - errorHandler.log(L.WARN, this.getClass(), e); - return null; - } - }); - } - public void exportNetworkPage() { if (serverInfo.getServer().isNotProxy()) { return; } - cacheNetworkPage(); - try { - exportAvailableServerPage(serverInfo.getServerUUID(), serverInfo.getServer().getName()); - } catch (IOException e) { - errorHandler.log(L.WARN, this.getClass(), e); - } + NetworkPage networkPage = pageFactory.networkPage(); + // TODO } public void exportAvailableServerPages() { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/SpecificExport.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/SpecificExport.java index 8b3410b2f..f16374861 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/SpecificExport.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/SpecificExport.java @@ -17,8 +17,6 @@ package com.djrapitops.plan.delivery.export; import com.djrapitops.plan.delivery.rendering.json.JSONFactory; -import com.djrapitops.plan.delivery.webserver.cache.PageId; -import com.djrapitops.plan.delivery.webserver.cache.ResponseCache; import com.djrapitops.plan.delivery.webserver.response.Response; import com.djrapitops.plan.identification.ServerInfo; import com.djrapitops.plan.storage.file.PlanFiles; @@ -104,7 +102,7 @@ public abstract class SpecificExport { } void exportAvailablePlayerPage(UUID playerUUID, String name) throws IOException { - Response response = ResponseCache.loadResponse(PageId.PLAYER.of(playerUUID)); + Response response = null; // TODO if (response == null) { return; } @@ -115,7 +113,7 @@ public abstract class SpecificExport { void exportAvailableServerPage(UUID serverUUID, String serverName) throws IOException { // TODO Force export in the future - Response response = ResponseCache.loadResponse(PageId.SERVER.of(serverUUID)); + Response response = null; if (response == null) { return; } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/pages/DebugPage.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/pages/DebugPage.java index 46e794451..d12e18b71 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/pages/DebugPage.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/pages/DebugPage.java @@ -23,13 +23,13 @@ import com.djrapitops.plan.delivery.formatting.Formatters; import com.djrapitops.plan.delivery.rendering.html.Html; import com.djrapitops.plan.delivery.rendering.html.icon.Icon; import com.djrapitops.plan.delivery.rendering.html.structure.TabsElement; -import com.djrapitops.plan.delivery.webserver.cache.ResponseCache; import com.djrapitops.plan.gathering.cache.SessionCache; import com.djrapitops.plan.gathering.domain.Session; import com.djrapitops.plan.identification.ServerInfo; import com.djrapitops.plan.identification.properties.ServerProperties; import com.djrapitops.plan.storage.database.Database; import com.djrapitops.plan.storage.file.FileResource; +import com.djrapitops.plan.storage.file.ResourceCache; import com.djrapitops.plan.version.VersionCheckSystem; import com.djrapitops.plugin.benchmarking.Benchmark; import com.djrapitops.plugin.benchmarking.Timings; @@ -113,12 +113,11 @@ public class DebugPage implements Page { private void appendResponseCache(StringBuilder content) { try { - content.append("
### Cached Responses:

"); - List cacheKeys = new ArrayList<>(ResponseCache.getCacheKeys()); + content.append("
### Cached Resources (from File or Jar):

"); + List cacheKeys = ResourceCache.getCachedResourceNames(); if (cacheKeys.isEmpty()) { content.append("Empty"); } - Collections.sort(cacheKeys); for (String cacheKey : cacheKeys) { content.append("- ").append(cacheKey).append("
"); } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/ResponseHandler.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/ResponseHandler.java index 853b931ab..8486e3a53 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/ResponseHandler.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/ResponseHandler.java @@ -17,8 +17,6 @@ package com.djrapitops.plan.delivery.webserver; import com.djrapitops.plan.delivery.webserver.auth.Authentication; -import com.djrapitops.plan.delivery.webserver.cache.PageId; -import com.djrapitops.plan.delivery.webserver.cache.ResponseCache; import com.djrapitops.plan.delivery.webserver.pages.*; import com.djrapitops.plan.delivery.webserver.pages.json.RootJSONHandler; import com.djrapitops.plan.delivery.webserver.response.Response; @@ -120,16 +118,16 @@ public class ResponseHandler extends TreePageHandler { String resource = target.getResourceString(); if (target.endsWith(".css")) { - return ResponseCache.loadResponse(PageId.CSS.of(resource), () -> responseFactory.cssResponse(resource)); + return responseFactory.cssResponse(resource); } if (target.endsWith(".js")) { - return ResponseCache.loadResponse(PageId.JS.of(resource), () -> responseFactory.javaScriptResponse(resource)); + return responseFactory.javaScriptResponse(resource); } if (target.endsWith(".png")) { return responseFactory.imageResponse(resource); } if (target.endsWith("favicon.ico")) { - return ResponseCache.loadResponse(PageId.FAVICON.id(), responseFactory::faviconResponse); + return responseFactory.faviconResponse(); } boolean isAuthRequired = webServer.get().isAuthRequired(); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/WebServerSystem.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/WebServerSystem.java index 04fc763a5..94e68b46d 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/WebServerSystem.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/WebServerSystem.java @@ -18,7 +18,6 @@ package com.djrapitops.plan.delivery.webserver; import com.djrapitops.plan.SubSystem; import com.djrapitops.plan.delivery.webserver.cache.JSONCache; -import com.djrapitops.plan.delivery.webserver.cache.ResponseCache; import com.djrapitops.plan.exceptions.EnableException; import javax.inject.Inject; @@ -49,7 +48,6 @@ public class WebServerSystem implements SubSystem { @Override public void disable() { webServer.disable(); - ResponseCache.clearCache(); JSONCache.invalidateAll(); JSONCache.cleanUp(); } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/ResponseCache.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/ResponseCache.java deleted file mode 100644 index cc7334952..000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/ResponseCache.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This file is part of Player Analytics (Plan). - * - * Plan is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License v3 as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Plan is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Plan. If not, see . - */ -package com.djrapitops.plan.delivery.webserver.cache; - -import com.djrapitops.plan.delivery.webserver.response.Response; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; - -import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; - -/** - * This class contains the page cache. - *

- * It caches all Responses with their matching identifiers. - * This reduces CPU cycles and the time to wait for loading the pages. - * This is especially useful in situations where multiple clients are accessing the server. - * - * @author Fuzzlemann - */ -public class ResponseCache { - - private static final Cache cache = Caffeine.newBuilder() - .expireAfterWrite(5, TimeUnit.MINUTES) - .build(); - - /** - * Constructor used to hide the public constructor - */ - private ResponseCache() { - throw new IllegalStateException("Utility class"); - } - - /** - * Loads the response from the response cache. - *

- * If the {@link Response} isn't cached, {@link Supplier#get()} in the {@code loader} - * is called to create the Response. - *

- * If the Response is created, it's automatically cached. - * - * @param identifier The identifier of the page - * @param loader The The {@link Response} {@link Supplier} (How should it load the page if it's not cached) - * @return The Response that was cached or created by the the {@link Response} {@link Supplier} - */ - public static Response loadResponse(String identifier, Supplier loader) { - return cache.get(identifier, k -> loader.get()); - } - - /** - * 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 loadResponse(String identifier) { - return cache.getIfPresent(identifier); - } - - /** - * Puts the page into the page cache. - *

- * If the cache already inherits that {@code identifier}, it's renewed. - * - * @param identifier The identifier of the page - * @param loader The {@link Response} {@link Supplier} (How it should load the page) - */ - public static void cacheResponse(String identifier, Supplier loader) { - cacheResponse(identifier, loader.get()); - - } - - /** - * Puts the page into the page cache. - *

- * If the cache already inherits that {@code identifier}, it's renewed. - * - * @param identifier The identifier of the page - * @param response The {@link Response} - */ - public static void cacheResponse(String identifier, Response response) { - if (response != null) { - cache.put(identifier, response); - } - } - - /** - * Checks if the page is cached. - * - * @param identifier The identifier of the page - * @return true if the page is cached - */ - public static boolean isCached(String identifier) { - return cache.getIfPresent(identifier) != null; - } - - /** - * Clears the cache from all its contents. - */ - public static void clearCache() { - cache.invalidateAll(); - } - - public static Set getCacheKeys() { - return cache.asMap().keySet(); - } - - public static long getEstimatedSize() { - return cache.estimatedSize(); - } - - public static void clearResponse(String identifier) { - cache.invalidate(identifier); - } -} diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/pages/PlayerPageHandler.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/pages/PlayerPageHandler.java index 124f80ece..fd1010057 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/pages/PlayerPageHandler.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/pages/PlayerPageHandler.java @@ -20,8 +20,6 @@ import com.djrapitops.plan.delivery.domain.WebUser; import com.djrapitops.plan.delivery.webserver.Request; import com.djrapitops.plan.delivery.webserver.RequestTarget; import com.djrapitops.plan.delivery.webserver.auth.Authentication; -import com.djrapitops.plan.delivery.webserver.cache.PageId; -import com.djrapitops.plan.delivery.webserver.cache.ResponseCache; import com.djrapitops.plan.delivery.webserver.response.Response; import com.djrapitops.plan.delivery.webserver.response.ResponseFactory; import com.djrapitops.plan.exceptions.WebUserAuthException; @@ -77,10 +75,9 @@ public class PlayerPageHandler implements PageHandler { throw new ForbiddenException("Database is " + dbState.name() + " - Please try again later. You can check database status with /plan info"); } if (raw) { - return ResponseCache.loadResponse(PageId.RAW_PLAYER.of(playerUUID), () -> responseFactory.rawPlayerPageResponse(playerUUID)); + return responseFactory.rawPlayerPageResponse(playerUUID); } - return ResponseCache.loadResponse(PageId.PLAYER.of(playerUUID), - () -> responseFactory.playerPageResponse(playerUUID)); + return responseFactory.playerPageResponse(playerUUID); } @Override diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/pages/PlayersPageHandler.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/pages/PlayersPageHandler.java index 99f70e4c2..b8197b391 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/pages/PlayersPageHandler.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/pages/PlayersPageHandler.java @@ -19,8 +19,6 @@ package com.djrapitops.plan.delivery.webserver.pages; import com.djrapitops.plan.delivery.webserver.Request; import com.djrapitops.plan.delivery.webserver.RequestTarget; import com.djrapitops.plan.delivery.webserver.auth.Authentication; -import com.djrapitops.plan.delivery.webserver.cache.PageId; -import com.djrapitops.plan.delivery.webserver.cache.ResponseCache; import com.djrapitops.plan.delivery.webserver.response.Response; import com.djrapitops.plan.delivery.webserver.response.ResponseFactory; import com.djrapitops.plan.exceptions.WebUserAuthException; @@ -58,7 +56,7 @@ public class PlayersPageHandler implements PageHandler { if (dbState != Database.State.OPEN) { throw new ForbiddenException("Database is " + dbState.name() + " - Please try again later. You can check database status with /plan info"); } - return ResponseCache.loadResponse(PageId.PLAYERS.id(), responseFactory::playersPageResponse); + return responseFactory.playersPageResponse(); } @Override diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/pages/ServerPageHandler.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/pages/ServerPageHandler.java index 560f9fd1c..0b0240c14 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/pages/ServerPageHandler.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/pages/ServerPageHandler.java @@ -19,8 +19,6 @@ package com.djrapitops.plan.delivery.webserver.pages; import com.djrapitops.plan.delivery.webserver.Request; import com.djrapitops.plan.delivery.webserver.RequestTarget; import com.djrapitops.plan.delivery.webserver.auth.Authentication; -import com.djrapitops.plan.delivery.webserver.cache.PageId; -import com.djrapitops.plan.delivery.webserver.cache.ResponseCache; import com.djrapitops.plan.delivery.webserver.response.Response; import com.djrapitops.plan.delivery.webserver.response.ResponseFactory; import com.djrapitops.plan.exceptions.WebUserAuthException; @@ -64,19 +62,11 @@ public class ServerPageHandler implements PageHandler { public Response getResponse(Request request, RequestTarget target) throws WebException { UUID serverUUID = getServerUUID(target); - Response response = ResponseCache.loadResponse(PageId.SERVER.of(serverUUID)); - - if (response != null) { - return response; - } else { - checkDBState(); - if (serverInfo.getServer().isProxy() && serverInfo.getServerUUID().equals(serverUUID)) { - return ResponseCache.loadResponse(PageId.SERVER.of(serverUUID), responseFactory::networkPageResponse); - } - Response serverPageResponse = responseFactory.serverPageResponse(serverUUID); - ResponseCache.cacheResponse(PageId.SERVER.of(serverUUID), serverPageResponse); - return serverPageResponse; + checkDBState(); + if (serverInfo.getServer().isProxy() && serverInfo.getServerUUID().equals(serverUUID)) { + return responseFactory.networkPageResponse(); } + return responseFactory.serverPageResponse(serverUUID); } private void checkDBState() throws ForbiddenException { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/file/PlanFiles.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/file/PlanFiles.java index c6def1f63..09d933c45 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/file/PlanFiles.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/file/PlanFiles.java @@ -73,6 +73,8 @@ public class PlanFiles implements SubSystem { @Override public void enable() throws EnableException { + ResourceCache.invalidateAll(); + ResourceCache.cleanUp(); Verify.isTrue((dataFolder.exists() && dataFolder.isDirectory()) || dataFolder.mkdirs(), () -> new EnableException("Could not create data folder at " + dataFolder.getAbsolutePath())); try { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/file/ResourceCache.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/file/ResourceCache.java index 4c7886b33..d0a14b599 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/file/ResourceCache.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/file/ResourceCache.java @@ -19,6 +19,9 @@ package com.djrapitops.plan.storage.file; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; @@ -48,4 +51,18 @@ public class ResourceCache { public static void cache(String resourceName, String got) { cache.put(resourceName, got); } + + public static void invalidateAll() { + cache.invalidateAll(); + } + + public static void cleanUp() { + cache.cleanUp(); + } + + public static List getCachedResourceNames() { + List resourceNames = new ArrayList<>(cache.asMap().keySet()); + Collections.sort(resourceNames); + return resourceNames; + } } \ No newline at end of file diff --git a/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/ResponseCacheTest.java b/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/ResponseCacheTest.java deleted file mode 100644 index 3ae3e490e..000000000 --- a/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/ResponseCacheTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is part of Player Analytics (Plan). - * - * Plan is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License v3 as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Plan is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Plan. If not, see . - */ -package com.djrapitops.plan.delivery.webserver; - -import com.djrapitops.plan.delivery.webserver.cache.ResponseCache; -import com.djrapitops.plan.delivery.webserver.response.Response; -import org.junit.jupiter.api.Test; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; -import utilities.RandomData; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * @author Fuzzlemann - */ -@RunWith(JUnitPlatform.class) -class ResponseCacheTest { - private final String IDENTIFIER = RandomData.randomString(10); - private final String RESPONSE_STRING = RandomData.randomString(10); - private final Response RESPONSE = new Response() { - @Override - public String getResponse() { - return RESPONSE_STRING; - } - }; - - @Test - void responseIsCachedIfNotFoundDuringLoad() { - assertFalse(ResponseCache.isCached(IDENTIFIER)); - - Response response = ResponseCache.loadResponse(IDENTIFIER, () -> RESPONSE); - assertTrue(ResponseCache.isCached(IDENTIFIER)); - - assertEquals(RESPONSE, response); - } - - @Test - void responseIsClearedWhenCacheIsCleared() { - ResponseCache.cacheResponse(IDENTIFIER, () -> RESPONSE); - assertTrue(ResponseCache.isCached(IDENTIFIER)); - - ResponseCache.clearCache(); - assertFalse(ResponseCache.isCached(IDENTIFIER)); - } -}