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

Reply via email to