From 2e1431ad9fdb0b31093518c09d206b52bb3dec2b Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Fri, 14 Feb 2020 14:30:50 +0100 Subject: [PATCH] Add configurable scripting host to Olive - Fix normalization again for reused scripting host - Reduce verbosity --- orx-olive/src/main/kotlin/Olive.kt | 26 ++++++++++++++++++++----- orx-olive/src/main/kotlin/Reloadable.kt | 14 ++++++------- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/orx-olive/src/main/kotlin/Olive.kt b/orx-olive/src/main/kotlin/Olive.kt index 6645ca92..dd9eb7b6 100644 --- a/orx-olive/src/main/kotlin/Olive.kt +++ b/orx-olive/src/main/kotlin/Olive.kt @@ -25,11 +25,18 @@ private fun Event.restoreListeners(store: Map, List<(Any) -> Uni listeners.retainAll(store[this] ?: emptyList()) } +enum class OliveScriptHost { + JSR223, + JSR223_REUSE, + KOTLIN_SCRIPT +} + class Olive

(val resources: Resources? = null) : Extension { override var enabled: Boolean = true var session: Session? = null + var scriptHost = OliveScriptHost.JSR223_REUSE - internal var scriptChange: (String)->Unit = {} + internal var scriptChange: (String) -> Unit = {} var script = "src/main/kotlin/live.kts" set(value) { @@ -70,7 +77,7 @@ class Olive

(val resources: Resources? = null) : Extension { trackedListeners.forEach { it.saveListeners(store) } - fun setupScript(scriptFile:String) { + fun setupScript(scriptFile: String) { watcher?.stop() val f = File(scriptFile) if (!f.exists()) { @@ -94,18 +101,27 @@ class Olive

(val resources: Resources? = null) : Extension { """.trimIndent()) } + val jsr233ObjectLoader = if (scriptHost == OliveScriptHost.JSR223_REUSE) ScriptObjectLoader() else null + watcher = program.watchFile(File(script)) { try { + logger.info("change detected, reloading script") val futureFunc = GlobalScope.async { val start = System.currentTimeMillis() - val f = loadFromScriptKSH Unit>(it) + + val loadedFunction = when (scriptHost) { + OliveScriptHost.JSR223_REUSE -> loadFromScript(it, jsr233ObjectLoader!!) + OliveScriptHost.JSR223 -> loadFromScript(it) + OliveScriptHost.KOTLIN_SCRIPT -> loadFromScriptKSH Unit>(it) + } + val end = System.currentTimeMillis() logger.info { "loading script took ${end - start}ms" } - f + loadedFunction } program.launch { - val func = futureFunc.await() + val func = futureFunc.await() program.extensions.clear() program.extensions.addAll(originalExtensions) diff --git a/orx-olive/src/main/kotlin/Reloadable.kt b/orx-olive/src/main/kotlin/Reloadable.kt index 4b8c131d..79d8a0d2 100644 --- a/orx-olive/src/main/kotlin/Reloadable.kt +++ b/orx-olive/src/main/kotlin/Reloadable.kt @@ -1,10 +1,12 @@ package org.openrndr.extra.olive +import mu.KotlinLogging import kotlin.reflect.KMutableProperty1 import kotlin.reflect.KProperty1 import kotlin.reflect.full.declaredMemberProperties import kotlin.reflect.jvm.jvmName +private val logger = KotlinLogging.logger {} private val store = mutableMapOf() @@ -19,11 +21,9 @@ fun clearReloadables() { * A class with which persistent state can be reloaded from inside Olive scripts. */ open class Reloadable { - - - // -- since kotlin 1.3.61 the scripting host prepends class names with the host id private fun normalizeClassName(name: String): String { - return name.replace(Regex("ScriptingHost[0-9a-f]+_"), "") + return name.replace(Regex("ScriptingHost[0-9a-f]+_"), // -- since kotlin 1.3.61 the scripting host prepends class names with the host id + "").replace(Regex("Line_[0-9]+"),"") // -- when reusing the script engine the line number increments. } /** @@ -41,14 +41,14 @@ open class Reloadable { val value = (e as KProperty1).get(existing) val mp = (p as KMutableProperty1) mp.set(this, value as Any) - println("reloaded property ${p.name} <- ${value}") + logger.info("reloaded property ${p.name} <- ${value}") } catch (e: Throwable) { - println("error while reloading property ${p.name}: ${e.message}") + logger.warn("error while reloading property ${p.name}: ${e.message}") } } } } else { - println("no existing store found for $className") + logger.info("no existing store found for $className") } store[normalizeClassName(this::class.jvmName)] = this }