All Downloads are FREE. Search and download functionalities are using the official Maven repository.

name.remal.gradle_plugins.dsl.utils.retrieveAllPluginIds.kt Maven / Gradle / Ivy

There is a newer version: 1.9.2
Show newest version
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()
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy