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.Answer;
import ca.ualberta.cs.cmput301f14t14.questionapp.model.Image;
import ca.ualberta.cs.cmput301f14t14.questionapp.model.LocationHolder;
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 Answer objects
*/
public class AnswerDeserializer implements JsonDeserializer<Answer> {
private DataManager dm;
public AnswerDeserializer(Context context) {
dm = DataManager.getInstance(context);
}
public Answer deserialize(final JsonElement json, final Type type,
final JsonDeserializationContext context) throws JsonParseException {
final JsonObject jsonObject = json.getAsJsonObject();
Answer answer;
UUID aid = UUID.fromString(jsonObject.get("id").getAsString());
// Get existing object if available
try {
answer = dm.getLocalDataStore().getAnswer(aid);
} catch (IOException e) {
Log.e("AnswerDeserializer", "Failed to get answer record");
answer = null;
}
if (answer == null)
answer = new Answer();
// Populate object
answer.setId(UUID.fromString(jsonObject.get("id").getAsString()));
answer.setParent(UUID.fromString(jsonObject.get("parent").getAsString()));
answer.setBody(jsonObject.get("body").getAsString());
answer.setAuthor(jsonObject.get("author").getAsString());
answer.setDate((Date) context.deserialize(jsonObject.get("date"), Date.class));
answer.setUpvotes(jsonObject.get("upvotes").getAsInt());
answer.setImage((Image) context.deserialize(jsonObject.get("image"), Image.class));
answer.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()));
}
answer.setCommentList(commentList);
return answer;
}
}