/*
* Copyright (C) 2012 Dr. John Lindsay <jlindsay@uoguelph.ca>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package whitebox.serialization;
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
import java.awt.Font;
import java.awt.print.PageFormat;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import whitebox.cartographic.*;
import whitebox.interfaces.CartographicElement;
/**
*
* @author johnlindsay
*/
public class MapInfoDeserializer implements JsonDeserializer<MapInfo> {
private String workingDirectory = null;
private String paletteDirectory = null;
public MapInfoDeserializer(String currentWorkingDirectory, String paletteDirectory) {
this.workingDirectory = currentWorkingDirectory;
this.paletteDirectory = paletteDirectory;
}
@Override
public MapInfo deserialize(JsonElement je, Type type,
JsonDeserializationContext jdc)
throws JsonParseException {
try {
if (workingDirectory == null || paletteDirectory == null) {
throw new JsonParseException("The current working directory or palette directory must be set.");
}
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(PageFormat.class, new PageFormatDeserializer());
gsonBuilder.registerTypeAdapter(CartographicElement.class,
new CartographicElementDeserializer(workingDirectory, paletteDirectory));
Gson gson = gsonBuilder.create();
Type fontType = new TypeToken<Font>() {}.getType();
Font font;
JsonObject jo = je.getAsJsonObject();
MapInfo mi = new MapInfo();
mi.setMapName(jo.getAsJsonPrimitive("mapName").getAsString());
mi.setFileName(jo.getAsJsonPrimitive("fileName").getAsString());
mi.setPageVisible(jo.getAsJsonPrimitive("pageVisible").getAsBoolean());
mi.setMargin(jo.getAsJsonPrimitive("margin").getAsDouble());
PageFormat pf = gson.fromJson(jo.getAsJsonObject("pageFormat"), PageFormat.class);
mi.setPageFormat(pf);
if (jo.has("defaultFont")) {
font = gson.fromJson(jo.get("defaultFont"), fontType);
mi.setDefaultFont(font);
}
Type listOfCartographicElementsObject =
new TypeToken<List<CartographicElement>>() {}.getType();
JsonElement je2 = jo.get("cartographicElementList");
ArrayList<CartographicElement> cartoElementList = gson.fromJson(je2, listOfCartographicElementsObject);
ArrayList<MapArea> mapAreas = new ArrayList<>();
for (CartographicElement ce : cartoElementList) {
if (ce instanceof MapArea) {
mapAreas.add((MapArea) ce);
}
}
for (int elementNumber = 0; elementNumber < cartoElementList.size(); elementNumber++) {
for (CartographicElement ce : cartoElementList) {
if (ce.getElementNumber() == elementNumber) {
if (ce instanceof MapScale) {
MapScale ms = (MapScale) ce;
int mapAreaElementNumber = ms.getMapAreaElementNumber();
for (MapArea ma : mapAreas) {
if (ma.getElementNumber() == mapAreaElementNumber) {
ms.setMapArea(ma);
mi.addNewCartographicElement(ms);
}
}
} else if (ce instanceof Legend) {
Legend l = (Legend) ce;
for (MapArea ma : mapAreas) {
l.addMapArea(ma);
}
// check to see if any MapAreas are contained in any carto element groups
for (CartographicElement ce2 : cartoElementList) {
if (ce instanceof CartographicElementGroup) {
CartographicElementGroup ceg = (CartographicElementGroup) ce;
List<CartographicElement> elementList = ceg.getElementList();
}
}
mi.addNewCartographicElement(l);
} else {
mi.addNewCartographicElement(ce);
}
}
}
}
//mi.removeCartographicElement(0); // removes the default maparea
return mi;
} catch (Exception e) {
System.err.println(e.getMessage());
return null;
}
}
}