From e8e1d6184e6215432da4ad458b86d69f497f8ec0 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 2 Jan 2024 12:54:50 +0900 Subject: [PATCH] Material Type adapter (#2253) * Fix powermockito test dependencies. * Add Material gson type adapter to handle old Material enums In this case GRASS -> SHORT_GRASS --- pom.xml | 44 ++++++++------- .../json/BentoboxTypeAdapterFactory.java | 4 ++ .../json/adapters/MaterialTypeAdapter.java | 56 +++++++++++++++++++ 3 files changed, 85 insertions(+), 19 deletions(-) create mode 100644 src/main/java/world/bentobox/bentobox/database/json/adapters/MaterialTypeAdapter.java diff --git a/pom.xml b/pom.xml index d691e5712..f60b1ade1 100644 --- a/pom.xml +++ b/pom.xml @@ -192,6 +192,31 @@ + + + + org.javassist + javassist + 3.30.2-GA + + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + org.powermock + powermock-api-mockito2 + ${powermock.version} + test + + + org.mockito + mockito-core + 3.11.1 + test + org.spigotmc @@ -212,25 +237,6 @@ bstats-bukkit ${bstats.version} - - - org.mockito - mockito-core - 3.11.1 - test - - - org.powermock - powermock-module-junit4 - ${powermock.version} - test - - - org.powermock - powermock-api-mockito2 - ${powermock.version} - test - org.mongodb diff --git a/src/main/java/world/bentobox/bentobox/database/json/BentoboxTypeAdapterFactory.java b/src/main/java/world/bentobox/bentobox/database/json/BentoboxTypeAdapterFactory.java index d1263ec9c..a8faa19e1 100644 --- a/src/main/java/world/bentobox/bentobox/database/json/BentoboxTypeAdapterFactory.java +++ b/src/main/java/world/bentobox/bentobox/database/json/BentoboxTypeAdapterFactory.java @@ -3,6 +3,7 @@ package world.bentobox.bentobox.database.json; import java.util.Map; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.configuration.serialization.ConfigurationSerializable; @@ -23,6 +24,7 @@ import world.bentobox.bentobox.database.json.adapters.EnumTypeAdapter; import world.bentobox.bentobox.database.json.adapters.FlagTypeAdapter; import world.bentobox.bentobox.database.json.adapters.ItemStackTypeAdapter; import world.bentobox.bentobox.database.json.adapters.LocationTypeAdapter; +import world.bentobox.bentobox.database.json.adapters.MaterialTypeAdapter; import world.bentobox.bentobox.database.json.adapters.PotionEffectTypeAdapter; import world.bentobox.bentobox.database.json.adapters.VectorTypeAdapter; import world.bentobox.bentobox.database.json.adapters.WorldTypeAdapter; @@ -55,6 +57,8 @@ public class BentoboxTypeAdapterFactory implements TypeAdapterFactory { if (Location.class.isAssignableFrom(rawType)) { // Use our current location adapter for backward compatibility return (TypeAdapter) new LocationTypeAdapter(); + } else if (Material.class.isAssignableFrom(rawType)) { + return (TypeAdapter) new MaterialTypeAdapter(); } else if (Biome.class.isAssignableFrom(rawType)) { return (TypeAdapter) new BiomeTypeAdapter(); } else if (Enum.class.isAssignableFrom(rawType)) { diff --git a/src/main/java/world/bentobox/bentobox/database/json/adapters/MaterialTypeAdapter.java b/src/main/java/world/bentobox/bentobox/database/json/adapters/MaterialTypeAdapter.java new file mode 100644 index 000000000..65150dbe6 --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/database/json/adapters/MaterialTypeAdapter.java @@ -0,0 +1,56 @@ +package world.bentobox.bentobox.database.json.adapters; + + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Material; + +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; + + +/** + * Minecraft 1.20 changed GRASS to SHORT_GRASS. This class provides and backwards compatibility when loading + * databased files stored with previous versions. It can be extended in the future if further enum changes are made. + * @author tastybento + * @since 2.0.0 + */ +public final class MaterialTypeAdapter extends TypeAdapter +{ + /** + * Map that contains string value to the actual Material enum object. + */ + final Map materialMap; + + public MaterialTypeAdapter() { + this.materialMap = new HashMap<>(); + + // Put in current values. + Arrays.stream(Material.values()).forEach(mat -> this.materialMap.put(mat.name(), mat)); + + // Put in renamed material values. + this.materialMap.put("GRASS", Material.SHORT_GRASS); + } + + @Override + public Material read(JsonReader input) throws IOException + { + if (JsonToken.NULL.equals(input.peek())) { + input.nextNull(); + return null; + } + + return this.materialMap.get(input.nextString().toUpperCase()); + } + + @Override + public void write(JsonWriter output, Material enumValue) throws IOException { + output.value(enumValue != null ? enumValue.name() : null); + } +} +