package se.alexanderblom.delicious.model; import java.io.IOException; import java.io.Reader; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.util.JsonReader; import android.util.Log; import com.google.common.base.Splitter; import com.google.common.collect.Lists; public class PostsParser { private static final String TAG = "PostsParser"; private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"; private JsonReader reader; private SimpleDateFormat dateFormat; public PostsParser(Reader in) { reader = new JsonReader(in); dateFormat = new SimpleDateFormat(DATE_FORMAT); } public List<Post> getPosts() throws IOException { try { ArrayList<Post> posts = new ArrayList<Post>(); reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); if (name.equals("posts")) { reader.beginArray(); while (reader.hasNext()) { Post post = readPost(); posts.add(post); } reader.endArray(); } else { reader.skipValue(); } } reader.endObject(); return posts; } finally { reader.close(); } } private Post readPost() throws IOException { String link = null; String title = null; String notes = null; List<String> tags = Collections.emptyList(); long timeMillis = 0; reader.beginObject(); waitFor("post"); reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); if (name.equals("href")) { link = reader.nextString(); } else if (name.equals("description")) { title = reader.nextString(); } else if (name.equals("extended")) { notes = reader.nextString(); } else if (name.equals("tag")) { Splitter splitter = Splitter.on(' ') .trimResults() .omitEmptyStrings(); tags = Lists.newArrayList(splitter.split(reader.nextString())); } else if (name.equals("time")) { String time = reader.nextString(); try { timeMillis = dateFormat.parse(time).getTime(); } catch (ParseException e) { Log.e(TAG, "Failed to parse date", e); } } else { reader.skipValue(); } } reader.endObject(); reader.endObject(); return new Post(link, title, notes, tags, timeMillis); } private void waitFor(String name) throws IOException { while (reader.hasNext()) { if (name.equals(reader.nextName())) { return; } else { reader.skipValue(); } } throw new IOException("Could not find '" + name + "'"); } }