package ca.ualberta.cs.cmput301f14t14.questionapp.model.serializer;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import android.content.Context;
import android.util.Log;
import ca.ualberta.cs.cmput301f14t14.questionapp.data.DataManager;
import ca.ualberta.cs.cmput301f14t14.questionapp.model.Image;
import ca.ualberta.cs.cmput301f14t14.questionapp.model.LocationHolder;
import ca.ualberta.cs.cmput301f14t14.questionapp.model.Question;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
/**
* Class used by GSON to deserialize Question objects
*/
public class QuestionDeserializer implements JsonDeserializer<Question> {
private DataManager dm;
public QuestionDeserializer(Context context) {
dm = DataManager.getInstance(context);
}
public Question deserialize(final JsonElement json, final Type type,
final JsonDeserializationContext context) throws JsonParseException {
final JsonObject jsonObject = json.getAsJsonObject();
Question question;
UUID qid = UUID.fromString(jsonObject.get("id").getAsString());
// Get existing object if available
try {
question = dm.getLocalDataStore().getQuestion(qid);
} catch (IOException e) {
Log.e("QuestionDeserializer", "Failed to get question record");
question = null;
}
if (question == null)
question = new Question();
// Populate object
question.setId(qid);
question.setTitle(jsonObject.get("title").getAsString());
question.setBody(jsonObject.get("body").getAsString());
question.setAuthor(jsonObject.get("author").getAsString());
question.setDate((Date) context.deserialize(jsonObject.get("date"), Date.class));
question.setUpvotes(jsonObject.get("upvotes").getAsInt());
question.setImage((Image) context.deserialize(jsonObject.get("image"), Image.class));
question.setLocation((LocationHolder) context.deserialize(jsonObject.get("location"), LocationHolder.class));
// Populate comment list
List<UUID> commentList = new ArrayList<UUID>();
JsonArray commentJsonArray = jsonObject.getAsJsonArray("comments");
for (JsonElement cIdElement: commentJsonArray) {
commentList.add(UUID.fromString(cIdElement.getAsString()));
}
question.setCommentList(commentList);
// Populate answer list
List<UUID> answerList = new ArrayList<UUID>();
JsonArray answerJsonArray = jsonObject.getAsJsonArray("answers");
for (JsonElement aIdElement: answerJsonArray) {
answerList.add(UUID.fromString(aIdElement.getAsString()));
}
question.setAnswerList(answerList);
return question;
}
}