diff options
author | Peter Wu <peter@lekensteyn.nl> | 2014-05-09 01:09:29 +0200 |
---|---|---|
committer | Peter Wu <peter@lekensteyn.nl> | 2014-05-09 01:09:29 +0200 |
commit | 8ab0f11e97de813d04e14b881149ea5b6fcc6782 (patch) | |
tree | 34696b9cd44078281d43354c125868c3c33f485e /src | |
parent | faa3102b2b79952c9def9d3c27cadb2c9048287d (diff) | |
download | Datafiller-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.java | 16 | ||||
-rw-r--r-- | src/data/User.java | 21 | ||||
-rw-r--r-- | src/data/ValidatingJsonDeserializer.java | 38 | ||||
-rw-r--r-- | src/io/TweetReader.java | 6 |
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 |