diff --git a/core/src/main/java/co/aikar/commands/AnnotationLookups.java b/core/src/main/java/co/aikar/commands/AnnotationLookups.java index c6c94de6..89cf4633 100644 --- a/core/src/main/java/co/aikar/commands/AnnotationLookups.java +++ b/core/src/main/java/co/aikar/commands/AnnotationLookups.java @@ -24,6 +24,7 @@ package co.aikar.commands; import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Parameter; @@ -31,147 +32,41 @@ import java.util.regex.Pattern; abstract class AnnotationLookups { - - // - // METHODS - // - - - boolean hasAnnotation(Method method, Class annoClass) { - return getAnnotationValue(method, annoClass, Annotations.NOTHING) != null; + boolean hasAnnotation(AnnotatedElement object, Class annoClass) { + return getAnnotationValue(object, annoClass, Annotations.NOTHING) != null; } - String[] getAnnotationValues(Method method, Class annoClass) { - return getAnnotationValues(method, annoClass, ACFPatterns.PIPE, Annotations.REPLACEMENTS); - } - String[] getAnnotationValues(Method method, Class annoClass, Pattern pattern) { - return getAnnotationValues(method, annoClass, pattern, Annotations.REPLACEMENTS); + boolean hasAnnotation(AnnotatedElement object, Class annoClass, boolean allowEmpty) { + return getAnnotationValue(object, annoClass, Annotations.NOTHING | (allowEmpty ? 0 : Annotations.NO_EMPTY)) != null; } - String[] getAnnotationValues(Method method, Class annoClass, int options) { - return getAnnotationValues(method, annoClass, ACFPatterns.PIPE, options); + String[] getAnnotationValues(AnnotatedElement object, Class annoClass) { + return getAnnotationValues(object, annoClass, ACFPatterns.PIPE, Annotations.REPLACEMENTS); + } + String[] getAnnotationValues(AnnotatedElement object, Class annoClass, Pattern pattern) { + return getAnnotationValues(object, annoClass, pattern, Annotations.REPLACEMENTS); } - String[] getAnnotationValues(Method method, Class annoClass, Pattern pattern, int options) { - String value = getAnnotationValue(method, annoClass, options); + String[] getAnnotationValues(AnnotatedElement object, Class annoClass, int options) { + return getAnnotationValues(object, annoClass, ACFPatterns.PIPE, options); + } + + String[] getAnnotationValues(AnnotatedElement object, Class annoClass, Pattern pattern, int options) { + String value = getAnnotationValue(object, annoClass, options); if (value == null) { return null; } return pattern.split(value); } - String getAnnotationValue(Method method, Class annoClass) { - return getAnnotationValue(method, annoClass, Annotations.REPLACEMENTS); + String getAnnotationValue(AnnotatedElement object, Class annoClass) { + return getAnnotationValue(object, annoClass, Annotations.REPLACEMENTS); } - String getAnnotationValue(Method method, Class annoClass, int options) { - return getValue(method.getAnnotation(annoClass), annoClass, options); + String getAnnotationValue(AnnotatedElement object, Class annoClass, int options) { + return getValue(object.getAnnotation(annoClass), annoClass, options); } - // - // PARAMETERS - // - - - String[] getAnnotationValues(Parameter param, Class annoClass) { - return getAnnotationValues(param, annoClass, ACFPatterns.PIPE, Annotations.REPLACEMENTS); - } - String[] getAnnotationValues(Parameter param, Class annoClass, Pattern pattern) { - return getAnnotationValues(param, annoClass, pattern, Annotations.REPLACEMENTS); - } - - String[] getAnnotationValues(Parameter param, Class annoClass, int options) { - return getAnnotationValues(param, annoClass, ACFPatterns.PIPE, options); - } - String[] getAnnotationValues(Parameter param, Class annoClass, Pattern pattern, int options) { - String value = getAnnotationValue(param, annoClass, options); - if (value == null) { - return null; - } - return pattern.split(value); - } - - boolean hasAnnotation(Parameter param, Class annoClass) { - return getAnnotationValue(param, annoClass, Annotations.NOTHING) != null; - } - - String getAnnotationValue(Parameter param, Class annoClass) { - return getAnnotationValue(param, annoClass, Annotations.REPLACEMENTS); - } - - String getAnnotationValue(Parameter param, Class annoClass, int options) { - return getValue(param.getAnnotation(annoClass), annoClass, options); - } - - // - // FIELDS - // - - String[] getAnnotationValues(Field field, Class annoClass) { - return getAnnotationValues(field, annoClass, ACFPatterns.PIPE, Annotations.REPLACEMENTS); - } - String[] getAnnotationValues(Field field, Class annoClass, Pattern pattern) { - return getAnnotationValues(field, annoClass, pattern, Annotations.REPLACEMENTS); - } - - String[] getAnnotationValues(Field field, Class annoClass, int options) { - return getAnnotationValues(field, annoClass, ACFPatterns.PIPE, options); - } - String[] getAnnotationValues(Field field, Class annoClass, Pattern pattern, int options) { - String value = getAnnotationValue(field, annoClass, options); - if (value == null) { - return null; - } - return pattern.split(value); - } - - boolean hasAnnotation(Field field, Class annoClass) { - return getAnnotationValue(field, annoClass, Annotations.NOTHING) != null; - } - - String getAnnotationValue(Field field, Class annoClass) { - return getAnnotationValue(field, annoClass, Annotations.REPLACEMENTS); - } - - String getAnnotationValue(Field field, Class annoClass, int options) { - return getValue(field.getAnnotation(annoClass), annoClass, options); - } - - // - // CLASSES - // - - - String[] getAnnotationValues(Class clazz, Class annoClass) { - return getAnnotationValues(clazz, annoClass, ACFPatterns.PIPE, Annotations.REPLACEMENTS); - } - - String[] getAnnotationValues(Class clazz, Class annoClass, Pattern pattern) { - return getAnnotationValues(clazz, annoClass, pattern, Annotations.REPLACEMENTS); - } - - String[] getAnnotationValues(Class clazz, Class annoClass, int options) { - return getAnnotationValues(clazz, annoClass, ACFPatterns.PIPE, options); - } - String[] getAnnotationValues(Class clazz, Class annoClass, Pattern pattern, int options) { - String value = getAnnotationValue(clazz, annoClass, options); - if (value == null) { - return null; - } - return pattern.split(value); - } - boolean hasAnnotation(Class clazz, Class annoClass) { - return getAnnotationValue(clazz, annoClass, Annotations.NOTHING) != null; - } - - String getAnnotationValue(Class clazz, Class annoClass) { - return getAnnotationValue(clazz, annoClass, Annotations.REPLACEMENTS); - } - - String getAnnotationValue(Class clazz, Class annoClass, int options) { - return getValue(clazz.getAnnotation(annoClass), annoClass, options); - } - abstract String getValue(Annotation annotation, Class annoClass, int options); } diff --git a/core/src/main/java/co/aikar/commands/BaseCommand.java b/core/src/main/java/co/aikar/commands/BaseCommand.java index 26308606..8ee31c0c 100644 --- a/core/src/main/java/co/aikar/commands/BaseCommand.java +++ b/core/src/main/java/co/aikar/commands/BaseCommand.java @@ -27,6 +27,7 @@ import co.aikar.commands.annotation.CatchAll; import co.aikar.commands.annotation.CatchUnknown; import co.aikar.commands.annotation.CommandAlias; import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Conditions; import co.aikar.commands.annotation.Default; import co.aikar.commands.annotation.HelpCommand; import co.aikar.commands.annotation.PreCommand; @@ -82,6 +83,7 @@ public abstract class BaseCommand { String commandName; String usageMessage; String permission; + String conditions; private ExceptionHandler exceptionHandler = null; CommandOperationContext lastCommandOperationContext; @@ -139,7 +141,8 @@ public abstract class BaseCommand { this.permission = annotations.getAnnotationValue(self, CommandPermission.class, Annotations.REPLACEMENTS); this.description = this.commandName + " commands"; this.usageMessage = "/" + this.commandName; - this.parentSubcommand = getParentSubcommand(this.getClass()); + this.parentSubcommand = getParentSubcommand(self); + this.conditions = annotations.getAnnotationValue(self, Conditions.class, Annotations.REPLACEMENTS | Annotations.NO_EMPTY); registerSubcommands(); diff --git a/core/src/main/java/co/aikar/commands/CommandConditions.java b/core/src/main/java/co/aikar/commands/CommandConditions.java index ae5f106b..2aa86843 100644 --- a/core/src/main/java/co/aikar/commands/CommandConditions.java +++ b/core/src/main/java/co/aikar/commands/CommandConditions.java @@ -54,21 +54,15 @@ public class CommandConditions < return this.paramConditions.put(clazz, id.toLowerCase(), handler); } - void validateConditions(CEC cec, Object value) throws InvalidCommandArgument { - String conditions = manager.getAnnotations().getAnnotationValue(cec.getParam(), Conditions.class); - validateConditions(conditions, cec, value); - } - void validateConditions(CommandOperationContext context) throws InvalidCommandArgument { RegisteredCommand cmd = context.getRegisteredCommand(); - String conditions = manager.getAnnotations().getAnnotationValue(cmd.method, Conditions.class); - validateConditions(conditions, context); + + validateConditions(cmd.conditions, context); validateConditions(cmd.scope, context); } private void validateConditions(BaseCommand scope, CommandOperationContext operationContext) throws InvalidCommandArgument { - String conditions = manager.getAnnotations().getAnnotationValue(scope.getClass(), Conditions.class); - validateConditions(conditions, operationContext); + validateConditions(scope.conditions, operationContext); if (scope.parentCommand != null) { validateConditions(scope.parentCommand, operationContext); @@ -100,7 +94,8 @@ public class CommandConditions < } } - private void validateConditions(String conditions, CEC execContext, Object value) throws InvalidCommandArgument { + void validateConditions(CEC execContext, Object value) throws InvalidCommandArgument { + String conditions = execContext.getCommandParameter().getConditions(); if (conditions == null) { return; } diff --git a/core/src/main/java/co/aikar/commands/CommandContexts.java b/core/src/main/java/co/aikar/commands/CommandContexts.java index bc4e9150..e5bf60f3 100644 --- a/core/src/main/java/co/aikar/commands/CommandContexts.java +++ b/core/src/main/java/co/aikar/commands/CommandContexts.java @@ -184,7 +184,7 @@ public class CommandContexts > { final BaseCommand scope; - final String command; final Method method; - final String prefSubCommand; final CommandParameter[] parameters; - final String syntaxText; - final String helpText; + final CommandManager manager; + final List registeredSubcommands = new ArrayList<>(); + + String command; + String prefSubCommand; + String syntaxText; + String helpText; + String permission; + String complete; + String conditions; - private final String permission; - final String complete; final int requiredResolvers; final int optionalResolvers; - final List registeredSubcommands = new ArrayList<>(); - final CommandManager manager; + public String helpSearchTags; RegisteredCommand(BaseCommand scope, String command, Method method, String prefSubCommand) { this.scope = scope; @@ -70,13 +75,15 @@ public class RegisteredCommand