Skip to content

Commit 92be8a7

Browse files
committed
KTNB-1205: Extract widget factory management into WidgetFactoryRegistry for improved modularity.
1 parent 8b5991b commit 92be8a7

File tree

3 files changed

+24
-16
lines changed

3 files changed

+24
-16
lines changed

integrations/widgets/widgets-api/src/main/kotlin/org/jetbrains/kotlinx/jupyter/widget/WidgetManager.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import org.jetbrains.kotlinx.jupyter.api.libraries.CommManager
1515
import org.jetbrains.kotlinx.jupyter.widget.model.DEFAULT_MAJOR_VERSION
1616
import org.jetbrains.kotlinx.jupyter.widget.model.DEFAULT_MINOR_VERSION
1717
import org.jetbrains.kotlinx.jupyter.widget.model.DefaultWidgetModel
18+
import org.jetbrains.kotlinx.jupyter.widget.model.WidgetFactoryRegistry
1819
import org.jetbrains.kotlinx.jupyter.widget.model.WidgetModel
19-
import org.jetbrains.kotlinx.jupyter.widget.model.loadWidgetFactory
2020
import org.jetbrains.kotlinx.jupyter.widget.model.versionConstraintRegex
2121
import org.jetbrains.kotlinx.jupyter.widget.protocol.CustomMessage
2222
import org.jetbrains.kotlinx.jupyter.widget.protocol.RequestStateMessage
@@ -67,7 +67,7 @@ public class WidgetManager(
6767
commManager.registerCommTarget(widgetTarget) { comm, data, _, buffers ->
6868
val openMessage = Json.decodeFromJsonElement<WidgetOpenMessage>(data)
6969
val modelName = openMessage.state["_model_name"]?.jsonPrimitive?.content!!
70-
val widgetFactory = loadWidgetFactory(modelName, classLoaderProvider())
70+
val widgetFactory = WidgetFactoryRegistry.loadWidgetFactory(modelName, classLoaderProvider())
7171

7272
val widget = widgetFactory.create()
7373
val patch = openMessage.toPatch(buffers)

integrations/widgets/widgets-api/src/main/kotlin/org/jetbrains/kotlinx/jupyter/widget/model/ModelCreation.kt

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,8 @@
11
package org.jetbrains.kotlinx.jupyter.widget.model
22

33
import org.jetbrains.kotlinx.jupyter.widget.WidgetManager
4-
import java.util.ServiceLoader
5-
import java.util.concurrent.ConcurrentHashMap
64
import kotlin.reflect.KClass
75

8-
private val factoryCache = ConcurrentHashMap<String, WidgetFactory<*>>()
9-
10-
internal fun loadWidgetFactory(
11-
modelName: String,
12-
classLoader: ClassLoader,
13-
): WidgetFactory<*> =
14-
factoryCache.getOrPut(modelName) {
15-
ServiceLoader
16-
.load(WidgetFactory::class.java, classLoader)
17-
.firstOrNull { it.spec.modelName == modelName } ?: error("No factory for model $modelName")
18-
}
19-
206
public fun <M : WidgetModel> WidgetManager.createAndRegisterWidget(widgetFactory: () -> M): M =
217
widgetFactory().also { widget -> registerWidget(widget) }
228

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.jetbrains.kotlinx.jupyter.widget.model
2+
3+
import java.util.ServiceLoader
4+
import java.util.concurrent.ConcurrentHashMap
5+
6+
public object WidgetFactoryRegistry {
7+
private val factoryCache = ConcurrentHashMap<String, WidgetFactory<*>>()
8+
9+
internal fun loadWidgetFactory(
10+
modelName: String,
11+
classLoader: ClassLoader,
12+
): WidgetFactory<*> =
13+
factoryCache.getOrPut(modelName) {
14+
ServiceLoader
15+
.load(WidgetFactory::class.java, classLoader)
16+
.firstOrNull { it.spec.modelName == modelName } ?: error("No factory for model $modelName")
17+
}
18+
19+
public fun registerWidgetFactory(factory: WidgetFactory<*>) {
20+
factoryCache[factory.spec.modelName] = factory
21+
}
22+
}

0 commit comments

Comments
 (0)