summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2014-05-10 01:06:28 +0200
committerPeter Wu <peter@lekensteyn.nl>2014-05-10 01:06:28 +0200
commite4d8d30fca3bc621e0f5ec6eba6117b510621c6f (patch)
tree4140460064f6f89670c655fceedea4b9e2e35516
parentd1a7285924143a2430c65edbc9455b67f5fae926 (diff)
downloadDatafiller-e4d8d30fca3bc621e0f5ec6eba6117b510621c6f.tar.gz
Add validator debugger where the wrong type is returned
-rw-r--r--src/data/DebuggingJsonDeserializer.java41
-rw-r--r--src/data/ValidatingJsonDeserializer.java2
-rw-r--r--src/io/TweetReader.java14
-rw-r--r--test/data/ValidatingJsonDeserializerTest.java10
4 files changed, 65 insertions, 2 deletions
diff --git a/src/data/DebuggingJsonDeserializer.java b/src/data/DebuggingJsonDeserializer.java
new file mode 100644
index 0000000..1b00d4d
--- /dev/null
+++ b/src/data/DebuggingJsonDeserializer.java
@@ -0,0 +1,41 @@
+package data;
+
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import java.lang.reflect.Type;
+
+/**
+ * Validates the deserialization of a JSON string. The main motivation of this
+ * class is to print the property name of an object that throws an
+ * IllegalStateException because a string was expected, but a different type got
+ * returned.
+ *
+ * @author Peter Wu
+ */
+public class DebuggingJsonDeserializer extends ValidatingJsonDeserializer {
+
+ private final Class overriddenClass;
+
+ private DebuggingJsonDeserializer(Class overriddenClass) {
+ this.overriddenClass = overriddenClass;
+ }
+
+ @Override
+ public Object deserialize(JsonElement je, Type type,
+ JsonDeserializationContext jdc) throws JsonParseException {
+ checkObject("", je, overriddenClass);
+ return null;
+ }
+
+ public static void tryValidate(String json, Class cls) {
+ new GsonBuilder()
+ .registerTypeAdapter(Dummy.class, new DebuggingJsonDeserializer(cls))
+ .create()
+ .fromJson(json, Dummy.class);
+ }
+
+ private class Dummy {
+ }
+}
diff --git a/src/data/ValidatingJsonDeserializer.java b/src/data/ValidatingJsonDeserializer.java
index c168821..f44b681 100644
--- a/src/data/ValidatingJsonDeserializer.java
+++ b/src/data/ValidatingJsonDeserializer.java
@@ -30,7 +30,7 @@ public class ValidatingJsonDeserializer<T> implements JsonDeserializer<T> {
return obj;
}
- private void checkObject(String path, JsonElement je, Class type) {
+ void checkObject(String path, JsonElement je, Class type) {
JsonObject jsonObj = je.getAsJsonObject();
for (Field f : type.getDeclaredFields()) {
JsonElement val = jsonObj.get(f.getName());
diff --git a/src/io/TweetReader.java b/src/io/TweetReader.java
index bf89a2c..f67daf8 100644
--- a/src/io/TweetReader.java
+++ b/src/io/TweetReader.java
@@ -2,7 +2,9 @@ package io;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
+import com.google.gson.JsonParseException;
import com.google.gson.JsonSyntaxException;
+import data.DebuggingJsonDeserializer;
import data.Tweet;
import data.ValidatingJsonDeserializer;
import java.io.BufferedReader;
@@ -40,7 +42,7 @@ public class TweetReader implements ITweetReader {
try {
tweet = gson.fromJson(line, Tweet.class);
} catch (JsonSyntaxException ex) {
- // TODO: handle something?
+ debugTweet(line, ex);
throw ex;
}
}
@@ -54,4 +56,14 @@ public class TweetReader implements ITweetReader {
} catch (IOException ex) {
}
}
+
+ private void debugTweet(String line, JsonSyntaxException ex) {
+ try {
+ System.err.println("Faulty line: " + line);
+ DebuggingJsonDeserializer.tryValidate(line, Tweet.class);
+ System.err.println("No error occured, how strange?");
+ } catch (JsonParseException jse) {
+ System.err.println("The error was: " + jse);
+ }
+ }
}
diff --git a/test/data/ValidatingJsonDeserializerTest.java b/test/data/ValidatingJsonDeserializerTest.java
index 2d3ffd1..a1f9884 100644
--- a/test/data/ValidatingJsonDeserializerTest.java
+++ b/test/data/ValidatingJsonDeserializerTest.java
@@ -534,4 +534,14 @@ public class ValidatingJsonDeserializerTest {
tweet.add("place", null);
checkTweetPass(tweet);
}
+
+ @Test
+ public void testNotATweetObject() {
+ try {
+ DebuggingJsonDeserializer.tryValidate("{}", Tweet.class);
+ fail("DebuggingJsonDeserializer must also check for type.");
+ } catch (JsonParseException ex) {
+ assertEquals("Missing field: id", ex.getMessage());
+ }
+ }
}