equivalent-exchange-3/src/main/java/com/pahimar/ee3/util/serialize/EnergyValueMapSerializer.java

99 lines
4.2 KiB
Java

package com.pahimar.ee3.util.serialize;
import com.google.gson.*;
import com.pahimar.ee3.api.exchange.EnergyValue;
import com.pahimar.ee3.exchange.OreStack;
import com.pahimar.ee3.exchange.WrappedStack;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import java.lang.reflect.Type;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class EnergyValueMapSerializer implements JsonSerializer<Map<WrappedStack, EnergyValue>>, JsonDeserializer<Map<WrappedStack, EnergyValue>> {
private static final String ENERGY_VALUE = "energyValue";
private static final String TYPE_ITEM_STACK = "itemstack";
private static final String TYPE_ORE_STACK = "orestack";
private static final String TYPE_FLUID_STACK = "fluidstack";
@Override
public Map<WrappedStack, EnergyValue> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Map<WrappedStack, EnergyValue> valueMap = new TreeMap<>();
if (json.isJsonArray()) {
JsonArray jsonArray = json.getAsJsonArray();
Iterator<JsonElement> jsonArrayIterator = jsonArray.iterator();
while (jsonArrayIterator.hasNext()) {
JsonElement jsonElement = jsonArrayIterator.next();
if (validateValueMapping(jsonElement)) {
JsonObject jsonValueMapping = jsonElement.getAsJsonObject();
WrappedStack wrappedStack = null;
EnergyValue energyValue = new EnergyValue(jsonValueMapping.get(ENERGY_VALUE).getAsNumber());
if (jsonValueMapping.has(TYPE_ITEM_STACK)) {
wrappedStack = WrappedStack.wrap(context.deserialize(jsonValueMapping.get(TYPE_ITEM_STACK), ItemStack.class));
}
else if (jsonValueMapping.has(TYPE_ORE_STACK)) {
wrappedStack = WrappedStack.wrap(context.deserialize(jsonValueMapping.get(TYPE_ORE_STACK), OreStack.class));
}
else if (jsonValueMapping.has(TYPE_FLUID_STACK)) {
wrappedStack = WrappedStack.wrap(context.deserialize(jsonValueMapping.get(TYPE_FLUID_STACK), FluidStack.class));
}
if (wrappedStack != null && energyValue != null) {
valueMap.put(wrappedStack, energyValue);
}
}
}
}
return valueMap;
}
@Override
public JsonElement serialize(Map<WrappedStack, EnergyValue> src, Type typeOfSrc, JsonSerializationContext context) {
JsonArray jsonArray = new JsonArray();
if (src != null) {
for (WrappedStack wrappedStack : src.keySet()) {
JsonObject jsonMapping = new JsonObject();
jsonMapping.add(wrappedStack.getWrappedObject().getClass().getSimpleName().toLowerCase(), context.serialize(wrappedStack.getWrappedObject()));
jsonMapping.addProperty(ENERGY_VALUE, src.get(wrappedStack).getValue());
jsonArray.add(jsonMapping);
}
}
return jsonArray;
}
/***
* Validates whether or not the provided {@link JsonElement} is a valid json encoded {@link WrappedStack}:{@link EnergyValue} mapping
*
* @param jsonElement the {@link JsonElement} being validated
* @return true if jsonElement is a valid json encoded {@link WrappedStack}:{@link EnergyValue} mapping, false otherwise
*/
private static boolean validateValueMapping(JsonElement jsonElement) {
if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.entrySet().size() == 2 && jsonObject.has(ENERGY_VALUE) && jsonObject.get(ENERGY_VALUE).isJsonPrimitive()) {
return (jsonObject.has(TYPE_ITEM_STACK) && jsonObject.get(TYPE_ITEM_STACK).isJsonObject()) ||
(jsonObject.has(TYPE_ORE_STACK) && jsonObject.get(TYPE_ORE_STACK).isJsonObject()) ||
(jsonObject.has(TYPE_FLUID_STACK) && jsonObject.get(TYPE_FLUID_STACK).isJsonObject());
}
}
return false;
}
}