From 94571f207ff2ce7e78a8bbb6c33c43a1b7c53683 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 28 Nov 2022 16:57:44 +0100 Subject: [PATCH] fix profile saving --- .../minosoft/config/profile/ProfileManager.kt | 25 ++++++++++++------- .../profile/delegate/AbstractDelegate.kt | 7 ++++++ .../config/profile/delegate/SimpleDelegate.kt | 6 +++++ .../delegate/types/list/ListDelegate.kt | 10 ++++++++ .../profile/delegate/types/map/MapDelegate.kt | 10 ++++++++ .../profile/delegate/types/set/SetDelegate.kt | 10 ++++++++ .../profiles/account/AccountProfileManager.kt | 1 + .../profiles/audio/AudioProfileManager.kt | 1 + .../profiles/block/BlockProfileManager.kt | 1 + .../connection/ConnectionProfileManager.kt | 1 + .../controls/ControlsProfileManager.kt | 1 + .../profiles/entity/EntityProfileManager.kt | 1 + .../profiles/eros/ErosProfileManager.kt | 1 + .../profile/profiles/eros/server/ServerC.kt | 2 -- .../eros/server/entries/ErosServer.kt | 4 ++- .../profile/profiles/gui/GUIProfileManager.kt | 1 + .../profiles/other/OtherProfileManager.kt | 1 + .../particle/ParticleProfileManager.kt | 1 + .../rendering/RenderingProfileManager.kt | 1 + .../resources/ResourcesProfileManager.kt | 1 + 20 files changed, 74 insertions(+), 12 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt index 9ce345642..75ae973c0 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt @@ -13,7 +13,9 @@ package de.bixilon.minosoft.config.profile +import com.fasterxml.jackson.databind.InjectableValues import com.fasterxml.jackson.databind.JavaType +import com.fasterxml.jackson.databind.ObjectMapper import de.bixilon.kutil.collections.map.bi.AbstractMutableBiMap import de.bixilon.kutil.concurrent.pool.DefaultThreadPool import de.bixilon.kutil.exception.ExceptionUtil.tryCatch @@ -40,6 +42,7 @@ import java.util.concurrent.locks.ReentrantLock interface ProfileManager { + val mapper: ObjectMapper val namespace: ResourceLocation val latestVersion: Int val saveLock: ReentrantLock @@ -68,13 +71,19 @@ interface ProfileManager { fun migrate(from: Int, data: MutableMap) = Unit - fun load(name: String, data: MutableMap?): T { - val profile = if (data == null) { - createProfile(name) - } else { - Jackson.MAPPER.convertValue(data, jacksonProfileType) as T - } + fun updateValue(profile: T, data: MutableMap?) { + profile.reloading = true + val injectable = InjectableValues.Std() + injectable.addValue(profileClass, profile) + mapper.injectableValues = injectable + mapper.updateValue(profile, data) profile.saved = true + profile.reloading = false + } + + fun load(name: String, data: MutableMap?): T { + val profile = createProfile() + updateValue(profile, data) profiles[name] = profile return profile } @@ -248,9 +257,7 @@ interface ProfileManager { } try { val data = readAndMigrate(path.path).second - val dataString = Jackson.MAPPER.writeValueAsString(data) - profile.reloading = true - Jackson.MAPPER.readerForUpdating(profile).readValue(dataString) + updateValue(profile, data) } catch (exception: Exception) { exception.printStackTrace() exception.crash() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/delegate/AbstractDelegate.kt b/src/main/java/de/bixilon/minosoft/config/profile/delegate/AbstractDelegate.kt index 3d040294a..0ae2410f9 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/delegate/AbstractDelegate.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/delegate/AbstractDelegate.kt @@ -30,4 +30,11 @@ interface AbstractDelegate : TextFormattable { override fun toText(): Any? { return get() } + + fun queueSave() { + if (profile.reloading) { + return + } + profile.saved = false + } } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/delegate/SimpleDelegate.kt b/src/main/java/de/bixilon/minosoft/config/profile/delegate/SimpleDelegate.kt index fdead2437..6433f19f5 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/delegate/SimpleDelegate.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/delegate/SimpleDelegate.kt @@ -16,6 +16,7 @@ package de.bixilon.minosoft.config.profile.delegate import de.bixilon.kutil.observer.DataObserver import de.bixilon.minosoft.config.profile.profiles.Profile import de.bixilon.minosoft.util.KUtil.minosoft +import kotlin.reflect.KProperty open class SimpleDelegate( override val profile: Profile, @@ -32,6 +33,11 @@ open class SimpleDelegate( this.value = value } + override fun setValue(thisRef: Any, property: KProperty<*>, value: T) { + super.setValue(thisRef, property, value) + queueSave() + } + override fun validate(value: T) { verify?.invoke(value) } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/list/ListDelegate.kt b/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/list/ListDelegate.kt index 5b5ce4705..1acb19c4c 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/list/ListDelegate.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/list/ListDelegate.kt @@ -17,6 +17,7 @@ import de.bixilon.kutil.observer.list.ListObserver import de.bixilon.minosoft.config.profile.delegate.AbstractDelegate import de.bixilon.minosoft.config.profile.profiles.Profile import de.bixilon.minosoft.util.KUtil.minosoft +import kotlin.reflect.KProperty class ListDelegate( override val profile: Profile, @@ -26,11 +27,20 @@ class ListDelegate( override val name = minosoft(name) override val description = minosoft("$name.description") + init { + value.addObserver { queueSave() } + } + override fun get() = value override fun set(value: MutableList) { validate(value) this.value.unsafe = value } + override fun setValue(thisRef: Any, property: KProperty<*>, value: MutableList) { + super.setValue(thisRef, property, value) + queueSave() + } + override fun validate(value: MutableList) = Unit } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/map/MapDelegate.kt b/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/map/MapDelegate.kt index 1a0a5f2c9..8b5184d18 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/map/MapDelegate.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/map/MapDelegate.kt @@ -17,6 +17,7 @@ import de.bixilon.kutil.observer.map.MapObserver import de.bixilon.minosoft.config.profile.delegate.AbstractDelegate import de.bixilon.minosoft.config.profile.profiles.Profile import de.bixilon.minosoft.util.KUtil.minosoft +import kotlin.reflect.KProperty open class MapDelegate( override val profile: Profile, @@ -26,11 +27,20 @@ open class MapDelegate( override val name = minosoft(name) override val description = minosoft("$name.description") + init { + value.addObserver { queueSave() } + } + override fun get() = value override fun set(value: MutableMap) { validate(value) this.value.unsafe = value } + override fun setValue(thisRef: Any, property: KProperty<*>, value: MutableMap) { + super.setValue(thisRef, property, value) + queueSave() + } + override fun validate(value: MutableMap) = Unit } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/set/SetDelegate.kt b/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/set/SetDelegate.kt index 152732376..2b53c7b5f 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/set/SetDelegate.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/set/SetDelegate.kt @@ -17,6 +17,7 @@ import de.bixilon.kutil.observer.set.SetObserver import de.bixilon.minosoft.config.profile.delegate.AbstractDelegate import de.bixilon.minosoft.config.profile.profiles.Profile import de.bixilon.minosoft.util.KUtil.minosoft +import kotlin.reflect.KProperty class SetDelegate( override val profile: Profile, @@ -26,11 +27,20 @@ class SetDelegate( override val name = minosoft(name) override val description = minosoft("$name.description") + init { + value.addObserver { queueSave() } + } + override fun get() = value override fun set(value: MutableSet) { validate(value) this.value.unsafe = value } + override fun setValue(thisRef: Any, property: KProperty<*>, value: MutableSet) { + super.setValue(thisRef, property, value) + queueSave() + } + override fun validate(value: MutableSet) = Unit } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/account/AccountProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/account/AccountProfileManager.kt index 66ca3af10..41ac3a741 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/account/AccountProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/account/AccountProfileManager.kt @@ -27,6 +27,7 @@ import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import java.util.concurrent.locks.ReentrantLock object AccountProfileManager : ProfileManager { + override val mapper = Jackson.MAPPER.copy() override val namespace = "minosoft:account".toResourceLocation() override val latestVersion get() = 1 override val saveLock = ReentrantLock() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/audio/AudioProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/audio/AudioProfileManager.kt index 66027458e..6e91c9b10 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/audio/AudioProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/audio/AudioProfileManager.kt @@ -28,6 +28,7 @@ import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import java.util.concurrent.locks.ReentrantLock object AudioProfileManager : ProfileManager { + override val mapper = Jackson.MAPPER.copy() override val namespace = "minosoft:audio".toResourceLocation() override val latestVersion get() = 1 override val saveLock = ReentrantLock() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/block/BlockProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/block/BlockProfileManager.kt index 9753cb184..c804e81ae 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/block/BlockProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/block/BlockProfileManager.kt @@ -27,6 +27,7 @@ import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import java.util.concurrent.locks.ReentrantLock object BlockProfileManager : ProfileManager { + override val mapper = Jackson.MAPPER.copy() override val namespace = "minosoft:block".toResourceLocation() override val latestVersion get() = 1 override val saveLock = ReentrantLock() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/connection/ConnectionProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/connection/ConnectionProfileManager.kt index 6fd2167a2..a7dbdf183 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/connection/ConnectionProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/connection/ConnectionProfileManager.kt @@ -27,6 +27,7 @@ import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import java.util.concurrent.locks.ReentrantLock object ConnectionProfileManager : ProfileManager { + override val mapper = Jackson.MAPPER.copy() override val namespace = "minosoft:connection".toResourceLocation() override val latestVersion get() = 1 override val saveLock = ReentrantLock() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/controls/ControlsProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/controls/ControlsProfileManager.kt index 4bee27d8d..141802ef2 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/controls/ControlsProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/controls/ControlsProfileManager.kt @@ -27,6 +27,7 @@ import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import java.util.concurrent.locks.ReentrantLock object ControlsProfileManager : ProfileManager { + override val mapper = Jackson.MAPPER.copy() override val namespace = "minosoft:controls".toResourceLocation() override val latestVersion get() = 1 override val saveLock = ReentrantLock() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/entity/EntityProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/entity/EntityProfileManager.kt index a8c60c98c..79dd05209 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/entity/EntityProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/entity/EntityProfileManager.kt @@ -27,6 +27,7 @@ import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import java.util.concurrent.locks.ReentrantLock object EntityProfileManager : ProfileManager { + override val mapper = Jackson.MAPPER.copy() override val namespace = "minosoft:entity".toResourceLocation() override val latestVersion get() = 1 override val saveLock = ReentrantLock() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfileManager.kt index 495f29376..13a779ee0 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfileManager.kt @@ -27,6 +27,7 @@ import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import java.util.concurrent.locks.ReentrantLock object ErosProfileManager : ProfileManager { + override val mapper = Jackson.MAPPER.copy() override val namespace = "minosoft:eros".toResourceLocation() override val latestVersion get() = 1 override val saveLock = ReentrantLock() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/ServerC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/ServerC.kt index 6cedac494..6c6f38da3 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/ServerC.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/ServerC.kt @@ -13,7 +13,6 @@ package de.bixilon.minosoft.config.profile.profiles.eros.server -import com.fasterxml.jackson.annotation.JsonInclude import de.bixilon.minosoft.config.profile.delegate.types.list.ListDelegate import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfile import de.bixilon.minosoft.config.profile.profiles.eros.server.entries.ErosServer @@ -24,6 +23,5 @@ class ServerC(profile: ErosProfile) { val modify = ModifyC(profile) val list = ListC(profile) - @get:JsonInclude(JsonInclude.Include.NON_EMPTY) var entries: MutableList by ListDelegate(profile, mutableListOf(), "") } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/entries/ErosServer.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/entries/ErosServer.kt index 3f5575e0e..16cb4175b 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/entries/ErosServer.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/server/entries/ErosServer.kt @@ -13,6 +13,7 @@ package de.bixilon.minosoft.config.profile.profiles.eros.server.entries +import com.fasterxml.jackson.annotation.JacksonInject import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonProperty @@ -31,13 +32,14 @@ import de.bixilon.minosoft.data.registries.versions.Versions import de.bixilon.minosoft.data.text.ChatComponent class ErosServer( - profile: ErosProfile, + @JacksonInject profile: ErosProfile, address: String, name: ChatComponent = ChatComponent.of(address), forcedVersion: Any? = null, // must be version profiles: MutableMap = mutableMapOf(), queryVersion: Boolean = true, ) : AbstractServer { + init { check(forcedVersion == null || forcedVersion is Version) } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/GUIProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/GUIProfileManager.kt index ba3bfe508..ff0f3302d 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/GUIProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/GUIProfileManager.kt @@ -27,6 +27,7 @@ import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import java.util.concurrent.locks.ReentrantLock object GUIProfileManager : ProfileManager { + override val mapper = Jackson.MAPPER.copy() override val namespace = "minosoft:gui".toResourceLocation() override val latestVersion get() = 1 override val saveLock = ReentrantLock() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/other/OtherProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/other/OtherProfileManager.kt index 5e4a78d03..9ba4f033b 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/other/OtherProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/other/OtherProfileManager.kt @@ -27,6 +27,7 @@ import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import java.util.concurrent.locks.ReentrantLock object OtherProfileManager : ProfileManager { + override val mapper = Jackson.MAPPER.copy() override val namespace = "minosoft:other".toResourceLocation() override val latestVersion get() = 2 override val saveLock = ReentrantLock() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfileManager.kt index ccf18e06d..ac20aa453 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfileManager.kt @@ -27,6 +27,7 @@ import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import java.util.concurrent.locks.ReentrantLock object ParticleProfileManager : ProfileManager { + override val mapper = Jackson.MAPPER.copy() override val namespace = "minosoft:particle".toResourceLocation() override val latestVersion get() = 1 override val saveLock = ReentrantLock() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/RenderingProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/RenderingProfileManager.kt index c45fe7b7f..b42264248 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/RenderingProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/RenderingProfileManager.kt @@ -27,6 +27,7 @@ import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import java.util.concurrent.locks.ReentrantLock object RenderingProfileManager : ProfileManager { + override val mapper = Jackson.MAPPER.copy() override val namespace = "minosoft:rendering".toResourceLocation() override val latestVersion get() = 1 override val saveLock = ReentrantLock() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/ResourcesProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/ResourcesProfileManager.kt index adce50dcd..754f24a11 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/ResourcesProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/resources/ResourcesProfileManager.kt @@ -27,6 +27,7 @@ import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid import java.util.concurrent.locks.ReentrantLock object ResourcesProfileManager : ProfileManager { + override val mapper = Jackson.MAPPER.copy() override val namespace = "minosoft:resources".toResourceLocation() override val latestVersion get() = 1 override val saveLock = ReentrantLock()