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
43 changes: 41 additions & 2 deletions sentry/api/sentry.api
Original file line number Diff line number Diff line change
Expand Up @@ -1756,7 +1756,7 @@ public final class io/sentry/protocol/MeasurementValue {
public fun <init> (F)V
}

public final class io/sentry/protocol/Mechanism : io/sentry/IUnknownPropertiesConsumer {
public final class io/sentry/protocol/Mechanism : io/sentry/IUnknownPropertiesConsumer, io/sentry/JsonSerializable, io/sentry/JsonUnknown {
public fun <init> ()V
public fun <init> (Ljava/lang/Thread;)V
public fun acceptUnknownProperties (Ljava/util/Map;)V
Expand All @@ -1766,14 +1766,34 @@ public final class io/sentry/protocol/Mechanism : io/sentry/IUnknownPropertiesCo
public fun getMeta ()Ljava/util/Map;
public fun getSynthetic ()Ljava/lang/Boolean;
public fun getType ()Ljava/lang/String;
public fun getUnknown ()Ljava/util/Map;
public fun isHandled ()Ljava/lang/Boolean;
public fun serialize (Lio/sentry/JsonObjectWriter;Lio/sentry/ILogger;)V
public fun setData (Ljava/util/Map;)V
public fun setDescription (Ljava/lang/String;)V
public fun setHandled (Ljava/lang/Boolean;)V
public fun setHelpLink (Ljava/lang/String;)V
public fun setMeta (Ljava/util/Map;)V
public fun setSynthetic (Ljava/lang/Boolean;)V
public fun setType (Ljava/lang/String;)V
public fun setUnknown (Ljava/util/Map;)V
}

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

public final class io/sentry/protocol/Mechanism$JsonKeys {
public static final field DATA Ljava/lang/String;
public static final field DESCRIPTION Ljava/lang/String;
public static final field HANDLED Ljava/lang/String;
public static final field HELP_LINK Ljava/lang/String;
public static final field META Ljava/lang/String;
public static final field SYNTHETIC Ljava/lang/String;
public static final field TYPE Ljava/lang/String;
public fun <init> ()V
}

public final class io/sentry/protocol/Message : io/sentry/IUnknownPropertiesConsumer {
Expand Down Expand Up @@ -1891,23 +1911,42 @@ public final class io/sentry/protocol/SdkVersion : io/sentry/IUnknownPropertiesC
public static fun updateSdkVersion (Lio/sentry/protocol/SdkVersion;Ljava/lang/String;Ljava/lang/String;)Lio/sentry/protocol/SdkVersion;
}

public final class io/sentry/protocol/SentryException : io/sentry/IUnknownPropertiesConsumer {
public final class io/sentry/protocol/SentryException : io/sentry/IUnknownPropertiesConsumer, io/sentry/JsonSerializable, io/sentry/JsonUnknown {
public fun <init> ()V
public fun acceptUnknownProperties (Ljava/util/Map;)V
public fun getMechanism ()Lio/sentry/protocol/Mechanism;
public fun getModule ()Ljava/lang/String;
public fun getStacktrace ()Lio/sentry/protocol/SentryStackTrace;
public fun getThreadId ()Ljava/lang/Long;
public fun getType ()Ljava/lang/String;
public fun getUnknown ()Ljava/util/Map;
public fun getValue ()Ljava/lang/String;
public fun serialize (Lio/sentry/JsonObjectWriter;Lio/sentry/ILogger;)V
public fun setMechanism (Lio/sentry/protocol/Mechanism;)V
public fun setModule (Ljava/lang/String;)V
public fun setStacktrace (Lio/sentry/protocol/SentryStackTrace;)V
public fun setThreadId (Ljava/lang/Long;)V
public fun setType (Ljava/lang/String;)V
public fun setUnknown (Ljava/util/Map;)V
public fun setValue (Ljava/lang/String;)V
}

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

public final class io/sentry/protocol/SentryException$JsonKeys {
public static final field MECHANISM Ljava/lang/String;
public static final field MODULE Ljava/lang/String;
public static final field STACKTRACE Ljava/lang/String;
public static final field THREAD_ID Ljava/lang/String;
public static final field TYPE Ljava/lang/String;
public static final field VALUE Ljava/lang/String;
public fun <init> ()V
}

public final class io/sentry/protocol/SentryId : io/sentry/JsonSerializable {
public static final field EMPTY_ID Lio/sentry/protocol/SentryId;
public fun <init> ()V
Expand Down
122 changes: 121 additions & 1 deletion sentry/src/main/java/io/sentry/protocol/Mechanism.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package io.sentry.protocol;

import io.sentry.ILogger;
import io.sentry.IUnknownPropertiesConsumer;
import io.sentry.JsonDeserializer;
import io.sentry.JsonObjectReader;
import io.sentry.JsonObjectWriter;
import io.sentry.JsonSerializable;
import io.sentry.JsonUnknown;
import io.sentry.util.CollectionUtils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
Expand All @@ -15,7 +23,7 @@
* This includes general exception values obtained from the operating system or runtime APIs, as
* well as mechanism-specific values.
*/
public final class Mechanism implements IUnknownPropertiesConsumer {
public final class Mechanism implements IUnknownPropertiesConsumer, JsonUnknown, JsonSerializable {
private final transient @Nullable Thread thread;
/**
* Mechanism type (required).
Expand Down Expand Up @@ -138,4 +146,116 @@ public void setSynthetic(final @Nullable Boolean synthetic) {
public void acceptUnknownProperties(final @NotNull Map<String, Object> unknown) {
this.unknown = unknown;
}

// JsonKeys

public static final class JsonKeys {
public static final String TYPE = "type";
public static final String DESCRIPTION = "description";
public static final String HELP_LINK = "help_link";
public static final String HANDLED = "handled";
public static final String SYNTHETIC = "synthetic";
public static final String META = "meta";
public static final String DATA = "data";
}

// JsonUnknown

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

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

// JsonSerializable

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
writer.beginObject();
if (type != null) {
writer.name(JsonKeys.TYPE).value(type);
}
if (description != null) {
writer.name(JsonKeys.DESCRIPTION).value(description);
}
if (helpLink != null) {
writer.name(JsonKeys.HELP_LINK).value(helpLink);
}
if (handled != null) {
writer.name(JsonKeys.HANDLED).value(handled);
}
if (synthetic != null) {
writer.name(JsonKeys.SYNTHETIC).value(synthetic);
}
if (meta != null) {
writer.name(JsonKeys.META).value(logger, meta);
}
if (data != null) {
writer.name(JsonKeys.DATA).value(logger, data);
}
if (unknown != null) {
for (String key : unknown.keySet()) {
Object value = unknown.get(key);
writer.name(key).value(logger, value);
}
}
writer.endObject();
}

// JsonDeserializer

public static final class Deserializer implements JsonDeserializer<Mechanism> {
@SuppressWarnings("unchecked")
@Override
public @NotNull Mechanism deserialize(@NotNull JsonObjectReader reader, @NotNull ILogger logger)
throws Exception {
Mechanism mechanism = new Mechanism();
Map<String, Object> unknown = null;
reader.beginObject();
do {
final String nextName = reader.nextName();
switch (nextName) {
case JsonKeys.TYPE:
mechanism.type = reader.nextStringOrNull();
break;
case JsonKeys.DESCRIPTION:
mechanism.description = reader.nextStringOrNull();
break;
case JsonKeys.HELP_LINK:
mechanism.helpLink = reader.nextStringOrNull();
break;
case JsonKeys.HANDLED:
mechanism.handled = reader.nextBooleanOrNull();
break;
case JsonKeys.SYNTHETIC:
mechanism.synthetic = reader.nextBooleanOrNull();
break;
case JsonKeys.META:
mechanism.meta =
CollectionUtils.newConcurrentHashMap(
(Map<String, Object>) reader.nextObjectOrNull());
break;
case JsonKeys.DATA:
mechanism.data =
CollectionUtils.newConcurrentHashMap(
(Map<String, Object>) reader.nextObjectOrNull());
break;
default:
if (unknown == null) {
unknown = new HashMap<>();
}
reader.nextUnknown(logger, unknown, nextName);
break;
}
} while (reader.hasNext());
reader.endObject();
mechanism.setUnknown(unknown);
return mechanism;
}
}
}
113 changes: 112 additions & 1 deletion sentry/src/main/java/io/sentry/protocol/SentryException.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
package io.sentry.protocol;

import io.sentry.ILogger;
import io.sentry.IUnknownPropertiesConsumer;
import io.sentry.JsonDeserializer;
import io.sentry.JsonObjectReader;
import io.sentry.JsonObjectWriter;
import io.sentry.JsonSerializable;
import io.sentry.JsonUnknown;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
Expand All @@ -21,7 +29,8 @@
* <p>```json { "exception": { "values": [ {"type": "Exception": "value": "random boring invariant
* was not met!"}, {"type": "ValueError", "value": "something went wrong, help!"}, ] } } ```
*/
public final class SentryException implements IUnknownPropertiesConsumer {
public final class SentryException
implements IUnknownPropertiesConsumer, JsonUnknown, JsonSerializable {
/**
* Exception type, e.g. `ValueError`.
*
Expand Down Expand Up @@ -159,4 +168,106 @@ public void setMechanism(final @Nullable Mechanism mechanism) {
public void acceptUnknownProperties(final @NotNull Map<String, Object> unknown) {
this.unknown = unknown;
}

// JsonKeys

public static final class JsonKeys {
public static final String TYPE = "type";
public static final String VALUE = "value";
public static final String MODULE = "module";
public static final String THREAD_ID = "thread_id";
public static final String STACKTRACE = "stacktrace";
public static final String MECHANISM = "mechanism";
}

// JsonUnknown

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

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

// JsonSerializable

@Override
public void serialize(@NotNull JsonObjectWriter writer, @NotNull ILogger logger)
throws IOException {
writer.beginObject();
if (type != null) {
writer.name(JsonKeys.TYPE).value(type);
}
if (value != null) {
writer.name(JsonKeys.VALUE).value(value);
}
if (module != null) {
writer.name(JsonKeys.MODULE).value(module);
}
if (threadId != null) {
writer.name(JsonKeys.THREAD_ID).value(threadId);
}
if (stacktrace != null) {
writer.name(JsonKeys.STACKTRACE).value(logger, stacktrace);
}
if (mechanism != null) {
writer.name(JsonKeys.MECHANISM).value(logger, mechanism);
}
if (unknown != null) {
for (String key : unknown.keySet()) {
Object value = unknown.get(key);
writer.name(key).value(logger, value);
}
}
writer.endObject();
}

// JsonDeserializer

public static final class Deserializer implements JsonDeserializer<SentryException> {
@SuppressWarnings("unchecked")
@Override
public @NotNull SentryException deserialize(
@NotNull JsonObjectReader reader, @NotNull ILogger logger) throws Exception {
SentryException sentryException = new SentryException();
Map<String, Object> unknown = null;
reader.beginObject();
do {
final String nextName = reader.nextName();
switch (nextName) {
case JsonKeys.TYPE:
sentryException.type = reader.nextStringOrNull();
break;
case JsonKeys.VALUE:
sentryException.value = reader.nextStringOrNull();
break;
case JsonKeys.MODULE:
sentryException.module = reader.nextStringOrNull();
break;
case JsonKeys.THREAD_ID:
sentryException.threadId = reader.nextLongOrNull();
break;
case JsonKeys.STACKTRACE:
sentryException.stacktrace =
new SentryStackTrace.Deserializer().deserialize(reader, logger);
break;
case JsonKeys.MECHANISM:
sentryException.mechanism = new Mechanism.Deserializer().deserialize(reader, logger);
break;
default:
if (unknown == null) {
unknown = new HashMap<>();
}
reader.nextUnknown(logger, unknown, nextName);
break;
}
} while (reader.hasNext());
reader.endObject();
sentryException.setUnknown(unknown);
return sentryException;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@ import io.sentry.protocol.DebugImage
import io.sentry.protocol.DebugMeta
import io.sentry.protocol.Device
import io.sentry.protocol.Gpu
import io.sentry.protocol.Mechanism
import io.sentry.protocol.OperatingSystem
import io.sentry.protocol.SdkInfo
import io.sentry.protocol.SentryException
import io.sentry.protocol.SentryId
import io.sentry.protocol.SentryRuntime
import io.sentry.protocol.SentryStackFrame
Expand Down Expand Up @@ -44,8 +46,10 @@ class JsonUnknownSerializationTest(
val debugMeta = givenJsonUnknown(DebugMeta())
val device = givenJsonUnknown(Device())
val gpu = givenJsonUnknown(Gpu())
val mechanism = givenJsonUnknown(Mechanism())
val operatingSystem = givenJsonUnknown(OperatingSystem())
val sdkInfo = givenJsonUnknown(SdkInfo())
val sentryException = givenJsonUnknown(SentryException())
val sentryRuntime = givenJsonUnknown(SentryRuntime())
val sentryStackFrame = givenJsonUnknown(SentryStackFrame())
val sentryStackTrace = givenJsonUnknown(SentryStackTrace())
Expand All @@ -63,8 +67,10 @@ class JsonUnknownSerializationTest(
arrayOf(debugMeta, debugMeta, DebugMeta.Deserializer()::deserialize),
arrayOf(device, device, Device.Deserializer()::deserialize),
arrayOf(gpu, gpu, Gpu.Deserializer()::deserialize),
arrayOf(mechanism, mechanism, Mechanism.Deserializer()::deserialize),
arrayOf(operatingSystem, operatingSystem, OperatingSystem.Deserializer()::deserialize),
arrayOf(sdkInfo, sdkInfo, SdkInfo.Deserializer()::deserialize),
arrayOf(sentryException, sentryException, SentryException.Deserializer()::deserialize),
arrayOf(sentryRuntime, sentryRuntime, SentryRuntime.Deserializer()::deserialize),
arrayOf(sentryStackFrame, sentryStackFrame, SentryStackFrame.Deserializer()::deserialize),
arrayOf(sentryStackTrace, sentryStackTrace, SentryStackTrace.Deserializer()::deserialize),
Expand Down
Loading