@@ -2,12 +2,16 @@ package app.simplecloud.controller.runtime
22
33import kotlinx.coroutines.*
44import org.apache.logging.log4j.LogManager
5+ import org.spongepowered.configurate.ConfigurationNode
56import org.spongepowered.configurate.ConfigurationOptions
67import org.spongepowered.configurate.kotlin.objectMapperFactory
78import org.spongepowered.configurate.loader.ParsingException
9+ import org.spongepowered.configurate.serialize.SerializationException
10+ import org.spongepowered.configurate.serialize.TypeSerializer
811import org.spongepowered.configurate.yaml.NodeStyle
912import org.spongepowered.configurate.yaml.YamlConfigurationLoader
1013import java.io.File
14+ import java.lang.reflect.Type
1115import java.nio.file.*
1216
1317
@@ -75,7 +79,9 @@ abstract class YamlDirectoryRepository<E, I>(
7579 protected fun save (fileName : String , entity : E ) {
7680 val file = directory.resolve(fileName).toFile()
7781 val loader = getOrCreateLoader(file)
78- val node = loader.createNode(ConfigurationOptions .defaults())
82+ val node = loader.createNode(ConfigurationOptions .defaults().serializers {
83+ it.register(Enum ::class .java, GenericEnumSerializer )
84+ })
7985 node.set(clazz, entity)
8086 loader.save(node)
8187 entities[file] = entity
@@ -89,6 +95,7 @@ abstract class YamlDirectoryRepository<E, I>(
8995 .defaultOptions { options ->
9096 options.serializers { builder ->
9197 builder.registerAnnotatedObjects(objectMapperFactory())
98+ builder.register(Enum ::class .java, GenericEnumSerializer )
9299 }
93100 }.build()
94101 }
@@ -120,11 +127,12 @@ abstract class YamlDirectoryRepository<E, I>(
120127 watcherEvents.onCreate(entity)
121128 }
122129 }
130+
123131 StandardWatchEventKinds .ENTRY_MODIFY -> {
124- val entity = load(resolvedPath.toFile())
125- if (entity != null ) {
126- watcherEvents.onModify(entity)
127- }
132+ val entity = load(resolvedPath.toFile())
133+ if (entity != null ) {
134+ watcherEvents.onModify(entity)
135+ }
128136 }
129137
130138 StandardWatchEventKinds .ENTRY_DELETE -> {
@@ -164,4 +172,25 @@ abstract class YamlDirectoryRepository<E, I>(
164172 }
165173 }
166174
175+ private object GenericEnumSerializer : TypeSerializer<Enum<*>> {
176+ override fun deserialize (type : Type , node : ConfigurationNode ): Enum <* > {
177+ val value = node.string ? : throw SerializationException (" No value present in node" )
178+
179+ if (type !is Class <* > || ! type.isEnum) {
180+ throw SerializationException (" Type is not an enum class" )
181+ }
182+
183+ @Suppress(" UNCHECKED_CAST" )
184+ return try {
185+ java.lang.Enum .valueOf(type as Class <out Enum <* >>, value)
186+ } catch (e: IllegalArgumentException ) {
187+ throw SerializationException (" Invalid enum constant" )
188+ }
189+ }
190+
191+ override fun serialize (type : Type , obj : Enum <* >? , node : ConfigurationNode ) {
192+ node.set(obj?.name)
193+ }
194+ }
195+
167196}
0 commit comments