package jas.spawner.legacy.spawner.biome.group;
import jas.common.helper.GsonHelper;
import jas.spawner.legacy.spawner.biome.group.BiomeGroupRegistry.BiomeGroup;
import jas.spawner.modern.DefaultProps;
import java.io.File;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import com.google.common.base.Optional;
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.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
public class BiomeGroupSaveObject {
public final String fileVersion = "1.0";
public final TreeMap<String, String> biomeMappings; // Use TreeMaps instead of hashmaps EVERYWHERE to sort by keys
private Optional<TreeMap<String, TreeMap<String, BiomeGroup>>> configNameToAttributeGroups;
private Optional<TreeMap<String, TreeMap<String, BiomeGroup>>> configNameToBiomeGroups;
/* For Serialization Only */
private BiomeGroupSaveObject() {
this.biomeMappings = new TreeMap<String, String>();
this.configNameToAttributeGroups = Optional.absent();
this.configNameToBiomeGroups = Optional.absent();
}
public BiomeGroupSaveObject(Map<String, String> biomeMappings, Collection<BiomeGroup> attributeGroups,
Collection<BiomeGroup> biomeGroups) {
this.biomeMappings = new TreeMap<String, String>(biomeMappings);
this.configNameToBiomeGroups = Optional.of(new TreeMap<String, TreeMap<String, BiomeGroup>>());
this.configNameToAttributeGroups = Optional.of(new TreeMap<String, TreeMap<String, BiomeGroup>>());
for (BiomeGroup group : attributeGroups) {
getOrCreate(configNameToAttributeGroups.get(), group.configName).put(group.groupID, group);
}
for (BiomeGroup group : biomeGroups) {
getOrCreate(configNameToBiomeGroups.get(), group.configName).put(group.groupID, group);
}
}
public Optional<TreeMap<String, TreeMap<String, BiomeGroup>>> getConfigNameToAttributeGroups() {
return configNameToAttributeGroups;
}
public Optional<TreeMap<String, TreeMap<String, BiomeGroup>>> getConfigNameToBiomeGroups() {
return configNameToBiomeGroups;
}
public static File getFile(File configDirectory, String saveName) {
return new File(configDirectory, DefaultProps.MODDIR + DefaultProps.WORLDSETTINGSDIR + saveName + "/"
+ "BiomeGroups.cfg");
}
private TreeMap<String, BiomeGroup> getOrCreate(TreeMap<String, TreeMap<String, BiomeGroup>> map, String key) {
TreeMap<String, BiomeGroup> group = map.get(key);
if (group == null) {
group = new TreeMap<String, BiomeGroup>();
map.put(key, group);
}
return group;
}
public static class BiomeGroupSaveObjectSerializer implements JsonSerializer<BiomeGroupSaveObject>,
JsonDeserializer<BiomeGroupSaveObject> {
public final String FILE_VERSION_KEY = "FILE_VERSION";
public final String FILE_VERSION = "1.0";
public final String BIOME_MAPPINGS = "Biome Mappings";
public final String ATTRIBUTE_GROUPS = "Attribute Groups";
public final String BIOME_GROUPS = "Biome Groups";
public final String CONTENTS_KEY = "contents";
@Override
public JsonElement serialize(BiomeGroupSaveObject saveObject, Type type, JsonSerializationContext context) {
JsonObject endObject = new JsonObject();
endObject.addProperty(FILE_VERSION_KEY, saveObject.fileVersion);
JsonObject mappingObject = new JsonObject();
for (Entry<String, String> entry : saveObject.biomeMappings.entrySet()) {
mappingObject.addProperty(entry.getKey(), entry.getValue());
}
endObject.add(BIOME_MAPPINGS, mappingObject);
JsonObject attributeObject = new JsonObject();
for (Entry<String, TreeMap<String, BiomeGroup>> outerEntry : saveObject.configNameToAttributeGroups.get()
.entrySet()) {
String configName = outerEntry.getKey();
JsonObject biomeObject = new JsonObject();
for (Entry<String, BiomeGroup> innerEntry : outerEntry.getValue().entrySet()) {
String groupName = innerEntry.getKey();
BiomeGroup group = innerEntry.getValue();
JsonArray contents = new JsonArray();
for (String content : group.getContents()) {
contents.add(new JsonPrimitive(content));
}
JsonObject contentsObject = new JsonObject();
contentsObject.add(CONTENTS_KEY, contents);
biomeObject.add(groupName, contentsObject);
}
attributeObject.add(configName, biomeObject);
}
endObject.add(ATTRIBUTE_GROUPS, attributeObject);
JsonObject biomeGroupObject = new JsonObject();
for (Entry<String, TreeMap<String, BiomeGroup>> outerEntry : saveObject.configNameToBiomeGroups.get()
.entrySet()) {
String configName = outerEntry.getKey();
JsonObject biomeObject = new JsonObject();
for (Entry<String, BiomeGroup> innerEntry : outerEntry.getValue().entrySet()) {
String groupName = innerEntry.getKey();
BiomeGroup group = innerEntry.getValue();
JsonArray contents = new JsonArray();
for (String content : group.getContents()) {
contents.add(new JsonPrimitive(content));
}
JsonObject contentsObject = new JsonObject();
contentsObject.add(CONTENTS_KEY, contents);
biomeObject.add(groupName, contentsObject);
}
biomeGroupObject.add(configName, biomeObject);
}
endObject.add(BIOME_GROUPS, biomeGroupObject);
return endObject;
}
@Override
public BiomeGroupSaveObject deserialize(JsonElement object, Type type, JsonDeserializationContext context)
throws JsonParseException {
BiomeGroupSaveObject saveObject = new BiomeGroupSaveObject();
JsonObject endObject = object.getAsJsonObject();
String fileVersion = GsonHelper.getMemberOrDefault(endObject, FILE_VERSION_KEY, FILE_VERSION);
JsonObject mappingsObject = GsonHelper.getMemberOrDefault(endObject, BIOME_MAPPINGS, new JsonObject());
for (Entry<String, JsonElement> entry : mappingsObject.entrySet()) {
saveObject.biomeMappings.put(entry.getKey(), entry.getValue().getAsString());
}
JsonElement attrElement = endObject.get(ATTRIBUTE_GROUPS);
if (attrElement != null && attrElement.isJsonObject()) {
saveObject.configNameToAttributeGroups = Optional
.of(new TreeMap<String, TreeMap<String, BiomeGroup>>());
JsonObject attributeObject = attrElement.getAsJsonObject();
for (Entry<String, JsonElement> outerEntry : attributeObject.entrySet()) {
String configName = outerEntry.getKey();
TreeMap<String, BiomeGroup> groupNameToBiomeGroup = saveObject.configNameToAttributeGroups.get()
.get(configName);
if (groupNameToBiomeGroup == null) {
groupNameToBiomeGroup = new TreeMap<String, BiomeGroup>();
saveObject.configNameToAttributeGroups.get().put(configName, groupNameToBiomeGroup);
}
JsonObject innerObject = outerEntry.getValue().getAsJsonObject();
for (Entry<String, JsonElement> innerEntry : innerObject.entrySet()) {
String groupName = innerEntry.getKey();
JsonArray contentsArray = innerEntry.getValue().getAsJsonObject().get(CONTENTS_KEY)
.getAsJsonArray();
ArrayList<String> contents = new ArrayList<String>();
for (JsonElement jsonElement : contentsArray) {
contents.add(jsonElement.getAsString());
}
groupNameToBiomeGroup.put(groupName, new BiomeGroup(groupName, configName, contents));
}
}
}
JsonElement biomeElement = endObject.get(BIOME_GROUPS);
if (biomeElement != null && biomeElement.isJsonObject()) {
saveObject.configNameToBiomeGroups = Optional.of(new TreeMap<String, TreeMap<String, BiomeGroup>>());
JsonObject biomeGroupObject = biomeElement.getAsJsonObject();
for (Entry<String, JsonElement> outerEntry : biomeGroupObject.entrySet()) {
String configName = outerEntry.getKey();
TreeMap<String, BiomeGroup> groupNameToBiomeGroup = saveObject.configNameToBiomeGroups.get().get(
configName);
if (groupNameToBiomeGroup == null) {
groupNameToBiomeGroup = new TreeMap<String, BiomeGroup>();
saveObject.configNameToBiomeGroups.get().put(configName, groupNameToBiomeGroup);
}
JsonObject innerObject = outerEntry.getValue().getAsJsonObject();
for (Entry<String, JsonElement> innerEntry : innerObject.entrySet()) {
String groupName = innerEntry.getKey();
JsonArray contentsArray = innerEntry.getValue().getAsJsonObject().get(CONTENTS_KEY)
.getAsJsonArray();
ArrayList<String> contents = new ArrayList<String>();
for (JsonElement jsonElement : contentsArray) {
contents.add(jsonElement.getAsString());
}
groupNameToBiomeGroup.put(groupName, new BiomeGroup(groupName, configName, contents));
}
}
}
return saveObject;
}
}
}