Cache graph responses

This commit is contained in:
Risto Lahtela 2021-02-10 10:04:21 +02:00
parent f5a9d03da9
commit b5365d2321
6 changed files with 50 additions and 37 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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) {

View File

@ -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<T> 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());
}
}
}

View File

@ -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<T> 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());
}
}
}

View File

@ -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());
}
}
}