From 138259412f02be9742e5f7cd8cf0c6c4c4df6711 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 8 Mar 2019 22:17:49 +0100 Subject: [PATCH] Config and command fixes/improvements Default value for config maps added Added support for array types in configs and handling null in setting Added support for TextArg annotation Allowing to override the command path Fixed optional argument detection in the annotation processor ("Optional" --> "OptionalArg") --- .../buttondevteam/lib/architecture/Component.java | 14 ++++++++++++-- .../buttondevteam/lib/architecture/ConfigData.java | 6 +++++- .../main/java/buttondevteam/lib/chat/Command2.java | 2 +- .../java/buttondevteam/lib/chat/ICommand2.java | 2 +- .../buttondevteam/buttonproc/ButtonProcessor.java | 2 +- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java index b6c880b..3090a07 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/Component.java @@ -17,6 +17,7 @@ import org.bukkit.plugin.java.JavaPlugin; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; import java.util.stream.Collectors; /** @@ -227,14 +228,23 @@ public abstract class Component { /** * Returns a map of configs that are under the given key. * @param key The key to use + * @param defaultProvider A mapping between config paths and config generators * @return A map containing configs */ - protected Map getConfigMap(String key) { + protected Map getConfigMap(String key, Map> defaultProvider) { val c=getConfig().getConfig(); var cs=c.getConfigurationSection(key); if(cs==null) cs=c.createSection(key); - return cs.getValues(false).entrySet().stream().filter(e->e.getValue() instanceof ConfigurationSection) + val res = cs.getValues(false).entrySet().stream().filter(e -> e.getValue() instanceof ConfigurationSection) .collect(Collectors.toMap(Map.Entry::getKey, kv -> new IHaveConfig((ConfigurationSection) kv.getValue()))); + if (res.size() == 0) { + for (val entry : defaultProvider.entrySet()) { + val conf = new IHaveConfig(cs.createSection(entry.getKey())); + entry.getValue().accept(conf); + res.put(entry.getKey(), conf); + } + } + return res; } private String getClassName() { diff --git a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java index 1a3a11f..8cff0f9 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/architecture/ConfigData.java @@ -5,6 +5,8 @@ import lombok.RequiredArgsConstructor; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; +import java.lang.reflect.Array; +import java.util.List; import java.util.Objects; import java.util.function.Function; @@ -74,12 +76,14 @@ public class ConfigData { //TODO: Save after a while else if (def instanceof Double) val = ((Number) val).doubleValue(); } + if (val instanceof List && def.getClass().isArray()) + val = ((List) val).toArray((T[]) Array.newInstance(def.getClass().getComponentType(), 0)); return (T) val; } public void set(T value) { Object val; - if (setter != null) + if (setter != null && value != null) val = setter.apply(value); else val = value; if (config != null) diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/Command2.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/Command2.java index c6c0de0..8327314 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/Command2.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/Command2.java @@ -130,7 +130,7 @@ public abstract class Command2 } } j = commandline.indexOf(' ', j + 1); //End index - if (j == -1) //Last parameter + if (j == -1 || paramArr[i1].isAnnotationPresent(TextArg.class)) //Last parameter j = commandline.length(); String param = commandline.substring(pj, j); if (cl == String.class) { diff --git a/ButtonCore/src/main/java/buttondevteam/lib/chat/ICommand2.java b/ButtonCore/src/main/java/buttondevteam/lib/chat/ICommand2.java index 781efe4..dba5664 100644 --- a/ButtonCore/src/main/java/buttondevteam/lib/chat/ICommand2.java +++ b/ButtonCore/src/main/java/buttondevteam/lib/chat/ICommand2.java @@ -59,7 +59,7 @@ public abstract class ICommand2 { * * @return The command path, which is the command class name by default (removing any "command" from it) - Change via the {@link CommandClass} annotation */ - public final String getCommandPath() { + public String getCommandPath() { return path; } diff --git a/ButtonProcessor/src/main/java/buttondevteam/buttonproc/ButtonProcessor.java b/ButtonProcessor/src/main/java/buttondevteam/buttonproc/ButtonProcessor.java index f7bb7fe..1fda004 100755 --- a/ButtonProcessor/src/main/java/buttondevteam/buttonproc/ButtonProcessor.java +++ b/ButtonProcessor/src/main/java/buttondevteam/buttonproc/ButtonProcessor.java @@ -78,7 +78,7 @@ public class ButtonProcessor extends AbstractProcessor { cs.set("params", ((ExecutableElement) targetcl).getParameters().stream().skip(1).map(p -> { //String tn=p.asType().toString(); //return tn.substring(tn.lastIndexOf('.')+1)+" "+p.getSimpleName(); - boolean optional = p.getAnnotationMirrors().stream().anyMatch(am -> am.getAnnotationType().toString().endsWith("Optional")); + boolean optional = p.getAnnotationMirrors().stream().anyMatch(am -> am.getAnnotationType().toString().endsWith("OptionalArg")); if (optional) return "[" + p.getSimpleName() + "]"; return "<" + p.getSimpleName() + ">";