package polly.rx.core.orion.model.json;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import polly.rx.core.orion.model.DefaultQuadrant;
import polly.rx.core.orion.model.Quadrant;
import polly.rx.core.orion.model.Sector;
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.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;
import de.skuzzle.polly.tools.Check;
class QuadrantJsonHandler extends AbstractJsonHandler implements
JsonDeserializer<Quadrant>, JsonSerializer<Quadrant>{
private final static String NAME = "name"; //$NON-NLS-1$
private final static String MAX_X = "maxX"; //$NON-NLS-1$
private final static String MAX_Y = "maxY"; //$NON-NLS-1$
private final static String SECTORS = "sectors"; //$NON-NLS-1$
final static Type QUADRANT_TYPE = new TypeToken<Quadrant>() {}.getType();
private final SectorJsonHandler sectorHandler;
public QuadrantJsonHandler(SectorJsonHandler sectorHandler) {
Check.objects(sectorHandler).notNull();
this.sectorHandler = sectorHandler;
}
@Override
public Quadrant deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
final JsonObject obj = json.getAsJsonObject();
final String name = this.getMemberOrThrow(obj, NAME).getAsString();
final int maxX = this.getMemberOrThrow(obj, MAX_X).getAsInt();
final int maxY = this.getMemberOrThrow(obj, MAX_Y).getAsInt();
final JsonArray sectors = this.getMemberOrDefault(obj, SECTORS,
new JsonArray()).getAsJsonArray();
final Collection<Sector> sectorsC = new ArrayList<>(sectors.size());
for (int i = 0; i < sectors.size(); ++i) {
final JsonElement jSector = sectors.get(i);
final Sector next = this.sectorHandler.deserialize(
jSector, SectorJsonHandler.SECTOR_TYPE, context);
sectorsC.add(next);
}
return new DefaultQuadrant(name, maxX, maxY, sectorsC);
}
@Override
public JsonElement serialize(Quadrant src, Type typeOfSrc,
JsonSerializationContext context) {
final JsonObject result = new JsonObject();
result.addProperty(NAME, src.getName());
result.addProperty(MAX_X, src.getMaxX());
result.addProperty(MAX_Y, src.getMaxY());
final JsonArray sectors = new JsonArray();
for (final Sector s : src.getSectors()) {
sectors.add(this.sectorHandler.serialize(s,
SectorJsonHandler.SECTOR_TYPE, context));
}
result.add(SECTORS, sectors);
return result;
}
}