Improve JsonKeyReader

This commit makes the following changes:

- Uses XteaKeyDeserializer instead of reading the key array manually.
- Adds support for an object of map squares to keys, which is the format
  used by the OpenOSRS XTEA endpoint.
- Throws exceptions if the input is malformed, rather than silently
  ignoring problems.

Signed-off-by: Graham <gpe@openrs2.org>
Graham 4 years ago
parent 31db959a46
commit 192b24b9bd
  1. 29
      archive/src/main/kotlin/org/openrs2/archive/key/JsonKeyReader.kt

@ -1,8 +1,10 @@
package org.openrs2.archive.key package org.openrs2.archive.key
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.treeToValue
import org.openrs2.crypto.XteaKey import org.openrs2.crypto.XteaKey
import org.openrs2.json.Json import org.openrs2.json.Json
import java.io.IOException
import java.io.InputStream import java.io.InputStream
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@ -12,21 +14,24 @@ public class JsonKeyReader @Inject constructor(
@Json private val mapper: ObjectMapper @Json private val mapper: ObjectMapper
) : KeyReader { ) : KeyReader {
override fun read(input: InputStream): Sequence<XteaKey> { override fun read(input: InputStream): Sequence<XteaKey> {
return sequence { val keys = mutableListOf<XteaKey>()
for (mapSquare in mapper.readTree(input)) { val root = mapper.readTree(input)
val key = mapSquare["key"] ?: mapSquare["keys"] ?: continue
if (key.size() != 4) { when {
continue root.isArray -> {
for (entry in root) {
val key = entry["key"] ?: entry["keys"] ?: throw IOException("Missing 'key' or 'keys' field")
keys += mapper.treeToValue<XteaKey>(key) ?: throw IOException("Key must be non-null")
} }
}
val k0 = key[0].asText().toIntOrNull() ?: continue root.isObject -> {
val k1 = key[1].asText().toIntOrNull() ?: continue for (entry in root.fields()) {
val k2 = key[2].asText().toIntOrNull() ?: continue keys += mapper.treeToValue<XteaKey>(entry.value) ?: throw IOException("Key must be non-null")
val k3 = key[3].asText().toIntOrNull() ?: continue
yield(XteaKey(k0, k1, k2, k3))
} }
} }
else -> throw IOException("Root element must be an array or object")
}
return keys.asSequence()
} }
} }

Loading…
Cancel
Save