Trying to make script error logging cleaner... no success

main
Oliver Kennedy 2023-06-04 14:53:20 -04:00
parent f8a94890d9
commit c0255bae0c
Signed by: okennedy
GPG Key ID: 3E5F9B3ABD3FDB60
2 changed files with 38 additions and 18 deletions

View File

@ -1,6 +1,7 @@
package net.okennedy.shingle
import net.okennedy.shingle.module.Module
import java.io.StringWriter
object Webserver extends cask.Routes
{
@ -21,12 +22,14 @@ object Webserver extends cask.Routes
@cask.get("api/modules/:id/load")
def saveModule(id: String) = {
val logger = new StringWriter()
try {
Module.reload(id)
"Success"
val result = Module.reload(id, logger = logger)
"Success\n"
} catch {
case t: Throwable =>
t.toString()
// for some bizarre reason, ScriptEngine doesn't respect the logger argument
"Error: Check the Shingle logs to see the error\n"
}
}

View File

@ -6,6 +6,8 @@ import java.io.File
import scala.io.Source
import java.io.FileWriter
import net.okennedy.shingle.stream._
import java.io.StringWriter
import java.io.Writer
object Module
{
@ -28,13 +30,15 @@ object Module
def init(): Unit =
{
for(module <- list){
val logger = new StringWriter()
println(s"... installing $module")
try {
install(module, read(module))
install(module, read(module), logger)
} catch {
case t: Throwable =>
println(s"Error installing $module")
t.printStackTrace()
println(logger.getBuffer())
// t.printStackTrace()
}
}
}
@ -69,9 +73,9 @@ object Module
new File(SCRIPTS, module+SUFFIX).delete()
}
def reload(module: String): Unit =
def reload(module: String, logger: Writer = null): Unit =
{
install(module, read(module))
install(module, read(module), logger)
}
def unload(module: String): Unit =
@ -79,18 +83,31 @@ object Module
activeModules.remove(module).foreach { _.cleanup() }
}
def install(module: String, script: String): Unit =
def install(module: String, script: String, logger: Writer = null): Unit =
{
val engine = new ScriptEngine()
engine.eval(
s"""net.okennedy.shingle.module.Module("$module") { implicit ctx =>
| import net.okennedy.shingle._;
| import net.okennedy.shingle.component._;
| import net.okennedy.shingle.cron.Cron;
| import scala.concurrent.duration._;
| $script
|}
|""".stripMargin,
)
if(logger != null){
val ctx = engine.getContext()
println(s"Replacing: ${ctx.getErrorWriter()}")
ctx.setWriter(logger)
ctx.setErrorWriter(logger)
engine.setContext(ctx)
}
println(s"Replaced with: ${engine.getContext().getErrorWriter()}")
try {
val result = engine.eval(
s"""net.okennedy.shingle.module.Module("$module") { implicit ctx =>
| import net.okennedy.shingle._;
| import net.okennedy.shingle.component._;
| import net.okennedy.shingle.cron.Cron;
| import scala.concurrent.duration._;
| $script
|}
|""".stripMargin,
)
} catch {
case e:javax.script.ScriptException =>
println("Script exception")
}
}
}