Skip to content

Commit 0ca7f0a

Browse files
committed
feat: update structure for new plugin API
1 parent 807dfa6 commit 0ca7f0a

10 files changed

Lines changed: 97 additions & 92 deletions

File tree

build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ version =
1212
val pf4jVersion: String by project
1313
val vertxVersion: String by project
1414
val gsonVersion: String by project
15+
val springContextVersion: String by project
1516
val handlebarsVersion: String by project
1617
val bootstrap = (project.findProperty("bootstrap") as String?)?.toBoolean() ?: false
1718
val pluginsDir: File? by rootProject.extra
@@ -50,6 +51,9 @@ dependencies {
5051

5152
// https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5
5253
implementation("org.apache.httpcomponents.client5:httpclient5:5.3")
54+
55+
// https://mvnrepository.com/artifact/org.springframework/spring-context
56+
compileOnly("org.springframework:spring-context:$springContextVersion")
5357
}
5458

5559
tasks {

gradle.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ pluginDependencies=
55
pf4jVersion=3.10.0
66
vertxVersion=4.5.1
77
gsonVersion=2.10.1
8-
handlebarsVersion=4.3.1
8+
handlebarsVersion=4.3.1
9+
springContextVersion=5.3.33
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package co.statu.rule.database
2+
3+
import co.statu.parsek.PluginEventManager
4+
import co.statu.parsek.api.annotation.EventListener
5+
import co.statu.parsek.api.config.PluginConfigManager
6+
import co.statu.parsek.api.event.CoreEventListener
7+
import co.statu.parsek.config.ConfigManager
8+
import co.statu.rule.database.event.DatabaseEventListener
9+
import org.slf4j.Logger
10+
11+
@EventListener
12+
class CoreEventHandler(
13+
private val logger: Logger,
14+
private val databasePlugin: DatabasePlugin,
15+
) : CoreEventListener {
16+
private val databaseManager by lazy {
17+
databasePlugin.pluginBeanContext.getBean(DatabaseManager::class.java)
18+
}
19+
20+
override suspend fun onConfigManagerReady(configManager: ConfigManager) {
21+
val pluginConfigManager = PluginConfigManager(
22+
configManager,
23+
databasePlugin,
24+
DatabaseConfig::class.java,
25+
exPluginIds = listOf("database")
26+
)
27+
databasePlugin.pluginBeanContext.beanFactory.registerSingleton(
28+
pluginConfigManager.javaClass.name,
29+
pluginConfigManager
30+
)
31+
32+
logger.info("Initialized plugin config")
33+
34+
DatabasePlugin.databaseManager = databaseManager
35+
36+
databaseManager.migrateNewPluginId(
37+
"database",
38+
databasePlugin.pluginId,
39+
databasePlugin
40+
)
41+
42+
databaseManager.initialize(databasePlugin)
43+
44+
databasePlugin.registerSingletonGlobal(databaseManager)
45+
46+
val handlers = PluginEventManager.getEventListeners<DatabaseEventListener>()
47+
48+
handlers.forEach {
49+
it.onReady(databaseManager)
50+
}
51+
}
52+
}

src/main/kotlin/co/statu/rule/database/DBEntity.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package co.statu.rule.database
22

3+
import co.statu.parsek.PluginEventManager
34
import co.statu.rule.database.deserializer.JsonObjectDeserializer
45
import co.statu.rule.database.event.DatabaseEventListener
56
import com.google.gson.GsonBuilder
@@ -15,10 +16,7 @@ abstract class DBEntity {
1516

1617
gsonBuilder.registerTypeAdapter(JsonObject::class.java, JsonObjectDeserializer())
1718

18-
val context = DatabasePlugin.INSTANCE.context
19-
val pluginEventManager = context.pluginEventManager
20-
21-
val databaseEventHandlers = pluginEventManager.getEventHandlers<DatabaseEventListener>()
19+
val databaseEventHandlers = PluginEventManager.getEventListeners<DatabaseEventListener>()
2220

2321
databaseEventHandlers.forEach { it.onGsonBuild(gsonBuilder) }
2422

src/main/kotlin/co/statu/rule/database/Dao.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package co.statu.rule.database
33
import co.statu.parsek.api.ParsekPlugin
44
import co.statu.parsek.util.TextUtil.convertToSnakeCase
55
import co.statu.rule.database.DBEntity.Companion.gson
6-
import co.statu.rule.database.DatabasePlugin.Companion.databaseManager
76
import io.vertx.jdbcclient.JDBCPool
87
import io.vertx.kotlin.coroutines.await
98
import io.vertx.sqlclient.Row
@@ -36,7 +35,7 @@ abstract class Dao<T : DBEntity>(private val entityClass: KClass<T>) {
3635

3736
abstract suspend fun init(jdbcPool: JDBCPool, plugin: ParsekPlugin)
3837

39-
fun getTablePrefix(): String = databaseManager.getTablePrefix()
38+
fun getTablePrefix(): String = DatabasePlugin.databaseManager.getTablePrefix()
4039

4140
suspend fun count(
4241
jdbcPool: JDBCPool

src/main/kotlin/co/statu/rule/database/DatabaseManager.kt

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,30 @@ package co.statu.rule.database
22

33
import co.statu.parsek.api.ParsekPlugin
44
import co.statu.parsek.api.config.PluginConfigManager
5+
import co.statu.rule.database.api.DatabaseHelper
56
import co.statu.rule.database.impl.SchemeVersionDaoImpl
67
import co.statu.rule.database.model.SchemeVersion
78
import io.vertx.core.Vertx
89
import io.vertx.core.json.JsonObject
910
import io.vertx.jdbcclient.JDBCPool
1011
import org.slf4j.Logger
12+
import org.springframework.beans.factory.config.ConfigurableBeanFactory
13+
import org.springframework.context.annotation.Scope
14+
import org.springframework.stereotype.Component
1115
import java.sql.BatchUpdateException
1216
import kotlin.system.exitProcess
1317

18+
@Component
19+
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
1420
class DatabaseManager(
1521
private val vertx: Vertx,
16-
private val pluginConfigManager: PluginConfigManager<DatabaseConfig>,
1722
private val logger: Logger,
23+
private val databasePlugin: DatabasePlugin
1824
) {
25+
private val pluginConfigManager by lazy {
26+
databasePlugin.pluginBeanContext.getBean(PluginConfigManager::class.java) as PluginConfigManager<DatabaseConfig>
27+
}
28+
1929
private lateinit var pool: JDBCPool
2030

2131
private val tables = mutableMapOf<ParsekPlugin, MutableList<Dao<*>>>()
@@ -69,7 +79,7 @@ class DatabaseManager(
6979
}
7080

7181
private suspend fun initSchemeVersion(plugin: ParsekPlugin, jdbcPool: JDBCPool) {
72-
val lastSchemeVersion = schemeVersionDaoImpl.getLastSchemeVersion(plugin.context.pluginId, jdbcPool)
82+
val lastSchemeVersion = schemeVersionDaoImpl.getLastSchemeVersion(plugin.pluginId, jdbcPool)
7383

7484
val latestMigration = getLatestMigration(plugin)
7585

@@ -80,9 +90,9 @@ class DatabaseManager(
8090
if (latestMigration == null) {
8191
schemeVersionDaoImpl.add(
8292
SchemeVersion(
83-
pluginId = plugin.context.pluginId,
93+
pluginId = plugin.pluginId,
8494
version = 1,
85-
extra = "Init ${plugin.context.pluginId}"
95+
extra = "Init ${plugin.pluginId}"
8696
),
8797
jdbcPool
8898
)
@@ -92,7 +102,7 @@ class DatabaseManager(
92102

93103
schemeVersionDaoImpl.add(
94104
SchemeVersion(
95-
pluginId = plugin.context.pluginId,
105+
pluginId = plugin.pluginId,
96106
version = latestMigration.SCHEME_VERSION,
97107
extra = latestMigration.SCHEME_VERSION_INFO
98108
),
@@ -105,13 +115,12 @@ class DatabaseManager(
105115

106116
initTables(plugin)
107117

108-
logger.info("\"${plugin.context.pluginId}\"'s database has been initialized")
118+
logger.info("\"${plugin.pluginId}\"'s database has been initialized")
109119
}
110120

111121
suspend fun initialize(
112122
plugin: ParsekPlugin,
113-
tables: List<Dao<*>>,
114-
migrations: List<DatabaseMigration>
123+
databaseHelper: DatabaseHelper? = null
115124
) {
116125
if (this.tables[plugin] == null) {
117126
this.tables[plugin] = mutableListOf()
@@ -121,14 +130,15 @@ class DatabaseManager(
121130
this.migrations[plugin] = mutableListOf()
122131
}
123132

124-
this.tables[plugin]!!.addAll(tables)
125-
this.migrations[plugin]!!.addAll(migrations)
133+
databaseHelper?.tables?.let { this.tables[plugin]!!.addAll(it) }
134+
databaseHelper?.migrations?.let { this.migrations[plugin]!!.addAll(it) }
126135

127136
val jdbcPool: JDBCPool
128137

129138
try {
130139
jdbcPool = getConnectionPool()
131140
} catch (e: Exception) {
141+
e.printStackTrace()
132142
logger.info("Connection to database failed! Shutting down...")
133143

134144
exitProcess(1)
@@ -137,7 +147,7 @@ class DatabaseManager(
137147
val lastSchemeVersion: SchemeVersion?
138148

139149
try {
140-
lastSchemeVersion = schemeVersionDaoImpl.getLastSchemeVersion(plugin.context.pluginId, jdbcPool)
150+
lastSchemeVersion = schemeVersionDaoImpl.getLastSchemeVersion(plugin.pluginId, jdbcPool)
141151
} catch (e: BatchUpdateException) {
142152
try {
143153
if (plugin is DatabasePlugin) {
@@ -151,7 +161,7 @@ class DatabaseManager(
151161
return
152162
} catch (e: Exception) {
153163
logger.error(e.message)
154-
logger.error("Database Error: Could not install plugin \"${plugin.context.pluginId}\". Shutting down...")
164+
logger.error("Database Error: Could not install plugin \"${plugin.pluginId}\". Shutting down...")
155165

156166
exitProcess(1)
157167
}
@@ -180,7 +190,7 @@ class DatabaseManager(
180190
internal fun getLatestMigration(plugin: ParsekPlugin) = migrations[plugin]?.maxByOrNull { it.SCHEME_VERSION }
181191

182192
suspend fun checkMigration(plugin: ParsekPlugin, jdbcPool: JDBCPool, lastSchemeVersion: SchemeVersion?) {
183-
logger.info("Checking available database migrations for \"${plugin.context.pluginId}\"")
193+
logger.info("Checking available database migrations for \"${plugin.pluginId}\"")
184194

185195
val databaseVersion = lastSchemeVersion?.version ?: 0
186196

@@ -196,7 +206,7 @@ class DatabaseManager(
196206
private suspend fun updateSchemeVersion(version: Int, info: String, plugin: ParsekPlugin, jdbcPool: JDBCPool) {
197207
schemeVersionDaoImpl.add(
198208
SchemeVersion(
199-
pluginId = plugin.context.pluginId,
209+
pluginId = plugin.pluginId,
200210
version = version,
201211
extra = info
202212
),
Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,9 @@
11
package co.statu.rule.database
22

33
import co.statu.parsek.api.ParsekPlugin
4-
import co.statu.parsek.api.PluginContext
5-
import co.statu.parsek.api.config.PluginConfigManager
6-
import org.slf4j.Logger
7-
import org.slf4j.LoggerFactory
84

9-
class DatabasePlugin(pluginContext: PluginContext) : ParsekPlugin(pluginContext) {
5+
class DatabasePlugin : ParsekPlugin() {
106
companion object {
11-
internal val logger: Logger = LoggerFactory.getLogger(DatabasePlugin::class.java)
12-
13-
internal lateinit var pluginConfigManager: PluginConfigManager<DatabaseConfig>
14-
15-
internal lateinit var INSTANCE: DatabasePlugin
16-
17-
internal val tables = listOf<Dao<*>>()
18-
internal val migrations = listOf<DatabaseMigration>()
19-
207
internal lateinit var databaseManager: DatabaseManager
218
}
22-
23-
init {
24-
INSTANCE = this
25-
26-
logger.info("Initialized instance")
27-
28-
context.pluginEventManager.register(this, ParsekEventHandler())
29-
30-
logger.info("Registered event")
31-
}
329
}
33-

src/main/kotlin/co/statu/rule/database/ParsekEventHandler.kt

Lines changed: 0 additions & 44 deletions
This file was deleted.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package co.statu.rule.database.api
2+
3+
import co.statu.rule.database.Dao
4+
import co.statu.rule.database.DatabaseMigration
5+
6+
interface DatabaseHelper {
7+
val tables: List<Dao<*>>
8+
val migrations: List<DatabaseMigration>
9+
}

src/main/kotlin/co/statu/rule/database/event/DatabaseEventListener.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package co.statu.rule.database.event
22

3-
import co.statu.parsek.api.PluginEvent
3+
import co.statu.parsek.api.event.PluginEventListener
44
import co.statu.rule.database.DatabaseManager
55
import com.google.gson.GsonBuilder
66

77
/**
88
* ParsekEventListener is an extension point for listening Parsek related events
99
* such as when config manager has been initialized.
1010
*/
11-
interface DatabaseEventListener : PluginEvent {
11+
interface DatabaseEventListener : PluginEventListener {
1212

1313
suspend fun onReady(databaseManager: DatabaseManager) {}
1414

0 commit comments

Comments
 (0)