From 20ef9df63dfc396ddfd5e03fa74cf01063d7b7c6 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Fri, 30 Aug 2019 23:48:36 +0300 Subject: [PATCH] Implemented a JSONCache --- .../delivery/webserver/WebServerSystem.java | 17 +++-- .../plan/delivery/webserver/cache/DataID.java | 53 ++++++++++++++ .../delivery/webserver/cache/JSONCache.java | 70 +++++++++++++++++++ 3 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/DataID.java create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONCache.java 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 acee27a55..79bb58a93 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 @@ -17,9 +17,9 @@ 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 com.djrapitops.plugin.benchmarking.Timings; import javax.inject.Inject; import javax.inject.Singleton; @@ -32,26 +32,29 @@ import javax.inject.Singleton; @Singleton public class WebServerSystem implements SubSystem { + private final JSONCache jsonCache; private final WebServer webServer; - private Timings timings; @Inject - public WebServerSystem(WebServer webServer, Timings timings) { + public WebServerSystem( + JSONCache jsonCache, + WebServer webServer + ) { + this.jsonCache = jsonCache; this.webServer = webServer; - this.timings = timings; } @Override public void enable() throws EnableException { - timings.start("WebServer Initialization"); webServer.enable(); - timings.end("WebServer Initialization"); } @Override public void disable() { - ResponseCache.clearCache(); webServer.disable(); + ResponseCache.clearCache(); + jsonCache.invalidateAll(); + jsonCache.cleanUp(); } public WebServer getWebServer() { 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 new file mode 100644 index 000000000..633d6807f --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/DataID.java @@ -0,0 +1,53 @@ +/* + * 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 java.util.UUID; + +/** + * Enum for different JSON data entries that can be stored in {@link JSONCache}. + * + * @author Rsl1122 + */ +public enum DataID { + PLAYERS, + SESSIONS, + SERVERS, + KILLS, + PING_TABLE, + GRAPH_PERFORMANCE, + GRAPH_ONLINE, + GRAPH_UNIQUE_NEW, + GRAPH_CALENDAR, + GRAPH_WORLD_PIE, + GRAPH_WORLD_MAP, + GRAPH_ACTIVITY, + GRAPH_PING, + GRAPH_PUNCHCARD, + SERVER_OVERVIEW, + ONLINE_OVERVIEW, + SESSIONS_OVERVIEW, + PVP_PVE, + PLAYERBASE_OVERVIEW, + PERFORMANCE_OVERVIEW, + ; + + public String of(UUID serverUUID) { + return name() + '-' + 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 new file mode 100644 index 000000000..22fd8170c --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONCache.java @@ -0,0 +1,70 @@ +package com.djrapitops.plan.delivery.webserver.cache; + +import com.djrapitops.plan.delivery.webserver.response.Response; +import com.djrapitops.plan.delivery.webserver.response.data.JSONResponse; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import org.apache.commons.lang3.StringUtils; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +/** + * Cache for any JSON data sent via {@link com.djrapitops.plan.delivery.webserver.pages.json.RootJSONHandler}. + * + * @author Rsl1122 + */ +@Singleton +public class JSONCache { + + private final Cache cache; + + @Inject + public JSONCache() { + cache = Caffeine.newBuilder() + .expireAfterWrite(2, TimeUnit.MINUTES) + .build(); + } + + public Response getOrCache(String identifier, Supplier jsonResponseSupplier) { + String found = cache.getIfPresent(identifier); + if (found == null) { + JSONResponse response = jsonResponseSupplier.get(); + cache.put(identifier, response.getContent()); + return response; + } + return new JSONResponse(found); + } + + public Response getOrCache(DataID dataID, UUID serverUUID, Supplier jsonResponseSupplier) { + return getOrCache(dataID.of(serverUUID), jsonResponseSupplier); + } + + public void invalidate(String identifier) { + cache.invalidate(identifier); + } + + public void invalidate(DataID dataID, UUID serverUUID) { + cache.invalidate(dataID.of(serverUUID)); + } + + public void invalidateMatching(DataID dataID) { + String toInvalidate = dataID.name(); + for (String identifier : cache.asMap().keySet()) { + if (StringUtils.startsWith(identifier, toInvalidate)) { + invalidate(identifier); + } + } + } + + public void invalidateAll() { + cache.invalidateAll(); + } + + public void cleanUp() { + cache.cleanUp(); + } +} \ No newline at end of file