Skip to content

Commit f06c137

Browse files
committed
feat: improved codebase
1 parent 3117497 commit f06c137

13 files changed

Lines changed: 320 additions & 114 deletions

src/main/kotlin/co/statu/parsek/Main.kt

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package co.statu.parsek
22

33
import co.statu.parsek.annotation.Boot
4-
import co.statu.parsek.api.event.CoreEventListener
54
import co.statu.parsek.config.ConfigManager
5+
import co.statu.parsek.route.RouterProvider
66
import co.statu.parsek.util.TimeUtil
77
import com.jcabi.manifests.Manifests
88
import io.vertx.core.Vertx
99
import io.vertx.core.VertxOptions
1010
import io.vertx.ext.web.Router
1111
import io.vertx.kotlin.coroutines.CoroutineVerticle
12+
import io.vertx.kotlin.coroutines.coAwait
1213
import org.slf4j.LoggerFactory
1314
import org.springframework.context.annotation.AnnotationConfigApplicationContext
14-
import kotlin.system.exitProcess
1515

1616
@Boot
1717
class Main : CoroutineVerticle() {
@@ -97,13 +97,25 @@ class Main : CoroutineVerticle() {
9797
startWebServer()
9898
}
9999

100-
private suspend fun init() {
101-
initDependencyInjection()
100+
private suspend fun executeBlocking(unit: () -> Unit) {
101+
vertx.executeBlocking {
102+
unit.invoke()
103+
}.onFailure {
104+
it.printStackTrace()
105+
}.coAwait()
106+
}
102107

103-
initPlugins()
108+
private suspend fun init() {
109+
executeBlocking {
110+
initDependencyInjection()
111+
}
104112

105113
initConfigManager()
106114

115+
executeBlocking {
116+
initPlugins()
117+
}
118+
107119
initRoutes()
108120
}
109121

@@ -135,31 +147,17 @@ class Main : CoroutineVerticle() {
135147
configManager = applicationContext.getBean(ConfigManager::class.java)
136148

137149
configManager.init()
138-
139-
try {
140-
val parsekEventHandlers = PluginEventManager.getParsekEventListeners<CoreEventListener>()
141-
142-
parsekEventHandlers.forEach { eventHandler ->
143-
eventHandler.onConfigManagerReady(configManager)
144-
}
145-
146-
parsekEventHandlers.forEach { eventHandler ->
147-
eventHandler.onConfigManagerDone(configManager)
148-
}
149-
} catch (e: Exception) {
150-
println(e.stackTraceToString())
151-
152-
exitProcess(1)
153-
}
154150
}
155151

156152
private fun initRoutes() {
157153
logger.info("Initializing routes")
158154

159155
try {
156+
val routerProvider = applicationContext.getBean(RouterProvider::class.java)
157+
routerProvider.initialize()
160158
router = applicationContext.getBean(Router::class.java)
161159
} catch (e: Exception) {
162-
logger.error(e.toString())
160+
e.printStackTrace()
163161
}
164162
}
165163

src/main/kotlin/co/statu/parsek/ParsekManifestPluginDescriptorFinder.kt

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,54 @@ package co.statu.parsek
22

33
import org.pf4j.ManifestPluginDescriptorFinder
44
import org.pf4j.PluginDescriptor
5-
import org.pf4j.util.StringUtils
65
import java.util.jar.Manifest
76

87
class ParsekManifestPluginDescriptorFinder : ManifestPluginDescriptorFinder() {
98
companion object {
10-
private const val PLUGIN_SOURCE_URL: String = "Plugin-Source-Url"
9+
private const val PLUGIN_ID: String = "id"
10+
private const val PLUGIN_NAME: String = "name"
11+
private const val PLUGIN_DESCRIPTION: String = "description"
12+
private const val PLUGIN_PARSEK_VERSION: String = "parsek-version"
13+
private const val PLUGIN_CLASS: String = "main-class"
14+
private const val PLUGIN_VERSION: String = "version"
15+
private const val PLUGIN_DEVELOPER: String = "developer"
16+
private const val PLUGIN_LICENSE: String = "license"
17+
private const val PLUGIN_SOURCE_URL: String = "source-url"
18+
private const val PLUGIN_DEPENDENCIES: String = "dependencies"
19+
private const val PLUGIN_REQUIRES: String = "requires"
1120
}
1221

1322
override fun createPluginDescriptorInstance(): ParsekPluginDescriptor {
1423
return ParsekPluginDescriptor()
1524
}
1625

1726
override fun createPluginDescriptor(manifest: Manifest): PluginDescriptor {
18-
val pluginDescriptor = super.createPluginDescriptor(manifest) as ParsekPluginDescriptor
27+
val pluginDescriptor = createPluginDescriptorInstance()
1928

2029
val attributes = manifest.mainAttributes
30+
val id = attributes.getValue(PLUGIN_ID)
31+
val name = attributes.getValue(PLUGIN_NAME)
32+
val description = attributes.getValue(PLUGIN_DESCRIPTION)
33+
val parsekVersion = attributes.getValue(PLUGIN_PARSEK_VERSION)
34+
val clazz = attributes.getValue(PLUGIN_CLASS)
35+
val version = attributes.getValue(PLUGIN_VERSION)
36+
val developer = attributes.getValue(PLUGIN_DEVELOPER)
37+
val license = attributes.getValue(PLUGIN_LICENSE)
2138
val sourceUrl = attributes.getValue(PLUGIN_SOURCE_URL)
22-
if (StringUtils.isNotNullOrEmpty(sourceUrl)) {
23-
pluginDescriptor.sourceUrl = sourceUrl
24-
}
39+
val dependencies = attributes.getValue(PLUGIN_DEPENDENCIES)
40+
val requires = attributes.getValue(PLUGIN_REQUIRES)
41+
42+
pluginDescriptor.pluginId = id
43+
pluginDescriptor.name = name ?: id
44+
pluginDescriptor.description = description
45+
pluginDescriptor.parsekVersion = parsekVersion
46+
pluginDescriptor.setPluginClass(clazz)
47+
pluginDescriptor.setPluginVersion(version)
48+
pluginDescriptor.developer = developer
49+
pluginDescriptor.license = license
50+
pluginDescriptor.sourceUrl = sourceUrl
51+
pluginDescriptor.setDependencies(dependencies ?: "")
52+
pluginDescriptor.setRequires(requires ?: "")
2553

2654
return pluginDescriptor
2755
}

src/main/kotlin/co/statu/parsek/ParsekPluginDescriptor.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,40 @@ package co.statu.parsek
33
import org.pf4j.DefaultPluginDescriptor
44

55
class ParsekPluginDescriptor : DefaultPluginDescriptor() {
6+
lateinit var name: String
7+
var description: String? = null
8+
var parsekVersion: String? = null
9+
lateinit var developer: String
610
var sourceUrl: String? = null
11+
12+
@Deprecated("Do not use", level = DeprecationLevel.HIDDEN)
13+
override fun getProvider(): String? {
14+
return super.getProvider()
15+
}
16+
17+
@Deprecated("Do not use", level = DeprecationLevel.HIDDEN)
18+
override fun getPluginDescription(): String? {
19+
return super.getPluginDescription()
20+
}
21+
22+
23+
public override fun setPluginId(pluginId: String): DefaultPluginDescriptor {
24+
return super.setPluginId(pluginId)
25+
}
26+
27+
public override fun setPluginClass(pluginClassName: String?): DefaultPluginDescriptor {
28+
return super.setPluginClass(pluginClassName)
29+
}
30+
31+
public override fun setPluginVersion(version: String?): DefaultPluginDescriptor {
32+
return super.setPluginVersion(version)
33+
}
34+
35+
public override fun setDependencies(dependencies: String?): DefaultPluginDescriptor {
36+
return super.setDependencies(dependencies)
37+
}
38+
39+
public override fun setRequires(requires: String?): DefaultPluginDescriptor {
40+
return super.setRequires(requires)
41+
}
742
}

src/main/kotlin/co/statu/parsek/ParsekPluginLoader.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package co.statu.parsek
22

3-
import org.pf4j.*
3+
import org.pf4j.JarPluginLoader
4+
import org.pf4j.PluginClassLoader
5+
import org.pf4j.PluginDescriptor
46
import org.pf4j.PluginManager
57
import java.nio.file.Path
68

79
class ParsekPluginLoader(pluginManager: PluginManager) : JarPluginLoader(pluginManager) {
810
override fun loadPlugin(pluginPath: Path, pluginDescriptor: PluginDescriptor): ClassLoader {
9-
val pluginClassLoader =
10-
PluginClassLoader(pluginManager, pluginDescriptor, javaClass.classLoader, ClassLoadingStrategy.APD)
11+
val pluginClassLoader = PluginClassLoader(pluginManager, pluginDescriptor, javaClass.classLoader)
1112

1213
pluginClassLoader.addFile(pluginPath.toFile())
1314

src/main/kotlin/co/statu/parsek/PluginFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class PluginFactory : DefaultPluginFactory() {
2121
val plugin = constructor.newInstance() as ParsekPlugin
2222

2323
plugin.pluginId = pluginWrapper.pluginId
24+
plugin.pluginState = pluginWrapper.pluginState
2425
plugin.vertx = vertx
2526
plugin.pluginEventManager = pluginEventManager
2627
plugin.environmentType = Main.ENVIRONMENT
@@ -31,7 +32,6 @@ class PluginFactory : DefaultPluginFactory() {
3132
runBlocking {
3233
plugin.load()
3334
plugin.onCreate()
34-
plugin.onStart()
3535
}
3636

3737
return plugin

src/main/kotlin/co/statu/parsek/PluginManager.kt

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package co.statu.parsek
22

33
import co.statu.parsek.api.ParsekPlugin
4+
import co.statu.parsek.api.event.PluginLifecycleListener
45
import kotlinx.coroutines.runBlocking
56
import org.pf4j.*
67
import org.springframework.context.annotation.AnnotationConfigApplicationContext
@@ -21,6 +22,12 @@ class PluginManager(importPaths: List<Path>) : DefaultPluginManager(importPaths)
2122

2223
pluginGlobalBeanContext
2324
}
25+
26+
internal val lifecycleListeners = mutableSetOf<PluginLifecycleListener>()
27+
}
28+
29+
fun addLifecycleListener(listener: PluginLifecycleListener) {
30+
lifecycleListeners.add(listener)
2431
}
2532

2633
override fun createPluginRepository(): PluginRepository {
@@ -64,30 +71,43 @@ class PluginManager(importPaths: List<Path>) : DefaultPluginManager(importPaths)
6471
return pluginWrapper
6572
}
6673

67-
6874
override fun enablePlugin(pluginId: String): Boolean {
6975
val result = super.enablePlugin(pluginId)
7076

7177
val plugin = getPlugin(pluginId)?.plugin as ParsekPlugin?
7278

7379
if (result) {
7480
plugin?.let {
75-
runBlocking {
76-
it.load()
77-
it.onEnable()
78-
it.onStart()
81+
try {
82+
runBlocking {
83+
it.load()
84+
85+
lifecycleListeners.forEach { listener ->
86+
listener.onPluginEnable(it)
87+
}
88+
89+
it.onEnable()
90+
}
91+
} catch (e: Exception) {
92+
e.printStackTrace()
7993
}
8094
}
8195
}
8296

8397
return result
8498
}
99+
override fun startPlugin(pluginId: String?): PluginState? {
100+
return super.startPlugin(pluginId)
101+
}
85102

86103
override fun disablePlugin(pluginId: String): Boolean {
87104
val plugin = getPlugin(pluginId).plugin as ParsekPlugin
88105

89106
runBlocking {
90-
plugin.onStop()
107+
lifecycleListeners.forEach { listener ->
108+
listener.onPluginDisable(plugin)
109+
}
110+
91111
plugin.onDisable()
92112
plugin.unload()
93113
}

src/main/kotlin/co/statu/parsek/SpringConfig.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,23 @@ open class SpringConfig {
3939
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
4040
open fun logger() = logger
4141

42-
4342
@Bean
44-
@Lazy
4543
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
46-
open fun router(
44+
open fun routerProvider(
4745
schemaRepository: SchemaRepository,
4846
configManager: ConfigManager,
49-
pluginManager: PluginManager
47+
pluginManager: PluginManager,
5048
) =
51-
RouterProvider.create(vertx, applicationContext, schemaRepository, configManager, pluginManager)
52-
.provide()
53-
49+
RouterProvider.create(
50+
vertx,
51+
applicationContext,
52+
schemaRepository,
53+
configManager,
54+
pluginManager
55+
)
5456

57+
@Bean
58+
open fun router(routerProvider: RouterProvider) = routerProvider.provide()
5559

5660
@Bean
5761
@Lazy

src/main/kotlin/co/statu/parsek/annotation/Dao.kt

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)