Skip to content

Commit 4bd87fe

Browse files
authored
Vendor JSON Writer/Reader: Refactor unknown Interface (getsentry#1633)
1 parent b65016f commit 4bd87fe

15 files changed

Lines changed: 455 additions & 87 deletions

sentry/api/sentry.api

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ public final class io/sentry/IpAddressUtils {
340340
}
341341

342342
public abstract interface class io/sentry/JsonDeserializer {
343-
public abstract fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Lio/sentry/JsonSerializable;
343+
public abstract fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Ljava/lang/Object;
344344
}
345345

346346
public final class io/sentry/JsonObjectDeserializer {
@@ -351,6 +351,7 @@ public final class io/sentry/JsonObjectDeserializer {
351351
public final class io/sentry/JsonObjectReader : io/sentry/vendor/gson/stream/JsonReader {
352352
public fun <init> (Ljava/io/Reader;)V
353353
public fun nextBooleanOrNull ()Ljava/lang/Boolean;
354+
public fun nextDateOrNull (Lio/sentry/ILogger;)Ljava/util/Date;
354355
public fun nextDoubleOrNull ()Ljava/lang/Double;
355356
public fun nextIntegerOrNull ()Ljava/lang/Integer;
356357
public fun nextLongOrNull ()Ljava/lang/Long;
@@ -367,11 +368,17 @@ public final class io/sentry/JsonObjectSerializer {
367368

368369
public final class io/sentry/JsonObjectWriter : io/sentry/vendor/gson/stream/JsonWriter {
369370
public fun <init> (Ljava/io/Writer;)V
371+
public fun name (Ljava/lang/String;)Lio/sentry/JsonObjectWriter;
372+
public synthetic fun name (Ljava/lang/String;)Lio/sentry/vendor/gson/stream/JsonWriter;
373+
public fun value (Lio/sentry/ILogger;Ljava/lang/Object;)Lio/sentry/JsonObjectWriter;
370374
}
371375

372376
public abstract interface class io/sentry/JsonSerializable {
373-
public abstract fun getUnknown ()Ljava/util/Map;
374377
public abstract fun serialize (Lio/sentry/JsonObjectWriter;Lio/sentry/ILogger;)V
378+
}
379+
380+
public abstract interface class io/sentry/JsonUnknown {
381+
public abstract fun getUnknown ()Ljava/util/Map;
375382
public abstract fun setUnknown (Ljava/util/Map;)V
376383
}
377384

@@ -1157,7 +1164,7 @@ public final class io/sentry/UncaughtExceptionHandlerIntegration : io/sentry/Int
11571164
public fun uncaughtException (Ljava/lang/Thread;Ljava/lang/Throwable;)V
11581165
}
11591166

1160-
public final class io/sentry/UserFeedback : io/sentry/JsonSerializable {
1167+
public final class io/sentry/UserFeedback : io/sentry/JsonSerializable, io/sentry/JsonUnknown {
11611168
public fun <init> (Lio/sentry/protocol/SentryId;)V
11621169
public fun <init> (Lio/sentry/protocol/SentryId;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
11631170
public fun getComments ()Ljava/lang/String;
@@ -1175,8 +1182,8 @@ public final class io/sentry/UserFeedback : io/sentry/JsonSerializable {
11751182

11761183
public final class io/sentry/UserFeedback$Deserializer : io/sentry/JsonDeserializer {
11771184
public fun <init> ()V
1178-
public synthetic fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Lio/sentry/JsonSerializable;
11791185
public fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Lio/sentry/UserFeedback;
1186+
public synthetic fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Ljava/lang/Object;
11801187
}
11811188

11821189
public final class io/sentry/UserFeedback$JsonKeys {
@@ -1385,7 +1392,7 @@ public abstract interface class io/sentry/hints/SubmissionResult {
13851392
public abstract fun setResult (Z)V
13861393
}
13871394

1388-
public final class io/sentry/protocol/App : io/sentry/IUnknownPropertiesConsumer {
1395+
public final class io/sentry/protocol/App : io/sentry/IUnknownPropertiesConsumer, io/sentry/JsonSerializable, io/sentry/JsonUnknown {
13891396
public static final field TYPE Ljava/lang/String;
13901397
public fun <init> ()V
13911398
public fun acceptUnknownProperties (Ljava/util/Map;)V
@@ -1396,13 +1403,33 @@ public final class io/sentry/protocol/App : io/sentry/IUnknownPropertiesConsumer
13961403
public fun getAppVersion ()Ljava/lang/String;
13971404
public fun getBuildType ()Ljava/lang/String;
13981405
public fun getDeviceAppHash ()Ljava/lang/String;
1406+
public fun getUnknown ()Ljava/util/Map;
1407+
public fun serialize (Lio/sentry/JsonObjectWriter;Lio/sentry/ILogger;)V
13991408
public fun setAppBuild (Ljava/lang/String;)V
14001409
public fun setAppIdentifier (Ljava/lang/String;)V
14011410
public fun setAppName (Ljava/lang/String;)V
14021411
public fun setAppStartTime (Ljava/util/Date;)V
14031412
public fun setAppVersion (Ljava/lang/String;)V
14041413
public fun setBuildType (Ljava/lang/String;)V
14051414
public fun setDeviceAppHash (Ljava/lang/String;)V
1415+
public fun setUnknown (Ljava/util/Map;)V
1416+
}
1417+
1418+
public final class io/sentry/protocol/App$Deserializer : io/sentry/JsonDeserializer {
1419+
public fun <init> ()V
1420+
public fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Lio/sentry/protocol/App;
1421+
public synthetic fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Ljava/lang/Object;
1422+
}
1423+
1424+
public final class io/sentry/protocol/App$JsonKeys {
1425+
public static final field APP_BUILD Ljava/lang/String;
1426+
public static final field APP_IDENTIFIER Ljava/lang/String;
1427+
public static final field APP_NAME Ljava/lang/String;
1428+
public static final field APP_START_TIME Ljava/lang/String;
1429+
public static final field APP_VERSION Ljava/lang/String;
1430+
public static final field BUILD_TYPE Ljava/lang/String;
1431+
public static final field DEVICE_APP_HASH Ljava/lang/String;
1432+
public fun <init> ()V
14061433
}
14071434

14081435
public final class io/sentry/protocol/Browser : io/sentry/IUnknownPropertiesConsumer {

sentry/src/main/java/io/sentry/JsonDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import org.jetbrains.annotations.NotNull;
55

66
@ApiStatus.Internal
7-
public interface JsonDeserializer<T extends JsonSerializable> {
7+
public interface JsonDeserializer<T> {
88
@NotNull
99
T deserialize(@NotNull JsonObjectReader reader, @NotNull ILogger logger) throws Exception;
1010
}

sentry/src/main/java/io/sentry/JsonObjectReader.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.sentry.vendor.gson.stream.JsonToken;
55
import java.io.IOException;
66
import java.io.Reader;
7+
import java.util.Date;
78
import java.util.Map;
89
import org.jetbrains.annotations.ApiStatus;
910
import org.jetbrains.annotations.Nullable;
@@ -43,6 +44,27 @@ public void nextUnknown(ILogger logger, Map<String, Object> unknown, String name
4344
}
4445
}
4546

47+
public @Nullable Date nextDateOrNull(ILogger logger) throws IOException {
48+
if (peek() == JsonToken.NULL) {
49+
return null;
50+
}
51+
String dateString = nextString();
52+
try {
53+
return DateUtils.getDateTime(dateString);
54+
} catch (Exception e) {
55+
logger.log(
56+
SentryLevel.DEBUG,
57+
"Error when deserializing UTC timestamp format, it might be millis timestamp format.",
58+
e);
59+
}
60+
try {
61+
return DateUtils.getDateTimeWithMillisPrecision(dateString);
62+
} catch (Exception e) {
63+
logger.log(SentryLevel.ERROR, "Error when deserializing millis timestamp format.", e);
64+
}
65+
return null;
66+
}
67+
4668
/**
4769
* Decodes JSON into Java primitives/objects (null, boolean, int, long, double, String, Map, List)
4870
* with full nesting support. To be used at the root level or after calling `nextName()`.

sentry/src/main/java/io/sentry/JsonObjectSerializer.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.IOException;
44
import java.util.Arrays;
55
import java.util.Collection;
6+
import java.util.Date;
67
import java.util.Map;
78
import org.jetbrains.annotations.ApiStatus;
89
import org.jetbrains.annotations.NotNull;
@@ -24,6 +25,8 @@ public void serialize(
2425
writer.value((boolean) object);
2526
} else if (object instanceof Number) {
2627
writer.value((Number) object);
28+
} else if (object instanceof Date) {
29+
serializeDate(writer, logger, (Date) object);
2730
} else if (object instanceof Collection) {
2831
serializeCollection(writer, logger, (Collection<?>) object);
2932
} else if (object.getClass().isArray()) {
@@ -40,6 +43,17 @@ public void serialize(
4043

4144
// Helper
4245

46+
private void serializeDate(
47+
@NotNull JsonObjectWriter writer, @NotNull ILogger logger, @NotNull Date date)
48+
throws IOException {
49+
try {
50+
writer.value(DateUtils.getTimestamp(date));
51+
} catch (Exception e) {
52+
logger.log(SentryLevel.ERROR, "Error when serializing Date", e);
53+
writer.nullValue(); // Fallback to setting null when date is malformed.
54+
}
55+
}
56+
4357
private void serializeCollection(
4458
@NotNull JsonObjectWriter writer, @NotNull ILogger logger, @NotNull Collection<?> collection)
4559
throws IOException {

sentry/src/main/java/io/sentry/JsonObjectWriter.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ public JsonObjectWriter(Writer out) {
1414
super(out);
1515
}
1616

17+
@Override
18+
public JsonObjectWriter name(String name) throws IOException {
19+
super.name(name);
20+
return this;
21+
}
22+
1723
/**
1824
* Encodes a supported object (Null, String, Boolean, Number, Collection, Array, Map,
1925
* JsonSerializable).
@@ -22,7 +28,8 @@ public JsonObjectWriter(Writer out) {
2228
* @param object Object to encode. May be null.
2329
* @return this writer.
2430
*/
25-
JsonObjectWriter value(@NotNull ILogger logger, @Nullable Object object) throws IOException {
31+
public JsonObjectWriter value(@NotNull ILogger logger, @Nullable Object object)
32+
throws IOException {
2633
jsonObjectSerializer.serialize(this, logger, object);
2734
return this;
2835
}
Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,8 @@
11
package io.sentry;
22

33
import java.io.IOException;
4-
import java.util.Map;
54
import org.jetbrains.annotations.NotNull;
6-
import org.jetbrains.annotations.Nullable;
75

86
public interface JsonSerializable {
97
void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger) throws IOException;
10-
11-
@Nullable
12-
Map<String, Object> getUnknown();
13-
14-
void setUnknown(@Nullable Map<String, Object> unknown);
158
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.sentry;
2+
3+
import java.util.Map;
4+
import org.jetbrains.annotations.ApiStatus;
5+
import org.jetbrains.annotations.Nullable;
6+
7+
@ApiStatus.Internal
8+
public interface JsonUnknown {
9+
@Nullable
10+
Map<String, Object> getUnknown();
11+
12+
void setUnknown(@Nullable Map<String, Object> unknown);
13+
}

sentry/src/main/java/io/sentry/UserFeedback.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import org.jetbrains.annotations.Nullable;
99

1010
/** Adds additional information about what happened to an event. */
11-
public final class UserFeedback implements JsonSerializable {
11+
public final class UserFeedback implements JsonUnknown, JsonSerializable {
1212

1313
private final SentryId eventId;
1414
private @Nullable String name;
@@ -131,6 +131,18 @@ public static final class JsonKeys {
131131
public static final String COMMENTS = "comments";
132132
}
133133

134+
// JsonUnknown
135+
136+
@Override
137+
public @Nullable Map<String, Object> getUnknown() {
138+
return unknown;
139+
}
140+
141+
@Override
142+
public void setUnknown(@Nullable Map<String, Object> unknown) {
143+
this.unknown = unknown;
144+
}
145+
134146
// JsonSerializable
135147

136148
@Override
@@ -161,16 +173,6 @@ public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
161173
writer.endObject();
162174
}
163175

164-
@Override
165-
public @Nullable Map<String, Object> getUnknown() {
166-
return unknown;
167-
}
168-
169-
@Override
170-
public void setUnknown(@Nullable Map<String, Object> unknown) {
171-
this.unknown = unknown;
172-
}
173-
174176
// JsonDeserializer
175177

176178
public static final class Deserializer implements JsonDeserializer<UserFeedback> {

0 commit comments

Comments
 (0)