refactor module loader part, add empty project morny-core
Some checks failed
Tests / check-build (push) Has been cancelled
Tests / check-unit-tests (push) Has been cancelled
Tests / check-assembly-run (push) Has been cancelled

This commit is contained in:
A.C.Sukazyo Eyre 2024-12-10 15:47:32 +08:00
parent 7c1549e35f
commit 9a8f3f8076
Signed by: Eyre_S
GPG Key ID: EFB47D98FE082FAD
9 changed files with 109 additions and 41 deletions

View File

@ -64,8 +64,20 @@ lazy val morny_system_lib = (project in file (MornyProject.morny_system_lib.id))
)
lazy val morny_core = (project in file(MornyProject.morny_core.id))
.dependsOn(morny_system_lib)
.settings(
name := MornyProject.morny_core.name,
moduleName := MornyProject.morny_core.id,
libraryDependencies ++= MornyProject.morny_core.dependencies,
)
lazy val morny_coeur = (project in file(MornyProject.morny_coeur.id))
.enablePlugins(BuildInfoPlugin)
.dependsOn(morny_core)
.dependsOn(morny_system_lib)
.settings(

View File

@ -16,7 +16,6 @@ import cc.sukazyo.cono.morny.util.schedule.Scheduler
import cc.sukazyo.cono.morny.util.time.WatchDog
import cc.sukazyo.cono.morny.util.UseString.MString
import cc.sukazyo.cono.morny.util.UseThrowable.toLogString
import cc.sukazyo.cono.morny.util.dataview.Table
import com.pengrad.telegrambot.TelegramBot
import com.pengrad.telegrambot.request.GetMe

View File

@ -2,8 +2,10 @@ package cc.sukazyo.cono.morny.core
import cc.sukazyo.cono.morny.core.Log.logger
import cc.sukazyo.cono.morny.core.MornyConfig.{CheckFailure, PROP_TOKEN_KEY}
import cc.sukazyo.cono.morny.core.module.{ModuleHelper, ModuleLoader}
import cc.sukazyo.cono.morny.core.module.ModuleHelper
import cc.sukazyo.cono.morny.core.module.ModuleLoader.MornyModuleInitializingException
import cc.sukazyo.cono.morny.util.CommonFormat
import cc.sukazyo.cono.morny.util.UseThrowable.toLogString
import java.time.ZoneOffset
import java.util.TimeZone
@ -170,7 +172,11 @@ object ServerMain {
s"""The Skip Login feature is not implemented yet!
|""".stripMargin
val loadedModules = ModuleLoader.loadCoreModules()
val loadedModules = ModuleHelper.loadCoeurModules(
(e: MornyModuleInitializingException) => {
logger.error(e.toLogString)
}
)
if (mode_echoVersion) {

View File

@ -1,6 +1,8 @@
package cc.sukazyo.cono.morny.core.module
import cc.sukazyo.cono.morny.core.MornyModule
import cc.sukazyo.cono.morny.core.{MornyCoeur, MornyModule}
import cc.sukazyo.cono.morny.core.module.ModuleLoader.MornyModuleInitializingException
import cc.sukazyo.cono.morny.core.module.ModulesJarLoader.loadFromJar
import cc.sukazyo.cono.morny.util.dataview.Table
object ModuleHelper {
@ -12,4 +14,8 @@ object ModuleHelper {
)
}
def loadCoeurModules (onLoadingErrors: MornyModuleInitializingException =>Any): List[MornyModule] = {
loadFromJar(classOf[MornyCoeur], onLoadingErrors)
}
}

View File

@ -1,51 +1,69 @@
package cc.sukazyo.cono.morny.core.module
import cc.sukazyo.cono.morny.core.{MornyCoeur, MornyModule}
import cc.sukazyo.cono.morny.core.Log.logger
import cc.sukazyo.cono.morny.util.UseThrowable.toLogString
import cc.sukazyo.cono.morny.core.MornyModule
import java.nio.charset.StandardCharsets
import scala.collection.mutable.ListBuffer
object ModuleLoader {
def loadCoreModules (): List[MornyModule] = {
loadFromJar(classOf[MornyCoeur])
class MornyModuleInitializingException (val className: String, message: String) extends Exception (
s"Failed to initialize module $className : $message"
)
class NotMornyModuleException (className: String) extends MornyModuleInitializingException (
className,
s"Class is not a MornyModule, due to it does not implements the cc.sukazyo.cono.morny.core.MornyModule trait."
)
class MornyModuleNotFoundException (className: String) extends MornyModuleInitializingException (
className,
s"Cannot found class in this name."
)
@throws[MornyModuleInitializingException]
def loadModuleByClass (clazz: Class[?]): MornyModule = {
try {
val instance = clazz.getConstructor().newInstance()
instance match
case module: MornyModule =>
module
case _ =>
throw NotMornyModuleException(clazz.getName)
} catch {
case e_module: MornyModuleInitializingException =>
throw e_module
case e_any: Exception =>
throw MornyModuleInitializingException(clazz.getName, e_any.getMessage).initCause(e_any)
}
}
def loadFromJar (packageClazz: Class[?]): List[MornyModule] = {
@throws[MornyModuleInitializingException]
def loadModuleByClassName (className: String): MornyModule = {
try {
val clazz = Class.forName(className)
loadModuleByClass(clazz)
} catch {
case e_module: MornyModuleInitializingException =>
throw e_module
case e_notFound: ClassNotFoundException =>
throw MornyModuleNotFoundException(className).initCause(e_notFound)
}
}
def loadModuleByNameList (moduleClassNames: List[String], onLoadingErrors: MornyModuleInitializingException =>Any): List[MornyModule] = {
val list = ListBuffer[MornyModule]()
val moduleListFile = packageClazz.getResourceAsStream("/morny-modules.list")
.readAllBytes()
val modules = String(moduleListFile, StandardCharsets.UTF_8)
.split("\n")
.map(_.strip)
.filter(_.nonEmpty)
modules.foreach { (clazzName: String) =>
moduleClassNames.foreach { (clazzName: String) =>
try {
val clazz = Class.forName(clazzName)
val instance = clazz.getConstructor().newInstance()
instance match
case module: MornyModule =>
list += module
case _ =>
logger `error`
s"""Module is not a Morny Module :
| - in package : ${packageClazz.getName}
| - declared class name : $clazzName
|You need to implement a MornyModule trait to make it a REAL morny module!""".stripMargin
} catch case e: Exception =>
logger `error`
s"""Failed to create a module instance :
| - in package : ${packageClazz.getName}
| - declared class name : $clazzName
|${e.toLogString}
|Is this a typo or packaging error? You need to add morny-modules.list and your code to the same jar.""".stripMargin
val module = loadModuleByClassName(clazzName)
list += module
} catch case e: MornyModuleInitializingException =>
onLoadingErrors(e)
}
list.toList
}
}

View File

@ -1,9 +1,20 @@
package cc.sukazyo.cono.morny.core.module
import cc.sukazyo.cono.morny.core.MornyModule
import cc.sukazyo.cono.morny.core.module.ModuleLoader.{loadModuleByNameList, MornyModuleInitializingException}
import java.nio.charset.StandardCharsets
object ModulesJarLoader {
def load (): Unit = {
// TODO
def loadFromJar (packageClazz: Class[?], onLoadingErrors: MornyModuleInitializingException=>Any): List[MornyModule] = {
val moduleListFile = packageClazz.getResourceAsStream("/morny-modules.list")
.readAllBytes()
val modules = String(moduleListFile, StandardCharsets.UTF_8)
.split("\n")
.map(_.strip)
.filter(_.nonEmpty)
loadModuleByNameList(modules.toList, onLoadingErrors)
}
}

3
morny-core/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
# builds
/target

View File

@ -60,11 +60,23 @@ object MornyConfiguration {
// for test report
"com.vladsch.flexmark" % "flexmark" % "0.64.8" % Test,
"com.vladsch.flexmark" % "flexmark-profile-pegdown" % "0.64.8" % Test
)
}
object Morny_Core extends ProjectMetadata {
override val name = "Morny Core"
override val id = "morny-core"
override val group = GROUP
override val root_package = s"$GROUP.cono.morny.core"
override val dependencies = Seq()
}
object Morny_Coeur extends ProjectMetadata with Runnable {
override val name = "Morny Coeur"
@ -108,7 +120,7 @@ object MornyConfiguration {
// for test report
"com.vladsch.flexmark" % "flexmark" % "0.64.8" % Test,
"com.vladsch.flexmark" % "flexmark-profile-pegdown" % "0.64.8" % Test
)
}

View File

@ -54,6 +54,7 @@ object MornyProject {
val source_encoding = "utf-8"
val morny_system_lib = MornyConfiguration.Morny_System_Library
val morny_core = MornyConfiguration.Morny_Core
val morny_coeur = MornyConfiguration.Morny_Coeur
}