package nl.fontys.sofa.limo.domain.component.serialization;
import com.google.gson.Gson;
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;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import nl.fontys.sofa.limo.domain.component.Icon;
import nl.fontys.sofa.limo.domain.component.event.Event;
import nl.fontys.sofa.limo.domain.component.hub.Hub;
import nl.fontys.sofa.limo.domain.component.leg.Leg;
import nl.fontys.sofa.limo.domain.component.leg.MultiModeLeg;
import nl.fontys.sofa.limo.domain.component.leg.ScheduledLeg;
import nl.fontys.sofa.limo.domain.component.procedure.Procedure;
/**
* Deserializes a Leg from JSON to a Java Object.
*
* @author Convict42
*/
public class LegDeserializer implements JsonDeserializer<Leg> {
@Override
public Leg deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject obj = json.getAsJsonObject();
JsonElement ele1 = obj.get("Legs");
JsonElement ele2 = obj.get("expectedTime");
if (ele1 != null) {
Map<Leg, Double> map = new HashMap<>();
JsonArray array = (JsonArray) ele1;
for (JsonElement je : array) {
JsonObject ob1 = (JsonObject) je;
JsonElement elem1 = ob1.get("Leg");
Leg leg = deserialize(elem1, typeOfT, context);
double elem2 = ob1.get("Value").getAsDouble();
map.put(leg, elem2);
}
MultiModeLeg mml = new MultiModeLeg();
mml.setLegs(map);
setStandard(mml, obj);
return mml;
}
if (ele2 != null) {
ScheduledLeg schedLeg = new ScheduledLeg();
JsonArray array = (JsonArray) obj.get("acceptanceTimes");
List<Long> list = new ArrayList<>();
for (JsonElement acceptanceTime : array) {
list.add(acceptanceTime.getAsLong());
}
schedLeg.setAcceptanceTimes(list);
schedLeg.setDelay(obj.get("delay").getAsLong());
schedLeg.setExpectedTime(obj.get("expectedTime").getAsLong());
schedLeg.setWaitingTimeLimit(obj.get("waitingTimeLimit").getAsLong());
JsonElement elem = obj.get("alternative");
Leg altLeg = deserialize(elem, typeOfT, context);
schedLeg.setAlternative(altLeg);
setStandard(schedLeg, obj);
return schedLeg;
}
if (ele1 == null && ele2 == null) {
Leg l = new Leg();
setStandard(l, json.getAsJsonObject());
return l;
}
return null;
}
private void setStandard(Leg leg, JsonObject obj) {
Gson g = GsonHelper.getInstance();
Type tEvent = new TypeToken<ArrayList<Event>>() {
}.getType();
Type tProcedure = new TypeToken<ArrayList<Procedure>>() {
}.getType();
leg.setDescription(obj.get("description").getAsString());
leg.setEvents((List<Event>) g.fromJson(obj.get("events"), tEvent));
Icon icon = g.fromJson(obj.get("icon"), Icon.class);
leg.setIcon(icon);
//leg.setId(null);
leg.setLastUpdate(obj.get("lastUpdate").getAsLong());
leg.setName(obj.get("name").getAsString());
if (!obj.get("next").isJsonNull()) {
leg.setNext(g.fromJson(obj.get("next"), Hub.class));
}
leg.setProcedures((List<Procedure>) g.fromJson(obj.get("procedures"), tProcedure));
leg.setUniqueIdentifier(obj.get("uniqueIdentifier").getAsString());
}
}