X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FDefaultElementLoader.kt;h=98a2caa7f2e78a31b34f5a757600aa3309eeb377;hp=956d73be86b5011450a211126edb33e5d7852a48;hb=b91ce252d94a8876097b939e129dc33264cef2f5;hpb=1cd71a1c2a94f889d63d6ec3168d76da0a8b116b diff --git a/src/main/kotlin/net/pterodactylus/sone/core/DefaultElementLoader.kt b/src/main/kotlin/net/pterodactylus/sone/core/DefaultElementLoader.kt index 956d73b..98a2caa 100644 --- a/src/main/kotlin/net/pterodactylus/sone/core/DefaultElementLoader.kt +++ b/src/main/kotlin/net/pterodactylus/sone/core/DefaultElementLoader.kt @@ -1,18 +1,21 @@ package net.pterodactylus.sone.core +import com.google.common.base.Ticker import com.google.common.cache.CacheBuilder import freenet.keys.FreenetURI import java.io.ByteArrayInputStream +import java.util.concurrent.TimeUnit.MINUTES import javax.imageio.ImageIO import javax.inject.Inject /** * [ElementLoader] implementation that uses a simple Guava [com.google.common.cache.Cache]. */ -class DefaultElementLoader @Inject constructor(private val freenetInterface: FreenetInterface) : ElementLoader { +class DefaultElementLoader @Inject constructor(private val freenetInterface: FreenetInterface, ticker: Ticker = Ticker.systemTicker()) : ElementLoader { private val loadingLinks = CacheBuilder.newBuilder().build() - private val imageCache = CacheBuilder.newBuilder().build() + private val failureCache = CacheBuilder.newBuilder().ticker(ticker).expireAfterWrite(30, MINUTES).build() + private val imageCache = CacheBuilder.newBuilder().build() private val callback = object : FreenetInterface.BackgroundFetchCallback { override fun cancelForMimeType(uri: FreenetURI, mimeType: String): Boolean { return !mimeType.startsWith("image/") @@ -25,12 +28,13 @@ class DefaultElementLoader @Inject constructor(private val freenetInterface: Fre ByteArrayInputStream(data).use { ImageIO.read(it) }?.let { - imageCache.get(uri.toString()) { LinkedImage(uri.toString()) } + imageCache.get(uri.toString()) { LinkedElement(uri.toString()) } } removeLoadingLink(uri) } override fun failed(uri: FreenetURI) { + failureCache.put(uri.toString(), true) removeLoadingLink(uri) } @@ -46,15 +50,15 @@ class DefaultElementLoader @Inject constructor(private val freenetInterface: Fre imageCache.getIfPresent(link)?.run { return this } + failureCache.getIfPresent(link)?.run { + return LinkedElement(link, failed = true) + } if (loadingLinks.getIfPresent(link) == null) { loadingLinks.put(link, true) freenetInterface.startFetch(FreenetURI(link), callback) } } - return object : LinkedElement { - override val link = link - override val loading = true - } + return LinkedElement(link, loading = true) } }