diff --git a/core/src/main/java/co/aikar/commands/AnnotationLookups.java b/core/src/main/java/co/aikar/commands/AnnotationLookups.java new file mode 100644 index 00000000..c6c94de6 --- /dev/null +++ b/core/src/main/java/co/aikar/commands/AnnotationLookups.java @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2016-2018 Daniel Ennis (Aikar) - MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package co.aikar.commands; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.regex.Pattern; + +abstract class AnnotationLookups { + + + // + // METHODS + // + + + boolean hasAnnotation(Method method, Class annoClass) { + return getAnnotationValue(method, 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); + } + + String[] getAnnotationValues(Method method, Class annoClass, int options) { + return getAnnotationValues(method, annoClass, ACFPatterns.PIPE, options); + } + + String[] getAnnotationValues(Method method, Class annoClass, Pattern pattern, int options) { + String value = getAnnotationValue(method, 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(Method method, Class annoClass, int options) { + return getValue(method.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/Annotations.java b/core/src/main/java/co/aikar/commands/Annotations.java index fe19860c..3e8dcdfc 100644 --- a/core/src/main/java/co/aikar/commands/Annotations.java +++ b/core/src/main/java/co/aikar/commands/Annotations.java @@ -24,24 +24,13 @@ package co.aikar.commands; import java.lang.annotation.Annotation; -import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.lang.reflect.Parameter; import java.util.IdentityHashMap; -import java.util.Locale; import java.util.Map; -import java.util.regex.Pattern; @SuppressWarnings("TypeParameterExplicitlyExtendsObject") -class Annotations < - IT, - I extends CommandIssuer, - FT, - MF extends MessageFormatter, - CEC extends CommandExecutionContext, - CC extends ConditionContext - > { +class Annotations extends AnnotationLookups { public static int NOTHING = 0; public static int REPLACEMENTS = 1; @@ -49,163 +38,15 @@ class Annotations < public static int UPPERCASE = 1 << 2; public static int NO_EMPTY = 1 << 3; - private final CommandManager manager; + private final M manager; private Map, Method> valueMethods = new IdentityHashMap<>(); - Annotations(CommandManager manager) { + Annotations(M manager) { this.manager = manager; } - - // - // METHODS - // - - - boolean hasAnnotation(Method method, Class annoClass) { - return getAnnotationValue(method, annoClass, NOTHING) != null; - } - - String[] getAnnotationValues(Method method, Class annoClass) { - return getAnnotationValues(method, annoClass, ACFPatterns.PIPE, REPLACEMENTS); - } - String[] getAnnotationValues(Method method, Class annoClass, Pattern pattern) { - return getAnnotationValues(method, annoClass, pattern, REPLACEMENTS); - } - - String[] getAnnotationValues(Method method, Class annoClass, int options) { - return getAnnotationValues(method, annoClass, ACFPatterns.PIPE, options); - } - - String[] getAnnotationValues(Method method, Class annoClass, Pattern pattern, int options) { - String value = getAnnotationValue(method, annoClass, options); - if (value == null) { - return null; - } - return pattern.split(value); - } - - String getAnnotationValue(Method method, Class annoClass) { - return getAnnotationValue(method, annoClass, REPLACEMENTS); - } - - String getAnnotationValue(Method method, Class annoClass, int options) { - return getValue(method.getAnnotation(annoClass), annoClass, options); - } - - - // - // PARAMETERS - // - - - String[] getAnnotationValues(Parameter param, Class annoClass) { - return getAnnotationValues(param, annoClass, ACFPatterns.PIPE, REPLACEMENTS); - } - String[] getAnnotationValues(Parameter param, Class annoClass, Pattern pattern) { - return getAnnotationValues(param, annoClass, pattern, 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, NOTHING) != null; - } - - String getAnnotationValue(Parameter param, Class annoClass) { - return getAnnotationValue(param, annoClass, 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, REPLACEMENTS); - } - String[] getAnnotationValues(Field field, Class annoClass, Pattern pattern) { - return getAnnotationValues(field, annoClass, pattern, 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, NOTHING) != null; - } - - String getAnnotationValue(Field field, Class annoClass) { - return getAnnotationValue(field, annoClass, 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, REPLACEMENTS); - } - - String[] getAnnotationValues(Class clazz, Class annoClass, Pattern pattern) { - return getAnnotationValues(clazz, annoClass, pattern, 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, NOTHING) != null; - } - - String getAnnotationValue(Class clazz, Class annoClass) { - return getAnnotationValue(clazz, annoClass, REPLACEMENTS); - } - - String getAnnotationValue(Class clazz, Class annoClass, int options) { - return getValue(clazz.getAnnotation(annoClass), annoClass, options); - } - - - // - // BASE - // - - - private String getValue(Annotation annotation, Class annoClass, int options) { + String getValue(Annotation annotation, Class annoClass, int options) { if (annotation == null) { // TODO: Alias support return null;