mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-12 17:07:55 -04:00
queue saving of selected profile
This commit is contained in:
parent
0fe5b949ad
commit
fca3adb48f
@ -11,9 +11,9 @@
|
|||||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.bixilon.minosoft.config.profile.storage
|
package de.bixilon.minosoft.config.profile
|
||||||
|
|
||||||
object ProfileIOUtil {
|
object ProfileUtil {
|
||||||
val NAME_REGEX = "[\\w_ ]{1,32}".toRegex()
|
val NAME_REGEX = "[\\w_ ]{1,32}".toRegex()
|
||||||
|
|
||||||
fun String.isValidName(): Boolean {
|
fun String.isValidName(): Boolean {
|
@ -31,6 +31,7 @@ object ProfileIOManager {
|
|||||||
private val save: MutableSet<FileStorage> = mutableSetOf()
|
private val save: MutableSet<FileStorage> = mutableSetOf()
|
||||||
private val delete: MutableSet<FileStorage> = mutableSetOf()
|
private val delete: MutableSet<FileStorage> = mutableSetOf()
|
||||||
private val reload: MutableSet<FileStorage> = mutableSetOf()
|
private val reload: MutableSet<FileStorage> = mutableSetOf()
|
||||||
|
private val selected: MutableSet<StorageProfileManager<*>> = mutableSetOf()
|
||||||
|
|
||||||
|
|
||||||
fun init() {
|
fun init() {
|
||||||
@ -93,6 +94,16 @@ object ProfileIOManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun selected() {
|
||||||
|
if (selected.isEmpty()) return
|
||||||
|
val iterator = selected.iterator()
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
val manager = iterator.next()
|
||||||
|
iterator.remove()
|
||||||
|
ignoreAll { manager.saveSelected() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fun save(storage: FileStorage) {
|
fun save(storage: FileStorage) {
|
||||||
lock.lock()
|
lock.lock()
|
||||||
@ -114,4 +125,11 @@ object ProfileIOManager {
|
|||||||
lock.unlock()
|
lock.unlock()
|
||||||
notify.countUp()
|
notify.countUp()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun saveSelected(manager: StorageProfileManager<*>) {
|
||||||
|
lock.lock()
|
||||||
|
selected += manager
|
||||||
|
lock.unlock()
|
||||||
|
notify.countUp()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,6 @@ import de.bixilon.kutil.cast.CastUtil.unsafeNull
|
|||||||
import de.bixilon.kutil.collections.CollectionUtil.mutableBiMapOf
|
import de.bixilon.kutil.collections.CollectionUtil.mutableBiMapOf
|
||||||
import de.bixilon.kutil.collections.map.bi.AbstractMutableBiMap
|
import de.bixilon.kutil.collections.map.bi.AbstractMutableBiMap
|
||||||
import de.bixilon.kutil.concurrent.lock.simple.SimpleLock
|
import de.bixilon.kutil.concurrent.lock.simple.SimpleLock
|
||||||
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
|
|
||||||
import de.bixilon.kutil.exception.Broken
|
import de.bixilon.kutil.exception.Broken
|
||||||
import de.bixilon.kutil.file.watcher.FileWatcherService
|
import de.bixilon.kutil.file.watcher.FileWatcherService
|
||||||
import de.bixilon.kutil.observer.DataObserver.Companion.observe
|
import de.bixilon.kutil.observer.DataObserver.Companion.observe
|
||||||
@ -30,8 +29,8 @@ import de.bixilon.kutil.observer.map.bi.BiMapObserver.Companion.observedBiMap
|
|||||||
import de.bixilon.minosoft.assets.util.FileUtil.mkdirParent
|
import de.bixilon.minosoft.assets.util.FileUtil.mkdirParent
|
||||||
import de.bixilon.minosoft.assets.util.InputStreamUtil.readAsString
|
import de.bixilon.minosoft.assets.util.InputStreamUtil.readAsString
|
||||||
import de.bixilon.minosoft.config.profile.ProfileType
|
import de.bixilon.minosoft.config.profile.ProfileType
|
||||||
|
import de.bixilon.minosoft.config.profile.ProfileUtil.isValidName
|
||||||
import de.bixilon.minosoft.config.profile.profiles.Profile
|
import de.bixilon.minosoft.config.profile.profiles.Profile
|
||||||
import de.bixilon.minosoft.config.profile.storage.ProfileIOUtil.isValidName
|
|
||||||
import de.bixilon.minosoft.data.registries.identified.Identified
|
import de.bixilon.minosoft.data.registries.identified.Identified
|
||||||
import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash
|
import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash
|
||||||
import de.bixilon.minosoft.protocol.ProtocolUtil.encodeNetwork
|
import de.bixilon.minosoft.protocol.ProtocolUtil.encodeNetwork
|
||||||
@ -52,6 +51,7 @@ abstract class StorageProfileManager<P : Profile> : Iterable<P>, Identified {
|
|||||||
private val jacksonType by lazy { Jackson.MAPPER.typeFactory.constructType(type.clazz) }
|
private val jacksonType by lazy { Jackson.MAPPER.typeFactory.constructType(type.clazz) }
|
||||||
private val reader by lazy { Jackson.MAPPER.readerFor(jacksonType) }
|
private val reader by lazy { Jackson.MAPPER.readerFor(jacksonType) }
|
||||||
override val identifier get() = type.identifier
|
override val identifier get() = type.identifier
|
||||||
|
private lateinit var root: File
|
||||||
|
|
||||||
|
|
||||||
abstract val latestVersion: Int
|
abstract val latestVersion: Int
|
||||||
@ -100,16 +100,18 @@ abstract class StorageProfileManager<P : Profile> : Iterable<P>, Identified {
|
|||||||
return stream.readAsString()
|
return stream.readAsString()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun saveSelected(root: File, name: String) {
|
fun saveSelected(name: String? = this.selected.storage?.nullCast<FileStorage>()?.name) {
|
||||||
val file = root.resolve(SELECTED)
|
val file = root.resolve(SELECTED)
|
||||||
file.mkdirParent()
|
file.mkdirParent()
|
||||||
val stream = FileOutputStream(file)
|
val stream = FileOutputStream(file)
|
||||||
|
if (name != null) {
|
||||||
stream.write(name.encodeNetwork())
|
stream.write(name.encodeNetwork())
|
||||||
|
}
|
||||||
stream.close()
|
stream.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun load() {
|
open fun load() {
|
||||||
val root = RunConfiguration.CONFIG_DIRECTORY.resolve(identifier.namespace).resolve(identifier.path).toFile()
|
root = RunConfiguration.CONFIG_DIRECTORY.resolve(identifier.namespace).resolve(identifier.path).toFile()
|
||||||
if (!root.exists()) {
|
if (!root.exists()) {
|
||||||
root.mkdirs()
|
root.mkdirs()
|
||||||
return createDefault()
|
return createDefault()
|
||||||
@ -117,7 +119,7 @@ abstract class StorageProfileManager<P : Profile> : Iterable<P>, Identified {
|
|||||||
var selected = loadSelected(root)
|
var selected = loadSelected(root)
|
||||||
if (selected == null) {
|
if (selected == null) {
|
||||||
selected = DEFAULT_NAME
|
selected = DEFAULT_NAME
|
||||||
saveSelected(root, selected)
|
saveSelected(selected)
|
||||||
}
|
}
|
||||||
if (!selected.isValidName()) selected = DEFAULT_NAME
|
if (!selected.isValidName()) selected = DEFAULT_NAME
|
||||||
val files = root.listFiles() ?: return createDefault()
|
val files = root.listFiles() ?: return createDefault()
|
||||||
@ -142,14 +144,7 @@ abstract class StorageProfileManager<P : Profile> : Iterable<P>, Identified {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.selected = this[selected] ?: create(selected)
|
this.selected = this[selected] ?: create(selected)
|
||||||
this::selected.observe(this) {
|
this::selected.observe(this) { ProfileIOManager.saveSelected(this) }
|
||||||
val name = it.storage.unsafeCast<FileStorage>().name
|
|
||||||
DefaultThreadPool += {
|
|
||||||
this.lock.acquire()
|
|
||||||
saveSelected(root, name)
|
|
||||||
this.lock.release()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
observe(root.toPath())
|
observe(root.toPath())
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user