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

org.jetbrains.kotlinx.jupyter.spring.starter.Beans.kt Maven / Gradle / Ivy

package org.jetbrains.kotlinx.jupyter.spring.starter

import jupyter.kotlin.ScriptTemplateWithDisplayHelpers
import jupyter.kotlin.USE
import org.jetbrains.kotlinx.jupyter.api.VariableDeclaration
import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration
import java.util.Locale
import kotlin.reflect.KClass
import kotlin.reflect.KVisibility
import kotlin.reflect.full.starProjectedType

@Suppress("unused")
fun ScriptTemplateWithDisplayHelpers.declareAllBeans() {
    USE {
        declareAllBeansInLibrary()
    }
}

@Suppress("unused")
fun JupyterIntegration.Builder.declareAllBeansInLibrary() {
    declareBeansByNames(springContext.beanDefinitionNames.toList())
}

@Suppress("unused")
fun JupyterIntegration.Builder.declareBeansByClasses(beanClasses: Iterable>) {
    val beanInstances =
        buildMap {
            beanClasses.forEachSafe { beanClass ->
                val className = beanClass.simpleName ?: return@forEachSafe
                val bean = springContext.getBean(beanClass.java)
                val beanName = className.replaceFirstChar { it.lowercase(Locale.getDefault()) }

                put(beanName, VariableDeclaration(beanName, bean, beanClass.starProjectedType, isMutable = false))
            }
        }

    declareBeanInstances(beanInstances)
}

fun JupyterIntegration.Builder.declareBeansByNames(beanNames: Iterable) {
    val beanInstances =
        buildMap {
            beanNames.forEachSafe { beanName ->
                val varName = beanName.substringAfterLast(".")
                if (varName.contains("$")) return@forEachSafe

                val beanClass = springContext.getType(beanName)?.kotlin ?: return@forEachSafe

                val qualifiedName = beanClass.qualifiedName ?: return@forEachSafe
                if (qualifiedName.contains("$") || qualifiedName.startsWith("com.sun.")) return@forEachSafe
                if (beanClass.visibility != KVisibility.PUBLIC) return@forEachSafe

                val bean = springContext.getBean(beanClass.java)

                put(varName, VariableDeclaration(varName, bean, beanClass.starProjectedType, isMutable = false))
            }
        }

    declareBeanInstances(beanInstances)
}

private fun JupyterIntegration.Builder.declareBeanInstances(beanInstances: Map) {
    onLoaded {
        declare(beanInstances.values)
    }
}

private fun  Iterable.forEachSafe(action: (T) -> Unit) {
    for (element in this) {
        try {
            action(element)
        } catch (_: Throwable) {
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy