From 7d6908d146df12b968c933997b48545adb6636e9 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Thu, 12 Aug 2021 22:54:04 +0200 Subject: [PATCH] Simplify and document --- .../volmit/iris/util/decree/DecreeNode.java | 36 +++++--- .../iris/util/decree/DecreeParameter.java | 27 ++++-- .../util/decree/DecreeParameterHandler.java | 88 +++++++++++++------ .../volmit/iris/util/decree/DecreeSystem.java | 6 +- .../com/volmit/iris/util/decree/EXAMPLE.java | 12 +-- .../util/decree/{ => annotations}/Decree.java | 17 +++- .../util/decree/{ => annotations}/Param.java | 16 +++- .../DecreeParsingException.java | 2 +- .../DecreeWhichException.java | 4 +- .../util/decree/handlers/ByteHandler.java | 3 +- .../util/decree/handlers/DoubleHandler.java | 3 +- .../util/decree/handlers/FloatHandler.java | 3 +- .../util/decree/handlers/IntegerHandler.java | 4 +- .../util/decree/handlers/LongHandler.java | 3 +- .../util/decree/handlers/PlayerHandler.java | 8 +- .../util/decree/handlers/ShortHandler.java | 3 +- .../util/decree/handlers/StringHandler.java | 3 +- .../util/decree/handlers/WorldHandler.java | 19 ++-- 18 files changed, 167 insertions(+), 90 deletions(-) rename src/main/java/com/volmit/iris/util/decree/{ => annotations}/Decree.java (71%) rename src/main/java/com/volmit/iris/util/decree/{ => annotations}/Param.java (76%) rename src/main/java/com/volmit/iris/util/decree/{ => exceptions}/DecreeParsingException.java (94%) rename src/main/java/com/volmit/iris/util/decree/{ => exceptions}/DecreeWhichException.java (88%) diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeNode.java b/src/main/java/com/volmit/iris/util/decree/DecreeNode.java index 02b1b440a..bcddd94dd 100644 --- a/src/main/java/com/volmit/iris/util/decree/DecreeNode.java +++ b/src/main/java/com/volmit/iris/util/decree/DecreeNode.java @@ -19,9 +19,12 @@ package com.volmit.iris.util.decree; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.decree.annotations.Decree; +import com.volmit.iris.util.decree.annotations.Param; import java.lang.reflect.Method; import java.lang.reflect.Parameter; +import java.util.Arrays; public class DecreeNode { private final Method method; @@ -31,13 +34,21 @@ public class DecreeNode { this.method = method; } + /** + * Get the parameters of this decree node + * @return The list of parameters if ALL are annotated by @{@link Param}, else null + */ public KList getParameters() { KList p = new KList<>(); for(Parameter i : method.getParameters()) { - p.add(new DecreeParameter(i)); + if (i.getDeclaredAnnotation(Param.class) != null) { + p.add(new DecreeParameter(i)); + } else { + return null; + } } return p; @@ -46,7 +57,7 @@ public class DecreeNode { public String getName() { Decree p = method.getDeclaredAnnotation(Decree.class); - return p == null || p.name().equals("methodName") ? method.getName() : p.name(); + return p == null || p.name().equals(Decree.METHOD_NAME) ? method.getName() : p.name(); } public DecreeOrigin getOrigin() @@ -58,7 +69,7 @@ public class DecreeNode { public String getDescription() { Decree p = method.getDeclaredAnnotation(Decree.class); - return p != null ? p.description() : "No Description Provided"; + return p != null ? p.description() : Decree.DEFAULT_DESCRIPTION; } public KList getAliases() @@ -66,17 +77,18 @@ public class DecreeNode { Decree p = method.getDeclaredAnnotation(Decree.class); KList d = new KList<>(); - if(p != null) - { - for(String i : p.aliases()) - { - if(i.isEmpty()) - { - continue; - } + if (p == null || Arrays.equals(p.aliases(), new String[]{Decree.NO_ALIASES})){ + return d; + } - d.add(i); + for(String i : p.aliases()) + { + if(i.isEmpty()) + { + continue; } + + d.add(i); } return d; diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java b/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java index 47dffbd2d..29717b477 100644 --- a/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java +++ b/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java @@ -19,8 +19,10 @@ package com.volmit.iris.util.decree; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.decree.annotations.Param; import java.lang.reflect.Parameter; +import java.util.Arrays; public class DecreeParameter { private final Parameter parameter; @@ -52,22 +54,29 @@ public class DecreeParameter { return p.name().isEmpty() ? parameter.getName() : p.name(); } + public boolean isRequired() + { + Param p = parameter.getDeclaredAnnotation(Param.class); + return p == null || p.value().equals(Param.REQUIRED); + } + public KList getAliases() { Param p = parameter.getDeclaredAnnotation(Param.class); - KList d= new KList<>(); + KList d = new KList<>(); - if(p != null) + if (p == null || Arrays.equals(p.aliases(), new String[]{Param.NO_ALIAS})){ + return d; + } + + for(String i : p.aliases()) { - for(String i : p.aliases()) + if(i.isEmpty()) { - if(i.isEmpty()) - { - continue; - } - - d.add(i); + continue; } + + d.add(i); } return d; diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeParameterHandler.java b/src/main/java/com/volmit/iris/util/decree/DecreeParameterHandler.java index e7f789254..7929f0163 100644 --- a/src/main/java/com/volmit/iris/util/decree/DecreeParameterHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/DecreeParameterHandler.java @@ -19,52 +19,84 @@ package com.volmit.iris.util.decree; import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KSet; - -import java.util.Locale; +import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.exceptions.DecreeWhichException; +import org.jetbrains.annotations.NotNull; public interface DecreeParameterHandler { + /** + * Should return the possible values for this type + * @return Possibilities for this type. + */ KList getPossibilities(); + /** + * Converting the type back to a string (inverse of the {@link #parse(String) parse} method) + * @param t The input of the designated type to convert to a String + * @return The resulting string + */ String toString(T t); + /** + * Should parse a String into the designated type + * @param in The string to parse + * @return The value extracted from the string, of the designated type + * @throws DecreeParsingException Thrown when the parsing fails (ex: "oop" translated to an integer throws this) + * @throws DecreeWhichException Thrown when multiple results are possible + */ T parse(String in) throws DecreeParsingException, DecreeWhichException; - boolean supports(Class type); + /** + * Returns whether a certain type is supported by this handler
+ * By default, this checks if the {@link #parse(String) parse} method returns the corresponding type. + * Hence, this should only be overwritten if multiple types, outside the designated one, are supported. + * @param type The type to check + * @return True if supported, false if not + */ + default boolean supports(Class type){ + try { + if (this.getClass().getMethod("parse", String.class).getReturnType().equals(type)){ + return true; + } + } catch (NoSuchMethodException ignored){} + return false; + } + /** + * The possible entries for the inputted string (support for autocomplete on partial entries) + * @param input The inputted string to check against + * @return A {@link KList} of possibilities + */ default KList getPossibilities(String input) { - KList p = getPossibilities(); - KList m = new KList<>(); + input = input.trim(); + KList possible = getPossibilities(); + KList matches = new KList<>(); - if(p != null) + if (possible == null || possible.isEmpty()){ + return matches; + } + + if (input.isEmpty()) { - if(input.trim().isEmpty()) - { - return getPossibilities(); - } + return getPossibilities(); + } - KList f = p.convert(this::toString); + KList converted = possible.convert(v -> toString(v).trim()); - for(int i = 0; i < f.size(); i++) + for(int i = 0; i < converted.size(); i++) + { + String g = converted.get(i); + // if + // G == I or + // I in G or + // G in I + if(g.equalsIgnoreCase(input) || g.toLowerCase().contains(input.toLowerCase()) || input.toLowerCase().contains(g.toLowerCase())) { - String g = f.get(i); - if(g.equalsIgnoreCase(input)) - { - m.add(p.get(i)); - } - } - - for(int i = 0; i < f.size(); i++) - { - String g = f.get(i); - if(g.toLowerCase().contains(input.toLowerCase()) || input.toLowerCase().contains(g.toLowerCase())) - { - m.addIfMissing(p.get(i)); - } + matches.add(possible.get(i)); } } - return m; + return matches; } } diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java b/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java index 35b141865..75732f025 100644 --- a/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java +++ b/src/main/java/com/volmit/iris/util/decree/DecreeSystem.java @@ -24,6 +24,11 @@ import com.volmit.iris.util.collection.KList; public class DecreeSystem { private static final KList> handlers = Iris.initialize("com.volmit.iris.util.decree.handlers", null).convert((i) -> (DecreeParameterHandler) i); + /** + * Get the handler for the specified type + * @param type The type to handle + * @return The corresponding {@link DecreeParameterHandler}, or null + */ public static DecreeParameterHandler handle(Class type) { for(DecreeParameterHandler i : handlers) @@ -33,7 +38,6 @@ public class DecreeSystem { return i; } } - return null; } } diff --git a/src/main/java/com/volmit/iris/util/decree/EXAMPLE.java b/src/main/java/com/volmit/iris/util/decree/EXAMPLE.java index bd65c3919..a06e00a91 100644 --- a/src/main/java/com/volmit/iris/util/decree/EXAMPLE.java +++ b/src/main/java/com/volmit/iris/util/decree/EXAMPLE.java @@ -18,6 +18,8 @@ package com.volmit.iris.util.decree; +import com.volmit.iris.util.decree.annotations.Decree; +import com.volmit.iris.util.decree.annotations.Param; import org.bukkit.entity.Player; public class EXAMPLE @@ -26,18 +28,10 @@ public class EXAMPLE public void kick( @Param(name = "player", description = "The Player to kick from the server", aliases = "p") Player player, - @Param(name = "reason", description = "A reason to kick the player for", aliases = "r") + @Param(name = "reason", description = "A reason to kick the player for", value = "No reason!", aliases = "r") String reason) { player.kickPlayer(reason); DecreeContext.get().sendMessage("Kicked " + player.getName()); } - - @Decree - public void kick( - @Param(name = "player", description = "The Player to kick from the server", aliases = "p") - Player player) - { - kick(player, "No Reason!"); - } } diff --git a/src/main/java/com/volmit/iris/util/decree/Decree.java b/src/main/java/com/volmit/iris/util/decree/annotations/Decree.java similarity index 71% rename from src/main/java/com/volmit/iris/util/decree/Decree.java rename to src/main/java/com/volmit/iris/util/decree/annotations/Decree.java index 2b6a73ccb..de68e7fa4 100644 --- a/src/main/java/com/volmit/iris/util/decree/Decree.java +++ b/src/main/java/com/volmit/iris/util/decree/annotations/Decree.java @@ -16,18 +16,27 @@ * along with this program. If not, see . */ -package com.volmit.iris.util.decree; +package com.volmit.iris.util.decree.annotations; + +import com.volmit.iris.util.decree.DecreeOrigin; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface Decree { - String name() default "methodName"; - String description() default "No Description Provided"; + String METHOD_NAME = "Default Method Name"; + + String DEFAULT_DESCRIPTION = "No Description Provided"; + + String NO_ALIASES = "No Aliases"; + + String name() default METHOD_NAME; + + String description() default DEFAULT_DESCRIPTION; DecreeOrigin origin() default DecreeOrigin.BOTH; - String[] aliases() default ""; + String[] aliases() default {NO_ALIASES}; } diff --git a/src/main/java/com/volmit/iris/util/decree/Param.java b/src/main/java/com/volmit/iris/util/decree/annotations/Param.java similarity index 76% rename from src/main/java/com/volmit/iris/util/decree/Param.java rename to src/main/java/com/volmit/iris/util/decree/annotations/Param.java index 9b3b5f532..3e481618e 100644 --- a/src/main/java/com/volmit/iris/util/decree/Param.java +++ b/src/main/java/com/volmit/iris/util/decree/annotations/Param.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.util.decree; +package com.volmit.iris.util.decree.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -26,7 +26,17 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) public @interface Param { + String REQUIRED = "REQUIRED"; + + String NO_ALIAS = "No Aliases Provided"; + + String DEFAULT_DESCRIPTION = "No Description Provided"; + String name(); - String description() default "No Description Provided"; - String[] aliases() default ""; + + String description() default DEFAULT_DESCRIPTION; + + String value() default REQUIRED; + + String[] aliases() default {NO_ALIAS}; } diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeParsingException.java b/src/main/java/com/volmit/iris/util/decree/exceptions/DecreeParsingException.java similarity index 94% rename from src/main/java/com/volmit/iris/util/decree/DecreeParsingException.java rename to src/main/java/com/volmit/iris/util/decree/exceptions/DecreeParsingException.java index 4971809b4..279f2cd77 100644 --- a/src/main/java/com/volmit/iris/util/decree/DecreeParsingException.java +++ b/src/main/java/com/volmit/iris/util/decree/exceptions/DecreeParsingException.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.util.decree; +package com.volmit.iris.util.decree.exceptions; public class DecreeParsingException extends Exception{ public DecreeParsingException(String message) { diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeWhichException.java b/src/main/java/com/volmit/iris/util/decree/exceptions/DecreeWhichException.java similarity index 88% rename from src/main/java/com/volmit/iris/util/decree/DecreeWhichException.java rename to src/main/java/com/volmit/iris/util/decree/exceptions/DecreeWhichException.java index 9ec282769..d20f8d5e2 100644 --- a/src/main/java/com/volmit/iris/util/decree/DecreeWhichException.java +++ b/src/main/java/com/volmit/iris/util/decree/exceptions/DecreeWhichException.java @@ -16,10 +16,10 @@ * along with this program. If not, see . */ -package com.volmit.iris.util.decree; +package com.volmit.iris.util.decree.exceptions; public class DecreeWhichException extends Exception{ public DecreeWhichException() { - super(); + super("More than one option for the entered input"); } } diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/ByteHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/ByteHandler.java index 448f0c603..04d70e4ef 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/ByteHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/ByteHandler.java @@ -20,7 +20,8 @@ package com.volmit.iris.util.decree.handlers; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.DecreeParsingException; +import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import org.jetbrains.annotations.NotNull; public class ByteHandler implements DecreeParameterHandler { @Override diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/DoubleHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/DoubleHandler.java index 947482fc0..5896230cc 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/DoubleHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/DoubleHandler.java @@ -20,7 +20,8 @@ package com.volmit.iris.util.decree.handlers; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.DecreeParsingException; +import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import org.jetbrains.annotations.NotNull; public class DoubleHandler implements DecreeParameterHandler { @Override diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/FloatHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/FloatHandler.java index 93d21ea19..92f2f2ef6 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/FloatHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/FloatHandler.java @@ -20,7 +20,8 @@ package com.volmit.iris.util.decree.handlers; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.DecreeParsingException; +import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import org.jetbrains.annotations.NotNull; public class FloatHandler implements DecreeParameterHandler { @Override diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/IntegerHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/IntegerHandler.java index c5329b4ba..dc314ffa1 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/IntegerHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/IntegerHandler.java @@ -20,8 +20,8 @@ package com.volmit.iris.util.decree.handlers; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.DecreeParsingException; -import net.kyori.adventure.text.minimessage.parser.ParsingException; +import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import org.jetbrains.annotations.NotNull; public class IntegerHandler implements DecreeParameterHandler { @Override diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/LongHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/LongHandler.java index 0efc70992..fda30fe4f 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/LongHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/LongHandler.java @@ -20,7 +20,8 @@ package com.volmit.iris.util.decree.handlers; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.DecreeParsingException; +import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import org.jetbrains.annotations.NotNull; public class LongHandler implements DecreeParameterHandler { @Override diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/PlayerHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/PlayerHandler.java index be3f34d51..df59ee495 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/PlayerHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/PlayerHandler.java @@ -20,13 +20,13 @@ package com.volmit.iris.util.decree.handlers; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.DecreeParsingException; -import com.volmit.iris.util.decree.DecreeWhichException; +import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.exceptions.DecreeWhichException; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.stream.Collectors; public class PlayerHandler implements DecreeParameterHandler { @Override @@ -60,7 +60,7 @@ public class PlayerHandler implements DecreeParameterHandler { catch(Throwable e) { - throw new DecreeParsingException("Unable to find Player \"" + in + "\""); + throw new DecreeParsingException("Unable to find Player \"" + in + "\" because of an uncaught exception: " + e); } } diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/ShortHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/ShortHandler.java index de364981d..464ce7aaf 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/ShortHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/ShortHandler.java @@ -20,7 +20,8 @@ package com.volmit.iris.util.decree.handlers; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.DecreeParsingException; +import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import org.jetbrains.annotations.NotNull; public class ShortHandler implements DecreeParameterHandler { @Override diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/StringHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/StringHandler.java index 6c481dd1d..781de5a23 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/StringHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/StringHandler.java @@ -20,7 +20,8 @@ package com.volmit.iris.util.decree.handlers; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.DecreeParsingException; +import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import org.jetbrains.annotations.NotNull; /** * Abstraction can sometimes breed stupidity diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/WorldHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/WorldHandler.java index 0b26f4e45..ecab5bfd2 100644 --- a/src/main/java/com/volmit/iris/util/decree/handlers/WorldHandler.java +++ b/src/main/java/com/volmit/iris/util/decree/handlers/WorldHandler.java @@ -20,22 +20,21 @@ package com.volmit.iris.util.decree.handlers; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.DecreeParameterHandler; -import com.volmit.iris.util.decree.DecreeParsingException; -import com.volmit.iris.util.decree.DecreeWhichException; +import com.volmit.iris.util.decree.exceptions.DecreeParsingException; +import com.volmit.iris.util.decree.exceptions.DecreeWhichException; import org.bukkit.Bukkit; import org.bukkit.World; - -import java.util.ArrayList; +import org.jetbrains.annotations.NotNull; public class WorldHandler implements DecreeParameterHandler { @Override public KList getPossibilities() { - return new KList<>(new ArrayList<>(Bukkit.getWorlds())); + return new KList<>(Bukkit.getWorlds()); } @Override - public String toString(World player) { - return player.getName(); + public String toString(World world) { + return world.getName(); } @Override @@ -56,10 +55,12 @@ public class WorldHandler implements DecreeParameterHandler { return options.get(0); } - + catch(DecreeParsingException e){ + throw e; + } catch(Throwable e) { - throw new DecreeParsingException("Unable to find World \"" + in + "\""); + throw new DecreeParsingException("Unable to find World \"" + in + "\" because of an uncaught exception: " + e); } }