summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/options
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/options')
-rw-r--r--src/main/kotlin/io/dico/parcels2/options/GeneratorOptions.kt70
-rw-r--r--src/main/kotlin/io/dico/parcels2/options/MigrationOptions.kt42
-rw-r--r--src/main/kotlin/io/dico/parcels2/options/Options.kt114
-rw-r--r--src/main/kotlin/io/dico/parcels2/options/OptionsMapper.kt132
-rw-r--r--src/main/kotlin/io/dico/parcels2/options/PolymorphicOptions.kt176
-rw-r--r--src/main/kotlin/io/dico/parcels2/options/StorageOptions.kt116
6 files changed, 325 insertions, 325 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/options/GeneratorOptions.kt b/src/main/kotlin/io/dico/parcels2/options/GeneratorOptions.kt
index d0626dc..a6a57e5 100644
--- a/src/main/kotlin/io/dico/parcels2/options/GeneratorOptions.kt
+++ b/src/main/kotlin/io/dico/parcels2/options/GeneratorOptions.kt
@@ -1,36 +1,36 @@
-package io.dico.parcels2.options
-
-import io.dico.parcels2.ParcelGenerator
-import io.dico.parcels2.defaultimpl.DefaultParcelGenerator
-import org.bukkit.Bukkit
-import org.bukkit.Material
-import org.bukkit.block.Biome
-import org.bukkit.block.data.BlockData
-import kotlin.reflect.KClass
-
-object GeneratorOptionsFactories : PolymorphicOptionsFactories<ParcelGenerator>("name", GeneratorOptions::class, DefaultGeneratorOptionsFactory())
-
-class GeneratorOptions (name: String = "default", options: Any = DefaultGeneratorOptions()) : PolymorphicOptions<ParcelGenerator>(name, options, GeneratorOptionsFactories) {
- fun newInstance(worldName: String) = factory.newInstance(key, options, worldName)
-}
-
-private class DefaultGeneratorOptionsFactory : PolymorphicOptionsFactory<ParcelGenerator> {
- override val supportedKeys: List<String> = listOf("default")
- override val optionsClass: KClass<out Any> get() = DefaultGeneratorOptions::class
-
- override fun newInstance(key: String, options: Any, vararg extra: Any?): ParcelGenerator {
- return DefaultParcelGenerator(extra.first() as String, options as DefaultGeneratorOptions)
- }
-}
-
-class DefaultGeneratorOptions(val defaultBiome: Biome = Biome.JUNGLE,
- val wallType: BlockData = Bukkit.createBlockData(Material.STONE_SLAB),
- val floorType: BlockData = Bukkit.createBlockData(Material.QUARTZ_BLOCK),
- val fillType: BlockData = Bukkit.createBlockData(Material.QUARTZ_BLOCK),
- val pathMainType: BlockData = Bukkit.createBlockData(Material.SANDSTONE),
- val pathAltType: BlockData = Bukkit.createBlockData(Material.REDSTONE_BLOCK),
- val parcelSize: Int = 101,
- val pathSize: Int = 9,
- val floorHeight: Int = 64,
- val offsetX: Int = 0,
+package io.dico.parcels2.options
+
+import io.dico.parcels2.ParcelGenerator
+import io.dico.parcels2.defaultimpl.DefaultParcelGenerator
+import org.bukkit.Bukkit
+import org.bukkit.Material
+import org.bukkit.block.Biome
+import org.bukkit.block.data.BlockData
+import kotlin.reflect.KClass
+
+object GeneratorOptionsFactories : PolymorphicOptionsFactories<ParcelGenerator>("name", GeneratorOptions::class, DefaultGeneratorOptionsFactory())
+
+class GeneratorOptions (name: String = "default", options: Any = DefaultGeneratorOptions()) : PolymorphicOptions<ParcelGenerator>(name, options, GeneratorOptionsFactories) {
+ fun newInstance(worldName: String) = factory.newInstance(key, options, worldName)
+}
+
+private class DefaultGeneratorOptionsFactory : PolymorphicOptionsFactory<ParcelGenerator> {
+ override val supportedKeys: List<String> = listOf("default")
+ override val optionsClass: KClass<out Any> get() = DefaultGeneratorOptions::class
+
+ override fun newInstance(key: String, options: Any, vararg extra: Any?): ParcelGenerator {
+ return DefaultParcelGenerator(extra.first() as String, options as DefaultGeneratorOptions)
+ }
+}
+
+class DefaultGeneratorOptions(val defaultBiome: Biome = Biome.JUNGLE,
+ val wallType: BlockData = Bukkit.createBlockData(Material.STONE_SLAB),
+ val floorType: BlockData = Bukkit.createBlockData(Material.QUARTZ_BLOCK),
+ val fillType: BlockData = Bukkit.createBlockData(Material.QUARTZ_BLOCK),
+ val pathMainType: BlockData = Bukkit.createBlockData(Material.SANDSTONE),
+ val pathAltType: BlockData = Bukkit.createBlockData(Material.REDSTONE_BLOCK),
+ val parcelSize: Int = 101,
+ val pathSize: Int = 9,
+ val floorHeight: Int = 64,
+ val offsetX: Int = 0,
val offsetZ: Int = 0) \ No newline at end of file
diff --git a/src/main/kotlin/io/dico/parcels2/options/MigrationOptions.kt b/src/main/kotlin/io/dico/parcels2/options/MigrationOptions.kt
index 5e36099..7dd752e 100644
--- a/src/main/kotlin/io/dico/parcels2/options/MigrationOptions.kt
+++ b/src/main/kotlin/io/dico/parcels2/options/MigrationOptions.kt
@@ -1,22 +1,22 @@
-package io.dico.parcels2.options
-
-import io.dico.parcels2.storage.migration.Migration
-import io.dico.parcels2.storage.migration.plotme.PlotmeMigration
-import kotlin.reflect.KClass
-
-object MigrationOptionsFactories : PolymorphicOptionsFactories<Migration>("kind", MigrationOptions::class, PlotmeMigrationFactory())
-
-class MigrationOptions(kind: String = "plotme-0.17", options: Any = PlotmeMigrationOptions()) : SimplePolymorphicOptions<Migration>(kind, options, MigrationOptionsFactories)
-
-private class PlotmeMigrationFactory : PolymorphicOptionsFactory<Migration> {
- override val supportedKeys = listOf("plotme-0.17")
- override val optionsClass: KClass<out Any> get() = PlotmeMigrationOptions::class
-
- override fun newInstance(key: String, options: Any, vararg extra: Any?): Migration {
- return PlotmeMigration(options as PlotmeMigrationOptions)
- }
-}
-
-class PlotmeMigrationOptions(val worldsFromTo: Map<String, String> = mapOf("plotworld" to "parcels"),
- val storage: StorageOptions = StorageOptions(options = DataConnectionOptions(database = "plotme")),
+package io.dico.parcels2.options
+
+import io.dico.parcels2.storage.migration.Migration
+import io.dico.parcels2.storage.migration.plotme.PlotmeMigration
+import kotlin.reflect.KClass
+
+object MigrationOptionsFactories : PolymorphicOptionsFactories<Migration>("kind", MigrationOptions::class, PlotmeMigrationFactory())
+
+class MigrationOptions(kind: String = "plotme-0.17", options: Any = PlotmeMigrationOptions()) : SimplePolymorphicOptions<Migration>(kind, options, MigrationOptionsFactories)
+
+private class PlotmeMigrationFactory : PolymorphicOptionsFactory<Migration> {
+ override val supportedKeys = listOf("plotme-0.17")
+ override val optionsClass: KClass<out Any> get() = PlotmeMigrationOptions::class
+
+ override fun newInstance(key: String, options: Any, vararg extra: Any?): Migration {
+ return PlotmeMigration(options as PlotmeMigrationOptions)
+ }
+}
+
+class PlotmeMigrationOptions(val worldsFromTo: Map<String, String> = mapOf("plotworld" to "parcels"),
+ val storage: StorageOptions = StorageOptions(options = DataConnectionOptions(database = "plotme")),
val tableNamesUppercase: Boolean = false) \ No newline at end of file
diff --git a/src/main/kotlin/io/dico/parcels2/options/Options.kt b/src/main/kotlin/io/dico/parcels2/options/Options.kt
index 35d48ba..412c783 100644
--- a/src/main/kotlin/io/dico/parcels2/options/Options.kt
+++ b/src/main/kotlin/io/dico/parcels2/options/Options.kt
@@ -1,58 +1,58 @@
-package io.dico.parcels2.options
-
-import io.dico.parcels2.TickJobtimeOptions
-import org.bukkit.GameMode
-import org.bukkit.Material
-import java.io.Reader
-import java.io.Writer
-import java.util.EnumSet
-
-class Options {
- var worlds: Map<String, WorldOptions> = hashMapOf()
- private set
- var storage: StorageOptions = StorageOptions()
- var tickJobtime: TickJobtimeOptions = TickJobtimeOptions(20, 1)
- var migration = MigrationOptionsHolder()
-
- fun addWorld(name: String,
- generatorOptions: GeneratorOptions? = null,
- worldOptions: RuntimeWorldOptions? = null) {
- val optionsHolder = WorldOptions(
- generatorOptions ?: GeneratorOptions(),
- worldOptions ?: RuntimeWorldOptions()
- )
-
- (worlds as MutableMap).put(name, optionsHolder)
- }
-
- fun writeTo(writer: Writer) = optionsMapper.writeValue(writer, this)
-
- fun mergeFrom(reader: Reader) = optionsMapper.readerForUpdating(this).readValue<Options>(reader)
-
- override fun toString(): String = optionsMapper.writeValueAsString(this)
-
-}
-
-class WorldOptions(val generator: GeneratorOptions,
- var runtime: RuntimeWorldOptions = RuntimeWorldOptions())
-
-class RuntimeWorldOptions(var gameMode: GameMode? = GameMode.CREATIVE,
- var dayTime: Boolean = true,
- var noWeather: Boolean = true,
- var preventWeatherBlockChanges: Boolean = true,
- var preventBlockSpread: Boolean = true, // TODO
- var dropEntityItems: Boolean = true,
- var doTileDrops: Boolean = false,
- var disableExplosions: Boolean = true,
- var blockPortalCreation: Boolean = true,
- var blockMobSpawning: Boolean = true,
- var blockedItems: Set<Material> = EnumSet.of(Material.FLINT_AND_STEEL, Material.SNOWBALL),
- var axisLimit: Int = 10)
-
-class DataFileOptions(val location: String = "/flatfile-storage/")
-
-class MigrationOptionsHolder {
- var enabled = false
- var disableWhenComplete = true
- var instance: MigrationOptions? = MigrationOptions()
+package io.dico.parcels2.options
+
+import io.dico.parcels2.TickJobtimeOptions
+import org.bukkit.GameMode
+import org.bukkit.Material
+import java.io.Reader
+import java.io.Writer
+import java.util.EnumSet
+
+class Options {
+ var worlds: Map<String, WorldOptions> = hashMapOf()
+ private set
+ var storage: StorageOptions = StorageOptions()
+ var tickJobtime: TickJobtimeOptions = TickJobtimeOptions(20, 1)
+ var migration = MigrationOptionsHolder()
+
+ fun addWorld(name: String,
+ generatorOptions: GeneratorOptions? = null,
+ worldOptions: RuntimeWorldOptions? = null) {
+ val optionsHolder = WorldOptions(
+ generatorOptions ?: GeneratorOptions(),
+ worldOptions ?: RuntimeWorldOptions()
+ )
+
+ (worlds as MutableMap).put(name, optionsHolder)
+ }
+
+ fun writeTo(writer: Writer) = optionsMapper.writeValue(writer, this)
+
+ fun mergeFrom(reader: Reader) = optionsMapper.readerForUpdating(this).readValue<Options>(reader)
+
+ override fun toString(): String = optionsMapper.writeValueAsString(this)
+
+}
+
+class WorldOptions(val generator: GeneratorOptions,
+ var runtime: RuntimeWorldOptions = RuntimeWorldOptions())
+
+class RuntimeWorldOptions(var gameMode: GameMode? = GameMode.CREATIVE,
+ var dayTime: Boolean = true,
+ var noWeather: Boolean = true,
+ var preventWeatherBlockChanges: Boolean = true,
+ var preventBlockSpread: Boolean = true, // TODO
+ var dropEntityItems: Boolean = true,
+ var doTileDrops: Boolean = false,
+ var disableExplosions: Boolean = true,
+ var blockPortalCreation: Boolean = true,
+ var blockMobSpawning: Boolean = true,
+ var blockedItems: Set<Material> = EnumSet.of(Material.FLINT_AND_STEEL, Material.SNOWBALL),
+ var axisLimit: Int = 10)
+
+class DataFileOptions(val location: String = "/flatfile-storage/")
+
+class MigrationOptionsHolder {
+ var enabled = false
+ var disableWhenComplete = true
+ var instance: MigrationOptions? = MigrationOptions()
} \ No newline at end of file
diff --git a/src/main/kotlin/io/dico/parcels2/options/OptionsMapper.kt b/src/main/kotlin/io/dico/parcels2/options/OptionsMapper.kt
index 671a25f..d741617 100644
--- a/src/main/kotlin/io/dico/parcels2/options/OptionsMapper.kt
+++ b/src/main/kotlin/io/dico/parcels2/options/OptionsMapper.kt
@@ -1,66 +1,66 @@
-package io.dico.parcels2.options
-
-import com.fasterxml.jackson.core.JsonGenerator
-import com.fasterxml.jackson.core.JsonParser
-import com.fasterxml.jackson.databind.DeserializationContext
-import com.fasterxml.jackson.databind.ObjectMapper
-import com.fasterxml.jackson.databind.PropertyNamingStrategy
-import com.fasterxml.jackson.databind.SerializerProvider
-import com.fasterxml.jackson.databind.deser.std.StdDeserializer
-import com.fasterxml.jackson.databind.ser.std.StdSerializer
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
-import com.fasterxml.jackson.module.kotlin.KotlinModule
-import org.bukkit.Bukkit
-import org.bukkit.block.data.BlockData
-
-val optionsMapper = ObjectMapper(YAMLFactory()).apply {
- propertyNamingStrategy = PropertyNamingStrategy.KEBAB_CASE
-
- val kotlinModule = KotlinModule()
-
- with(kotlinModule) {
- /*
- setSerializerModifier(object : BeanSerializerModifier() {
- @Suppress("UNCHECKED_CAST")
- override fun modifySerializer(config: SerializationConfig?, beanDesc: BeanDescription, serializer: JsonSerializer<*>): JsonSerializer<*> {
-
- val newSerializer = if (GeneratorOptions::class.isSuperclassOf(beanDesc.beanClass.kotlin)) {
- GeneratorOptionsSerializer(serializer as JsonSerializer<GeneratorOptions>)
- } else {
- serializer
- }
-
- return super.modifySerializer(config, beanDesc, newSerializer)
- }
- })*/
-
- addSerializer(BlockDataSerializer())
- addDeserializer(BlockData::class.java, BlockDataDeserializer())
-
- GeneratorOptionsFactories.registerSerialization(this)
- StorageOptionsFactories.registerSerialization(this)
- MigrationOptionsFactories.registerSerialization(this)
- }
-
- registerModule(kotlinModule)
-}
-
-private class BlockDataSerializer : StdSerializer<BlockData>(BlockData::class.java) {
-
- override fun serialize(value: BlockData, gen: JsonGenerator, provider: SerializerProvider) {
- gen.writeString(value.asString)
- }
-
-}
-
-private class BlockDataDeserializer : StdDeserializer<BlockData>(BlockData::class.java) {
-
- override fun deserialize(p: JsonParser, ctxt: DeserializationContext): BlockData? {
- try {
- return Bukkit.createBlockData(p.valueAsString)
- } catch (ex: Exception) {
- throw RuntimeException("Exception occurred at ${p.currentLocation}", ex)
- }
- }
-
-}
+package io.dico.parcels2.options
+
+import com.fasterxml.jackson.core.JsonGenerator
+import com.fasterxml.jackson.core.JsonParser
+import com.fasterxml.jackson.databind.DeserializationContext
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.databind.PropertyNamingStrategy
+import com.fasterxml.jackson.databind.SerializerProvider
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer
+import com.fasterxml.jackson.databind.ser.std.StdSerializer
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
+import com.fasterxml.jackson.module.kotlin.KotlinModule
+import org.bukkit.Bukkit
+import org.bukkit.block.data.BlockData
+
+val optionsMapper = ObjectMapper(YAMLFactory()).apply {
+ propertyNamingStrategy = PropertyNamingStrategy.KEBAB_CASE
+
+ val kotlinModule = KotlinModule()
+
+ with(kotlinModule) {
+ /*
+ setSerializerModifier(object : BeanSerializerModifier() {
+ @Suppress("UNCHECKED_CAST")
+ override fun modifySerializer(config: SerializationConfig?, beanDesc: BeanDescription, serializer: JsonSerializer<*>): JsonSerializer<*> {
+
+ val newSerializer = if (GeneratorOptions::class.isSuperclassOf(beanDesc.beanClass.kotlin)) {
+ GeneratorOptionsSerializer(serializer as JsonSerializer<GeneratorOptions>)
+ } else {
+ serializer
+ }
+
+ return super.modifySerializer(config, beanDesc, newSerializer)
+ }
+ })*/
+
+ addSerializer(BlockDataSerializer())
+ addDeserializer(BlockData::class.java, BlockDataDeserializer())
+
+ GeneratorOptionsFactories.registerSerialization(this)
+ StorageOptionsFactories.registerSerialization(this)
+ MigrationOptionsFactories.registerSerialization(this)
+ }
+
+ registerModule(kotlinModule)
+}
+
+private class BlockDataSerializer : StdSerializer<BlockData>(BlockData::class.java) {
+
+ override fun serialize(value: BlockData, gen: JsonGenerator, provider: SerializerProvider) {
+ gen.writeString(value.asString)
+ }
+
+}
+
+private class BlockDataDeserializer : StdDeserializer<BlockData>(BlockData::class.java) {
+
+ override fun deserialize(p: JsonParser, ctxt: DeserializationContext): BlockData? {
+ try {
+ return Bukkit.createBlockData(p.valueAsString)
+ } catch (ex: Exception) {
+ throw RuntimeException("Exception occurred at ${p.currentLocation}", ex)
+ }
+ }
+
+}
diff --git a/src/main/kotlin/io/dico/parcels2/options/PolymorphicOptions.kt b/src/main/kotlin/io/dico/parcels2/options/PolymorphicOptions.kt
index aa60f39..f65efa1 100644
--- a/src/main/kotlin/io/dico/parcels2/options/PolymorphicOptions.kt
+++ b/src/main/kotlin/io/dico/parcels2/options/PolymorphicOptions.kt
@@ -1,89 +1,89 @@
-package io.dico.parcels2.options
-
-import com.fasterxml.jackson.core.JsonGenerator
-import com.fasterxml.jackson.core.JsonParser
-import com.fasterxml.jackson.databind.DeserializationContext
-import com.fasterxml.jackson.databind.JsonDeserializer
-import com.fasterxml.jackson.databind.JsonNode
-import com.fasterxml.jackson.databind.SerializerProvider
-import com.fasterxml.jackson.databind.module.SimpleModule
-import com.fasterxml.jackson.databind.ser.std.StdSerializer
-import io.dico.parcels2.logger
-import kotlin.reflect.KClass
-
-abstract class PolymorphicOptions<T : Any>(val key: String,
- val options: Any,
- factories: PolymorphicOptionsFactories<T>) {
- val factory = factories.getFactory(key)!!
-}
-
-abstract class SimplePolymorphicOptions<T : Any>(key: String, options: Any, factories: PolymorphicOptionsFactories<T>)
- : PolymorphicOptions<T>(key, options, factories) {
- fun newInstance(): T = factory.newInstance(key, options)
-}
-
-interface PolymorphicOptionsFactory<T : Any> {
- val supportedKeys: List<String>
- val optionsClass: KClass<out Any>
- fun newInstance(key: String, options: Any, vararg extra: Any?): T
-}
-
-@Suppress("UNCHECKED_CAST")
-abstract class PolymorphicOptionsFactories<T : Any>(val serializeKeyAs: String,
- rootClass: KClass<out PolymorphicOptions<T>>,
- vararg defaultFactories: PolymorphicOptionsFactory<T>) {
- val rootClass = rootClass as KClass<PolymorphicOptions<T>>
- private val map: MutableMap<String, PolymorphicOptionsFactory<T>> = linkedMapOf()
- val availableKeys: Collection<String> get() = map.keys
-
- fun registerFactory(factory: PolymorphicOptionsFactory<T>) = factory.supportedKeys.forEach { map.putIfAbsent(it.toLowerCase(), factory) }
-
- fun getFactory(key: String): PolymorphicOptionsFactory<T>? = map[key.toLowerCase()]
-
- fun registerSerialization(module: SimpleModule) {
- module.addSerializer(PolymorphicOptionsSerializer(this))
- module.addDeserializer(rootClass.java, PolymorphicOptionsDeserializer(this))
- }
-
- init {
- defaultFactories.forEach { registerFactory(it) }
- }
-}
-
-
-private class PolymorphicOptionsDeserializer<T : Any>(val factories: PolymorphicOptionsFactories<T>) : JsonDeserializer<PolymorphicOptions<T>>() {
-
- override fun deserialize(p: JsonParser, ctxt: DeserializationContext?): PolymorphicOptions<T> {
- val node = p.readValueAsTree<JsonNode>()
- val key = node.get(factories.serializeKeyAs).asText()
- val factory = getFactory(key)
- val optionsNode = node.get("options")
- val options = p.codec.treeToValue(optionsNode, factory.optionsClass.java)
- return factories.rootClass.constructors.first().call(key, options)
- }
-
- private fun getFactory(key: String): PolymorphicOptionsFactory<T> {
- factories.getFactory(key)?.let { return it }
-
- logger.warn("Unknown ${factories.rootClass.simpleName} ${factories.serializeKeyAs}: $key. " +
- "\nAvailable options: ${factories.availableKeys}")
-
- val default = factories.getFactory(factories.availableKeys.first())
- ?: throw IllegalStateException("No default ${factories.rootClass.simpleName} factory registered.")
- return default
- }
-
-}
-
-private class PolymorphicOptionsSerializer<T : Any>(val factories: PolymorphicOptionsFactories<T>) : StdSerializer<PolymorphicOptions<T>>(factories.rootClass.java) {
-
- override fun serialize(value: PolymorphicOptions<T>, gen: JsonGenerator, sp: SerializerProvider?) {
- with(gen) {
- writeStartObject()
- writeStringField(factories.serializeKeyAs, value.key)
- writeFieldName("options")
- writeObject(value.options)
- writeEndObject()
- }
- }
+package io.dico.parcels2.options
+
+import com.fasterxml.jackson.core.JsonGenerator
+import com.fasterxml.jackson.core.JsonParser
+import com.fasterxml.jackson.databind.DeserializationContext
+import com.fasterxml.jackson.databind.JsonDeserializer
+import com.fasterxml.jackson.databind.JsonNode
+import com.fasterxml.jackson.databind.SerializerProvider
+import com.fasterxml.jackson.databind.module.SimpleModule
+import com.fasterxml.jackson.databind.ser.std.StdSerializer
+import io.dico.parcels2.logger
+import kotlin.reflect.KClass
+
+abstract class PolymorphicOptions<T : Any>(val key: String,
+ val options: Any,
+ factories: PolymorphicOptionsFactories<T>) {
+ val factory = factories.getFactory(key)!!
+}
+
+abstract class SimplePolymorphicOptions<T : Any>(key: String, options: Any, factories: PolymorphicOptionsFactories<T>)
+ : PolymorphicOptions<T>(key, options, factories) {
+ fun newInstance(): T = factory.newInstance(key, options)
+}
+
+interface PolymorphicOptionsFactory<T : Any> {
+ val supportedKeys: List<String>
+ val optionsClass: KClass<out Any>
+ fun newInstance(key: String, options: Any, vararg extra: Any?): T
+}
+
+@Suppress("UNCHECKED_CAST")
+abstract class PolymorphicOptionsFactories<T : Any>(val serializeKeyAs: String,
+ rootClass: KClass<out PolymorphicOptions<T>>,
+ vararg defaultFactories: PolymorphicOptionsFactory<T>) {
+ val rootClass = rootClass as KClass<PolymorphicOptions<T>>
+ private val map: MutableMap<String, PolymorphicOptionsFactory<T>> = linkedMapOf()
+ val availableKeys: Collection<String> get() = map.keys
+
+ fun registerFactory(factory: PolymorphicOptionsFactory<T>) = factory.supportedKeys.forEach { map.putIfAbsent(it.toLowerCase(), factory) }
+
+ fun getFactory(key: String): PolymorphicOptionsFactory<T>? = map[key.toLowerCase()]
+
+ fun registerSerialization(module: SimpleModule) {
+ module.addSerializer(PolymorphicOptionsSerializer(this))
+ module.addDeserializer(rootClass.java, PolymorphicOptionsDeserializer(this))
+ }
+
+ init {
+ defaultFactories.forEach { registerFactory(it) }
+ }
+}
+
+
+private class PolymorphicOptionsDeserializer<T : Any>(val factories: PolymorphicOptionsFactories<T>) : JsonDeserializer<PolymorphicOptions<T>>() {
+
+ override fun deserialize(p: JsonParser, ctxt: DeserializationContext?): PolymorphicOptions<T> {
+ val node = p.readValueAsTree<JsonNode>()
+ val key = node.get(factories.serializeKeyAs).asText()
+ val factory = getFactory(key)
+ val optionsNode = node.get("options")
+ val options = p.codec.treeToValue(optionsNode, factory.optionsClass.java)
+ return factories.rootClass.constructors.first().call(key, options)
+ }
+
+ private fun getFactory(key: String): PolymorphicOptionsFactory<T> {
+ factories.getFactory(key)?.let { return it }
+
+ logger.warn("Unknown ${factories.rootClass.simpleName} ${factories.serializeKeyAs}: $key. " +
+ "\nAvailable options: ${factories.availableKeys}")
+
+ val default = factories.getFactory(factories.availableKeys.first())
+ ?: throw IllegalStateException("No default ${factories.rootClass.simpleName} factory registered.")
+ return default
+ }
+
+}
+
+private class PolymorphicOptionsSerializer<T : Any>(val factories: PolymorphicOptionsFactories<T>) : StdSerializer<PolymorphicOptions<T>>(factories.rootClass.java) {
+
+ override fun serialize(value: PolymorphicOptions<T>, gen: JsonGenerator, sp: SerializerProvider?) {
+ with(gen) {
+ writeStartObject()
+ writeStringField(factories.serializeKeyAs, value.key)
+ writeFieldName("options")
+ writeObject(value.options)
+ writeEndObject()
+ }
+ }
} \ No newline at end of file
diff --git a/src/main/kotlin/io/dico/parcels2/options/StorageOptions.kt b/src/main/kotlin/io/dico/parcels2/options/StorageOptions.kt
index 3d68701..29aab7a 100644
--- a/src/main/kotlin/io/dico/parcels2/options/StorageOptions.kt
+++ b/src/main/kotlin/io/dico/parcels2/options/StorageOptions.kt
@@ -1,59 +1,59 @@
-package io.dico.parcels2.options
-
-import com.zaxxer.hikari.HikariDataSource
-import io.dico.parcels2.logger
-import io.dico.parcels2.storage.Storage
-import io.dico.parcels2.storage.BackedStorage
-import io.dico.parcels2.storage.exposed.ExposedBacking
-import io.dico.parcels2.storage.getHikariConfig
-import javax.sql.DataSource
-
-object StorageOptionsFactories : PolymorphicOptionsFactories<Storage>("dialect", StorageOptions::class, ConnectionStorageFactory())
-
-class StorageOptions(dialect: String = "mariadb", options: Any = DataConnectionOptions()) : SimplePolymorphicOptions<Storage>(dialect, options, StorageOptionsFactories) {
-
- fun getDataSourceFactory(): DataSourceFactory? {
- return when (factory) {
- is ConnectionStorageFactory -> factory.getDataSourceFactory(key, options)
- else -> return null
- }
- }
-}
-
-typealias DataSourceFactory = () -> DataSource
-
-private class ConnectionStorageFactory : PolymorphicOptionsFactory<Storage> {
- override val optionsClass = DataConnectionOptions::class
- override val supportedKeys: List<String> = listOf("postgresql", "mariadb")
-
- fun getDataSourceFactory(key: String, options: Any): DataSourceFactory {
- val hikariConfig = getHikariConfig(key, options as DataConnectionOptions)
- return { HikariDataSource(hikariConfig) }
- }
-
- override fun newInstance(key: String, options: Any, vararg extra: Any?): Storage {
- return BackedStorage(ExposedBacking(getDataSourceFactory(key, options), (options as DataConnectionOptions).poolSize))
- }
-}
-
-data class DataConnectionOptions(val address: String = "localhost",
- val database: String = "parcels",
- val username: String = "root",
- val password: String = "",
- val poolSize: Int = 4) {
-
- fun splitAddressAndPort(defaultPort: Int = 3306): Pair<String, Int>? {
- val idx = address.indexOf(":").takeUnless { it == -1 } ?: return Pair(address, defaultPort)
-
- val addressName = address.substring(0, idx).takeUnless { it.isBlank() } ?: return null.also {
- logger.error("(Invalidly) blank address in data storage options")
- }
-
- val port = address.substring(idx + 1).toIntOrNull() ?: return null.also {
- logger.error("Invalid port number in data storage options: $it, using $defaultPort as default")
- }
-
- return Pair(addressName, port)
- }
-
+package io.dico.parcels2.options
+
+import com.zaxxer.hikari.HikariDataSource
+import io.dico.parcels2.logger
+import io.dico.parcels2.storage.Storage
+import io.dico.parcels2.storage.BackedStorage
+import io.dico.parcels2.storage.exposed.ExposedBacking
+import io.dico.parcels2.storage.getHikariConfig
+import javax.sql.DataSource
+
+object StorageOptionsFactories : PolymorphicOptionsFactories<Storage>("dialect", StorageOptions::class, ConnectionStorageFactory())
+
+class StorageOptions(dialect: String = "mariadb", options: Any = DataConnectionOptions()) : SimplePolymorphicOptions<Storage>(dialect, options, StorageOptionsFactories) {
+
+ fun getDataSourceFactory(): DataSourceFactory? {
+ return when (factory) {
+ is ConnectionStorageFactory -> factory.getDataSourceFactory(key, options)
+ else -> return null
+ }
+ }
+}
+
+typealias DataSourceFactory = () -> DataSource
+
+private class ConnectionStorageFactory : PolymorphicOptionsFactory<Storage> {
+ override val optionsClass = DataConnectionOptions::class
+ override val supportedKeys: List<String> = listOf("postgresql", "mariadb")
+
+ fun getDataSourceFactory(key: String, options: Any): DataSourceFactory {
+ val hikariConfig = getHikariConfig(key, options as DataConnectionOptions)
+ return { HikariDataSource(hikariConfig) }
+ }
+
+ override fun newInstance(key: String, options: Any, vararg extra: Any?): Storage {
+ return BackedStorage(ExposedBacking(getDataSourceFactory(key, options), (options as DataConnectionOptions).poolSize))
+ }
+}
+
+data class DataConnectionOptions(val address: String = "localhost",
+ val database: String = "parcels",
+ val username: String = "root",
+ val password: String = "",
+ val poolSize: Int = 4) {
+
+ fun splitAddressAndPort(defaultPort: Int = 3306): Pair<String, Int>? {
+ val idx = address.indexOf(":").takeUnless { it == -1 } ?: return Pair(address, defaultPort)
+
+ val addressName = address.substring(0, idx).takeUnless { it.isBlank() } ?: return null.also {
+ logger.error("(Invalidly) blank address in data storage options")
+ }
+
+ val port = address.substring(idx + 1).toIntOrNull() ?: return null.also {
+ logger.error("Invalid port number in data storage options: $it, using $defaultPort as default")
+ }
+
+ return Pair(addressName, port)
+ }
+
} \ No newline at end of file