diff --git a/core/src/main/java/net/techcable/techutils/config/ConfigFieldWrapper.java b/core/src/main/java/net/techcable/techutils/config/ConfigFieldWrapper.java new file mode 100644 index 0000000..b113377 --- /dev/null +++ b/core/src/main/java/net/techcable/techutils/config/ConfigFieldWrapper.java @@ -0,0 +1,39 @@ +package net.techcable.techutils.config; + +import java.lang.reflect.Field; + +public class ConfigField { + public ConfigField(Field field) { + this.field = field; + } + private final Field field; + + public String getName() { + if (!getAnnotation().value().isEmpty()) { + return getAnnotation().value(); + } + return field.getName(); + } + + public void setValue(Object instance, Object value) { + try { + field.setAccessible(true); + field.set(instance, value); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public Object getValue(Object instance) { + try { + field.setAccessible(true); + field.get(instance); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public ConfigOption getAnnotation() { + return field.getAnnotation(ConfigOption.class); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/techcable/techutils/config/ConfigOption.java b/core/src/main/java/net/techcable/techutils/config/ConfigOption.java new file mode 100644 index 0000000..67ae4d1 --- /dev/null +++ b/core/src/main/java/net/techcable/techutils/config/ConfigOption.java @@ -0,0 +1,5 @@ +package net.techcable.techutils.config; + +public @interface ConfigOption { + public String value() default ""; +} \ No newline at end of file diff --git a/core/src/main/java/net/techcable/techutils/config/ConfigSerializer.java b/core/src/main/java/net/techcable/techutils/config/ConfigSerializer.java new file mode 100644 index 0000000..d10a7d6 --- /dev/null +++ b/core/src/main/java/net/techcable/techutils/config/ConfigSerializer.java @@ -0,0 +1,96 @@ +package net.techcable.techutils.config; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.configuration.file.YamlConfiguration; + +public class ConfigSerializer { + + public ConfigSerializer(Object toSerialise, URL original, File configFile) { + this.toSerialise = toSerialise; + this.original = original; + this.configFile = configFile; + + List rawFields = new ArrayList<>(); + for (Field field : toSerialise.getClass().getDeclaredFields()) { + if (field.getAnnotation(ConfigOption.class) != null) fields.add(field); + } + this.fields = new ConfigField[rawFields.size()]; + for (int i = 0; i < fields.length; i++) { + fields[i] = new ConfigField(rawFields.get(i)); + } + } + + private final Object toSerialise; + private final URL original; + @Getter + private final File configFile; + + private YamlConfiguration config; + private ConfigField[] fields; + + public void save() { + if (!configFile.exists()) copy(original, configFile); + if (config != null) config = new YamlConfiguration(); + for (ConfigField field : fields) { + saveField(field); + } + try { + config.save(configFile); + } catch (Exception e) {} + } + + public void load() { + if (!configFile.exists()) copy(original, configFile); + if (config != null) config = new YamlConfiguration(); + for (ConfigField field : fields) { + loadField(field); + } + try { + config.load(configFile); + } catch (Exception e) {} + } + + public void saveField(ConfigField field) { + try { + config.set(field.getName(), field.getValue(toSerialise)); + } catch (Exception e) {} + } + + public void loadField(ConfigField field) { + try { + Object value = config.get(field.getName(), null); + if (value == null) return; + field.setValue(toSerialise, value); + } catch (Exception e) {} + } + + public static void copy(URL from, File to) { + BufferedReader in = null; + BufferedWriter out = null; + try { + to.createNewFile(); + char[] buffer = new char[100]; + int i = 0; + in = new BufferedReader(new InputStreamReader(in.openStream())); + out = new BufferedWriter(new FileWriter(to)); + while(true) { + int num = in.read(buffer); + if (num < 1) break; + out.write(buffer, 0, num); + } + } catch (IOException ex) { + throw new RuntimeException(ex); + } finally { + if (in != null) in.close(); + if (out != null) out.close(); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/techcable/techutils/config/Configuration.java b/core/src/main/java/net/techcable/techutils/config/Configuration.java new file mode 100644 index 0000000..4a93280 --- /dev/null +++ b/core/src/main/java/net/techcable/techutils/config/Configuration.java @@ -0,0 +1,21 @@ +package net.techcbale.techutils.config; + +public abstract class Configuration { + private ConfigurationSerializer serializer; + public Configuration(String resourceName, File configFile) { + URL from = getClass().getResource(resourceName); + this.serializer = new ConfigurationSerializer(from, configFile, this); + } + + public File getFile() { + return serializer.getFile(); + } + + public void save() { + serializer.save(); + } + + public void load() { + serializer.load(); + } +} \ No newline at end of file diff --git a/core/src/main/java/techcable/minecraft/techutils/TechPlugin.java b/core/src/main/java/techcable/minecraft/techutils/TechPlugin.java index f82833a..54cffc7 100644 --- a/core/src/main/java/techcable/minecraft/techutils/TechPlugin.java +++ b/core/src/main/java/techcable/minecraft/techutils/TechPlugin.java @@ -1,7 +1,10 @@ package techcable.minecraft.techutils; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; +import net.techcable.techutils.config.Configuration; import net.techcable.minecraft.techutils.offlineplayer.OfflinePlayers; import net.techcable.minecraft.techutils.offlineplayer.PlayerData; @@ -32,6 +35,32 @@ public static PlayerData getPlayerData(UUID player) { public PlayerData getPlayerData(OfflinePlayer player) { return OfflinePlayers.getData(player); } + public Class getConfigClass(String id) { + if (id == null) { //Main + return getMainConfigClass(); + } + return null; + } + protected abstract Class getMainConfigClass(); + + private HashMap configMap = new HashMap<>(); + public Configuration getConfig(String id) { + if (configMap.containsKey(id)) return configMap.get(id); + Class configClass = getConfigClass(id); + if (configClass == null) return null; //Not supported + try { + Configuration config = configClass.newInstance(); + configMap.put(id, config); + return config; + } catch (Exception ex) { + return null; //Must have no args constructor + } + } + + public Configuration getMainConfig() { + return getConfig(null); + } + public String getMetadataBase() { return "techutils." + getName() + "."; }