summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2014-05-09 01:09:29 +0200
committerPeter Wu <peter@lekensteyn.nl>2014-05-09 01:09:29 +0200
commit8ab0f11e97de813d04e14b881149ea5b6fcc6782 (patch)
tree34696b9cd44078281d43354c125868c3c33f485e /src
parentfaa3102b2b79952c9def9d3c27cadb2c9048287d (diff)
downloadDatafiller-8ab0f11e97de813d04e14b881149ea5b6fcc6782.tar.gz
Add missing validation annotations, ...
* Add missing Validator annotations for User. * Add entities and url properties for user. * Properly do a recursive check if an Validator annotation is present.
Diffstat (limited to 'src')
-rw-r--r--src/data/Tweet.java16
-rw-r--r--src/data/User.java21
-rw-r--r--src/data/ValidatingJsonDeserializer.java38
-rw-r--r--src/io/TweetReader.java6
4 files changed, 62 insertions, 19 deletions
diff --git a/src/data/Tweet.java b/src/data/Tweet.java
index 0d529d6..577b620 100644
--- a/src/data/Tweet.java
+++ b/src/data/Tweet.java
@@ -8,8 +8,8 @@ import com.google.gson.GsonBuilder;
*/
public class Tweet {
- public String lang;
public long id;
+ public String lang;
public long in_reply_to_user_id;
public String created_at;
public long favorite_count;
@@ -18,9 +18,10 @@ public class Tweet {
public String text;
@ValidatingJsonDeserializer.Nullable
public Tweet retweeted_status;
+ @ValidatingJsonDeserializer.Validator
public Entities entities;
public long retweet_count;
- @ValidatingJsonDeserializer.Validator()
+ @ValidatingJsonDeserializer.Validator
public User user;
@Override
@@ -29,26 +30,29 @@ public class Tweet {
return gson.toJson(this);
}
- public class Entities {
+ public static class Entities {
+ @ValidatingJsonDeserializer.Validator
public Hashtag[] hashtags;
+ @ValidatingJsonDeserializer.Validator
public Url[] urls;
+ @ValidatingJsonDeserializer.Validator
public Mention[] user_mentions;
}
- public class Hashtag {
+ public static class Hashtag {
public String text;
}
- public class Url {
+ public static class Url {
public String expanded_url;
//public String display_url;
//public String url;
}
- public class Mention {
+ public static class Mention {
public long id; // user ID
//public String name; // display name
diff --git a/src/data/User.java b/src/data/User.java
index 054fa54..390d986 100644
--- a/src/data/User.java
+++ b/src/data/User.java
@@ -14,5 +14,26 @@ public class User {
public String location;
public String screen_name;
public String created_at;
+ @ValidatingJsonDeserializer.Validator
+ public Entities entities;
public String lang;
+
+ public static class Entities {
+
+ @ValidatingJsonDeserializer.Validator
+ public UrlEntity url;
+ }
+
+ public static class UrlEntity {
+
+ @ValidatingJsonDeserializer.Validator
+ public Url[] urls;
+ }
+
+ public static class Url {
+
+ public String expanded_url;
+ //public String display_url;
+ //public String url;
+ }
}
diff --git a/src/data/ValidatingJsonDeserializer.java b/src/data/ValidatingJsonDeserializer.java
index 91c1709..8711f59 100644
--- a/src/data/ValidatingJsonDeserializer.java
+++ b/src/data/ValidatingJsonDeserializer.java
@@ -2,6 +2,7 @@ package data;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
@@ -25,8 +26,17 @@ public class ValidatingJsonDeserializer<T> implements JsonDeserializer<T> {
public T deserialize(JsonElement je, Type type,
JsonDeserializationContext jdc) throws JsonParseException {
T obj = new Gson().fromJson(je, type);
+ checkObject(je, obj.getClass());
+ return obj;
+ }
+
+ private void checkObject(JsonElement je, Class type) {
+ if (!je.isJsonObject()) {
+ throw new JsonParseException("Expected object: " + type.getName());
+ }
JsonObject jsonObj = je.getAsJsonObject();
- for (Field f : obj.getClass().getDeclaredFields()) {
+ for (Field f : type.getDeclaredFields()) {
+ System.err.println("verif " + f.getName());
if (!jsonObj.has(f.getName())) {
if (f.getAnnotation(Nullable.class) != null) {
// null allowed, skip
@@ -34,21 +44,29 @@ public class ValidatingJsonDeserializer<T> implements JsonDeserializer<T> {
}
throw new JsonParseException("Missing field: " + f.getName());
}
+ tryValidateProperty(jsonObj.get(f.getName()), f);
// TODO: validate type?
}
- return obj;
}
- public static GsonBuilder addValidation(GsonBuilder gson, Type type) {
- GsonBuilder gb = new GsonBuilder();
- gson.registerTypeAdapter(type, new ValidatingJsonDeserializer());
- for (Field f : type.getClass().getDeclaredFields()) {
- Validator v = f.getAnnotation(Validator.class);
- if (v != null) {
- addValidation(gson, v.deserializer());
+ private void tryValidateProperty(JsonElement je, Field f) {
+ // assume that this annotation is only applied to objects
+ Validator v = f.getAnnotation(Validator.class);
+ if (v != null) {
+ Class<?> type = f.getType();
+ if (type.isArray()) {
+ if (!je.isJsonArray()) {
+ throw new JsonParseException("Not an array: " + f.getName());
+ }
+ JsonArray ja = je.getAsJsonArray();
+ type = type.getComponentType();
+ for (JsonElement arr_je : ja) {
+ checkObject(arr_je, type);
+ }
+ } else {
+ checkObject(je, type);
}
}
- return gb;
}
/**
diff --git a/src/io/TweetReader.java b/src/io/TweetReader.java
index d82978e..bf89a2c 100644
--- a/src/io/TweetReader.java
+++ b/src/io/TweetReader.java
@@ -27,9 +27,9 @@ public class TweetReader implements ITweetReader {
}
this.is = is;
reader = new BufferedReader(new InputStreamReader(is));
- GsonBuilder gsonBuilder = new GsonBuilder();
- ValidatingJsonDeserializer.addValidation(gsonBuilder, Tweet.class);
- gson = gsonBuilder.create();
+ gson = new GsonBuilder()
+ .registerTypeAdapter(Tweet.class, new ValidatingJsonDeserializer())
+ .create();
}
@Override