From 52a4e348cb94def3f69a63d007e0da0ef74b97ed Mon Sep 17 00:00:00 2001 From: SamB440 Date: Wed, 1 Jan 2020 20:50:04 +0000 Subject: [PATCH] Gson testing --- .../islandearth/rpgregions/RPGRegions.java | 10 +++- .../rpgregions/gson/InterfaceAdapter.java | 49 +++++++++++++++++++ .../managers/RPGRegionsManagers.java | 24 ++++++++- .../data/region/ConfiguredRegion.java | 14 ++++++ .../rpgregions/rewards/DiscoveryReward.java | 14 ++---- .../rpgregions/rewards/ExperienceReward.java | 10 ++-- .../rpgregions/rewards/ItemReward.java | 10 ++-- 7 files changed, 112 insertions(+), 19 deletions(-) create mode 100644 src/main/java/net/islandearth/rpgregions/gson/InterfaceAdapter.java diff --git a/src/main/java/net/islandearth/rpgregions/RPGRegions.java b/src/main/java/net/islandearth/rpgregions/RPGRegions.java index 0baba6f..fd8eeff 100644 --- a/src/main/java/net/islandearth/rpgregions/RPGRegions.java +++ b/src/main/java/net/islandearth/rpgregions/RPGRegions.java @@ -7,10 +7,14 @@ import net.islandearth.languagy.language.LanguagyImplementation; import net.islandearth.languagy.language.LanguagyPluginHook; import net.islandearth.languagy.language.Translator; import net.islandearth.rpgregions.api.RPGRegionsAPI; +import net.islandearth.rpgregions.gson.InterfaceAdapter; import net.islandearth.rpgregions.listener.ConnectionListener; import net.islandearth.rpgregions.listener.MoveListener; import net.islandearth.rpgregions.listener.RegionListener; import net.islandearth.rpgregions.managers.RPGRegionsManagers; +import net.islandearth.rpgregions.rewards.DiscoveryReward; +import net.islandearth.rpgregions.rewards.ExperienceReward; +import net.islandearth.rpgregions.rewards.ItemReward; import net.islandearth.rpgregions.translation.Translations; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -122,6 +126,10 @@ public final class RPGRegions extends JavaPlugin implements RPGRegionsAPI, Langu } public Gson getGson() { - return new GsonBuilder().setPrettyPrinting().serializeNulls().create(); + return new GsonBuilder() + .registerTypeAdapter(DiscoveryReward.class, new InterfaceAdapter()) + .registerTypeAdapter(DiscoveryReward.class, new InterfaceAdapter()) + .setPrettyPrinting() + .serializeNulls().create(); } } diff --git a/src/main/java/net/islandearth/rpgregions/gson/InterfaceAdapter.java b/src/main/java/net/islandearth/rpgregions/gson/InterfaceAdapter.java new file mode 100644 index 0000000..7fd1cfd --- /dev/null +++ b/src/main/java/net/islandearth/rpgregions/gson/InterfaceAdapter.java @@ -0,0 +1,49 @@ +package net.islandearth.rpgregions.gson; + +import com.google.gson.*; + +import java.lang.reflect.Type; + +public class InterfaceAdapter + implements JsonSerializer, JsonDeserializer { + + @Override + public final JsonElement serialize(final T object, final Type interfaceType, final JsonSerializationContext context) { + final JsonObject member = new JsonObject(); + + member.addProperty("type", object.getClass().getName()); + + member.add("data", context.serialize(object)); + + return member; + } + + @Override + public final T deserialize(final JsonElement elem, final Type interfaceType, final JsonDeserializationContext context) + throws JsonParseException { + final JsonObject member = (JsonObject) elem; + final JsonElement typeString = get(member, "type"); + final JsonElement data = get(member, "data"); + final Type actualType = typeForName(typeString); + + return context.deserialize(data, actualType); + } + + private Type typeForName(final JsonElement typeElem) { + try { + return Class.forName(typeElem.getAsString()); + } catch (ClassNotFoundException e) { + throw new JsonParseException(e); + } + } + + private JsonElement get(final JsonObject wrapper, final String memberName) { + final JsonElement elem = wrapper.get(memberName); + + if (elem == null) { + throw new JsonParseException( + "no '" + memberName + "' member found in json file."); + } + return elem; + } +} diff --git a/src/main/java/net/islandearth/rpgregions/managers/RPGRegionsManagers.java b/src/main/java/net/islandearth/rpgregions/managers/RPGRegionsManagers.java index 8e7f9b4..1310c3b 100644 --- a/src/main/java/net/islandearth/rpgregions/managers/RPGRegionsManagers.java +++ b/src/main/java/net/islandearth/rpgregions/managers/RPGRegionsManagers.java @@ -1,5 +1,6 @@ package net.islandearth.rpgregions.managers; +import com.google.gson.Gson; import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.api.integrations.IntegrationManager; import net.islandearth.rpgregions.api.integrations.IntegrationType; @@ -7,9 +8,15 @@ import net.islandearth.rpgregions.managers.data.RPGRegionsCache; import net.islandearth.rpgregions.managers.data.StorageManager; import net.islandearth.rpgregions.managers.data.StorageType; import net.islandearth.rpgregions.managers.data.region.ConfiguredRegion; +import net.islandearth.rpgregions.rewards.DiscoveryReward; +import net.islandearth.rpgregions.rewards.ExperienceReward; import java.io.File; import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; public class RPGRegionsManagers { @@ -33,12 +40,27 @@ public class RPGRegionsManagers { File folder = new File(plugin.getDataFolder() + "/regions/"); if (!folder.exists()) folder.mkdirs(); + List rewards = new ArrayList<>(); + rewards.add(new ExperienceReward(10)); + ConfiguredRegion configuredRegion = new ConfiguredRegion("docks-1", rewards); + regionsCache.addConfiguredRegion(configuredRegion); + File file1 = new File(plugin.getDataFolder() + "/regions/" + "docks-1" + ".json"); + if (!file1.exists()) { + try { + file1.createNewFile(); + Gson gson = plugin.getGson(); + gson.toJson(configuredRegion, new FileWriter(file1)); + } catch (IOException e) { + e.printStackTrace(); + } + } + for (File file : folder.listFiles()) { // Exclude non-json files if (file.getName().endsWith(".json")) { try { ConfiguredRegion region = plugin.getGson().fromJson(new FileReader(file), ConfiguredRegion.class); - plugin.getManagers().getRegionsCache().addConfiguredRegion(region); + regionsCache.addConfiguredRegion(region); } catch (Exception e) { plugin.getLogger().severe("Error loading region config " + file.getName() + ":"); e.printStackTrace(); diff --git a/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java b/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java index 4cd96d4..b707d74 100644 --- a/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java +++ b/src/main/java/net/islandearth/rpgregions/managers/data/region/ConfiguredRegion.java @@ -1,7 +1,11 @@ package net.islandearth.rpgregions.managers.data.region; +import net.islandearth.rpgregions.RPGRegions; import net.islandearth.rpgregions.rewards.DiscoveryReward; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.util.List; public class ConfiguredRegion { @@ -9,6 +13,11 @@ public class ConfiguredRegion { private String id; private List rewards; + public ConfiguredRegion(String id, List rewards) { + this.id = id; + this.rewards = rewards; + } + public void setId(String id) { this.id = id; } @@ -24,4 +33,9 @@ public class ConfiguredRegion { public List getRewards() { return rewards; } + + public void save(RPGRegions plugin) throws IOException { + File file = new File(plugin.getDataFolder() + "/regions/" + this.id + ".yml"); + plugin.getGson().toJson(this, new FileWriter(file)); + } } diff --git a/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java b/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java index fabbb5d..fa8982c 100644 --- a/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java +++ b/src/main/java/net/islandearth/rpgregions/rewards/DiscoveryReward.java @@ -4,15 +4,7 @@ import org.bukkit.entity.Player; public abstract class DiscoveryReward { - private final String region; - - DiscoveryReward(String region) { - this.region = region; - } - - public String getRegion() { - return region; - } - - abstract void award(Player player); + public abstract void award(Player player); + + public abstract String getName(); } diff --git a/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java b/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java index c61aad0..826e2a0 100644 --- a/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java +++ b/src/main/java/net/islandearth/rpgregions/rewards/ExperienceReward.java @@ -6,13 +6,17 @@ public class ExperienceReward extends DiscoveryReward { private final int xp; - ExperienceReward(String region, int xp) { - super(region); + public ExperienceReward(int xp) { this.xp = xp; } @Override - void award(Player player) { + public void award(Player player) { player.giveExp(xp); } + + @Override + public String getName() { + return "Experience"; + } } diff --git a/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java b/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java index fcc482a..cb2be2c 100644 --- a/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java +++ b/src/main/java/net/islandearth/rpgregions/rewards/ItemReward.java @@ -7,15 +7,19 @@ public class ItemReward extends DiscoveryReward { private final ItemStack item; - ItemReward(String region, ItemStack item) { - super(region); + public ItemReward(ItemStack item) { this.item = item; } @Override - void award(Player player) { + public void award(Player player) { player.getInventory().addItem(item).forEach((pos, item) -> { player.getLocation().getWorld().dropItemNaturally(player.getLocation(), item); }); } + + @Override + public String getName() { + return "Item"; + } }