Niedzielski has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/316473

Change subject: Fix un/marshalling of Uris to extend to subclasses
......................................................................

Fix un/marshalling of Uris to extend to subclasses

GsonBuilder.registerTypeAdapter() does not consider type hierarchies.
Uri is an abstract type so all instances will always be a subclass. Use
registerTypeHierarchyAdapter() instead. Also, move null handling to
TypeAdapter.nullSafe() and add tests.

Change-Id: I59ba6a9e32e898f28c9d1248fd39c20c71eebca1
---
M app/src/main/java/org/wikipedia/json/GsonUtil.java
M app/src/main/java/org/wikipedia/json/UriTypeAdapter.java
A app/src/test/java/org/wikipedia/json/UriTypeAdapterTest.java
3 files changed, 67 insertions(+), 7 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/73/316473/1

diff --git a/app/src/main/java/org/wikipedia/json/GsonUtil.java 
b/app/src/main/java/org/wikipedia/json/GsonUtil.java
index 3761d15..81c4831 100644
--- a/app/src/main/java/org/wikipedia/json/GsonUtil.java
+++ b/app/src/main/java/org/wikipedia/json/GsonUtil.java
@@ -11,7 +11,7 @@
     private static final String DATE_FORMAT = "MMM dd, yyyy HH:mm:ss";
     private static final Gson DEFAULT_GSON = new GsonBuilder()
             .setDateFormat(DATE_FORMAT)
-            .registerTypeAdapter(Uri.class, new UriTypeAdapter())
+            .registerTypeHierarchyAdapter(Uri.class, new 
UriTypeAdapter().nullSafe())
             .registerTypeHierarchyAdapter(Namespace.class, new 
NamespaceTypeAdapter().nullSafe())
             .create();
 
diff --git a/app/src/main/java/org/wikipedia/json/UriTypeAdapter.java 
b/app/src/main/java/org/wikipedia/json/UriTypeAdapter.java
index 4f06b44..07ffa51 100644
--- a/app/src/main/java/org/wikipedia/json/UriTypeAdapter.java
+++ b/app/src/main/java/org/wikipedia/json/UriTypeAdapter.java
@@ -11,17 +11,12 @@
 public class UriTypeAdapter extends TypeAdapter<Uri> {
     @Override
     public void write(JsonWriter out, Uri value) throws IOException {
-        out.value(value == null ? null : value.toString());
+        out.value(value.toString());
     }
 
     @Override
     public Uri read(JsonReader in) throws IOException {
         String url = in.nextString();
-
-        if (url == null) {
-            return null;
-        }
-
         return Uri.parse(url);
     }
 }
diff --git a/app/src/test/java/org/wikipedia/json/UriTypeAdapterTest.java 
b/app/src/test/java/org/wikipedia/json/UriTypeAdapterTest.java
new file mode 100644
index 0000000..f2e08ee
--- /dev/null
+++ b/app/src/test/java/org/wikipedia/json/UriTypeAdapterTest.java
@@ -0,0 +1,65 @@
+package org.wikipedia.json;
+
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.ParameterizedRobolectricTestRunner;
+import org.robolectric.ParameterizedRobolectricTestRunner.Parameters;
+import org.wikipedia.Constants;
+
+import java.util.Arrays;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.wikipedia.json.GsonMarshaller.marshal;
+import static org.wikipedia.json.GsonUnmarshaller.unmarshal;
+
+@RunWith(ParameterizedRobolectricTestRunner.class) public class 
UriTypeAdapterTest {
+    @Parameters(name = "{0}") public static Iterable<Object[]> data() {
+        return Arrays.asList(new Object[][] {{DeferredParam.NULL},
+                {DeferredParam.STRING},
+                {DeferredParam.OPAQUE},
+                {DeferredParam.HIERARCHICAL}});
+    }
+
+    @Nullable private final Uri uri;
+
+    public UriTypeAdapterTest(@NonNull DeferredParam param) {
+        this.uri = param.val();
+    }
+
+    @Test public void testWriteRead() {
+        Uri result = unmarshal(Uri.class, marshal(uri));
+        assertThat(result, is(uri));
+    }
+
+    // Namespace uses a roboelectric mocked class internally, SparseArray, 
which is unavailable at
+    // static time; defer evaluation until TestRunner is executed
+    private enum DeferredParam {
+        NULL() {
+            @Nullable @Override Uri val() {
+                return null;
+            }
+        },
+        STRING() {
+            @Nullable @Override Uri val() {
+                return Uri.parse(Constants.WIKIPEDIA_URL);
+            }
+        },
+        OPAQUE() {
+            @Nullable @Override Uri val() {
+                return Uri.fromParts("http", "mediawiki.org", null);
+            }
+        },
+        HIERARCHICAL() {
+            @Nullable @Override Uri val() {
+                return Uri.EMPTY;
+            }
+        };
+
+        @Nullable abstract Uri val();
+    }
+}
\ No newline at end of file

-- 
To view, visit https://gerrit.wikimedia.org/r/316473
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I59ba6a9e32e898f28c9d1248fd39c20c71eebca1
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