package com.pocketreddit.library.things.utils; import org.json.JSONException; import org.json.JSONObject; import com.pocketreddit.library.things.Kind; import com.pocketreddit.library.things.More; import com.pocketreddit.library.things.Thing; import com.pocketreddit.library.things.factories.CommentFactory; import com.pocketreddit.library.things.factories.LinkFactory; import com.pocketreddit.library.things.factories.ListingFactory; import com.pocketreddit.library.things.factories.SubredditFactory; import com.pocketreddit.library.things.factories.ThingFactory; import com.pocketreddit.library.things.factories.ThingFactoryException; public class JsonToThingConverter<T extends Thing> { public JsonToThingConverter() { } @SuppressWarnings({ "unchecked", "rawtypes" }) public T convert(JSONObject json) throws ThingFactoryException { Kind kind; try { kind = Kind.toKind(json.getString("kind")); } catch (JSONException e) { throw new ThingFactoryException( "An error occurred trying to parse the kind of thing in provided json", e); } ThingFactory thingFactory = null; switch (kind) { case SUBREDDIT: thingFactory = new SubredditFactory(json); break; case LISTING: thingFactory = new ListingFactory(json); break; case THREAD: try { thingFactory = json.getJSONObject("data").isNull("domain") ? new CommentFactory( json) : new LinkFactory(json); } catch (JSONException e) { throw new ThingFactoryException("Could not parse data for Thread thing.", e); } break; case COMMENT: thingFactory = new CommentFactory(json); break; case MORE: return (T) new More(); default: throw new UnsupportedOperationException("Kind: " + kind + " conversion not yet supported."); } return (T) thingFactory.createThing(); } }