Commit d38fa039 authored by jiahua.liu's avatar jiahua.liu

plugin supporting

parent 3eed99ce
...@@ -5,24 +5,36 @@ import java.io.File ...@@ -5,24 +5,36 @@ import java.io.File
import java.util.jar.JarFile import java.util.jar.JarFile
abstract class PluginBase{ abstract class PluginBase constructor() {
open fun onLoad(){ open fun onLoad() {
} }
open fun onEnable(){ open fun onEnable() {
} }
open fun onDisable(){ open fun onDisable() {
} }
fun getPluginManager():PluginManager{ fun getPluginManager(): PluginManager {
return PluginManager return PluginManager
} }
private lateinit var pluginDescription: PluginDescription
internal fun init(pluginDescription: PluginDescription) {
this.pluginDescription = pluginDescription
this.onLoad()
}
fun getDataFolder(): File {
return File(PluginManager.pluginsPath + pluginDescription.pluginName).also {
it.mkdirs()
}
}
} }
...@@ -33,9 +45,8 @@ class PluginDescription( ...@@ -33,9 +45,8 @@ class PluginDescription(
val pluginVersion: String, val pluginVersion: String,
val pluginInfo: String, val pluginInfo: String,
val depends: List<String>,//插件的依赖 val depends: List<String>,//插件的依赖
//internal internal var loaded: Boolean = false,
var loaded: Boolean = false, internal var noCircularDepend: Boolean = true
var noCircularDepend: Boolean = true
) { ) {
companion object { companion object {
...@@ -81,23 +92,17 @@ class PluginDescription( ...@@ -81,23 +92,17 @@ class PluginDescription(
object PluginManager{ object PluginManager{
private val pluginsPath = System.getProperty("user.dir") + "/plugins/".replace("//","/").also { internal val pluginsPath = System.getProperty("user.dir") + "/plugins/".replace("//", "/").also {
File(it).mkdirs() File(it).mkdirs()
} }
private val logger = DefaultLogger("Plugin Manager") private val logger = DefaultLogger("Plugin Manager")
//已完成加载的 //已完成加载的
private val nameToDescriptionMap: Map<String, PluginDescription> = mutableMapOf() private val nameToPluginBaseMap: MutableMap<String, PluginBase> = mutableMapOf()
private val pluginBaseToDescriptionMap: Map<PluginBase, PluginDescription> = mutableMapOf()
fun getPluginDataFolder(plugin: PluginBase):File{
val name = (pluginBaseToDescriptionMap[plugin] ?: error("Plugin not loaded")).pluginName
return File(pluginsPath + name).also {
it.mkdirs()
}
}
/** /**
...@@ -179,11 +184,36 @@ object PluginManager{ ...@@ -179,11 +184,36 @@ object PluginManager{
//在这里所有的depends都已经加载了 //在这里所有的depends都已经加载了
//loadPlugin //real load
logger.info("loading plugin " + description.pluginName)
} try {
this.javaClass.classLoader.loadClass(description.pluginBasePath)
return try {
val subClass = javaClass.asSubclass(PluginBase::class.java)
val plugin: PluginBase = subClass.getDeclaredConstructor().newInstance()
description.loaded = true
logger.info("successfully loaded plugin " + description.pluginName)
logger.info(description.pluginInfo)
nameToPluginBaseMap[description.pluginName] = plugin
plugin.init(description)
true
} catch (e: ClassCastException) {
false.also {
logger.error("failed to load plugin " + description.pluginName + " , Main class does not extends PluginBase ")
}
}
} catch (e: ClassNotFoundException) {
return false.also {
logger.error("failed to load plugin " + description.pluginName + " , Main class not found under " + description.pluginBasePath)
}
}
}
pluginsFound.values.forEach{ loadPlugin(it) } pluginsFound.values.forEach{ loadPlugin(it) }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment