Skip to content
This repository was archived by the owner on Dec 10, 2025. It is now read-only.

Commit 6cf981a

Browse files
committed
feat: add support for Flyway configuration overrides and standalone application customization
- Introduced `FlywayDisabler` to handle dynamic Flyway configuration based on `StandaloneConfigHolder`. - Enhanced `StandaloneConfigHolder` to include Flyway-specific settings and a global configuration accessor. - Updated `PluginFlywayConfigurationCustomizer` with Flyway-related application customization. - Added `CloudSpringApplicationConfiguration` interface for modular Spring application configuration. - Centralized Flyway configuration logic with caching mechanisms for improved performance and reuse. - Refactored database configuration to include additional Flyway options.
1 parent 51ba81e commit 6cf981a

File tree

10 files changed

+115
-22
lines changed

10 files changed

+115
-22
lines changed

surf-cloud-api/surf-cloud-api-common/build.gradle.kts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
import dev.slne.surf.surfapi.gradle.util.slneReleases
2-
import gradle.kotlin.dsl.accessors._2c95f20277cbe6143532f6e8d67e36cc.processResources
3-
import org.gradle.internal.impldep.org.junit.experimental.categories.Categories.CategoryFilter.exclude
4-
import org.jetbrains.kotlin.gradle.idea.proto.com.google.protobuf.api
5-
import org.jetbrains.kotlin.gradle.internal.config.AnalysisFlags.optIn
62

73
plugins {
84
`exclude-kotlin`
@@ -56,4 +52,4 @@ publishing {
5652
repositories {
5753
slneReleases()
5854
}
59-
}
55+
}

surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/CloudCoreInstance.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ import dev.slne.surf.cloud.core.common.player.punishment.CloudPlayerPunishmentMa
1616
import dev.slne.surf.cloud.core.common.player.task.PrePlayerJoinTaskAutoRegistrationHandler
1717
import dev.slne.surf.cloud.core.common.plugin.task.CloudBeforeStartTaskHandler
1818
import dev.slne.surf.cloud.core.common.processors.NettyPacketProcessor
19-
import dev.slne.surf.cloud.core.common.spring.CloudChildSpringApplicationConfiguration
20-
import dev.slne.surf.cloud.core.common.spring.CloudLifecycleAware
21-
import dev.slne.surf.cloud.core.common.spring.CloudUncaughtExceptionHandler
22-
import dev.slne.surf.cloud.core.common.spring.SurfSpringBanner
19+
import dev.slne.surf.cloud.core.common.spring.*
2320
import dev.slne.surf.cloud.core.common.spring.event.RootSpringContextInitialized
2421
import dev.slne.surf.cloud.core.common.util.getCallerClass
2522
import dev.slne.surf.cloud.core.common.util.tempChangeSystemClassLoader
@@ -154,6 +151,11 @@ class CloudCoreInstance : CloudInstance {
154151
.profiles(springProfile)
155152
.initializers(NettyPacketProcessor())
156153
.web(WebApplicationType.NONE)
154+
.apply {
155+
for (configuration in CloudSpringApplicationConfiguration.configurations) {
156+
configuration.configureApplication(this)
157+
}
158+
}
157159
.run()
158160
}
159161

@@ -166,7 +168,12 @@ class CloudCoreInstance : CloudInstance {
166168
val joinClassLoader = JoinClassLoader(classLoader, parentClassLoader)
167169
return tempChangeSystemClassLoader(joinClassLoader) {
168170
val parentContext = internalContext ?: error("Parent context is not initialized yet.")
169-
val resourceLoader = DefaultResourceLoader(JoinClassLoader(joinClassLoader, listOf(javaClass.classLoader)))
171+
val resourceLoader = DefaultResourceLoader(
172+
JoinClassLoader(
173+
joinClassLoader,
174+
listOf(javaClass.classLoader)
175+
)
176+
)
170177
val childConfigurations =
171178
parentContext.getBeansOfType(CloudChildSpringApplicationConfiguration::class.java)
172179

surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/config/AbstractSurfCloudConfig.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,7 @@ abstract class AbstractSurfCloudConfigHolder<C : AbstractSurfCloudConfig>(
3030
private val manager: SpongeConfigManager<C>
3131

3232
init {
33-
surfConfigApi.createSpongeYmlConfig(
34-
configClass,
35-
coreCloudInstance.dataFolder,
36-
"config.yml"
37-
)
38-
33+
createConfig(configClass)
3934
manager = surfConfigApi.getSpongeConfigManagerForConfig(configClass)
4035
}
4136

@@ -53,4 +48,12 @@ abstract class AbstractSurfCloudConfigHolder<C : AbstractSurfCloudConfig>(
5348
reloadAware.forEachAnnotationOrdered { it.beforeSave() }
5449
manager.save()
5550
}
51+
52+
companion object {
53+
fun <C> createConfig(configClass: Class<C>) = surfConfigApi.createSpongeYmlConfig(
54+
configClass,
55+
coreCloudInstance.dataFolder,
56+
"config.yml"
57+
)
58+
}
5659
}

surf-cloud-core/surf-cloud-core-common/src/main/kotlin/dev/slne/surf/cloud/core/common/config/connection/db/DatabaseConfig.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,18 @@ data class DatabaseConfig(
2020

2121
@Comment("Type of database to connect to")
2222
@Setting("type")
23-
val type: DatabaseType = DatabaseType.MARIADB
23+
val type: DatabaseType = DatabaseType.MARIADB,
24+
25+
val flyway: FlywayConfig = FlywayConfig()
2426
) {
27+
28+
@ConfigSerializable
29+
data class FlywayConfig(
30+
val enabled: Boolean = true,
31+
val baselineOnMigrate: Boolean = false,
32+
)
33+
34+
2535
enum class DatabaseType(val driver: String) {
2636
MYSQL("com.mysql.cj.jdbc.Driver"),
2737
MARIADB("org.mariadb.jdbc.Driver"),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package dev.slne.surf.cloud.core.common.spring
2+
3+
import net.kyori.adventure.util.Services
4+
import org.springframework.boot.builder.SpringApplicationBuilder
5+
6+
interface CloudSpringApplicationConfiguration {
7+
8+
fun configureApplication(
9+
builder: SpringApplicationBuilder
10+
)
11+
12+
companion object {
13+
val configurations: Set<CloudSpringApplicationConfiguration> =
14+
Services.services(CloudSpringApplicationConfiguration::class.java)
15+
}
16+
}
Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
11
package dev.slne.surf.cloud.standalone.config
22

3+
import dev.slne.surf.cloud.core.common.CloudCoreInstance
34
import dev.slne.surf.cloud.core.common.config.AbstractSurfCloudConfigHolder
45
import dev.slne.surf.cloud.core.common.config.ConfigReloadAware
56
import org.springframework.beans.factory.ObjectProvider
7+
import org.springframework.beans.factory.getBean
68
import org.springframework.stereotype.Component
79

810
@Component
911
class StandaloneConfigHolder(reloadAware: ObjectProvider<ConfigReloadAware>) :
10-
AbstractSurfCloudConfigHolder<StandaloneConfig>(reloadAware, StandaloneConfig::class.java)
12+
AbstractSurfCloudConfigHolder<StandaloneConfig>(reloadAware, StandaloneConfig::class.java) {
13+
14+
companion object {
15+
val holder
16+
get() = CloudCoreInstance.internalContext?.getBean<StandaloneConfigHolder>()
17+
?: error("StandaloneConfigHolder is not initialized yet")
18+
19+
fun isFlywayEnabled(): Boolean = createConfig(StandaloneConfig::class.java)
20+
.connectionConfig
21+
.databaseConfig
22+
.flyway.enabled
23+
}
24+
}

surf-cloud-standalone/src/main/kotlin/dev/slne/surf/cloud/standalone/plugin/spring/PluginSpringConfig.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ import org.springframework.boot.builder.SpringApplicationBuilder
1616
import org.springframework.stereotype.Component
1717

1818
@Component
19-
class PluginSpringConfig : CloudChildSpringApplicationConfiguration {
19+
class PluginSpringConfig() :
20+
CloudChildSpringApplicationConfiguration {
2021

2122
override fun configureChildApplication(
2223
builder: SpringApplicationBuilder,

surf-cloud-standalone/src/main/kotlin/dev/slne/surf/cloud/standalone/plugin/spring/config/DatabaseConfig.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package dev.slne.surf.cloud.standalone.plugin.spring.config
22

3+
import com.github.benmanes.caffeine.cache.Caffeine
34
import dev.slne.surf.cloud.api.server.plugin.configuration.PluginMeta
45
import dev.slne.surf.cloud.standalone.plugin.PluginInitializerManager
56
import dev.slne.surf.surfapi.core.api.config.createSpongeYmlConfig
67
import dev.slne.surf.surfapi.core.api.config.surfConfigApi
8+
import net.kyori.adventure.util.TriState
79
import org.spongepowered.configurate.objectmapping.ConfigSerializable
810
import org.springframework.context.annotation.Bean
911
import org.springframework.context.annotation.Configuration
@@ -21,6 +23,7 @@ data class DatabaseConfig(
2123
) {
2224
@ConfigSerializable
2325
data class FlywayConfig(
26+
val enabled: TriState = TriState.NOT_SET,
2427
val baselineOnMigrate: Boolean = false,
2528
)
2629

@@ -38,10 +41,21 @@ data class DatabaseConfig(
3841
@Profile("plugin")
3942
class DatabaseConfigConfiguration {
4043

44+
companion object {
45+
private val configurations = Caffeine.newBuilder()
46+
.build<String, DatabaseConfig>()
47+
48+
49+
fun getOrCreate(meta: PluginMeta) = configurations.get(meta.name) {
50+
createDatabaseConfig(PluginInitializerManager.pluginDirectoryPath / meta.name)
51+
}
52+
}
53+
54+
4155
@Suppress("SpringJavaInjectionPointsAutowiringInspection")
4256
@Bean
4357
fun pluginDatabaseConfig(meta: PluginMeta): DatabaseConfig {
44-
return createDatabaseConfig(PluginInitializerManager.pluginDirectoryPath / meta.name)
58+
return getOrCreate(meta)
4559
}
4660
}
4761

surf-cloud-standalone/src/main/kotlin/dev/slne/surf/cloud/standalone/plugin/spring/config/PluginFlywayConfigurationCustomizer.kt

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package dev.slne.surf.cloud.standalone.plugin.spring.config
22

33
import dev.slne.surf.cloud.api.server.plugin.provider.classloader.SpringPluginClassloader
4+
import dev.slne.surf.cloud.core.common.spring.CloudChildSpringApplicationConfiguration
5+
import dev.slne.surf.cloud.standalone.config.StandaloneConfigHolder
46
import dev.slne.surf.surfapi.core.api.reflection.Field
57
import dev.slne.surf.surfapi.core.api.reflection.SurfProxy
68
import dev.slne.surf.surfapi.core.api.reflection.createProxy
79
import dev.slne.surf.surfapi.core.api.reflection.surfReflection
810
import org.flywaydb.core.api.configuration.ClassicConfiguration
911
import org.flywaydb.core.api.configuration.FluentConfiguration
1012
import org.springframework.boot.autoconfigure.flyway.FlywayConfigurationCustomizer
13+
import org.springframework.boot.builder.SpringApplicationBuilder
1114
import org.springframework.context.annotation.Configuration
1215
import org.springframework.context.annotation.Profile
1316
import java.net.URLClassLoader
@@ -17,8 +20,8 @@ import java.net.URLClassLoader
1720
@Suppress("SpringJavaInjectionPointsAutowiringInspection")
1821
class PluginFlywayConfigurationCustomizer(
1922
private val pluginClassloader: SpringPluginClassloader,
20-
private val databaseConfig: DatabaseConfig
21-
) : FlywayConfigurationCustomizer {
23+
private val databaseConfig: DatabaseConfig,
24+
) : FlywayConfigurationCustomizer, CloudChildSpringApplicationConfiguration {
2225

2326
override fun customize(configuration: FluentConfiguration) {
2427
configuration.table(pluginClassloader.meta.flywayTableName)
@@ -30,6 +33,20 @@ class PluginFlywayConfigurationCustomizer(
3033
URLClassLoader("${source.fileName}-flyway", arrayOf(source.toUri().toURL()), null)
3134
}
3235

36+
override fun configureChildApplication(
37+
builder: SpringApplicationBuilder,
38+
classLoader: ClassLoader,
39+
vararg parentClassLoader: ClassLoader
40+
) {
41+
require(classLoader is SpringPluginClassloader)
42+
val flywayEnabled = DatabaseConfigConfiguration.getOrCreate(classLoader.meta).flyway.enabled
43+
.toBooleanOrElseGet { StandaloneConfigHolder.holder.config.connectionConfig.databaseConfig.flyway.enabled }
44+
45+
if (!flywayEnabled) {
46+
builder.properties("spring.flyway.enabled=false")
47+
}
48+
}
49+
3350
companion object {
3451

3552
val fluentConfigurationProxy = surfReflection.createProxy<FluentConfigurationProxy>()
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package dev.slne.surf.cloud.standalone.spring
2+
3+
import com.google.auto.service.AutoService
4+
import dev.slne.surf.cloud.core.common.spring.CloudSpringApplicationConfiguration
5+
import dev.slne.surf.cloud.standalone.config.StandaloneConfigHolder
6+
import org.springframework.boot.builder.SpringApplicationBuilder
7+
8+
@AutoService(CloudSpringApplicationConfiguration::class)
9+
class FlywayDisabler : CloudSpringApplicationConfiguration {
10+
override fun configureApplication(builder: SpringApplicationBuilder) {
11+
if (!StandaloneConfigHolder.isFlywayEnabled()) {
12+
builder.properties("spring.flyway.enabled=false")
13+
}
14+
}
15+
}

0 commit comments

Comments
 (0)