Skip to content

Commit

Permalink
Extrace deserializeCOllection into its own method
Browse files Browse the repository at this point in the history
  • Loading branch information
romtsn committed Mar 13, 2023
1 parent 751ce4d commit bea3016
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,8 @@ static boolean isForegroundImportance(final @NotNull Context context) {
static @Nullable ActivityManager.MemoryInfo getMemInfo(
final @NotNull Context context, final @NotNull ILogger logger) {
try {
final ActivityManager actManager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
final ActivityManager actManager =
(ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
final ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo();
if (actManager != null) {
actManager.getMemoryInfo(memInfo);
Expand Down
7 changes: 4 additions & 3 deletions sentry/api/sentry.api
Original file line number Diff line number Diff line change
Expand Up @@ -557,8 +557,8 @@ public abstract interface class io/sentry/ISentryExecutorService {
}

public abstract interface class io/sentry/ISerializer {
public fun deserialize (Ljava/io/Reader;Ljava/lang/Class;)Ljava/lang/Object;
public abstract fun deserialize (Ljava/io/Reader;Ljava/lang/Class;Lio/sentry/JsonDeserializer;)Ljava/lang/Object;
public abstract fun deserialize (Ljava/io/Reader;Ljava/lang/Class;)Ljava/lang/Object;
public abstract fun deserializeCollection (Ljava/io/Reader;Ljava/lang/Class;Lio/sentry/JsonDeserializer;)Ljava/lang/Object;
public abstract fun deserializeEnvelope (Ljava/io/InputStream;)Lio/sentry/SentryEnvelope;
public abstract fun serialize (Lio/sentry/SentryEnvelope;Ljava/io/OutputStream;)V
public abstract fun serialize (Ljava/lang/Object;Ljava/io/Writer;)V
Expand Down Expand Up @@ -699,7 +699,8 @@ public abstract interface class io/sentry/JsonSerializable {

public final class io/sentry/JsonSerializer : io/sentry/ISerializer {
public fun <init> (Lio/sentry/SentryOptions;)V
public fun deserialize (Ljava/io/Reader;Ljava/lang/Class;Lio/sentry/JsonDeserializer;)Ljava/lang/Object;
public fun deserialize (Ljava/io/Reader;Ljava/lang/Class;)Ljava/lang/Object;
public fun deserializeCollection (Ljava/io/Reader;Ljava/lang/Class;Lio/sentry/JsonDeserializer;)Ljava/lang/Object;
public fun deserializeEnvelope (Ljava/io/InputStream;)Lio/sentry/SentryEnvelope;
public fun serialize (Lio/sentry/SentryEnvelope;Ljava/io/OutputStream;)V
public fun serialize (Ljava/lang/Object;Ljava/io/Writer;)V
Expand Down
6 changes: 2 additions & 4 deletions sentry/src/main/java/io/sentry/ISerializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,12 @@

public interface ISerializer {

<T, R> @Nullable T deserialize(
<T, R> @Nullable T deserializeCollection(
@NotNull Reader reader,
@NotNull Class<T> clazz,
@Nullable JsonDeserializer<R> elementDeserializer);

default <T> @Nullable T deserialize(@NotNull Reader reader, @NotNull Class<T> clazz) {
return deserialize(reader, clazz, null);
}
<T> @Nullable T deserialize(@NotNull Reader reader, @NotNull Class<T> clazz);

@Nullable
SentryEnvelope deserializeEnvelope(@NotNull InputStream inputStream);
Expand Down
34 changes: 23 additions & 11 deletions sentry/src/main/java/io/sentry/JsonSerializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -119,27 +119,39 @@ public JsonSerializer(@NotNull SentryOptions options) {

@SuppressWarnings("unchecked")
@Override
public <T, R> @Nullable T deserialize(
public <T, R> @Nullable T deserializeCollection(
@NotNull Reader reader,
@NotNull Class<T> clazz,
@Nullable JsonDeserializer<R> elementDeserializer) {
try {
JsonObjectReader jsonObjectReader = new JsonObjectReader(reader);
if (Collection.class.isAssignableFrom(clazz)) {
if (elementDeserializer == null) {
// if the object has no known deserializer we do best effort and deserialize it as map
return (T) jsonObjectReader.nextObjectOrNull();
}

return (T) jsonObjectReader.nextList(options.getLogger(), elementDeserializer);
} else {
return (T) jsonObjectReader.nextObjectOrNull();
}
} catch (Throwable e) {
options.getLogger().log(SentryLevel.ERROR, "Error when deserializing", e);
return null;
}
}

@SuppressWarnings("unchecked")
@Override
public <T> @Nullable T deserialize(@NotNull Reader reader, @NotNull Class<T> clazz) {
try {
JsonObjectReader jsonObjectReader = new JsonObjectReader(reader);
JsonDeserializer<?> deserializer = deserializersByClass.get(clazz);
if (deserializer != null) {
Object object = deserializer.deserialize(jsonObjectReader, options.getLogger());
return clazz.cast(object);
} else if (isKnownPrimitive(clazz)) {
if (Collection.class.isAssignableFrom(clazz)) {
if (elementDeserializer == null) {
// if the object has no known deserializer we do best effort and deserialize it as map
return (T) jsonObjectReader.nextObjectOrNull();
}

return (T) jsonObjectReader.nextList(options.getLogger(), elementDeserializer);
} else {
return (T) jsonObjectReader.nextObjectOrNull();
}
return (T) jsonObjectReader.nextObjectOrNull();
} else {
return null; // No way to deserialize objects we don't know about.
}
Expand Down
7 changes: 6 additions & 1 deletion sentry/src/main/java/io/sentry/NoOpSerializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,18 @@ public static NoOpSerializer getInstance() {
private NoOpSerializer() {}

@Override
public <T, R> @Nullable T deserialize(
public <T, R> @Nullable T deserializeCollection(
@NotNull Reader reader,
@NotNull Class<T> clazz,
@Nullable JsonDeserializer<R> elementDeserializer) {
return null;
}

@Override
public <T> @Nullable T deserialize(@NotNull Reader reader, @NotNull Class<T> clazz) {
return null;
}

@Override
public @Nullable SentryEnvelope deserializeEnvelope(@NotNull InputStream inputStream) {
return null;
Expand Down
6 changes: 5 additions & 1 deletion sentry/src/main/java/io/sentry/cache/CacheUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,11 @@ static void delete(
if (file.exists()) {
try (final Reader reader =
new BufferedReader(new InputStreamReader(new FileInputStream(file), UTF_8))) {
return options.getSerializer().deserialize(reader, clazz, elementDeserializer);
if (elementDeserializer == null) {
return options.getSerializer().deserialize(reader, clazz);
} else {
return options.getSerializer().deserializeCollection(reader, clazz, elementDeserializer);
}
} catch (Throwable e) {
options.getLogger().log(ERROR, e, "Error reading entity from scope cache: %s", fileName);
}
Expand Down
2 changes: 1 addition & 1 deletion sentry/src/test/java/io/sentry/JsonSerializerTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -1153,7 +1153,7 @@ class JsonSerializerTest {
val breadcrumb2 = Breadcrumb.navigation("one", "other")
val collection = serializeToString(listOf(breadcrumb1, breadcrumb2))

val deserializedCollection = fixture.serializer.deserialize(StringReader(collection), List::class.java, Breadcrumb.Deserializer())
val deserializedCollection = fixture.serializer.deserializeCollection(StringReader(collection), List::class.java, Breadcrumb.Deserializer())

assertEquals(listOf(breadcrumb1, breadcrumb2), deserializedCollection)
}
Expand Down

0 comments on commit bea3016

Please sign in to comment.