diff options
Diffstat (limited to 'src/main/java/moe/nea')
85 files changed, 1887 insertions, 843 deletions
diff --git a/src/main/java/moe/nea/firmament/gui/config/storage/ArrayIndexedJsonPointer.kt b/src/main/java/moe/nea/firmament/gui/config/storage/ArrayIndexedJsonPointer.kt new file mode 100644 index 0000000..1e204d6 --- /dev/null +++ b/src/main/java/moe/nea/firmament/gui/config/storage/ArrayIndexedJsonPointer.kt @@ -0,0 +1,17 @@ +package moe.nea.firmament.gui.config.storage + +import com.google.gson.JsonArray +import com.google.gson.JsonElement + +data class ArrayIndexedJsonPointer( + val owner: JsonArray, + val index: Int +) : JsonPointer { + override fun get(): JsonElement { + return owner.get(index) + } + + override fun set(value: JsonElement) { + owner.set(index, value) + } +} diff --git a/src/main/java/moe/nea/firmament/gui/config/storage/ConfigEditor.kt b/src/main/java/moe/nea/firmament/gui/config/storage/ConfigEditor.kt new file mode 100644 index 0000000..df1ed33 --- /dev/null +++ b/src/main/java/moe/nea/firmament/gui/config/storage/ConfigEditor.kt @@ -0,0 +1,104 @@ +package moe.nea.firmament.gui.config.storage + +import com.google.gson.JsonArray +import com.google.gson.JsonObject +import kotlinx.serialization.json.JsonElement +import moe.nea.firmament.util.json.intoGson +import moe.nea.firmament.util.json.intoKotlinJson + +data class ConfigEditor( + val roots: List<JsonPointer>, +) { + fun transform(transform: (JsonElement) -> JsonElement) { + roots.forEach { root -> + root.set(transform(root.get().intoKotlinJson()).intoGson()) + } + } + + fun move(fromPath: String, toPath: String) { + if (fromPath == toPath) return + val fromSegments = fromPath.split(".").filter { it.isNotEmpty() } + val toSegments = toPath.split(".").filter { it.isNotEmpty() } + roots.forEach { root -> + var fp = root.get() + if (fromSegments.isEmpty()) { + root.set(JsonObject()) + } else { + fromSegments.dropLast(1).forEach { + fp = (fp as JsonObject)[it] ?: return@forEach // todo warn if we dont find the object maybe + } + fp as JsonObject + fp = fp.remove(fromSegments.last())?.deepCopy() ?: return@forEach // in theory i don't need to deepcopy but fuck theory + } + if (toSegments.isEmpty()) { + root.set(fp) + } else { + var lp = root.get() + toSegments.dropLast(1).forEach { name -> + val parent = lp as JsonObject + var child = parent[name] + if (child == null) { + child = JsonObject() + parent.add(name, child) + } + lp = child + } + lp as JsonObject + if (lp.has(toSegments.last())) { + error("Cannot overwrite $lp.${toSegments.last()} with $fp") + } + lp.add(toSegments.last(), fp) + } + } + } + + fun at(path: String, block: ConfigEditor.() -> Unit) { + block(at(path)) + } + + fun at(path: String): ConfigEditor { + var lastRoots = roots + for (segment in path.split(".")) { + if (segment.isEmpty()) { + continue + } else if (segment == "*") { + lastRoots = lastRoots.flatMap { root -> + when (val ele = root.get()) { + is JsonObject -> { + ele.entrySet().map { + (ObjectIndexedJsonPointer(ele, it.key)) + } + } + + is JsonArray -> { + (0..<ele.size()).map { + (ArrayIndexedJsonPointer(ele, it)) + } + } + + else -> { + error("Cannot expand a json primitive $ele at $path") + } + } + } + } else { + lastRoots = lastRoots.map { root -> + when (val ele = root.get()) { + is JsonObject -> { + ObjectIndexedJsonPointer(ele, segment) + } + + is JsonArray -> { + ArrayIndexedJsonPointer(ele, segment.toInt()) + } + + else -> { + error("Cannot expand a json primitive $ele at $path") + } + } + } + } + } + return ConfigEditor(lastRoots) + } +} diff --git a/src/main/java/moe/nea/firmament/gui/config/storage/ConfigFixEvent.kt b/src/main/java/moe/nea/firmament/gui/config/storage/ConfigFixEvent.kt new file mode 100644 index 0000000..07148d5 --- /dev/null +++ b/src/main/java/moe/nea/firmament/gui/config/storage/ConfigFixEvent.kt @@ -0,0 +1,38 @@ +package moe.nea.firmament.gui.config.storage + +import com.google.gson.JsonElement +import com.google.gson.JsonObject +import moe.nea.firmament.events.FirmamentEvent +import moe.nea.firmament.events.FirmamentEventBus + +data class ConfigFixEvent( + val storageClass: ConfigStorageClass, + val toVersion: Int, + var data: JsonObject, +) : FirmamentEvent() { + companion object : FirmamentEventBus<ConfigFixEvent>() { + + } + fun on( + toVersion: Int, + storageClass: ConfigStorageClass, + block: ConfigEditor.() -> Unit + ) { + require(toVersion <= FirmamentConfigLoader.currentConfigVersion) + if (this.toVersion == toVersion && this.storageClass == storageClass) { + block(ConfigEditor(listOf(object : JsonPointer { + override fun get(): JsonObject { + return data + } + + override fun set(value: JsonElement) { + data = value as JsonObject + } + + override fun toString(): String { + return "ConfigRoot($storageClass)" + } + }))) + } + } +} diff --git a/src/main/java/moe/nea/firmament/gui/config/storage/JsonPointer.kt b/src/main/java/moe/nea/firmament/gui/config/storage/JsonPointer.kt new file mode 100644 index 0000000..e34c312 --- /dev/null +++ b/src/main/java/moe/nea/firmament/gui/config/storage/JsonPointer.kt @@ -0,0 +1,8 @@ +package moe.nea.firmament.gui.config.storage + +import com.google.gson.JsonElement + +interface JsonPointer { + fun get(): JsonElement + fun set(value: JsonElement) +} diff --git a/src/main/java/moe/nea/firmament/gui/config/storage/ObjectIndexedJsonPointer.kt b/src/main/java/moe/nea/firmament/gui/config/storage/ObjectIndexedJsonPointer.kt new file mode 100644 index 0000000..091275d --- /dev/null +++ b/src/main/java/moe/nea/firmament/gui/config/storage/ObjectIndexedJsonPointer.kt @@ -0,0 +1,17 @@ +package moe.nea.firmament.gui.config.storage + +import com.google.gson.JsonElement +import com.google.gson.JsonObject + +data class ObjectIndexedJsonPointer( + val owner: JsonObject, + val name: String +) : JsonPointer { + override fun get(): JsonElement { + return owner.get(name) + } + + override fun set(value: JsonElement) { + owner.add(name, value) + } +} diff --git a/src/main/java/moe/nea/firmament/init/AutoDiscoveryPlugin.java b/src/main/java/moe/nea/firmament/init/AutoDiscoveryPlugin.java index 0713068..07e4549 100644 --- a/src/main/java/moe/nea/firmament/init/AutoDiscoveryPlugin.java +++ b/src/main/java/moe/nea/firmament/init/AutoDiscoveryPlugin.java @@ -1,6 +1,9 @@ package moe.nea.firmament.init; +import moe.nea.firmament.util.ErrorUtil; +import moe.nea.firmament.util.compatloader.ICompatMeta; + import java.io.File; import java.io.IOException; import java.net.MalformedURLException; @@ -24,6 +27,8 @@ public class AutoDiscoveryPlugin { return mixins.stream().map(it -> defaultName + "." + it).toList(); } + // TODO: remove println + private static final List<AutoDiscoveryPlugin> mixinPlugins = new ArrayList<>(); public static List<AutoDiscoveryPlugin> getMixinPlugins() { @@ -94,7 +99,7 @@ public class AutoDiscoveryPlugin { String norm = (className.substring(0, className.length() - ".class".length())) .replace("\\", "/") .replace("/", "."); - if (norm.startsWith(getMixinPackage() + ".") && !norm.endsWith(".")) { + if (norm.startsWith(getMixinPackage() + ".") && !norm.endsWith(".") && ICompatMeta.Companion.shouldLoad(norm)) { mixins.add(norm.substring(getMixinPackage().length() + 1)); } } @@ -125,24 +130,25 @@ public class AutoDiscoveryPlugin { */ public List<String> getMixins() { if (mixins != null) return mixins; - System.out.println("Trying to discover mixins"); - mixins = new ArrayList<>(); - URL classUrl = getClass().getProtectionDomain().getCodeSource().getLocation(); - System.out.println("Found classes at " + classUrl); - tryDiscoverFromContentFile(classUrl); - var classRoots = System.getProperty("firmament.classroots"); - if (classRoots != null && !classRoots.isBlank()) { - System.out.println("Found firmament class roots: " + classRoots); - for (String s : classRoots.split(File.pathSeparator)) { - if (s.isBlank()) { - continue; - } - try { + try { + System.out.println("Trying to discover mixins"); + mixins = new ArrayList<>(); + URL classUrl = getClass().getProtectionDomain().getCodeSource().getLocation(); + System.out.println("Found classes at " + classUrl); + tryDiscoverFromContentFile(classUrl); + var classRoots = System.getProperty("firmament.classroots"); + if (classRoots != null && !classRoots.isBlank()) { + System.out.println("Found firmament class roots: " + classRoots); + for (String s : classRoots.split(File.pathSeparator)) { + if (s.isBlank()) { + continue; + } tryDiscoverFromContentFile(new File(s).toURI().toURL()); - } catch (MalformedURLException e) { - throw new RuntimeException(e); } } + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); } |
