From c54e9b63d26c05e82c89c2c9c69df7aca1d14b5a Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sat, 4 Feb 2023 14:53:28 +0700 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=D1=81=D1=8F=20=D0=BE=D1=82=20nullSafe=20=D0=B2?= =?UTF-8?q?=D1=80=D0=B0=D0=BF=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/json/factory/ArrayListAdapterFactory.kt | 2 +- .../io/json/factory/ArrayListTypeAdapter.kt | 14 +++++++++++--- .../json/factory/ImmutableArrayMapTypeAdapter.kt | 12 ++++++++++-- .../factory/ImmutableCollectionAdapterFactory.kt | 8 ++++---- .../io/json/factory/ImmutableListTypeAdapter.kt | 12 ++++++++++-- .../io/json/factory/ImmutableMapTypeAdapter.kt | 12 ++++++++++-- .../io/json/factory/ImmutableSetTypeAdapter.kt | 12 ++++++++++-- 7 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ArrayListAdapterFactory.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ArrayListAdapterFactory.kt index bd1a825d..1e91b7fa 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ArrayListAdapterFactory.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ArrayListAdapterFactory.kt @@ -9,7 +9,7 @@ import java.lang.reflect.ParameterizedType object ArrayListAdapterFactory : TypeAdapterFactory { override fun create(gson: Gson, type: TypeToken): TypeAdapter? { if (ArrayList::class.java.isAssignableFrom(type.rawType) && type.type is ParameterizedType) { - return ArrayListTypeAdapter(gson.getAdapter(TypeToken.get((type.type as ParameterizedType).actualTypeArguments[0]))).nullSafe() as TypeAdapter + return ArrayListTypeAdapter(gson.getAdapter(TypeToken.get((type.type as ParameterizedType).actualTypeArguments[0]))) as TypeAdapter } return null diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ArrayListTypeAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ArrayListTypeAdapter.kt index 8a1d6064..691cda30 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ArrayListTypeAdapter.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ArrayListTypeAdapter.kt @@ -6,8 +6,13 @@ import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter import java.util.ArrayList -class ArrayListTypeAdapter(val elementAdapter: TypeAdapter) : TypeAdapter>() { - override fun write(out: JsonWriter, value: ArrayList) { +class ArrayListTypeAdapter(val elementAdapter: TypeAdapter) : TypeAdapter>() { + override fun write(out: JsonWriter, value: ArrayList?) { + if (value == null) { + out.nullValue() + return + } + if (value.size == 1) { elementAdapter.write(out, value[0]) return @@ -22,7 +27,10 @@ class ArrayListTypeAdapter(val elementAdapter: TypeAdapter) : TypeAdapter< out.endArray() } - override fun read(reader: JsonReader): ArrayList { + override fun read(reader: JsonReader): ArrayList? { + if (reader.peek() == JsonToken.NULL) + return null + if (reader.peek() != JsonToken.BEGIN_ARRAY) { // не массив, возможно упрощение структуры "a": [value] -> "a": value val list = ArrayList(1) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableArrayMapTypeAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableArrayMapTypeAdapter.kt index 52a60081..566ca361 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableArrayMapTypeAdapter.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableArrayMapTypeAdapter.kt @@ -9,7 +9,12 @@ import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter class ImmutableArrayMapTypeAdapter(val keyAdapter: TypeAdapter, val elementAdapter: TypeAdapter) : TypeAdapter>() { - override fun write(out: JsonWriter, value: ImmutableMap) { + override fun write(out: JsonWriter, value: ImmutableMap?) { + if (value == null) { + out.nullValue() + return + } + out.beginArray() for ((k, v) in value) { @@ -20,7 +25,10 @@ class ImmutableArrayMapTypeAdapter(val keyAdapter: TypeAdapter, val ele out.endArray() } - override fun read(reader: JsonReader): ImmutableMap { + override fun read(reader: JsonReader): ImmutableMap? { + if (reader.peek() == JsonToken.NULL) + return null + reader.beginArray() val builder = ImmutableMap.Builder() diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableCollectionAdapterFactory.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableCollectionAdapterFactory.kt index bf2631ae..2173200d 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableCollectionAdapterFactory.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableCollectionAdapterFactory.kt @@ -15,25 +15,25 @@ object ImmutableCollectionAdapterFactory : TypeAdapterFactory { when (type.rawType) { ImmutableList::class.java -> { val elementType = `$Gson$Types`.getCollectionElementType(type.type, type.rawType) - return ImmutableListTypeAdapter(gson.getAdapter(TypeToken.get(elementType))).nullSafe() as TypeAdapter + return ImmutableListTypeAdapter(gson.getAdapter(TypeToken.get(elementType))) as TypeAdapter } ImmutableSet::class.java -> { val elementType = `$Gson$Types`.getCollectionElementType(type.type, type.rawType) - return ImmutableSetTypeAdapter(gson.getAdapter(TypeToken.get(elementType))).nullSafe() as TypeAdapter + return ImmutableSetTypeAdapter(gson.getAdapter(TypeToken.get(elementType))) as TypeAdapter } ImmutableMap::class.java -> { val (elementType0, elementType1) = `$Gson$Types`.getMapKeyAndValueTypes(type.type, type.rawType) if (`$Gson$Types`.getRawType(elementType0) == String::class.java) { - return ImmutableMapTypeAdapter(gson.getAdapter(TypeToken.get(elementType1))).nullSafe() as TypeAdapter + return ImmutableMapTypeAdapter(gson.getAdapter(TypeToken.get(elementType1)))as TypeAdapter } return ImmutableArrayMapTypeAdapter( gson.getAdapter(TypeToken.get(elementType0)), gson.getAdapter(TypeToken.get(elementType1)) - ).nullSafe() as TypeAdapter + ) as TypeAdapter } else -> return null diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableListTypeAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableListTypeAdapter.kt index 0db51916..8ae7c34a 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableListTypeAdapter.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableListTypeAdapter.kt @@ -8,7 +8,12 @@ import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter class ImmutableListTypeAdapter(val elementAdapter: TypeAdapter) : TypeAdapter>() { - override fun write(out: JsonWriter, value: ImmutableList) { + override fun write(out: JsonWriter, value: ImmutableList?) { + if (value == null) { + out.nullValue() + return + } + if (value.size == 1) { elementAdapter.write(out, value[0]) return @@ -23,7 +28,10 @@ class ImmutableListTypeAdapter(val elementAdapter: TypeAdapter) : TypeAdap out.endArray() } - override fun read(reader: JsonReader): ImmutableList { + override fun read(reader: JsonReader): ImmutableList? { + if (reader.peek() == JsonToken.NULL) + return null + if (reader.peek() != JsonToken.BEGIN_ARRAY) { // не массив, возможно упрощение структуры "a": [value] -> "a": value return ImmutableList.of(elementAdapter.read(reader) ?: throw JsonSyntaxException("List does not accept nulls")) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableMapTypeAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableMapTypeAdapter.kt index 58bc816d..6614a6a7 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableMapTypeAdapter.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableMapTypeAdapter.kt @@ -9,7 +9,12 @@ import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter class ImmutableMapTypeAdapter(val elementAdapter: TypeAdapter) : TypeAdapter>() { - override fun write(out: JsonWriter, value: ImmutableMap) { + override fun write(out: JsonWriter, value: ImmutableMap?) { + if (value == null) { + out.nullValue() + return + } + out.beginObject() for ((k, v) in value) { @@ -20,7 +25,10 @@ class ImmutableMapTypeAdapter(val elementAdapter: TypeAdapter) : TypeAdapt out.endObject() } - override fun read(reader: JsonReader): ImmutableMap { + override fun read(reader: JsonReader): ImmutableMap? { + if (reader.peek() == JsonToken.NULL) + return null + reader.beginObject() val builder = ImmutableMap.Builder() diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableSetTypeAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableSetTypeAdapter.kt index 1cd97dfb..e321953b 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableSetTypeAdapter.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/factory/ImmutableSetTypeAdapter.kt @@ -9,7 +9,12 @@ import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter class ImmutableSetTypeAdapter(val elementAdapter: TypeAdapter) : TypeAdapter>() { - override fun write(out: JsonWriter, value: ImmutableSet) { + override fun write(out: JsonWriter, value: ImmutableSet?) { + if (value == null) { + out.nullValue() + return + } + if (value.size == 1) { elementAdapter.write(out, value.first()) return @@ -24,7 +29,10 @@ class ImmutableSetTypeAdapter(val elementAdapter: TypeAdapter) : TypeAdapt out.endArray() } - override fun read(reader: JsonReader): ImmutableSet { + override fun read(reader: JsonReader): ImmutableSet? { + if (reader.peek() == JsonToken.NULL) + return null + if (reader.peek() != JsonToken.BEGIN_ARRAY) { // не массив, возможно упрощение структуры "a": [value] -> "a": value return ImmutableSet.of(elementAdapter.read(reader) ?: throw JsonSyntaxException("List does not accept nulls"))