[MediaWiki-commits] [Gerrit] apps...wikipedia[master]: Fix un/marshalling of Uris to extend to subclasses

2016-10-19 Thread jenkins-bot (Code Review)
jenkins-bot has submitted this change and it was merged.

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(-)

Approvals:
  Dbrant: Looks good to me, approved
  jenkins-bot: Verified



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,  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 {
 @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 000..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 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: merged
Gerrit-Change-Id: I59ba6a9e32e898f28c9d1248fd39c20c71eebca1
Gerrit-PatchSet: 1

[MediaWiki-commits] [Gerrit] apps...wikipedia[master]: Fix un/marshalling of Uris to extend to subclasses

2016-10-17 Thread Niedzielski (Code Review)
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,  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 {
 @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 000..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 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: