From 812594783e6fd001d5035c93c1ba905bc97066ce Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 5 Feb 2018 11:35:50 -0800 Subject: [PATCH] Made Adapter its own annotation. --- .../us/tastybento/bskyblock/Settings.java | 6 +- .../api/configuration/ConfigEntry.java | 3 +- .../flatfile/FlatFileDatabaseHandler.java | 62 +++++++++++-------- .../database/mysql/MySQLDatabaseHandler.java | 40 ++++++------ .../bskyblock/database/objects/Island.java | 4 +- .../database/objects/adapters/Adapter.java | 19 ++++++ .../objects/adapters/AdapterInterface.java} | 4 +- .../{ => adapters}/FlagSerializer.java | 5 +- .../adapters/PotionEffectListAdapter.java} | 4 +- 9 files changed, 91 insertions(+), 56 deletions(-) create mode 100644 src/main/java/us/tastybento/bskyblock/database/objects/adapters/Adapter.java rename src/main/java/us/tastybento/bskyblock/{api/configuration/Adapter.java => database/objects/adapters/AdapterInterface.java} (78%) rename src/main/java/us/tastybento/bskyblock/database/objects/{ => adapters}/FlagSerializer.java (89%) rename src/main/java/us/tastybento/bskyblock/{api/configuration/PotionEffectListAdpater.java => database/objects/adapters/PotionEffectListAdapter.java} (83%) diff --git a/src/main/java/us/tastybento/bskyblock/Settings.java b/src/main/java/us/tastybento/bskyblock/Settings.java index b6efe91e7..de86476da 100644 --- a/src/main/java/us/tastybento/bskyblock/Settings.java +++ b/src/main/java/us/tastybento/bskyblock/Settings.java @@ -14,10 +14,11 @@ import org.bukkit.potion.PotionEffectType; import us.tastybento.bskyblock.Constants.GameType; import us.tastybento.bskyblock.api.configuration.ConfigEntry; import us.tastybento.bskyblock.api.configuration.ISettings; -import us.tastybento.bskyblock.api.configuration.PotionEffectListAdpater; import us.tastybento.bskyblock.api.configuration.StoreAt; import us.tastybento.bskyblock.api.flags.Flag; import us.tastybento.bskyblock.database.BSBDatabase.DatabaseType; +import us.tastybento.bskyblock.database.objects.adapters.Adapter; +import us.tastybento.bskyblock.database.objects.adapters.PotionEffectListAdapter; /** * All the plugin settings are here @@ -237,7 +238,8 @@ public class Settings implements ISettings { @ConfigEntry(path = "acid.damage.rain", specificTo = GameType.ACIDISLAND) private int acidRainDamage = 1; - @ConfigEntry(path = "acid.damage.effects", specificTo = GameType.ACIDISLAND, adapter = PotionEffectListAdpater.class) + @ConfigEntry(path = "acid.damage.effects", specificTo = GameType.ACIDISLAND) + @Adapter(PotionEffectListAdapter.class) private List acidEffects = new ArrayList<>(Arrays.asList(PotionEffectType.CONFUSION, PotionEffectType.SLOW)); /* SCHEMATICS */ diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java b/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java index 38137d22a..4f814a20a 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java +++ b/src/main/java/us/tastybento/bskyblock/api/configuration/ConfigEntry.java @@ -16,12 +16,11 @@ import us.tastybento.bskyblock.Constants.GameType; @Target(ElementType.FIELD) public @interface ConfigEntry { - String path() default ""; + String path(); String since() default "1.0"; boolean overrideOnChange() default false; boolean experimental() default false; boolean needsReset() default false; GameType specificTo() default GameType.BOTH; - Class adapter() default Adapter.class; } \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java index 9695a7468..3fae3482b 100644 --- a/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/flatfile/FlatFileDatabaseHandler.java @@ -26,11 +26,12 @@ import org.bukkit.plugin.Plugin; import us.tastybento.bskyblock.Constants; import us.tastybento.bskyblock.Constants.GameType; -import us.tastybento.bskyblock.api.configuration.Adapter; import us.tastybento.bskyblock.api.configuration.ConfigEntry; import us.tastybento.bskyblock.api.configuration.StoreAt; import us.tastybento.bskyblock.database.DatabaseConnecter; import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; +import us.tastybento.bskyblock.database.objects.adapters.Adapter; +import us.tastybento.bskyblock.database.objects.adapters.AdapterInterface; import us.tastybento.bskyblock.util.Util; /** @@ -179,21 +180,24 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { continue; } // TODO: Add handling of other ConfigEntry elements - if (!configEntry.adapter().equals(Adapter.class)) { - // A conversion adapter has been defined - Object value = config.get(storageLocation); - method.invoke(instance, ((Adapter)configEntry.adapter().newInstance()).serialize(value)); - if (DEBUG) { - plugin.getLogger().info("DEBUG: value = " + value); - plugin.getLogger().info("DEBUG: property type = " + propertyDescriptor.getPropertyType()); - plugin.getLogger().info("DEBUG: " + value.getClass()); - } - if (value != null && !value.getClass().equals(MemorySection.class)) { - method.invoke(instance, deserialize(value,propertyDescriptor.getPropertyType())); - } - // We are done here - continue; + } + Adapter adapterNotation = field.getAnnotation(Adapter.class); + if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { + if (DEBUG) + plugin.getLogger().info("DEBUG: there is an adapter"); + // A conversion adapter has been defined + Object value = config.get(storageLocation); + method.invoke(instance, ((AdapterInterface)adapterNotation.value().newInstance()).serialize(value)); + if (DEBUG) { + plugin.getLogger().info("DEBUG: value = " + value); + plugin.getLogger().info("DEBUG: property type = " + propertyDescriptor.getPropertyType()); + plugin.getLogger().info("DEBUG: " + value.getClass()); } + if (value != null && !value.getClass().equals(MemorySection.class)) { + method.invoke(instance, deserialize(value,propertyDescriptor.getPropertyType())); + } + // We are done here + continue; } // Look in the YAML Config to see if this field exists (it should) @@ -352,18 +356,24 @@ public class FlatFileDatabaseHandler extends AbstractDatabaseHandler { storageLocation = configEntry.path(); } // TODO: add in game-specific saving - if (!configEntry.adapter().equals(Adapter.class)) { - // A conversion adapter has been defined - try { - config.set(storageLocation, ((Adapter)configEntry.adapter().newInstance()).deserialize(value)); - } catch (InstantiationException e) { - e.printStackTrace(); - } - // We are done here - continue fields; - } - + } + + Adapter adapterNotation = field.getAnnotation(Adapter.class); + if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { + if (DEBUG) + plugin.getLogger().info("DEBUG: there is an adapter"); + // A conversion adapter has been defined + // A conversion adapter has been defined + try { + config.set(storageLocation, ((AdapterInterface)adapterNotation.value().newInstance()).deserialize(value)); + } catch (InstantiationException e) { + e.printStackTrace(); + } + // We are done here + continue fields; + } + //plugin.getLogger().info("DEBUG: property desc = " + propertyDescriptor.getPropertyType().getTypeName()); // Depending on the vale type, it'll need serializing differenty // Check if this field is the mandatory UniqueId field. This is used to identify this instantiation of the class diff --git a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java index c5631e76a..1603d05d2 100644 --- a/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java +++ b/src/main/java/us/tastybento/bskyblock/database/mysql/MySQLDatabaseHandler.java @@ -32,10 +32,11 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.plugin.Plugin; -import us.tastybento.bskyblock.api.configuration.Adapter; import us.tastybento.bskyblock.api.configuration.ConfigEntry; import us.tastybento.bskyblock.database.DatabaseConnecter; import us.tastybento.bskyblock.database.managers.AbstractDatabaseHandler; +import us.tastybento.bskyblock.database.objects.adapters.Adapter; +import us.tastybento.bskyblock.database.objects.adapters.AdapterInterface; import us.tastybento.bskyblock.util.Util; /** @@ -423,14 +424,15 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { if (configEntry != null) { if (DEBUG) plugin.getLogger().info("DEBUG: there is a configEntry"); - if (!configEntry.adapter().equals(Adapter.class)) { - if (DEBUG) - plugin.getLogger().info("DEBUG: there is an adapter"); - // A conversion adapter has been defined - value = ((Adapter)configEntry.adapter().newInstance()).deserialize(value); - if (DEBUG) - plugin.getLogger().info("DEBUG: value now after deserialization = " + value); - } + } + Adapter adapterNotation = field.getAnnotation(Adapter.class); + if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { + if (DEBUG) + plugin.getLogger().info("DEBUG: there is an adapter"); + // A conversion adapter has been defined + value = ((AdapterInterface)adapterNotation.value().newInstance()).deserialize(value); + if (DEBUG) + plugin.getLogger().info("DEBUG: value now after deserialization = " + value); } // Create set and map table inserts if this is a Collection if (propertyDescriptor.getPropertyType().equals(Set.class) || @@ -485,7 +487,7 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { Entry en = (Entry) it.next(); if (DEBUG) plugin.getLogger().info("DEBUG: entry ket = " + en.getKey()); - + // Get the key and serialize it Object key = serialize(en.getKey(), en.getKey().getClass()); if (DEBUG) @@ -789,14 +791,16 @@ public class MySQLDatabaseHandler extends AbstractDatabaseHandler { if (configEntry != null) { if (DEBUG) plugin.getLogger().info("DEBUG: there is a configEntry"); - if (!configEntry.adapter().equals(Adapter.class)) { - if (DEBUG) - plugin.getLogger().info("DEBUG: there is an adapter"); - // A conversion adapter has been defined - value = ((Adapter)configEntry.adapter().newInstance()).serialize(value); - if (DEBUG) - plugin.getLogger().info("DEBUG: value now after serialization = " + value); - } + // TODO: add config entry handling + } + Adapter adapterNotation = field.getAnnotation(Adapter.class); + if (adapterNotation != null && AdapterInterface.class.isAssignableFrom(adapterNotation.value())) { + if (DEBUG) + plugin.getLogger().info("DEBUG: there is an adapter"); + // A conversion adapter has been defined + value = ((AdapterInterface)adapterNotation.value().newInstance()).serialize(value); + if (DEBUG) + plugin.getLogger().info("DEBUG: value now after deserialization = " + value); } if (DEBUG) { plugin.getLogger().info("DEBUG: invoking method " + method.getName()); diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java index eae614cdb..b16961a81 100755 --- a/src/main/java/us/tastybento/bskyblock/database/objects/Island.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/Island.java @@ -23,6 +23,8 @@ import us.tastybento.bskyblock.api.events.island.IslandEvent.IslandLockEvent; import us.tastybento.bskyblock.api.events.island.IslandEvent.IslandUnlockEvent; import us.tastybento.bskyblock.api.events.island.IslandEvent.Reason; import us.tastybento.bskyblock.api.flags.Flag; +import us.tastybento.bskyblock.database.objects.adapters.Adapter; +import us.tastybento.bskyblock.database.objects.adapters.FlagSerializer; import us.tastybento.bskyblock.managers.RanksManager; import us.tastybento.bskyblock.util.Util; @@ -80,7 +82,7 @@ public class Island implements DataObject { private boolean purgeProtected = false; //// Protection flags //// - @ConfigEntry(adapter = FlagSerializer.class) + @Adapter(FlagSerializer.class) private HashMap flags = new HashMap<>(); private int levelHandicap; diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/adapters/Adapter.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/Adapter.java new file mode 100644 index 000000000..da5ec607d --- /dev/null +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/Adapter.java @@ -0,0 +1,19 @@ +package us.tastybento.bskyblock.database.objects.adapters; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * + * Denotes which adapter should be used to serialize or deserialize this field + * @author tastybento + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Adapter { + + Class value(); + +} \ No newline at end of file diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/AdapterInterface.java similarity index 78% rename from src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java rename to src/main/java/us/tastybento/bskyblock/database/objects/adapters/AdapterInterface.java index d87f26531..ac1187081 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/Adapter.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/AdapterInterface.java @@ -1,4 +1,4 @@ -package us.tastybento.bskyblock.api.configuration; +package us.tastybento.bskyblock.database.objects.adapters; /** @@ -8,7 +8,7 @@ package us.tastybento.bskyblock.api.configuration; * @param * @param */ -public interface Adapter { +public interface AdapterInterface { /** * Serialize object diff --git a/src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java similarity index 89% rename from src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java rename to src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java index c3b2db36f..e4ddb3d48 100644 --- a/src/main/java/us/tastybento/bskyblock/database/objects/FlagSerializer.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/FlagSerializer.java @@ -1,4 +1,4 @@ -package us.tastybento.bskyblock.database.objects; +package us.tastybento.bskyblock.database.objects.adapters; import java.util.HashMap; import java.util.Map.Entry; @@ -7,7 +7,6 @@ import org.bukkit.Bukkit; import org.bukkit.configuration.MemorySection; import us.tastybento.bskyblock.BSkyBlock; -import us.tastybento.bskyblock.api.configuration.Adapter; import us.tastybento.bskyblock.api.flags.Flag; /** @@ -17,7 +16,7 @@ import us.tastybento.bskyblock.api.flags.Flag; * @author tastybento * */ -public class FlagSerializer implements Adapter, HashMap> { +public class FlagSerializer implements AdapterInterface, HashMap> { @Override public HashMap serialize(Object object) { diff --git a/src/main/java/us/tastybento/bskyblock/api/configuration/PotionEffectListAdpater.java b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/PotionEffectListAdapter.java similarity index 83% rename from src/main/java/us/tastybento/bskyblock/api/configuration/PotionEffectListAdpater.java rename to src/main/java/us/tastybento/bskyblock/database/objects/adapters/PotionEffectListAdapter.java index 2abe0e836..c1a2d3f3a 100644 --- a/src/main/java/us/tastybento/bskyblock/api/configuration/PotionEffectListAdpater.java +++ b/src/main/java/us/tastybento/bskyblock/database/objects/adapters/PotionEffectListAdapter.java @@ -1,11 +1,11 @@ -package us.tastybento.bskyblock.api.configuration; +package us.tastybento.bskyblock.database.objects.adapters; import java.util.ArrayList; import java.util.List; import org.bukkit.potion.PotionEffectType; -public class PotionEffectListAdpater implements Adapter, List> { +public class PotionEffectListAdapter implements AdapterInterface, List> { @SuppressWarnings("unchecked") @Override