Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 32 additions & 5 deletions sentry/api/sentry.api
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ public final class io/sentry/IpAddressUtils {
}

public abstract interface class io/sentry/JsonDeserializer {
public abstract fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Lio/sentry/JsonSerializable;
public abstract fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Ljava/lang/Object;
}

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

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

public abstract interface class io/sentry/JsonSerializable {
public abstract fun getUnknown ()Ljava/util/Map;
public abstract fun serialize (Lio/sentry/JsonObjectWriter;Lio/sentry/ILogger;)V
}

public abstract interface class io/sentry/JsonUnknown {
public abstract fun getUnknown ()Ljava/util/Map;
public abstract fun setUnknown (Ljava/util/Map;)V
}

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

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

public final class io/sentry/UserFeedback$Deserializer : io/sentry/JsonDeserializer {
public fun <init> ()V
public synthetic fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Lio/sentry/JsonSerializable;
public fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Lio/sentry/UserFeedback;
public synthetic fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Ljava/lang/Object;
}

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

public final class io/sentry/protocol/App : io/sentry/IUnknownPropertiesConsumer {
public final class io/sentry/protocol/App : io/sentry/IUnknownPropertiesConsumer, io/sentry/JsonSerializable, io/sentry/JsonUnknown {
public static final field TYPE Ljava/lang/String;
public fun <init> ()V
public fun acceptUnknownProperties (Ljava/util/Map;)V
Expand All @@ -1396,13 +1403,33 @@ public final class io/sentry/protocol/App : io/sentry/IUnknownPropertiesConsumer
public fun getAppVersion ()Ljava/lang/String;
public fun getBuildType ()Ljava/lang/String;
public fun getDeviceAppHash ()Ljava/lang/String;
public fun getUnknown ()Ljava/util/Map;
public fun serialize (Lio/sentry/JsonObjectWriter;Lio/sentry/ILogger;)V
public fun setAppBuild (Ljava/lang/String;)V
public fun setAppIdentifier (Ljava/lang/String;)V
public fun setAppName (Ljava/lang/String;)V
public fun setAppStartTime (Ljava/util/Date;)V
public fun setAppVersion (Ljava/lang/String;)V
public fun setBuildType (Ljava/lang/String;)V
public fun setDeviceAppHash (Ljava/lang/String;)V
public fun setUnknown (Ljava/util/Map;)V
}

public final class io/sentry/protocol/App$Deserializer : io/sentry/JsonDeserializer {
public fun <init> ()V
public fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Lio/sentry/protocol/App;
public synthetic fun deserialize (Lio/sentry/JsonObjectReader;Lio/sentry/ILogger;)Ljava/lang/Object;
}

public final class io/sentry/protocol/App$JsonKeys {
public static final field APP_BUILD Ljava/lang/String;
public static final field APP_IDENTIFIER Ljava/lang/String;
public static final field APP_NAME Ljava/lang/String;
public static final field APP_START_TIME Ljava/lang/String;
public static final field APP_VERSION Ljava/lang/String;
public static final field BUILD_TYPE Ljava/lang/String;
public static final field DEVICE_APP_HASH Ljava/lang/String;
public fun <init> ()V
}

public final class io/sentry/protocol/Browser : io/sentry/IUnknownPropertiesConsumer {
Expand Down
2 changes: 1 addition & 1 deletion sentry/src/main/java/io/sentry/JsonDeserializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import org.jetbrains.annotations.NotNull;

@ApiStatus.Internal
public interface JsonDeserializer<T extends JsonSerializable> {
public interface JsonDeserializer<T> {
@NotNull
T deserialize(@NotNull JsonObjectReader reader, @NotNull ILogger logger) throws Exception;
}
22 changes: 22 additions & 0 deletions sentry/src/main/java/io/sentry/JsonObjectReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import io.sentry.vendor.gson.stream.JsonToken;
import java.io.IOException;
import java.io.Reader;
import java.util.Date;
import java.util.Map;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
Expand Down Expand Up @@ -43,6 +44,27 @@ public void nextUnknown(ILogger logger, Map<String, Object> unknown, String name
}
}

public @Nullable Date nextDateOrNull(ILogger logger) throws IOException {
if (peek() == JsonToken.NULL) {
return null;
}
String dateString = nextString();
try {
return DateUtils.getDateTime(dateString);
} catch (Exception e) {
logger.log(
SentryLevel.DEBUG,
"Error when deserializing UTC timestamp format, it might be millis timestamp format.",
e);
}
try {
return DateUtils.getDateTimeWithMillisPrecision(dateString);
} catch (Exception e) {
logger.log(SentryLevel.ERROR, "Error when deserializing millis timestamp format.", e);
}
return null;
}

/**
* Decodes JSON into Java primitives/objects (null, boolean, int, long, double, String, Map, List)
* with full nesting support. To be used at the root level or after calling `nextName()`.
Expand Down
14 changes: 14 additions & 0 deletions sentry/src/main/java/io/sentry/JsonObjectSerializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.Map;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
Expand All @@ -24,6 +25,8 @@ public void serialize(
writer.value((boolean) object);
} else if (object instanceof Number) {
writer.value((Number) object);
} else if (object instanceof Date) {
serializeDate(writer, logger, (Date) object);
} else if (object instanceof Collection) {
serializeCollection(writer, logger, (Collection<?>) object);
} else if (object.getClass().isArray()) {
Expand All @@ -40,6 +43,17 @@ public void serialize(

// Helper

private void serializeDate(
@NotNull JsonObjectWriter writer, @NotNull ILogger logger, @NotNull Date date)
throws IOException {
try {
writer.value(DateUtils.getTimestamp(date));
} catch (Exception e) {
logger.log(SentryLevel.ERROR, "Error when serializing Date", e);
writer.nullValue(); // Fallback to setting null when date is malformed.
}
}

private void serializeCollection(
@NotNull JsonObjectWriter writer, @NotNull ILogger logger, @NotNull Collection<?> collection)
throws IOException {
Expand Down
9 changes: 8 additions & 1 deletion sentry/src/main/java/io/sentry/JsonObjectWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ public JsonObjectWriter(Writer out) {
super(out);
}

@Override
public JsonObjectWriter name(String name) throws IOException {
super.name(name);
return this;
}

/**
* Encodes a supported object (Null, String, Boolean, Number, Collection, Array, Map,
* JsonSerializable).
Expand All @@ -22,7 +28,8 @@ public JsonObjectWriter(Writer out) {
* @param object Object to encode. May be null.
* @return this writer.
*/
JsonObjectWriter value(@NotNull ILogger logger, @Nullable Object object) throws IOException {
public JsonObjectWriter value(@NotNull ILogger logger, @Nullable Object object)
throws IOException {
jsonObjectSerializer.serialize(this, logger, object);
return this;
}
Expand Down
7 changes: 0 additions & 7 deletions sentry/src/main/java/io/sentry/JsonSerializable.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,8 @@
package io.sentry;

import java.io.IOException;
import java.util.Map;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public interface JsonSerializable {
void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger) throws IOException;

@Nullable
Map<String, Object> getUnknown();

void setUnknown(@Nullable Map<String, Object> unknown);
}
13 changes: 13 additions & 0 deletions sentry/src/main/java/io/sentry/JsonUnknown.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.sentry;

import java.util.Map;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;

@ApiStatus.Internal
public interface JsonUnknown {
@Nullable
Map<String, Object> getUnknown();

void setUnknown(@Nullable Map<String, Object> unknown);
}
24 changes: 13 additions & 11 deletions sentry/src/main/java/io/sentry/UserFeedback.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import org.jetbrains.annotations.Nullable;

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

private final SentryId eventId;
private @Nullable String name;
Expand Down Expand Up @@ -131,6 +131,18 @@ public static final class JsonKeys {
public static final String COMMENTS = "comments";
}

// JsonUnknown

@Override
public @Nullable Map<String, Object> getUnknown() {
return unknown;
}

@Override
public void setUnknown(@Nullable Map<String, Object> unknown) {
this.unknown = unknown;
}

// JsonSerializable

@Override
Expand Down Expand Up @@ -161,16 +173,6 @@ public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
writer.endObject();
}

@Override
public @Nullable Map<String, Object> getUnknown() {
return unknown;
}

@Override
public void setUnknown(@Nullable Map<String, Object> unknown) {
this.unknown = unknown;
}

// JsonDeserializer

public static final class Deserializer implements JsonDeserializer<UserFeedback> {
Expand Down
Loading