package org.sorz.lab.smallcloudemoji.parsers;
import android.util.JsonReader;
import org.sorz.lab.smallcloudemoji.db.DaoSession;
import org.sorz.lab.smallcloudemoji.exceptions.LoadingCancelException;
import org.sorz.lab.smallcloudemoji.exceptions.PullParserException;
import java.io.IOException;
import java.io.Reader;
/**
* Load a repository to database from a json stream (reader).
*/
public class RepositoryJsonLoader extends RepositoryLoader {
private JsonReader parser;
public RepositoryJsonLoader(DaoSession daoSession) {
super(daoSession);
}
@Override
protected void loadRepository(Reader reader)
throws PullParserException, IOException, LoadingCancelException {
parser = new JsonReader(reader);
parser.beginObject();
while (parser.hasNext()) {
String name = parser.nextName();
if (!name.equals("categories")) {
parser.skipValue();
continue;
}
parser.beginArray();
while (parser.hasNext()) {
loadCategory();
}
parser.endArray();
}
parser.endObject();
}
void loadCategory() throws IOException, LoadingCancelException {
boolean nameFound = false;
parser.beginObject();
while (parser.hasNext()) {
String name = parser.nextName();
if (name.equals("name") && !nameFound) {
nameFound = true;
beginCategory(parser.nextString());
} else if (name.equals("entries")) {
parser.beginArray();
while (parser.hasNext()) {
loadEntry();
}
parser.endArray();
} else {
parser.skipValue();
}
}
parser.endObject();
if (!nameFound)
beginCategory("Category"); // Apply default name.
endCategory();
}
void loadEntry() throws IOException, LoadingCancelException {
String description = "";
String emoticon = null;
parser.beginObject();
while (parser.hasNext()) {
String name = parser.nextName();
if (name.equals("description"))
description = parser.nextString();
else if (name.equals("emoticon"))
emoticon = parser.nextString();
else
parser.skipValue();
}
parser.endObject();
if (emoticon != null)
addEntry(emoticon, description);
}
}