From b5365d2321afeaa8bb226f0cd10e93ce16975fb7 Mon Sep 17 00:00:00 2001 From: Risto Lahtela <24460436+AuroraLS3@users.noreply.github.com> Date: Wed, 10 Feb 2021 10:04:21 +0200 Subject: [PATCH] Cache graph responses --- .../delivery/webserver/ResponseResolver.java | 2 +- .../delivery/webserver/cache/JSONStorage.java | 2 ++ .../resolver/json/GraphsJSONResolver.java | 33 ++++++++++++++++--- .../resolver/json/NetworkTabJSONResolver.java | 14 ++------ .../resolver/json/ServerTabJSONResolver.java | 20 +---------- .../plan/identification/Identifiers.java | 16 +++++++++ 6 files changed, 50 insertions(+), 37 deletions(-) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/ResponseResolver.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/ResponseResolver.java index 200a7f1d1..2f83b7f1f 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/ResponseResolver.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/ResponseResolver.java @@ -54,7 +54,7 @@ import java.util.regex.Pattern; public class ResponseResolver { private final DebugPageResolver debugPageResolver; - private QueryPageResolver queryPageResolver; + private final QueryPageResolver queryPageResolver; private final PlayersPageResolver playersPageResolver; private final PlayerPageResolver playerPageResolver; private final ServerPageResolver serverPageResolver; diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONStorage.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONStorage.java index 78a095787..9d53df486 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONStorage.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONStorage.java @@ -42,12 +42,14 @@ public interface JSONStorage extends SubSystem { } default StoredJSON storeJson(String identifier, Object json) { + if (json instanceof String) return storeJson(identifier, (String) json); return storeJson(identifier, new Gson().toJson(json)); } StoredJSON storeJson(String identifier, String json, long timestamp); default StoredJSON storeJson(String identifier, Object json, long timestamp) { + if (json instanceof String) return storeJson(identifier, (String) json, timestamp); return storeJson(identifier, new Gson().toJson(json), timestamp); } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/GraphsJSONResolver.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/GraphsJSONResolver.java index ee2b6ec45..9f7428157 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/GraphsJSONResolver.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/GraphsJSONResolver.java @@ -17,13 +17,15 @@ package com.djrapitops.plan.delivery.webserver.resolver.json; import com.djrapitops.plan.delivery.rendering.json.graphs.GraphJSONCreator; +import com.djrapitops.plan.delivery.web.resolver.MimeType; import com.djrapitops.plan.delivery.web.resolver.Resolver; import com.djrapitops.plan.delivery.web.resolver.Response; import com.djrapitops.plan.delivery.web.resolver.exception.BadRequestException; import com.djrapitops.plan.delivery.web.resolver.request.Request; import com.djrapitops.plan.delivery.web.resolver.request.WebUser; +import com.djrapitops.plan.delivery.webserver.cache.AsyncJSONResolverService; import com.djrapitops.plan.delivery.webserver.cache.DataID; -import com.djrapitops.plan.delivery.webserver.cache.JSONCache; +import com.djrapitops.plan.delivery.webserver.cache.JSONStorage; import com.djrapitops.plan.identification.Identifiers; import javax.inject.Inject; @@ -41,14 +43,16 @@ import java.util.UUID; public class GraphsJSONResolver implements Resolver { private final Identifiers identifiers; + private final AsyncJSONResolverService jsonResolverService; private final GraphJSONCreator graphJSON; @Inject public GraphsJSONResolver( Identifiers identifiers, - GraphJSONCreator graphJSON + AsyncJSONResolverService jsonResolverService, GraphJSONCreator graphJSON ) { this.identifiers = identifiers; + this.jsonResolverService = jsonResolverService; this.graphJSON = graphJSON; } @@ -76,12 +80,31 @@ public class GraphsJSONResolver implements Resolver { DataID dataID = getDataID(type); + JSONStorage.StoredJSON graphJSON = getGraphJSON(request, dataID); + + return Response.builder() + .setMimeType(MimeType.JSON) + .setJSONContent(graphJSON.json) + .build(); + } + + private JSONStorage.StoredJSON getGraphJSON(Request request, DataID dataID) { + long timestamp = Identifiers.getTimestamp(request); + + JSONStorage.StoredJSON storedJSON; if (request.getQuery().get("server").isPresent()) { UUID serverUUID = identifiers.getServerUUID(request); // Can throw BadRequestException - return JSONCache.getOrCache(dataID, serverUUID, () -> generateGraphDataJSONOfType(dataID, serverUUID)); + storedJSON = jsonResolverService.resolve( + timestamp, dataID, serverUUID, + theServerUUID -> generateGraphDataJSONOfType(dataID, theServerUUID) + ); + } else { + // Assume network + storedJSON = jsonResolverService.resolve( + timestamp, dataID, () -> generateGraphDataJSONOfType(dataID) + ); } - // Assume network - return JSONCache.getOrCache(dataID, () -> generateGraphDataJSONOfType(dataID)); + return storedJSON; } private DataID getDataID(String type) { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/NetworkTabJSONResolver.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/NetworkTabJSONResolver.java index 666b8a751..dcbcbe69f 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/NetworkTabJSONResolver.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/NetworkTabJSONResolver.java @@ -20,11 +20,11 @@ import com.djrapitops.plan.delivery.rendering.json.network.NetworkTabJSONCreator import com.djrapitops.plan.delivery.web.resolver.MimeType; import com.djrapitops.plan.delivery.web.resolver.Resolver; import com.djrapitops.plan.delivery.web.resolver.Response; -import com.djrapitops.plan.delivery.web.resolver.exception.BadRequestException; import com.djrapitops.plan.delivery.web.resolver.request.Request; import com.djrapitops.plan.delivery.web.resolver.request.WebUser; import com.djrapitops.plan.delivery.webserver.cache.AsyncJSONResolverService; import com.djrapitops.plan.delivery.webserver.cache.DataID; +import com.djrapitops.plan.identification.Identifiers; import java.util.Optional; import java.util.function.Supplier; @@ -62,17 +62,7 @@ public class NetworkTabJSONResolver implements Resolver { private Response getResponse(Request request) { return Response.builder() .setMimeType(MimeType.JSON) - .setJSONContent(asyncJSONResolverService.resolve(getTimestamp(request), dataID, jsonCreator).json) + .setJSONContent(asyncJSONResolverService.resolve(Identifiers.getTimestamp(request), dataID, jsonCreator).json) .build(); } - - private long getTimestamp(Request request) { - try { - return request.getQuery().get("timestamp") - .map(Long::parseLong) - .orElseGet(System::currentTimeMillis); - } catch (NumberFormatException nonNumberTimestamp) { - throw new BadRequestException("'timestamp' was not a number: " + nonNumberTimestamp.getMessage()); - } - } } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/ServerTabJSONResolver.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/ServerTabJSONResolver.java index 1bff0c9b3..f0eb816af 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/ServerTabJSONResolver.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/ServerTabJSONResolver.java @@ -20,7 +20,6 @@ import com.djrapitops.plan.delivery.rendering.json.ServerTabJSONCreator; import com.djrapitops.plan.delivery.web.resolver.MimeType; import com.djrapitops.plan.delivery.web.resolver.Resolver; import com.djrapitops.plan.delivery.web.resolver.Response; -import com.djrapitops.plan.delivery.web.resolver.exception.BadRequestException; import com.djrapitops.plan.delivery.web.resolver.request.Request; import com.djrapitops.plan.delivery.web.resolver.request.WebUser; import com.djrapitops.plan.delivery.webserver.cache.AsyncJSONResolverService; @@ -29,7 +28,6 @@ import com.djrapitops.plan.identification.Identifiers; import java.util.Optional; import java.util.UUID; -import java.util.concurrent.TimeUnit; import java.util.function.Function; /** @@ -68,23 +66,7 @@ public class ServerTabJSONResolver implements Resolver { UUID serverUUID = identifiers.getServerUUID(request); // Can throw BadRequestException return Response.builder() .setMimeType(MimeType.JSON) - .setJSONContent(asyncJSONResolverService.resolve(getTimestamp(request), dataID, serverUUID, jsonCreator).json) + .setJSONContent(asyncJSONResolverService.resolve(Identifiers.getTimestamp(request), dataID, serverUUID, jsonCreator).json) .build(); } - - private long getTimestamp(Request request) { - try { - long currentTime = System.currentTimeMillis(); - long timestamp = request.getQuery().get("timestamp") - .map(Long::parseLong) - .orElse(currentTime); - if (currentTime + TimeUnit.SECONDS.toMillis(10L) < timestamp) { - throw new BadRequestException("Attempt to get data from the future! " + timestamp + " > " + currentTime); - } - return timestamp; - } catch (NumberFormatException nonNumberTimestamp) { - throw new BadRequestException("'timestamp' was not a number: " + nonNumberTimestamp.getMessage()); - } - } - } \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/identification/Identifiers.java b/Plan/common/src/main/java/com/djrapitops/plan/identification/Identifiers.java index 7a359d89e..cb85d1671 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/identification/Identifiers.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/identification/Identifiers.java @@ -26,6 +26,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import java.util.Optional; import java.util.UUID; +import java.util.concurrent.TimeUnit; /** * Utility for getting server identifier from different sources. @@ -103,4 +104,19 @@ public class Identifiers { public UUID getPlayerUUID(String name) { return uuidUtility.getUUIDOf(name); } + + public static long getTimestamp(Request request) { + try { + long currentTime = System.currentTimeMillis(); + long timestamp = request.getQuery().get("timestamp") + .map(Long::parseLong) + .orElse(currentTime); + if (currentTime + TimeUnit.SECONDS.toMillis(10L) < timestamp) { + throw new BadRequestException("Attempt to get data from the future! " + timestamp + " > " + currentTime); + } + return timestamp; + } catch (NumberFormatException nonNumberTimestamp) { + throw new BadRequestException("'timestamp' was not a number: " + nonNumberTimestamp.getMessage()); + } + } } \ No newline at end of file