AvalonS3ClientRegistry.kt
package io.github.lishangbu.avalon.s3.client
import io.github.lishangbu.avalon.s3.facade.S3Facade
import java.util.LinkedHashSet
/** 命名 S3 client 注册表。 */
class AvalonS3ClientRegistry(
private val defaultClientName: String,
private val bundles: Map<String, AvalonS3ClientBundle>,
) : AutoCloseable {
init {
require(bundles.isNotEmpty()) {
"At least one enabled S3 client must be configured."
}
require(bundles.containsKey(defaultClientName)) {
"Default S3 client '$defaultClientName' is not defined. Available clients: ${bundles.keys}."
}
}
/** 获取默认 facade。 */
fun defaultFacade(): S3Facade = facade(defaultClientName)
/** 获取命名 facade。 */
fun facade(clientName: String): S3Facade = bundle(clientName).facade
/** 获取命名 bundle。 */
fun bundle(clientName: String): AvalonS3ClientBundle =
bundles[clientName]
?: throw IllegalArgumentException("Unknown S3 client '$clientName'. Available clients: ${bundles.keys}.")
/** 获取所有已注册名称。 */
fun clientNames(): Set<String> = bundles.keys
/** 获取所有 facade。 */
fun facades(): Map<String, S3Facade> = bundles.mapValues { (_, bundle) -> bundle.facade }
override fun close() {
val closeables = LinkedHashSet<AutoCloseable>()
bundles.values.forEach { bundle ->
closeables += bundle.s3TransferManager
closeables += bundle.s3Presigner
closeables += bundle.s3ControlAsyncClient
closeables += bundle.s3ControlClient
closeables += bundle.s3AsyncClient
closeables += bundle.s3Client
}
closeables.forEach(AutoCloseable::close)
}
}