@@ -58,24 +58,57 @@ class CappedTypeAdapterFactory(val maxDepth: Int) : TypeAdapterFactory {
58
58
val objSize = instrumentation!! .getObjectSize(value)
59
59
if (objSize <= maxMemorySize) {
60
60
JsogRegistry .get().userData[" depth" ] = (JsogRegistry .get().userData[" depth" ] as Int ) + 1
61
- try {
62
- ModelSerializer .INSTANCE .extendedGson.getDelegateAdapter(
63
- this @CappedTypeAdapterFactory, type
64
- ).write(jsonWriter, value)
65
- } catch (e: Exception ) {
66
- jsonWriter.beginObject()
67
- jsonWriter.name(" @skip" )
68
- jsonWriter.value(" EXCEPTION_OCCURRED" )
69
- jsonWriter.name(" @class" )
70
- jsonWriter.value(value.javaClass.name)
71
- jsonWriter.name(" @size" )
72
- jsonWriter.value(objSize.toString())
73
- jsonWriter.name(" @cause" )
74
- jsonWriter.value(e.message)
75
- jsonWriter.name(" @id" )
76
- jsonWriter.value(Integer .toHexString(System .identityHashCode(value)))
77
- jsonWriter.endObject()
61
+
62
+ if (value is Collection <* >) {
63
+ writeCollection(jsonWriter, value.iterator(), value.size, objSize)
64
+ } else if (value is Map <* , * > && value.size > maxArraySize) {
65
+ jsonWriter.beginArray()
66
+ value.onEachIndexed { i, entry ->
67
+ if (i >= maxArraySize) return @onEachIndexed
68
+ jsonWriter.beginObject()
69
+ jsonWriter.name(entry.key.toString())
70
+ if (entry.value == null ) {
71
+ jsonWriter.nullValue()
72
+ } else {
73
+ when (entry.value) {
74
+ is Boolean -> jsonWriter.value(entry.value as Boolean )
75
+ is Number -> jsonWriter.value(entry.value as Number )
76
+ is Char -> jsonWriter.value(entry.value.toString())
77
+ is String -> jsonWriter.value(entry.value as String )
78
+ else -> doWrite(jsonWriter, entry.value, objSize)
79
+ }
80
+ }
81
+ jsonWriter.endObject()
82
+ }
83
+
84
+ if (value.size > maxArraySize) {
85
+ jsonWriter.beginObject()
86
+ jsonWriter.name(" @skip" )
87
+ jsonWriter.value(" MAX_COLLECTION_SIZE_EXCEEDED" )
88
+ jsonWriter.name(" @skip[size]" )
89
+ jsonWriter.value(value.size)
90
+ jsonWriter.name(" @skip[max]" )
91
+ jsonWriter.value(maxArraySize)
92
+ jsonWriter.endObject()
93
+ }
94
+ jsonWriter.endArray()
95
+ } else if (value!! ::class .java.isArray) {
96
+ when (value) {
97
+ is BooleanArray -> writeCollection(jsonWriter, value.iterator(), value.size, objSize)
98
+ is ByteArray -> writeCollection(jsonWriter, value.iterator(), value.size, objSize)
99
+ is CharArray -> writeCollection(jsonWriter, value.iterator(), value.size, objSize)
100
+ is ShortArray -> writeCollection(jsonWriter, value.iterator(), value.size, objSize)
101
+ is IntArray -> writeCollection(jsonWriter, value.iterator(), value.size, objSize)
102
+ is LongArray -> writeCollection(jsonWriter, value.iterator(), value.size, objSize)
103
+ is FloatArray -> writeCollection(jsonWriter, value.iterator(), value.size, objSize)
104
+ is DoubleArray -> writeCollection(jsonWriter, value.iterator(), value.size, objSize)
105
+ is Array <* > -> writeCollection(jsonWriter, value.iterator(), value.size, objSize)
106
+ else -> throw IllegalArgumentException (" Unsupported array type: " + value.javaClass.name)
107
+ }
108
+ } else {
109
+ doWrite(jsonWriter, value as T , value.javaClass as Class <T >, objSize)
78
110
}
111
+
79
112
JsogRegistry .get().userData[" depth" ] = (JsogRegistry .get().userData[" depth" ] as Int ) - 1
80
113
} else {
81
114
jsonWriter.beginObject()
@@ -91,13 +124,80 @@ class CappedTypeAdapterFactory(val maxDepth: Int) : TypeAdapterFactory {
91
124
}
92
125
}
93
126
127
+ private fun writeCollection (jsonWriter : JsonWriter , value : Iterator <* >, arrSize : Int , objSize : Long ) {
128
+ jsonWriter.beginArray()
129
+ value.withIndex().forEach { (i, it) ->
130
+ if (i >= maxArraySize) return @forEach
131
+ if (it == null ) {
132
+ jsonWriter.nullValue()
133
+ } else {
134
+ doWrite(jsonWriter, it as T , it::class .java as Class <T >, objSize)
135
+ }
136
+ }
137
+
138
+ if (arrSize > maxArraySize) {
139
+ jsonWriter.beginObject()
140
+ jsonWriter.name(" @skip" )
141
+ jsonWriter.value(" MAX_COLLECTION_SIZE_EXCEEDED" )
142
+ jsonWriter.name(" @skip[size]" )
143
+ jsonWriter.value(arrSize)
144
+ jsonWriter.name(" @skip[max]" )
145
+ jsonWriter.value(maxArraySize)
146
+ jsonWriter.endObject()
147
+ }
148
+ jsonWriter.endArray()
149
+ }
150
+
151
+ private fun doWrite (jsonWriter : JsonWriter , value : Any? , objSize : Long ) {
152
+ try {
153
+ ModelSerializer .INSTANCE .extendedGson.getDelegateAdapter(
154
+ this @CappedTypeAdapterFactory, TypeToken .get(Any ::class .java)
155
+ ).write(jsonWriter, value)
156
+ } catch (e: Exception ) {
157
+ jsonWriter.beginObject()
158
+ jsonWriter.name(" @skip" )
159
+ jsonWriter.value(" EXCEPTION_OCCURRED" )
160
+ jsonWriter.name(" @class" )
161
+ jsonWriter.value(value!! ::class .java.name)
162
+ jsonWriter.name(" @size" )
163
+ jsonWriter.value(objSize.toString())
164
+ jsonWriter.name(" @cause" )
165
+ jsonWriter.value(e.message)
166
+ jsonWriter.name(" @id" )
167
+ jsonWriter.value(Integer .toHexString(System .identityHashCode(value)))
168
+ jsonWriter.endObject()
169
+ }
170
+ }
171
+
172
+ private fun <T > doWrite (jsonWriter : JsonWriter , value : T ? , javaClazz : Class <T >, objSize : Long ) {
173
+ try {
174
+ ModelSerializer .INSTANCE .extendedGson.getDelegateAdapter(
175
+ this @CappedTypeAdapterFactory, TypeToken .get(javaClazz)
176
+ ).write(jsonWriter, value)
177
+ } catch (e: Exception ) {
178
+ jsonWriter.beginObject()
179
+ jsonWriter.name(" @skip" )
180
+ jsonWriter.value(" EXCEPTION_OCCURRED" )
181
+ jsonWriter.name(" @class" )
182
+ jsonWriter.value(javaClazz.name)
183
+ jsonWriter.name(" @size" )
184
+ jsonWriter.value(objSize.toString())
185
+ jsonWriter.name(" @cause" )
186
+ jsonWriter.value(e.message)
187
+ jsonWriter.name(" @id" )
188
+ jsonWriter.value(Integer .toHexString(System .identityHashCode(value)))
189
+ jsonWriter.endObject()
190
+ }
191
+ }
192
+
94
193
override fun read (jsonReader : JsonReader ): T ? = null
95
194
}
96
195
}
97
196
98
197
companion object {
99
198
private var instrumentation: Instrumentation ? = null
100
199
private var maxMemorySize: Long = - 1
200
+ private var maxArraySize: Int = 100
101
201
102
202
@JvmStatic
103
203
fun setInstrumentation (instrumentation : Instrumentation ) {
0 commit comments