diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/JsonFlattener.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/JsonFlattener.kt index 7486fd14..49c978c5 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/JsonFlattener.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/JsonFlattener.kt @@ -8,24 +8,24 @@ import com.google.gson.JsonPrimitive import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap -private fun flattenJsonPrimitive(input: JsonPrimitive): Any { +private fun flattenJsonPrimitive(input: JsonPrimitive, interner: (String) -> String = String::intern): Any { if (input.isNumber) { return input.asNumber } else if (input.isString) { - return input.asString.intern() + return interner(input.asString) } else { return input.asBoolean } } -private fun flattenJsonArray(input: JsonArray): ArrayList { +private fun flattenJsonArray(input: JsonArray, interner: (String) -> String = String::intern): ArrayList { val flattened = ArrayList(input.size()) for (v in input) { when (v) { - is JsonObject -> flattened.add(flattenJsonObject(v)) - is JsonArray -> flattened.add(flattenJsonArray(v)) - is JsonPrimitive -> flattened.add(flattenJsonPrimitive(v)) + is JsonObject -> flattened.add(flattenJsonObject(v, interner)) + is JsonArray -> flattened.add(flattenJsonArray(v, interner)) + is JsonPrimitive -> flattened.add(flattenJsonPrimitive(v, interner)) // is JsonNull -> baked.add(null) } } @@ -33,30 +33,30 @@ private fun flattenJsonArray(input: JsonArray): ArrayList { return flattened } -private fun flattenJsonObject(input: JsonObject): MutableMap { +private fun flattenJsonObject(input: JsonObject, interner: (String) -> String = String::intern): MutableMap { val flattened = Object2ObjectOpenHashMap() for ((k, v) in input.entrySet()) { when (v) { - is JsonObject -> flattened[k] = flattenJsonObject(v) - is JsonArray -> flattened[k] = flattenJsonArray(v) - is JsonPrimitive -> flattened[k] = flattenJsonPrimitive(v) + is JsonObject -> flattened[k] = flattenJsonObject(v, interner) + is JsonArray -> flattened[k] = flattenJsonArray(v, interner) + is JsonPrimitive -> flattened[k] = flattenJsonPrimitive(v, interner) } } return flattened } -fun flattenJsonElement(input: JsonElement): Any? { +fun flattenJsonElement(input: JsonElement, interner: (String) -> String = String::intern): Any? { return when (input) { - is JsonObject -> flattenJsonObject(input) - is JsonArray -> flattenJsonArray(input) - is JsonPrimitive -> flattenJsonPrimitive(input) + is JsonObject -> flattenJsonObject(input, interner) + is JsonArray -> flattenJsonArray(input, interner) + is JsonPrimitive -> flattenJsonPrimitive(input, interner) is JsonNull -> null else -> throw IllegalArgumentException("Unknown argument $input") } } -fun flattenJsonElement(input: JsonObject) = flattenJsonObject(input) -fun flattenJsonElement(input: JsonArray) = flattenJsonArray(input) -fun flattenJsonElement(input: JsonPrimitive) = flattenJsonPrimitive(input) +fun flattenJsonElement(input: JsonObject, interner: (String) -> String = String::intern) = flattenJsonObject(input, interner) +fun flattenJsonElement(input: JsonArray, interner: (String) -> String = String::intern) = flattenJsonArray(input, interner) +fun flattenJsonElement(input: JsonPrimitive, interner: (String) -> String = String::intern) = flattenJsonPrimitive(input, interner) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/RawPrototype.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/RawPrototype.kt index 0ed74859..9ae9ed9f 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/RawPrototype.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/RawPrototype.kt @@ -2,6 +2,7 @@ package ru.dbotthepony.kstarbound.defs import com.google.common.collect.ImmutableMap import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap +import ru.dbotthepony.kstarbound.Starbound import ru.dbotthepony.kstarbound.io.json.INativeJsonHolder /** @@ -15,7 +16,7 @@ import ru.dbotthepony.kstarbound.io.json.INativeJsonHolder */ abstract class RawPrototype, ASSEMBLED : AssembledPrototype> : INativeJsonHolder { val json = Object2ObjectArrayMap() - fun enroll() = enrollMap(json) + fun enroll() = enrollMap(json, Starbound.assetStringInterner::intern) abstract fun assemble(directory: String = ""): ASSEMBLED override fun acceptJson(json: MutableMap) { diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/BuilderAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/BuilderAdapter.kt index 40be4fb1..383a27c5 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/BuilderAdapter.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/BuilderAdapter.kt @@ -13,6 +13,7 @@ import com.google.gson.stream.JsonWriter import it.unimi.dsi.fastutil.objects.ObjectArraySet import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet import org.apache.logging.log4j.LogManager +import ru.dbotthepony.kstarbound.Starbound import ru.dbotthepony.kstarbound.defs.flattenJsonElement import ru.dbotthepony.kstarbound.util.NotNullVar import kotlin.reflect.KClass @@ -95,7 +96,12 @@ class BuilderAdapter private constructor( if (instance is IJsonHolder) { val obj = TypeAdapters.JSON_ELEMENT.read(reader) reader = JsonTreeReader(obj) - instance.acceptJson(obj.asJsonObject) + + if (instance is INativeJsonHolder) { + instance.acceptJson(flattenJsonElement(obj.asJsonObject, Starbound.assetStringInterner::intern)) + } else { + instance.acceptJson(obj.asJsonObject) + } } reader.beginObject()