Niedzielski has uploaded a new change for review. https://gerrit.wikimedia.org/r/228982
Change subject: Catch unmarshalling errors and report them ...................................................................... Catch unmarshalling errors and report them Gson can throw more than JsonSyntaxException. This patch adds a safety mechanism for catching any Exception produce during unmarshalling and reports it ACRA. Change-Id: I06bf864e8e4dbd9d9c4ff4bc725edd81274ec120 --- M wikipedia/src/main/java/org/wikipedia/data/GsonMarshaller.java M wikipedia/src/main/java/org/wikipedia/data/GsonUnmarshaller.java A wikipedia/src/main/java/org/wikipedia/data/GsonUtil.java M wikipedia/src/main/java/org/wikipedia/data/TabUnmarshaller.java 4 files changed, 35 insertions(+), 10 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia refs/changes/82/228982/1 diff --git a/wikipedia/src/main/java/org/wikipedia/data/GsonMarshaller.java b/wikipedia/src/main/java/org/wikipedia/data/GsonMarshaller.java index 23bdf3d..80e7740 100644 --- a/wikipedia/src/main/java/org/wikipedia/data/GsonMarshaller.java +++ b/wikipedia/src/main/java/org/wikipedia/data/GsonMarshaller.java @@ -3,10 +3,12 @@ import com.google.gson.Gson; public final class GsonMarshaller { - private static final Gson DEFAULT_GSON = new Gson(); - public static String marshal(Object object) { - return DEFAULT_GSON.toJson(object); + return marshal(GsonUtil.getDefaultGson(), object); + } + + public static String marshal(Gson gson, Object object) { + return gson.toJson(object); } private GsonMarshaller() { } diff --git a/wikipedia/src/main/java/org/wikipedia/data/GsonUnmarshaller.java b/wikipedia/src/main/java/org/wikipedia/data/GsonUnmarshaller.java index 0f1f087..2a47153 100644 --- a/wikipedia/src/main/java/org/wikipedia/data/GsonUnmarshaller.java +++ b/wikipedia/src/main/java/org/wikipedia/data/GsonUnmarshaller.java @@ -8,16 +8,14 @@ import java.util.Collection; public final class GsonUnmarshaller { - private static final Gson DEFAULT_GSON = new Gson(); - /** @return Unmarshalled object. */ public static <T> T unmarshal(Class<T> clazz, @NonNull String json) { - return unmarshal(DEFAULT_GSON, clazz, json); + return unmarshal(GsonUtil.getDefaultGson(), clazz, json); } /** @return Unmarshalled collection of objects. */ public static <T extends Collection<?>> T unmarshal(TypeToken<T> typeToken, @NonNull String json) { - return unmarshal(DEFAULT_GSON, typeToken, json); + return unmarshal(GsonUtil.getDefaultGson(), typeToken, json); } /** @return Unmarshalled object. */ @@ -26,7 +24,9 @@ } /** @return Unmarshalled collection of objects. */ - public static <T extends Collection<?>> T unmarshal(@NonNull Gson gson, TypeToken<T> typeToken, @NonNull String json) { + public static <T extends Collection<?>> T unmarshal(@NonNull Gson gson, + TypeToken<T> typeToken, + @NonNull String json) { // From the manual: "Fairly hideous... Unfortunately, no way to get around this in Java". return gson.fromJson(json, typeToken.getType()); } diff --git a/wikipedia/src/main/java/org/wikipedia/data/GsonUtil.java b/wikipedia/src/main/java/org/wikipedia/data/GsonUtil.java new file mode 100644 index 0000000..35c7194 --- /dev/null +++ b/wikipedia/src/main/java/org/wikipedia/data/GsonUtil.java @@ -0,0 +1,14 @@ +package org.wikipedia.data; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public final class GsonUtil { + private static final Gson DEFAULT_GSON = new GsonBuilder().create(); + + public static Gson getDefaultGson() { + return DEFAULT_GSON; + } + + private GsonUtil() { } +} diff --git a/wikipedia/src/main/java/org/wikipedia/data/TabUnmarshaller.java b/wikipedia/src/main/java/org/wikipedia/data/TabUnmarshaller.java index f66bb70..42177d4 100644 --- a/wikipedia/src/main/java/org/wikipedia/data/TabUnmarshaller.java +++ b/wikipedia/src/main/java/org/wikipedia/data/TabUnmarshaller.java @@ -2,16 +2,25 @@ import com.google.gson.reflect.TypeToken; +import org.acra.ACRA; import org.wikipedia.page.tabs.Tab; +import java.util.Collections; import java.util.List; public final class TabUnmarshaller { private static final TypeToken<List<Tab>> TYPE_TOKEN = new TypeToken<List<Tab>>() { }; public static List<Tab> unmarshal(String json) { - return GsonUnmarshaller.unmarshal(TYPE_TOKEN, json); + try { + return GsonUnmarshaller.unmarshal(TYPE_TOKEN, json); + } catch (Exception e) { + // Catch all. Any Exception can be thrown when unmarshalling. + ACRA.getErrorReporter().putCustomData("json", json); + ACRA.getErrorReporter().handleSilentException(e); + return Collections.emptyList(); + } } private TabUnmarshaller() { } -} \ No newline at end of file +} -- To view, visit https://gerrit.wikimedia.org/r/228982 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I06bf864e8e4dbd9d9c4ff4bc725edd81274ec120 Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Niedzielski <sniedziel...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits