From 44ec1e57099bc713a3850717dbf41f08ffd99183 Mon Sep 17 00:00:00 2001 From: Claude Brisson Date: Thu, 14 Mar 2024 22:41:40 +0100 Subject: [PATCH] Add config property for ratings date freeze --- .../pairgoth/ratings/RatingsHandler.kt | 28 +++++++++++++------ .../pairgoth/ratings/RatingsManager.kt | 8 +++++- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/RatingsHandler.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/RatingsHandler.kt index 05e1a07..bd39cb3 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/RatingsHandler.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/RatingsHandler.kt @@ -9,8 +9,6 @@ import org.slf4j.LoggerFactory import java.io.File import java.net.URL import java.nio.charset.StandardCharsets -import java.text.DateFormat -import java.text.SimpleDateFormat import java.time.LocalDate import java.time.format.DateTimeFormatter import java.util.* @@ -26,15 +24,15 @@ abstract class RatingsHandler(val origin: RatingsManager.Ratings) { private val client = OkHttpClient() abstract val defaultURL: URL open val active = true - // val cacheFile = RatingsManager.path.resolve("${origin.name}.json").toFile() lateinit var players: Json.Array + lateinit var activeRatingsFile: File private var updated = false val url: URL by lazy { WebappManager.properties.getProperty("ratings.${origin.name.lowercase(Locale.ROOT)}")?.let { URL(it) } ?: defaultURL } - private fun getRatingsFiles() = RatingsManager.path.useDirectoryEntries("${origin.name}-*.json") { entries -> + public fun getRatingsFiles() = RatingsManager.path.useDirectoryEntries("${origin.name}-*.json") { entries -> entries.sortedBy { it.fileName.name }.map { it.toFile() }.toList() @@ -44,11 +42,19 @@ abstract class RatingsHandler(val origin: RatingsManager.Ratings) { private fun initIfNeeded(ratingsFile: File): Boolean { return if (!this::players.isInitialized) { - players = Json.parse(ratingsFile.readText())?.asArray() ?: Json.Array() + readPlayers(ratingsFile) true } else false } + @Synchronized + private fun readPlayers(ratingsFile: File) { + logger.info("Reading ${origin.name} players from ${ratingsFile.canonicalPath}") + players = Json.parse(ratingsFile.readText())?.asArray() ?: Json.Array() + activeRatingsFile = ratingsFile + } + + @Synchronized fun updateIfNeeded(): Boolean { val latestRatingsFile = getLatestRatingsFile() if (latestRatingsFile != null && Date().time - latestRatingsFile.lastModified() < delay) { @@ -56,12 +62,13 @@ abstract class RatingsHandler(val origin: RatingsManager.Ratings) { } val payload = fetchPayload() val (lastUpdated, lastPlayers) = parsePayload(payload) - val targetRatingsFilename = "${origin.name}-${ymd.format(lastUpdated)}.json" - if (latestRatingsFile != null && latestRatingsFile.name == targetRatingsFilename) { + val ratingsFilename = "${origin.name}-${ymd.format(lastUpdated)}.json" + if (latestRatingsFile != null && latestRatingsFile.name == ratingsFilename) { return initIfNeeded(latestRatingsFile) } RatingsManager.logger.info("Updating $origin cache from $url") - RatingsManager.path.resolve(targetRatingsFilename).toFile().printWriter().use { out -> + activeRatingsFile = RatingsManager.path.resolve(ratingsFilename).toFile() + activeRatingsFile.printWriter().use { out -> out.println(lastPlayers.toString()) } players = lastPlayers @@ -73,6 +80,11 @@ abstract class RatingsHandler(val origin: RatingsManager.Ratings) { return players } + fun fetchPlayers(ratingsFile: File): Json.Array { + initIfNeeded(ratingsFile) + return players + } + protected fun fetchPayload(): String { val request = Request.Builder() .url(url) diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/RatingsManager.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/RatingsManager.kt index d85e7c3..7f8a20d 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/RatingsManager.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/RatingsManager.kt @@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory import java.io.BufferedReader import java.lang.Exception import java.nio.file.Path +import java.nio.file.Paths import java.util.* import java.util.concurrent.locks.ReadWriteLock import java.util.concurrent.locks.ReentrantReadWriteLock @@ -53,7 +54,12 @@ object RatingsManager: Runnable { override fun run() { try { players = ratingsHandlers.values.filter { it.active }.flatMapTo(Json.MutableArray()) { ratings -> - ratings.fetchPlayers() + val ratingsFile = WebappManager.properties.getProperty("ratings.${ratings.origin.name.lowercase()}") as String? + if (ratingsFile == null) { + ratings.fetchPlayers() + } else { + ratings.fetchPlayers(Paths.get("").resolve(ratingsFile).toFile()) + } } val updated = ratingsHandlers.values.filter { it.active }.map { it.updated() }.reduce { u1, u2 -> u1 or u2