equivalent-exchange-3/src/main/java/com/pahimar/ee3/util/serialize/EnergyValueMapSerializer.java
2023-01-03 17:47:36 +01:00

163 lines
6.6 KiB
Java

package com.pahimar.ee3.util.serialize;
import java.lang.reflect.Type;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
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;
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 = null;
if (jsonValueMapping.get(ENERGY_VALUE).isJsonPrimitive()) {
if (jsonValueMapping.getAsJsonPrimitive(ENERGY_VALUE)
.isNumber()) {
try {
energyValue = new EnergyValue(
jsonValueMapping.getAsJsonPrimitive(ENERGY_VALUE)
.getAsNumber()
);
} catch (NumberFormatException e) {
// TODO Logging
}
}
}
if (jsonValueMapping.has(TYPE_ITEM_STACK)) {
try {
ItemStack itemStack = context.deserialize(
jsonValueMapping.get(TYPE_ITEM_STACK), ItemStack.class
);
wrappedStack = WrappedStack.wrap(itemStack);
} catch (JsonParseException e) {
// TODO Logging
}
} else if (jsonValueMapping.has(TYPE_ORE_STACK)) {
try {
OreStack oreStack = context.deserialize(
jsonValueMapping.get(TYPE_ORE_STACK), OreStack.class
);
wrappedStack = WrappedStack.wrap(oreStack);
} catch (JsonParseException e) {
// TODO Logging
}
} else if (jsonValueMapping.has(TYPE_FLUID_STACK)) {
try {
FluidStack fluidStack = context.deserialize(
jsonValueMapping.get(TYPE_FLUID_STACK), FluidStack.class
);
wrappedStack = WrappedStack.wrap(fluidStack);
} catch (JsonParseException e) {
// TODO Logging
}
}
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) {
src.keySet()
.stream()
.filter(
wrappedStack
-> wrappedStack != null && wrappedStack.getWrappedObject() != null
)
.forEach(wrappedStack -> {
JsonObject jsonMapping = new JsonObject();
JsonElement jsonElement
= context.serialize(wrappedStack.getWrappedObject());
if (jsonElement.isJsonObject()) {
jsonMapping.add(
wrappedStack.getWrappedObject()
.getClass()
.getSimpleName()
.toLowerCase(),
context.serialize(wrappedStack.getWrappedObject())
);
if (src.get(wrappedStack) != null) {
jsonMapping.addProperty(
ENERGY_VALUE, src.get(wrappedStack).getValue()
);
} else {
jsonMapping.add(ENERGY_VALUE, JsonNull.INSTANCE);
}
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;
}
}