diff --git a/src/main/kotlin/co/statu/parsek/PluginFactory.kt b/src/main/kotlin/co/statu/parsek/PluginFactory.kt index bcb1c26..1654cb3 100644 --- a/src/main/kotlin/co/statu/parsek/PluginFactory.kt +++ b/src/main/kotlin/co/statu/parsek/PluginFactory.kt @@ -26,16 +26,19 @@ class PluginFactory : DefaultPluginFactory() { plugin.pluginEventManager = pluginEventManager plugin.environmentType = Main.ENVIRONMENT plugin.releaseStage = Main.STAGE + plugin.pluginGlobalBeanContext = PluginManager.pluginGlobalBeanContext plugin.applicationContext = Main.applicationContext val pluginBeanContext by lazy { val pluginBeanContext = AnnotationConfigApplicationContext() - pluginBeanContext.parent = Main.applicationContext + pluginBeanContext.setAllowBeanDefinitionOverriding(true) + + pluginBeanContext.parent = PluginManager.pluginGlobalBeanContext pluginBeanContext.classLoader = pluginClass.classLoader pluginBeanContext.scan(pluginClass.`package`.name) - pluginBeanContext.beanFactory.registerSingleton(logger.javaClass.name, logger) + pluginBeanContext.beanFactory.registerSingleton(plugin.logger.javaClass.name, plugin.logger) pluginBeanContext.beanFactory.registerSingleton(pluginEventManager.javaClass.name, pluginEventManager) pluginBeanContext.beanFactory.registerSingleton(plugin.javaClass.name, plugin) diff --git a/src/main/kotlin/co/statu/parsek/PluginManager.kt b/src/main/kotlin/co/statu/parsek/PluginManager.kt index fcaef42..38b2690 100644 --- a/src/main/kotlin/co/statu/parsek/PluginManager.kt +++ b/src/main/kotlin/co/statu/parsek/PluginManager.kt @@ -1,11 +1,24 @@ package co.statu.parsek import org.pf4j.* +import org.springframework.context.annotation.AnnotationConfigApplicationContext import java.nio.file.Path class PluginManager(importPaths: List) : DefaultPluginManager(importPaths) { companion object { internal val pluginEventManager = PluginEventManager() + + internal val pluginGlobalBeanContext by lazy { + val pluginGlobalBeanContext = AnnotationConfigApplicationContext() + + pluginGlobalBeanContext.setAllowBeanDefinitionOverriding(true) + + pluginGlobalBeanContext.beanFactory.registerSingleton(SpringConfig.vertx.javaClass.name, SpringConfig.vertx) + + pluginGlobalBeanContext.refresh() + + pluginGlobalBeanContext + } } override fun createPluginDescriptorFinder(): CompoundPluginDescriptorFinder { diff --git a/src/main/kotlin/co/statu/parsek/SpringConfig.kt b/src/main/kotlin/co/statu/parsek/SpringConfig.kt index b76e6ad..58048a0 100755 --- a/src/main/kotlin/co/statu/parsek/SpringConfig.kt +++ b/src/main/kotlin/co/statu/parsek/SpringConfig.kt @@ -45,9 +45,10 @@ open class SpringConfig { @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) open fun router( schemaParser: SchemaParser, - configManager: ConfigManager + configManager: ConfigManager, + pluginManager: PluginManager ) = - RouterProvider.create(vertx, applicationContext, schemaParser, configManager) + RouterProvider.create(vertx, applicationContext, schemaParser, configManager, pluginManager) .provide() @Bean diff --git a/src/main/kotlin/co/statu/parsek/api/ParsekPlugin.kt b/src/main/kotlin/co/statu/parsek/api/ParsekPlugin.kt index af49c04..f2fdc74 100644 --- a/src/main/kotlin/co/statu/parsek/api/ParsekPlugin.kt +++ b/src/main/kotlin/co/statu/parsek/api/ParsekPlugin.kt @@ -26,18 +26,21 @@ abstract class ParsekPlugin : Plugin() { lateinit var pluginBeanContext: AnnotationConfigApplicationContext internal set + lateinit var pluginGlobalBeanContext: AnnotationConfigApplicationContext + internal set + internal lateinit var applicationContext: AnnotationConfigApplicationContext val logger: Logger = LoggerFactory.getLogger(this::class.java) - private val registeredBeans = mutableListOf>() + private val registeredBeans = mutableListOf() - fun register(bean: Class<*>) { + fun registerSingletonGlobal(bean: Any) { if (registeredBeans.contains(bean)) { return } - applicationContext.register(bean) + pluginGlobalBeanContext.beanFactory.registerSingleton(bean.javaClass.name, bean) registeredBeans.add(bean) } @@ -46,20 +49,14 @@ abstract class ParsekPlugin : Plugin() { pluginEventManager.register(this, eventListener) } - fun unRegister(bean: Class<*>) { + fun unRegisterGlobal(bean: Any) { if (!registeredBeans.contains(bean)) { return } - val registry = applicationContext.beanFactory as BeanDefinitionRegistry - val beanNames = registry.beanDefinitionNames + val registry = pluginGlobalBeanContext.beanFactory as BeanDefinitionRegistry - for (beanName in beanNames) { - if (registry.getBeanDefinition(beanName).beanClassName == bean.name) { - registry.removeBeanDefinition(beanName) - return // Stop after removing the first bean definition of the given class - } - } + registry.removeBeanDefinition(bean.javaClass.name) registeredBeans.remove(bean) } @@ -82,7 +79,7 @@ abstract class ParsekPlugin : Plugin() { val copyOfRegisteredBeans = registeredBeans.toList() copyOfRegisteredBeans.forEach { - unRegister(it) + unRegisterGlobal(it) } pluginEventManager.unregisterPlugin(this) diff --git a/src/main/kotlin/co/statu/parsek/api/config/PluginConfigManager.kt b/src/main/kotlin/co/statu/parsek/api/config/PluginConfigManager.kt index 281e9ce..2a6acc1 100644 --- a/src/main/kotlin/co/statu/parsek/api/config/PluginConfigManager.kt +++ b/src/main/kotlin/co/statu/parsek/api/config/PluginConfigManager.kt @@ -5,15 +5,17 @@ import co.statu.parsek.config.ConfigManager import com.google.gson.Gson import io.vertx.core.json.JsonObject import org.slf4j.Logger +import org.slf4j.LoggerFactory class PluginConfigManager( private val configManager: ConfigManager, plugin: ParsekPlugin, private val pluginConfigClass: Class, - private val logger: Logger, private val migrations: List = listOf(), private val exPluginIds: List = listOf() ) { + private val logger: Logger = LoggerFactory.getLogger(this::class.java) + companion object { private val gson = Gson() } diff --git a/src/main/kotlin/co/statu/parsek/route/RouterProvider.kt b/src/main/kotlin/co/statu/parsek/route/RouterProvider.kt index e456b91..4b9fa52 100755 --- a/src/main/kotlin/co/statu/parsek/route/RouterProvider.kt +++ b/src/main/kotlin/co/statu/parsek/route/RouterProvider.kt @@ -1,7 +1,9 @@ package co.statu.parsek.route import co.statu.parsek.PluginEventManager +import co.statu.parsek.PluginManager import co.statu.parsek.annotation.Endpoint +import co.statu.parsek.api.ParsekPlugin import co.statu.parsek.api.event.RouterEventListener import co.statu.parsek.config.ConfigManager import co.statu.parsek.model.Api @@ -14,22 +16,25 @@ import io.vertx.ext.web.handler.CorsHandler import io.vertx.ext.web.handler.SessionHandler import io.vertx.ext.web.sstore.LocalSessionStore import io.vertx.json.schema.SchemaParser +import org.pf4j.PluginWrapper import org.springframework.context.annotation.AnnotationConfigApplicationContext class RouterProvider private constructor( vertx: Vertx, applicationContext: AnnotationConfigApplicationContext, schemaParser: SchemaParser, - configManager: ConfigManager + configManager: ConfigManager, + pluginManager: PluginManager ) { companion object { fun create( vertx: Vertx, applicationContext: AnnotationConfigApplicationContext, schemaParser: SchemaParser, - configManager: ConfigManager + configManager: ConfigManager, + pluginManager: PluginManager ) = - RouterProvider(vertx, applicationContext, schemaParser, configManager) + RouterProvider(vertx, applicationContext, schemaParser, configManager, pluginManager) private var isInitialized = false @@ -62,9 +67,14 @@ class RouterProvider private constructor( init { val routerConfig = configManager.getConfig().getJsonObject("router") - val beans = applicationContext.getBeansWithAnnotation(Endpoint::class.java) + val routeList = mutableListOf() - val routeList = beans.map { it.value as Route }.toMutableList() + routeList.addAll(applicationContext.getBeansWithAnnotation(Endpoint::class.java).map { it.value as Route }) + routeList.addAll(pluginManager.plugins.map { + ((it as PluginWrapper).plugin as ParsekPlugin).pluginBeanContext.getBeansWithAnnotation( + Endpoint::class.java + ) + }.flatMap { it.values }.map { it as Route }) val routerEventHandlers = PluginEventManager.getParsekEventListeners()