Skip to content

Commit b053484

Browse files
committed
Merge remote-tracking branch 'origin/develop' into develop
2 parents 3ac3fe7 + e35c8c3 commit b053484

File tree

1 file changed

+34
-5
lines changed

1 file changed

+34
-5
lines changed

controller-runtime/src/main/kotlin/app/simplecloud/controller/runtime/YamlDirectoryRepository.kt

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@ package app.simplecloud.controller.runtime
22

33
import kotlinx.coroutines.*
44
import org.apache.logging.log4j.LogManager
5+
import org.spongepowered.configurate.ConfigurationNode
56
import org.spongepowered.configurate.ConfigurationOptions
67
import org.spongepowered.configurate.kotlin.objectMapperFactory
78
import org.spongepowered.configurate.loader.ParsingException
9+
import org.spongepowered.configurate.serialize.SerializationException
10+
import org.spongepowered.configurate.serialize.TypeSerializer
811
import org.spongepowered.configurate.yaml.NodeStyle
912
import org.spongepowered.configurate.yaml.YamlConfigurationLoader
1013
import java.io.File
14+
import java.lang.reflect.Type
1115
import 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

Comments
 (0)