From c8067257f95d0b4681dd8f9fbad39d0b27bcedc5 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Mon, 8 Apr 2019 12:46:47 +0200 Subject: [PATCH] Implemented config & doc pregen #59 The doc gen works --- ...1) (com.github.TBMCPlugins.ButtonCore).iml | 2 +- .../core/component/channel/Channel.java | 2 +- .../lib/architecture/ButtonPlugin.java | 1 + .../lib/architecture/Component.java | 1 + .../lib/architecture/ConfigData.java | 2 ++ .../lib/architecture/IHaveConfig.java | 30 +++++++++++++++++-- .../buttonproc/ConfigProcessor.java | 26 ++++++++++++++-- 7 files changed, 58 insertions(+), 6 deletions(-) diff --git a/ButtonCore/ButtonCore (1) (com.github.TBMCPlugins.ButtonCore).iml b/ButtonCore/ButtonCore (1) (com.github.TBMCPlugins.ButtonCore).iml index 7c2fa83..3c34336 100644 --- a/ButtonCore/ButtonCore (1) (com.github.TBMCPlugins.ButtonCore).iml +++ b/ButtonCore/ButtonCore (1) (com.github.TBMCPlugins.ButtonCore).iml @@ -21,7 +21,7 @@ - + diff --git a/ButtonCore/src/main/java/buttondevteam/core/component/channel/Channel.java b/ButtonCore/src/main/java/buttondevteam/core/component/channel/Channel.java index c643880..120615c 100755 --- a/ButtonCore/src/main/java/buttondevteam/core/component/channel/Channel.java +++ b/ButtonCore/src/main/java/buttondevteam/core/component/channel/Channel.java @@ -53,7 +53,7 @@ public class Channel { */ public final ConfigData DisplayName() { throwGame(); - return component.getConfig().getData(ID + ".displayName", defDisplayName); + return component.getConfig().getData(ID + ".displayName", defDisplayName); //TODO: Use config map } public final ConfigData Color() { diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ButtonPlugin.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ButtonPlugin.java index 25df8af..10e5c49 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ButtonPlugin.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ButtonPlugin.java @@ -42,6 +42,7 @@ public abstract class ButtonPlugin extends JavaPlugin { @Override public final void onEnable() { loadConfig(); + IHaveConfig.pregenConfig(this, iConfig); try { pluginEnable(); } catch (Exception e) { diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java index 4d2c9cf..435c71d 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java @@ -85,6 +85,7 @@ public abstract class Component { } component.plugin = plugin; updateConfig(plugin, component); + IHaveConfig.pregenConfig(component, component.config); component.register(plugin); components.put(component.getClass(), component); if (plugin instanceof ButtonPlugin) diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java index 6374db0..c3d8baa 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java @@ -4,6 +4,7 @@ import buttondevteam.core.MainPlugin; import buttondevteam.lib.ThorpeUtils; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.RequiredArgsConstructor; import org.bukkit.Bukkit; import org.bukkit.configuration.Configuration; @@ -29,6 +30,7 @@ public class ConfigData { * May be null for testing */ private final ConfigurationSection config; + @Getter private final String path; private final T def; private final Object primitiveDef; diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/IHaveConfig.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/IHaveConfig.java index 241e4f5..15a5d24 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/IHaveConfig.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/IHaveConfig.java @@ -1,10 +1,10 @@ package buttondevteam.lib.architecture; +import buttondevteam.core.MainPlugin; +import buttondevteam.lib.TBMCCoreAPI; import lombok.Getter; import lombok.val; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitTask; import java.util.HashMap; import java.util.function.Function; @@ -117,4 +117,30 @@ public final class IHaveConfig { } return (ConfigData) data; } + + /** + * Generates the config YAML. + * + * @param obj The object which has config methods + * @param config The config that holds the values + */ + public static void pregenConfig(Object obj, IHaveConfig config) { + val ms = obj.getClass().getDeclaredMethods(); + for (val m : ms) { + if (!m.getReturnType().getName().equals(ConfigData.class.getName())) continue; + try { + if (m.getParameterCount() == 0) { + m.setAccessible(true); + ConfigData c = (ConfigData) m.invoke(obj); + if (!c.getPath().equals(m.getName())) + MainPlugin.Instance.getLogger().warning("Config name does not match: " + c.getPath() + " instead of " + m.getName()); //TODO: Set it here + c.get(); //Saves the default value if needed - also checks validity + } else if (m.getParameterCount() == 1) { + //TODO: Config map + } + } catch (Exception e) { + TBMCCoreAPI.SendException("Failed to pregenerate " + m.getName() + " for " + obj + "!", e); + } + } + } } diff --git a/ButtonProcessor/src/main/java/buttondevteam/buttonproc/ConfigProcessor.java b/ButtonProcessor/src/main/java/buttondevteam/buttonproc/ConfigProcessor.java index f244553..8895fa9 100644 --- a/ButtonProcessor/src/main/java/buttondevteam/buttonproc/ConfigProcessor.java +++ b/ButtonProcessor/src/main/java/buttondevteam/buttonproc/ConfigProcessor.java @@ -4,7 +4,11 @@ import org.bukkit.configuration.file.YamlConfiguration; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; import javax.tools.FileObject; import javax.tools.StandardLocation; import java.io.File; @@ -29,11 +33,29 @@ public class ConfigProcessor { public void process(Element targetcl) { if (targetcl.getModifiers().contains(Modifier.ABSTRACT)) return; + final String path = "components." + targetcl.getSimpleName(); + for (Element e : targetcl.getEnclosedElements()) { + /*System.out.println("Element: "+e); + System.out.println("Type: "+e.getClass()+" - "+e.getKind()); + if(e instanceof ExecutableElement) + System.out.println("METHOD!");*/ + if (!(e instanceof ExecutableElement)) continue; + TypeMirror tm = ((ExecutableElement) e).getReturnType(); + if (tm.getKind() != TypeKind.DECLARED) continue; + DeclaredType dt = (DeclaredType) tm; + if (!dt.asElement().getSimpleName().contentEquals("ConfigData")) return; + System.out.println("Config: " + e.getSimpleName()); + System.out.println("Value: " + ((ExecutableElement) e).getDefaultValue()); + String doc = procEnv.getElementUtils().getDocComment(e); + if (doc == null) continue; + System.out.println("DOC: " + doc); + yaml.set(path + "." + e.getSimpleName() + "_doc", doc); //methodName_doc + } String javadoc = procEnv.getElementUtils().getDocComment(targetcl); if (javadoc == null) return; - System.out.println("JAVADOC"); //TODO: Config methods + System.out.println("JAVADOC"); System.out.println(javadoc); - yaml.set("components." + targetcl.getSimpleName() + "._doc", javadoc); + yaml.set(path + "._doc", javadoc); try { yaml.save(file); } catch (IOException e) {