name.remal.gradle_plugins.dsl.utils.retrieveAllPluginIds.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gradle-plugins-kotlin-dsl Show documentation
Show all versions of gradle-plugins-kotlin-dsl Show documentation
Remal Gradle plugins: gradle-plugins-kotlin-dsl
package name.remal.gradle_plugins.dsl.utils
import io.github.classgraph.ClassGraph
import name.remal.concurrentMapOf
import name.remal.concurrentSetOf
import java.lang.ClassLoader.getSystemClassLoader
import java.util.concurrent.ConcurrentMap
private val pluginIdsCache: ConcurrentMap> = concurrentMapOf()
private object NullClassLoader : ClassLoader()
fun retrieveAllPluginIds(classLoader: ClassLoader?): Set {
return pluginIdsCache.computeIfAbsent(classLoader ?: NullClassLoader) { classLoaderKey ->
val pluginIds = concurrentSetOf()
ClassGraph()
.apply {
if (classLoader === NullClassLoader) {
overrideClassLoaders(getSystemClassLoader())
} else {
overrideClassLoaders(classLoaderKey)
}
}
.whitelistPathsNonRecursive("META-INF/gradle-plugins")
.scan()
.use {
it.allResources.asSequence()
.filter { it.path.endsWith(".properties") }
.forEach { resource ->
pluginIds.add(resource.path.substringAfterLast('/').substringBeforeLast('.'))
}
}
return@computeIfAbsent pluginIds.toSortedSet().toSet()
}
}