1919
2020package org.ossreviewtoolkit.plugins.packagemanagers.maven.utils
2121
22+ import io.github.irgaly.kottage.Kottage
23+ import io.github.irgaly.kottage.KottageEnvironment
24+ import io.github.irgaly.kottage.getOrNull
25+ import io.github.irgaly.kottage.platform.KottageContext
26+ import io.github.irgaly.kottage.put
27+ import io.github.irgaly.kottage.strategy.KottageLruStrategy
28+
2229import java.io.Closeable
2330import java.io.File
2431import java.net.URI
2532
2633import kotlin.time.Duration.Companion.hours
2734
35+ import kotlinx.coroutines.MainScope
36+
2837import org.apache.logging.log4j.kotlin.logger
2938import org.apache.maven.artifact.repository.LegacyLocalRepositoryManager
3039import org.apache.maven.bridge.MavenRepositorySystem
@@ -79,16 +88,15 @@ import org.ossreviewtoolkit.model.PackageProvider
7988import org.ossreviewtoolkit.model.RemoteArtifact
8089import org.ossreviewtoolkit.model.fromYaml
8190import org.ossreviewtoolkit.model.toYaml
82- import org.ossreviewtoolkit.utils.common.DiskCache
8391import org.ossreviewtoolkit.utils.common.collectMessages
8492import org.ossreviewtoolkit.utils.common.div
85- import org.ossreviewtoolkit.utils.common.gibibytes
8693import org.ossreviewtoolkit.utils.common.searchUpwardFor
8794import org.ossreviewtoolkit.utils.ort.OrtAuthenticator
8895import org.ossreviewtoolkit.utils.ort.OrtProxySelector
8996import org.ossreviewtoolkit.utils.ort.downloadText
9097import org.ossreviewtoolkit.utils.ort.okHttpClient
9198import org.ossreviewtoolkit.utils.ort.ortDataDirectory
99+ import org.ossreviewtoolkit.utils.ort.runBlocking
92100import org.ossreviewtoolkit.utils.ort.showStackTrace
93101
94102/* *
@@ -101,12 +109,18 @@ class MavenSupport(private val workspaceReader: WorkspaceReader) : Closeable {
101109 private val container = createContainer()
102110 private val repositorySystemSession = createRepositorySystemSession(workspaceReader)
103111
104- private val remoteArtifactCache = DiskCache (
105- directory = ortDataDirectory / " cache" / " analyzer" / workspaceReader.repository.contentType,
106- maxCacheSizeInBytes = 1 .gibibytes,
107- maxCacheEntryAgeInSeconds = 6 .hours.inWholeSeconds
112+ val kottage = Kottage (
113+ name = " maven-support-store" ,
114+ directoryPath = (ortDataDirectory / " cache" / " analyzer" / workspaceReader.repository.contentType).absolutePath,
115+ environment = KottageEnvironment (KottageContext ()),
116+ scope = MainScope ()
108117 )
109118
119+ val remoteArtifactCache = kottage.cache(" remote-artifact-cache" ) {
120+ strategy = KottageLruStrategy (maxEntryCount = 5000 )
121+ defaultExpireTime = 6 .hours
122+ }
123+
110124 // The MavenSettingsBuilder class is deprecated, but internally it uses its successor SettingsBuilder. Calling
111125 // MavenSettingsBuilder requires less code than calling SettingsBuilder, so use it until it is removed.
112126 @Suppress(" DEPRECATION" )
@@ -294,7 +308,8 @@ class MavenSupport(private val workspaceReader: WorkspaceReader) : Closeable {
294308
295309 val cacheKey = " $artifact @$allRepositories "
296310
297- remoteArtifactCache.read(cacheKey)?.let {
311+ // TODO: Straight use `RemoteArtifact` instead of `String` here once the model classes use KxS.
312+ runBlocking { remoteArtifactCache.getOrNull<String >(cacheKey) }?.let {
298313 logger.debug { " Reading remote artifact for '$artifact ' from disk cache." }
299314 return it.fromYaml()
300315 }
@@ -413,7 +428,7 @@ class MavenSupport(private val workspaceReader: WorkspaceReader) : Closeable {
413428
414429 return RemoteArtifact (info.downloadUrl, hash).also { remoteArtifact ->
415430 logger.debug { " Writing remote artifact for '$artifact ' to disk cache." }
416- remoteArtifactCache.write (cacheKey, remoteArtifact.toYaml())
431+ runBlocking { remoteArtifactCache.put (cacheKey, remoteArtifact.toYaml()) }
417432 }
418433 } else {
419434 logger.debug { artifactDownload.exception.collectMessages() }
@@ -430,7 +445,7 @@ class MavenSupport(private val workspaceReader: WorkspaceReader) : Closeable {
430445 if (downloadUrls.any { url -> PACKAGING_TYPES .any { url.endsWith(" .$it " ) } }) {
431446 logger.debug { " Writing empty remote artifact for '$artifact ' to disk cache." }
432447
433- remoteArtifactCache.write (cacheKey, remoteArtifact.toYaml())
448+ runBlocking { remoteArtifactCache.put (cacheKey, remoteArtifact.toYaml()) }
434449 } else {
435450 logger.warn { " Could not find artifact $artifact in any of $downloadUrls ." }
436451 }
@@ -596,7 +611,7 @@ class MavenSupport(private val workspaceReader: WorkspaceReader) : Closeable {
596611 }
597612
598613 override fun close () {
599- remoteArtifactCache .close()
614+ runBlocking { kottage .close() }
600615 }
601616}
602617
0 commit comments