From 11beca2c1129a02ec25b8d5469d26f9984cea080 Mon Sep 17 00:00:00 2001 From: Nikolaos Grammatikos Date: Thu, 25 May 2017 20:31:58 +0100 Subject: [PATCH 1/2] Update for Spigot API v1.11.2-R0.1-SNAPSHOT and Java 8. --- .gitignore | 331 ++++++---- .idea/.name | 1 + .idea/compiler.xml | 16 + .idea/vcs.xml | 6 + pom.xml | 160 ++--- .../se/ranzdo/bukkit/methodcommand/Arg.java | 53 +- .../bukkit/methodcommand/ArgumentHandler.java | 318 ++++----- .../methodcommand/ArgumentVariable.java | 2 +- .../methodcommand/ArgumentVerifier.java | 5 +- .../bukkit/methodcommand/Arguments.java | 179 +++-- .../ranzdo/bukkit/methodcommand/Command.java | 53 +- .../bukkit/methodcommand/CommandArgument.java | 193 +++--- .../bukkit/methodcommand/CommandError.java | 48 +- .../bukkit/methodcommand/CommandHandler.java | 493 +++++++------- .../bukkit/methodcommand/CommandUtil.java | 91 +-- .../methodcommand/ExecutableArgument.java | 2 +- .../se/ranzdo/bukkit/methodcommand/Flag.java | 74 +-- .../ranzdo/bukkit/methodcommand/FlagArg.java | 2 +- .../bukkit/methodcommand/FlagArgument.java | 65 +- .../se/ranzdo/bukkit/methodcommand/Flags.java | 11 +- .../bukkit/methodcommand/HelpHandler.java | 5 +- .../methodcommand/InvalidVerifyArgument.java | 8 +- .../methodcommand/PermissionHandler.java | 2 +- .../bukkit/methodcommand/ReflectionUtil.java | 18 +- .../RegisterCommandMethodException.java | 11 +- .../methodcommand/RegisteredCommand.java | 610 +++++++++--------- .../bukkit/methodcommand/RootCommand.java | 38 +- .../bukkit/methodcommand/TransformError.java | 8 +- .../methodcommand/VerifierNotRegistered.java | 8 +- .../bukkit/methodcommand/VerifyError.java | 8 +- .../ranzdo/bukkit/methodcommand/Wildcard.java | 2 +- .../methodcommand/WildcardArgument.java | 100 +-- .../handlers/DoubleArgumentHandler.java | 26 +- .../handlers/EntityTypeArgumentHandler.java | 43 +- .../handlers/IntegerArgumentHandler.java | 26 +- .../handlers/MaterialArgumentHandler.java | 55 +- .../handlers/NumberArgumentHandler.java | 119 ++-- .../handlers/PlayerArgumentHandler.java | 43 +- .../handlers/StringArgumentHandler.java | 92 ++- .../handlers/WorldArgumentHandler.java | 45 +- 40 files changed, 1755 insertions(+), 1615 deletions(-) create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/vcs.xml diff --git a/.gitignore b/.gitignore index 0c26c98..47bb979 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,8 @@ -target/ -################# -## Eclipse -################# -*.pydevproject -.project +# Created by https://www.gitignore.io/api/git,java,maven,eclipse,netbeans,java-web,intellij,intellij+iml + +### Eclipse ### + .metadata bin/ tmp/ @@ -13,9 +11,9 @@ tmp/ *.swp *~.nib local.properties -.classpath .settings/ .loadpath +.recommenders # External tool builders .externalToolBuilders/ @@ -23,142 +21,193 @@ local.properties # Locally stored "Eclipse launch configurations" *.launch -# CDT-specific +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) .cproject -# PDT-specific +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) .buildpath +# sbteclipse plugin +.target -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results -[Dd]ebug/ -[Rr]elease/ -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.vspscc -.builds -*.dotCover - -## TODO: If you have NuGet Package Restore enabled, uncomment this -#packages/ - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf - -# Visual Studio profiler -*.psess -*.vsp - -# ReSharper is a .NET coding add-in -_ReSharper* - -# Installshield output folder -[Ee]xpress - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish - -# Others -[Bb]in -[Oo]bj -sql -TestResults -*.Cache -ClientBin -stylecop.* -~$* -*.dbmdl -Generated_Code #added for RIA/Silverlight projects - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML - - - -############ -## Windows -############ - -# Windows image file caches -Thumbs.db - -# Folder config file -Desktop.ini - - -############# -## Python -############# - -*.py[co] - -# Packages -*.egg -*.egg-info -dist -build -eggs -parts -bin -var -sdist -develop-eggs -.installed.cfg - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg - -# Mac crap -.DS_Store +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +# Scala IDE specific (Scala & Java development for Eclipse) +.cache-main +.scala_dependencies +.worksheet + +### Eclipse Patch ### +# Eclipse Core +.project + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +### Git ### +*.orig + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/dictionaries + +# Sensitive or high-churn files: +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.xml +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle: +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ + +# Mongo Explorer plugin: +.idea/**/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Intellij+iml ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff: + +# Sensitive or high-churn files: + +# Gradle: + +# CMake + +# Mongo Explorer plugin: + +## File-based project format: + +## Plugin-specific files: + +# IntelliJ + +# mpeltonen/sbt-idea plugin + +# JIRA plugin + +# Cursive Clojure plugin + +# Crashlytics plugin (for Android Studio and IntelliJ) + +### Intellij+iml Patch ### +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### Java-Web ### +## ignoring target file +target/ + +### Maven ### +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties + +# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) +!/.mvn/wrapper/maven-wrapper.jar + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +# End of https://www.gitignore.io/api/git,java,maven,eclipse,netbeans,java-web,intellij,intellij+iml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..6c1d822 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +methodcommand \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..ad94b52 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index b79a480..19758f3 100644 --- a/pom.xml +++ b/pom.xml @@ -1,77 +1,87 @@ - - 4.0.0 - se.ranzdo.bukkit - methodcommand - 0.2-SNAPSHOT - MethodCommand - - - - bukkit-repo - http://repo.bukkit.org/content/groups/public/ - - - - - - org.bukkit - bukkit - 1.4.5-R0.1 - provided - - + + 4.0.0 + se.ranzdo.bukkit + methodcommand + 1.0.1-SNAPSHOT + MethodCommand + jar - - - - org.apache.maven.plugins - maven-jar-plugin - 2.1 - - - - MethodCommand - - - - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - attach-javadocs - - jar - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.0.2 - - 1.6 - 1.6 - - - - - + + + spigot-repo + https://hub.spigotmc.org/nexus/content/groups/public/ + + true + + + true + + + + + + + org.spigotmc + spigot-api + 1.11.2-R0.1-SNAPSHOT + jar + provided + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + MethodCommand + + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.0.1 + + + attach-sources + + jar + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.4 + + + attach-javadocs + + jar + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + 1.8 + 1.8 + + + + diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/Arg.java b/src/main/java/se/ranzdo/bukkit/methodcommand/Arg.java index 0dbb515..3422b8d 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/Arg.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/Arg.java @@ -8,26 +8,35 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) public @interface Arg { - /**The default argument to process if the argument is not defined by the user. To make it a mandatory argument define it as a space " " (as it is default).

- * When this is combined with the {@link FlagArg} annotation the default argument will only be used if the flag is not defined by the user. Flags can't have default arguments. - */ - String def() default " "; - - /**The description of this argument. - */ - String description() default ""; - - /**The short-name of this argument. This is what will show between the [] when this argument is described to the user. - */ - String name(); - - /**The verifiers is a way to verify the arguments before they even execute the command.

- * For example, if you would want a integer defined by the user but it isen't allowed to be greater than 10 you can use the max verifier.
- * {@code @Arg(name="example", verifiers="max[10]")}
- * If the user input is greater than 10, it will return an predefined error message to the user.

- * You can add multiple verifiers using the | between each.
- * {@code @Arg(name="example", verifiers="min[5]|max[10]")}

- * The verifiers differs from what class the parameter have. To check which verifiers are available, see the {@linkplain ArgumentHandler} for that class. - */ - String verifiers() default ""; + /** + * The default argument to process if the argument is not defined by the user. To make it a mandatory argument + * define it as a space " " (as it is default).

+ * When this is combined with the {@link FlagArg} annotation the default argument will only be used if the + * flag is not defined by the user. Flags can't have default arguments. + */ + String def() default " "; + + /** + * The description of this argument. + */ + String description() default ""; + + /** + * The short-name of this argument. This is what will show between the [] when this argument is described to the + * user. + */ + String name(); + + /** + * The verifiers is a way to verify the arguments before they even execute the command.

+ * For example, if you would want a integer defined by the user but it isen't allowed to be greater than 10 you + * can use the max verifier.
+ * {@code @Arg(name="example", verifiers="max[10]")}
+ * If the user input is greater than 10, it will return an predefined error message to the user.

+ * You can add multiple verifiers using the | between each.
+ * {@code @Arg(name="example", verifiers="min[5]|max[10]")}

+ * The verifiers differs from what class the parameter have. To check which verifiers are available, see the + * {@linkplain ArgumentHandler} for that class. + */ + String verifiers() default ""; } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/ArgumentHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/ArgumentHandler.java index 0984a68..da64246 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/ArgumentHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/ArgumentHandler.java @@ -1,160 +1,172 @@ package se.ranzdo.bukkit.methodcommand; -import java.util.HashMap; +import com.google.common.collect.Maps; +import org.bukkit.command.CommandSender; + import java.util.Map; import java.util.Map.Entry; -import org.bukkit.command.CommandSender; - public abstract class ArgumentHandler { - private final class Variable { - String userFriendlyName; - ArgumentVariable variable; - Variable(String userFriendlyName,ArgumentVariable variable) { - this.userFriendlyName = userFriendlyName; - this.variable = variable; - } - } - - CommandHandler handler; - - private Map> verifiers = new HashMap>(); - private Map vars = new HashMap(); - private Map messageNodes = new HashMap(); - - public ArgumentHandler() { - //Default messages - setMessage("include_error", "[%p] has an invalid value."); - setMessage("exclude_error", "[%p] has an invalid value."); - setMessage("cant_as_console", "You can't do this as console."); - - //Default verifiers - addVerifier("include", new ArgumentVerifier() { - @Override - public void verify(CommandSender sender, CommandArgument argument, String verifyName, String[] verifyArgs, T value, String valueRaw) throws VerifyError { - for(String include : verifyArgs) { - try { - if(transform(sender, argument, include) != value) - throw new VerifyError(argument.getMessage("include_error", valueRaw)); - } catch (TransformError e) { - throw (IllegalArgumentException) new IllegalArgumentException("Could not transform the verify argument "+include).initCause(e); - } - } - } - }); - - addVerifier("exclude", new ArgumentVerifier() { - @Override - public void verify(CommandSender sender, CommandArgument argument, String verifyName, String[] verifyArgs, T value, String valueRaw) throws VerifyError { - for(String exclude : verifyArgs) { - try { - if(transform(sender, argument, exclude) == value) - throw new VerifyError(argument.getMessage("exclude_error", valueRaw)); - } catch (TransformError e) { - throw (IllegalArgumentException) new IllegalArgumentException("Could not transform the verify argument "+exclude).initCause(e); - } - } - } - }); - } - - public final void addVariable(String varName, String userFriendlyName, ArgumentVariable var) { - if(verifierExists(varName)) - throw new IllegalArgumentException("A variable with the name "+varName+" does already exist."); - - vars.put(varName, new Variable(userFriendlyName, var)); - } - - public final void addVerifier(String name, ArgumentVerifier verify) { - if(verifierExists(name)) - throw new IllegalArgumentException("A verifier with the name "+name+" does already exist."); - - verifiers.put(name, verify); - } - - public final CommandHandler getCommandHandler() { - return handler; - } - - public final String getMessage(String node) { - return messageNodes.get(node); - } - - public final ArgumentVariable getVariable(String varName) { - return vars.get(varName) == null ? null : vars.get(varName).variable; - } - - public final String getVariableUserFriendlyName(String varName) { - return vars.get(varName) == null ? null : vars.get(varName).userFriendlyName; - } - - public final ArgumentVerifier getVerifier(String argName) { - return verifiers.get(argName); - } - - final T handle(CommandSender sender, CommandArgument argument, String arg) throws CommandError { - if(arg == null) - return null; - - T transformed; - - if(arg.startsWith("?")) { - String varName = arg.substring(1, arg.length()); - ArgumentVariable var = getVariable(varName); - if(var == null) - throw new IllegalArgumentException("The ArgumentVariable '"+varName+"' is not registered."); - - transformed = var.var(sender, argument, varName); - } - else if(arg.matches("^\\\\+\\?.*$")) { - arg = arg.substring(1, arg.length()); - transformed = transform(sender, argument, arg); - } - else - transformed = transform(sender, argument, arg); - - for(Entry verifier : argument.getVerifyArguments().entrySet()) { - ArgumentVerifier v = this.verifiers.get(verifier.getKey()); - if(v == null) - throw new VerifierNotRegistered(verifier.getKey()); - - v.verify(sender, argument, verifier.getKey(), verifier.getValue(), transformed, arg); - } - - return transformed; - } - - public final void setMessage(String node, String def) { - messageNodes.put(node, def); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("ArgumentHandler -> "+getClass().getName()+"\n"); - sb.append("Set messages: \n"); - for(Entry entry : messageNodes.entrySet()) { - sb.append(entry.getKey()+" = \""+entry.getValue()+"\";\n"); - } - sb.append("\nAvailable verifiers: \n"); - for(Entry> entry : verifiers.entrySet()) { - sb.append(entry.getKey()+" = \""+entry.getValue().getClass().getName()+"\";\n"); - } - sb.append("\nAvailable variables: \n"); - for(Entry entry : vars.entrySet()) { - sb.append(entry.getKey()+" = \""+entry.getValue().userFriendlyName+"\";\n"); - } - - return sb.toString(); - } - - public abstract T transform(CommandSender sender, CommandArgument argument, String value) throws TransformError; - - public final boolean variableExists(String varName) { - return vars.get(varName) != null; - } - - public final boolean verifierExists(String argName) { - return verifiers.get(argName) != null; - } + CommandHandler handler; + private Map> verifiers = Maps.newHashMap(); + private Map vars = Maps.newHashMap(); + private Map messageNodes = Maps.newHashMap(); + + public ArgumentHandler() { + //Default messages + setMessage("include_error", "[%p] has an invalid value."); + setMessage("exclude_error", "[%p] has an invalid value."); + setMessage("cant_as_console", "You can't do this as console."); + + //Default verifiers + addVerifier("include", (sender, argument, verifyName, verifyArgs, value, valueRaw) -> { + for (String include : verifyArgs) { + try { + if (transform(sender, argument, include) != value) throw new VerifyError( + argument.getMessage("include_error", valueRaw) + ); + } catch (TransformError e) { + throw new IllegalArgumentException( + "Could not transform the verify" + " argument " + include, + e + ); + } + } + }); + + addVerifier("exclude", (sender, argument, verifyName, verifyArgs, value, valueRaw) -> { + for (String exclude : verifyArgs) { + try { + if (transform(sender, argument, exclude) == value) throw new VerifyError( + argument.getMessage("exclude_error", valueRaw) + ); + } catch (TransformError e) { + throw new IllegalArgumentException( + "Could not transform the verify" + " argument " + exclude, + e + ); + } + } + }); + } + + public final void addVariable(String varName, String userFriendlyName, ArgumentVariable var) { + if (verifierExists(varName)) throw new IllegalArgumentException( + "A variable with the name " + varName + " does already exist." + ); + + vars.put(varName, new Variable(userFriendlyName, var)); + } + + public final void addVerifier(String name, ArgumentVerifier verify) { + if (verifierExists(name)) throw new IllegalArgumentException( + "A verifier with the name " + name + " does already exist." + ); + + verifiers.put(name, verify); + } + + public final CommandHandler getCommandHandler() { + return handler; + } + + public final String getMessage(String node) { + return messageNodes.get(node); + } + + public final ArgumentVariable getVariable(String varName) { + return vars.get(varName) == null ? null : vars.get(varName).variable; + } + + public final String getVariableUserFriendlyName(String varName) { + return vars.get(varName) == null ? null : vars.get(varName).userFriendlyName; + } + + public final ArgumentVerifier getVerifier(String argName) { + return verifiers.get(argName); + } + + final T handle(CommandSender sender, CommandArgument argument, String arg) throws CommandError { + if (arg == null) { + return null; + } + + T transformed; + + if (arg.startsWith("?")) { + String varName = arg.substring(1, arg.length()); + ArgumentVariable var = getVariable(varName); + + if (var == null) throw new IllegalArgumentException( + "The ArgumentVariable '" + varName + "' is not registered." + ); + + transformed = var.var(sender, argument, varName); + } else if (arg.matches("^\\\\+\\?.*$")) { + arg = arg.substring(1, arg.length()); + transformed = transform(sender, argument, arg); + } else { + transformed = transform(sender, argument, arg); + } + + for (Entry verifier : argument.getVerifyArguments().entrySet()) { + ArgumentVerifier v = this.verifiers.get(verifier.getKey()); + if (v == null) { + throw new VerifierNotRegistered(verifier.getKey()); + } + + v.verify(sender, argument, verifier.getKey(), verifier.getValue(), transformed, arg); + } + + return transformed; + } + + public final void setMessage(String node, String def) { + messageNodes.put(node, def); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("ArgumentHandler -> ").append(getClass().getName()).append("\n"); + sb.append("Set messages: \n"); + + for (Entry entry : messageNodes.entrySet()) { + sb.append(entry.getKey()).append(" = \"").append(entry.getValue()).append("\";\n"); + } + + sb.append("\nAvailable verifiers: \n"); + + for (Entry> entry : verifiers.entrySet()) { + sb.append(entry.getKey()).append(" = \"").append(entry.getValue().getClass().getName()).append("\";\n"); + } + + sb.append("\nAvailable variables: \n"); + + for (Entry entry : vars.entrySet()) { + sb.append(entry.getKey()).append(" = \"").append(entry.getValue().userFriendlyName).append("\";\n"); + } + + return sb.toString(); + } + + public abstract T transform(CommandSender sender, CommandArgument argument, String value) throws TransformError; + + public final boolean variableExists(String varName) { + return vars.get(varName) != null; + } + + public final boolean verifierExists(String argName) { + return verifiers.get(argName) != null; + } + + private final class Variable { + String userFriendlyName; + ArgumentVariable variable; + + Variable(String userFriendlyName, ArgumentVariable variable) { + this.userFriendlyName = userFriendlyName; + this.variable = variable; + } + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/ArgumentVariable.java b/src/main/java/se/ranzdo/bukkit/methodcommand/ArgumentVariable.java index 1dedae1..f46976f 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/ArgumentVariable.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/ArgumentVariable.java @@ -3,5 +3,5 @@ import org.bukkit.command.CommandSender; public interface ArgumentVariable { - public T var(CommandSender sender, CommandArgument argument, String varName) throws CommandError; + T var(CommandSender sender, CommandArgument argument, String varName) throws CommandError; } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/ArgumentVerifier.java b/src/main/java/se/ranzdo/bukkit/methodcommand/ArgumentVerifier.java index 7e9b4cb..7ef3a12 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/ArgumentVerifier.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/ArgumentVerifier.java @@ -3,5 +3,8 @@ import org.bukkit.command.CommandSender; public interface ArgumentVerifier { - public void verify(CommandSender sender, CommandArgument argument, String verifyName, String[] verifyArgs, T value, String valueRaw) throws VerifyError; + void verify(CommandSender sender, CommandArgument argument, String verifyName, + String[] verifyArgs, + T value, + String valueRaw) throws VerifyError; } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/Arguments.java b/src/main/java/se/ranzdo/bukkit/methodcommand/Arguments.java index abc4810..aabdb10 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/Arguments.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/Arguments.java @@ -1,99 +1,96 @@ package se.ranzdo.bukkit.methodcommand; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + import java.util.List; import java.util.Map; import java.util.Map.Entry; public class Arguments { - private List arguments; - private int argCounter = 0; - - private Map> flags = new HashMap>(); - private Map flagCounter = new HashMap(); - - public Arguments(String[] args, Map flags) throws CommandError { - List largs = new ArrayList(Arrays.asList(args)); - //Find the flags - for(Entry entry : flags.entrySet()) { - Flag flag = entry.getValue(); - - int flagIndex = largs.indexOf("-"+flag.getIdentifier()); - if(flagIndex == -1) - continue; - - largs.remove(flagIndex); - - int endIndex = flag.getArguments().size()+flagIndex; - - if(endIndex > largs.size()) - throw new CommandError("The flag -"+flag.getIdentifier()+" does not have the required parameters."); - - flagCounter.put(flag, 0); - - List flagArgs = new ArrayList(); - this.flags.put(flag, flagArgs); - - for(int i = flagIndex; i < endIndex; i++) { - flagArgs.add(largs.remove(flagIndex)); - } - } - - //The rest is normal arguments - arguments = largs; - } - - public boolean flagExists(Flag flag) { - return flags.get(flag) != null; - } - - public boolean hasNext() { - return argCounter < size(); - } - - public boolean hasNext(Flag flag) { - Integer c = flagCounter.get(flag); - if(c == null) - return false; - - return c < size(flag); - } - - public String nextArgument() { - String arg = arguments.get(argCounter); - argCounter++; - return arg; - } - - public String nextFlagArgument(Flag flag) { - List args = flags.get(flag); - - if(args == null) - return null; - - return args.get(flagCounter.put(flag, flagCounter.get(flag)+1)); - } - - public int over() { - return size()-argCounter; - } - - public int over(Flag flag) { - return size(flag)-flagCounter.get(flag); - } - - public int size() { - return arguments.size(); - } - - public int size(Flag flag) { - List args = flags.get(flag); - - if(args == null) - return 0; - - return args.size(); - } + private List arguments; + private int argCounter = 0; + + private Map> flags = Maps.newHashMap(); + private Map flagCounter = Maps.newHashMap(); + + public Arguments(String[] args, Map flags) throws CommandError { + List largs = Lists.newArrayList(args); + + //Find the flags + for (Entry entry : flags.entrySet()) { + Flag flag = entry.getValue(); + + int flagIndex = largs.indexOf("-" + flag.getIdentifier()); + + if (flagIndex == -1) { + continue; + } + + largs.remove(flagIndex); + + int endIndex = flag.getArguments().size() + flagIndex; + + if (endIndex > largs.size()) throw new CommandError( + "The flag -" + flag.getIdentifier() + " does not have the required parameters." + ); + + flagCounter.put(flag, 0); + + List flagArgs = Lists.newArrayList(); + this.flags.put(flag, flagArgs); + + for (int i = flagIndex; i < endIndex; i++) { + flagArgs.add(largs.remove(flagIndex)); + } + } + + //The rest is normal arguments + arguments = largs; + } + + public boolean flagExists(Flag flag) { + return flags.get(flag) != null; + } + + public boolean hasNext() { + return argCounter < size(); + } + + public boolean hasNext(Flag flag) { + Integer c = flagCounter.get(flag); + + return c != null && c < size(flag); + } + + public String nextArgument() { + String arg = arguments.get(argCounter); + argCounter++; + + return arg; + } + + public String nextFlagArgument(Flag flag) { + List args = flags.get(flag); + + return args == null ? null : args.get(flagCounter.put(flag, flagCounter.get(flag) + 1)); + } + + public int over() { + return size() - argCounter; + } + + public int over(Flag flag) { + return size(flag) - flagCounter.get(flag); + } + + public int size() { + return arguments.size(); + } + + public int size(Flag flag) { + List args = flags.get(flag); + + return args == null ? 0 : args.size(); + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/Command.java b/src/main/java/se/ranzdo/bukkit/methodcommand/Command.java index c4982b1..7f973a0 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/Command.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/Command.java @@ -1,33 +1,42 @@ package se.ranzdo.bukkit.methodcommand; +import org.bukkit.command.CommandSender; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import org.bukkit.command.CommandSender; - @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Command { - /**The description of this command - */ - String description() default ""; - - /**The identifier describes what command definition this will bind to. Spliced by spaces, you can define as many sub commands as you want, as long as the first command (the root) is defined in the plugin.yml file.

- * Example: {@code @Command(identifier="root sub1 sub2")}
- * The first command "root" needs to be defined in the plugin.yml. The user will be able to access the command by writing (if the root command does not choose an alias instead):
- * {@code /root sub1 sub2}
- */ - String identifier(); - - /**If this command can only be executed by players (default true).
- * If you turn this to false, the first parameter in the method must be the {@link CommandSender} to avoid {@link ClassCastException} - */ - boolean onlyPlayers() default true; - - /**The permissions to check if the user have before execution. If it is empty the command does not require any permission.

- * If the user don't have one of the permissions, they will get an error message stating that they do not have permission to use the command. - */ - String[] permissions() default {}; + /** + * The description of this command + */ + String description() default ""; + + /** + * The identifier describes what command definition this will bind to. Spliced by spaces, you can define as many + * sub commands as you want, as long as the first command (the root) is defined in the plugin.yml file.

+ * Example: {@code @Command(identifier="root sub1 sub2")}
+ * The first command "root" needs to be defined in the plugin.yml. The user will be able to access the command by + * writing (if the root command does not choose an alias instead):
+ * {@code /root sub1 sub2}
+ */ + String identifier(); + + /** + * If this command can only be executed by players (default true).
+ * If you turn this to false, the first parameter in the method must be the {@link CommandSender} to avoid + * {@link ClassCastException} + */ + boolean onlyPlayers() default true; + + /** + * The permissions to check if the user have before execution. If it is empty the command does not require any + * permission.

+ * If the user don't have one of the permissions, they will get an error message stating that they do not have + * permission to use the command. + */ + String[] permissions() default {}; } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/CommandArgument.java b/src/main/java/se/ranzdo/bukkit/methodcommand/CommandArgument.java index c68a1a5..b90e218 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/CommandArgument.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/CommandArgument.java @@ -1,98 +1,109 @@ package se.ranzdo.bukkit.methodcommand; -import java.util.HashMap; -import java.util.Map; - +import com.google.common.collect.Maps; import org.bukkit.command.CommandSender; +import java.util.Map; + public class CommandArgument implements ExecutableArgument { - private final String name; - private final String description; - private final String def; - private final Map verifyArguments; - private final ArgumentHandler handler; - private final Class argumentClass; - - private Map overrideMessages = new HashMap(); - - public CommandArgument(Arg commandArgAnnotation, Class argumentClass, ArgumentHandler argumentHandler) { - this(commandArgAnnotation.name(), commandArgAnnotation.description(), commandArgAnnotation.def(), commandArgAnnotation.verifiers(), argumentClass, argumentHandler); - } - - public CommandArgument(String name, String description, String def, String verifiers, Class argumentClass, ArgumentHandler handler) { - this.name = name; - this.description = description; - this.def = def; - this.verifyArguments = CommandUtil.parseVerifiers(verifiers); - this.handler = handler; - this.argumentClass = argumentClass; - } - - @Override - public Object execute(CommandSender sender, Arguments args) throws CommandError { - String arg; - if(!args.hasNext()) { - if(def.equals(" ")) - throw new CommandError("The argument ["+name+"] is not defined (it has no default value)", true); - - arg = def; - } - else - arg = CommandUtil.escapeArgumentVariable(args.nextArgument()); - - return handler.handle(sender, this, arg); - } - - private String formatMessage(String msg, String[] vars) { - msg = msg.replace("%p", name); - - for(int i = 1; i <= vars.length;i++) { - msg = msg.replace("%"+i, vars[i-1]); - } - - return msg.replaceAll("%\\d+", ""); - } - - public Class getArgumentClass() { - return argumentClass; - } - - public String getDefault() { - return def; - } - - public String getDescription() { - return description; - } - - public ArgumentHandler getHandler() { - return handler; - } - - public String getMessage(String node) { - return getMessage(node, new String[0]); - } - - public String getMessage(String node, String...vars) { - String msg = overrideMessages.get(node); - - if(msg != null) - return formatMessage(msg, vars); - - msg = handler.getMessage(node); - - if(msg != null) - return formatMessage(msg, vars); - - throw new IllegalArgumentException("The node \""+node+"\" is not available."); - } - - public String getName() { - return name; - } - - public Map getVerifyArguments() { - return verifyArguments; - } + private final String name; + private final String description; + private final String def; + private final Map verifyArguments; + private final ArgumentHandler handler; + private final Class argumentClass; + + private Map overrideMessages = Maps.newHashMap(); + + public CommandArgument(Arg commandArgAnnotation, Class argumentClass, ArgumentHandler argumentHandler) { + this(commandArgAnnotation.name(), + commandArgAnnotation.description(), + commandArgAnnotation.def(), + commandArgAnnotation.verifiers(), + argumentClass, + argumentHandler); + } + + public CommandArgument(String name, String description, String def, String verifiers, + Class argumentClass, + ArgumentHandler handler) { + this.name = name; + this.description = description; + this.def = def; + this.verifyArguments = CommandUtil.parseVerifiers(verifiers); + this.handler = handler; + this.argumentClass = argumentClass; + } + + @Override + public Object execute(CommandSender sender, Arguments args) throws CommandError { + String arg; + if (!args.hasNext()) { + if (def.equals(" ")) throw new CommandError( + "The argument [" + name + "] is not defined (it has no default value)", + true + ); + + arg = def; + } else { + arg = CommandUtil.escapeArgumentVariable(args.nextArgument()); + } + + return handler.handle(sender, this, arg); + } + + private String formatMessage(String msg, String[] vars) { + msg = msg.replace("%p", name); + + for (int i = 1; i <= vars.length; i++) { + msg = msg.replace("%" + i, vars[i - 1]); + } + + return msg.replaceAll("%\\d+", ""); + } + + public Class getArgumentClass() { + return argumentClass; + } + + public String getDefault() { + return def; + } + + public String getDescription() { + return description; + } + + public ArgumentHandler getHandler() { + return handler; + } + + public String getMessage(String node) { + return getMessage(node, new String[0]); + } + + public String getMessage(String node, String... vars) { + String msg = overrideMessages.get(node); + + if (msg != null) { + return formatMessage(msg, vars); + } + + msg = handler.getMessage(node); + + if (msg != null) { + return formatMessage(msg, vars); + } + + throw new IllegalArgumentException("The node \"" + node + "\" is not available."); + } + + public String getName() { + return name; + } + + public Map getVerifyArguments() { + return verifyArguments; + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/CommandError.java b/src/main/java/se/ranzdo/bukkit/methodcommand/CommandError.java index f423684..2cd0bb2 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/CommandError.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/CommandError.java @@ -3,27 +3,29 @@ import org.bukkit.ChatColor; public class CommandError extends Exception { - private static final long serialVersionUID = 1L; - - private boolean showUsage; - - public CommandError(String msg) { - this(msg, false); - } - - public CommandError(String msg, boolean showUsage) { - super(msg); - this.showUsage = showUsage; - } - - public String getColorizedMessage() { - String msg = getMessage(); - msg = msg.replaceAll("\\[", ChatColor.AQUA+"["); - msg = msg.replaceAll("\\]", "]"+ChatColor.RED); - return ChatColor.RED+msg; - } - - public boolean showUsage() { - return showUsage; - } + private static final long serialVersionUID = 1L; + + private boolean showUsage; + + public CommandError(String msg) { + this(msg, false); + } + + public CommandError(String msg, boolean showUsage) { + super(msg); + this.showUsage = showUsage; + } + + public String getColorizedMessage() { + String msg = getMessage(); + + msg = msg.replaceAll("\\[", ChatColor.AQUA + "["); + msg = msg.replaceAll("\\]", "]" + ChatColor.RED); + + return ChatColor.RED + msg; + } + + public boolean showUsage() { + return showUsage; + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/CommandHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/CommandHandler.java index 5494903..49eb485 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/CommandHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/CommandHandler.java @@ -1,11 +1,7 @@ package se.ranzdo.bukkit.methodcommand; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.World; @@ -15,240 +11,261 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; - import se.ranzdo.bukkit.methodcommand.handlers.*; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + public class CommandHandler implements CommandExecutor { - - private JavaPlugin plugin; - private Map, ArgumentHandler> argumentHandlers = new HashMap, ArgumentHandler>(); - private Map rootCommands = new HashMap(); - - private PermissionHandler permissionHandler = new PermissionHandler() { - @Override - public boolean hasPermission(CommandSender sender, String[] permissions) { - for(String perm : permissions) { - if(!sender.hasPermission(perm)) - return false; - } - return true; - } - }; - - private HelpHandler helpHandler = new HelpHandler() { - private String formatArgument(CommandArgument argument) { - String def = argument.getDefault(); - if(def.equals(" ")) { - def = ""; - } - else if(def.startsWith("?")) { - String varName = def.substring(1); - def = argument.getHandler().getVariableUserFriendlyName(varName); - if(def == null) - throw new IllegalArgumentException("The ArgumentVariable '"+varName+"' is not registered."); - def = ChatColor.GOLD+" | "+ChatColor.WHITE+def; - } - else { - def = ChatColor.GOLD+" | "+ChatColor.WHITE+def; - } - - return ChatColor.AQUA+"["+argument.getName()+def+ChatColor.AQUA+"] "+ChatColor.DARK_AQUA+argument.getDescription(); - } - - @Override - public String[] getHelpMessage(RegisteredCommand command) { - ArrayList message = new ArrayList(); - - if(command.isSet()) { - message.add(ChatColor.AQUA+command.getDescription()); - } - - message.add(getUsage(command)); - - if(command.isSet()) { - for(CommandArgument argument : command.getArguments()) { - message.add(formatArgument(argument)); - } - if(command.getWildcard() != null) { - message.add(formatArgument(command.getWildcard())); - } - List flags = command.getFlags(); - if(flags.size() > 0) { - message.add(ChatColor.GOLD+"Flags:"); - for(Flag flag : flags) { - StringBuilder args = new StringBuilder(); - for(FlagArgument argument : flag.getArguments()) { - args.append(" ["+argument.getName()+"]"); - } - message.add("-"+flag.getIdentifier()+ChatColor.AQUA+args.toString()); - for(FlagArgument argument : flag.getArguments()) { - message.add(formatArgument(argument)); - } - } - } - } - - - List subcommands = command.getSuffixes(); - if(subcommands.size() > 0) { - message.add(ChatColor.GOLD+"Subcommands:"); - for(RegisteredCommand scommand : subcommands) { - message.add(scommand.getUsage()); - } - } - - return message.toArray(new String[0]); - } - - @Override - public String getUsage(RegisteredCommand command) { - StringBuilder usage = new StringBuilder(); - usage.append(command.getLabel()); - - RegisteredCommand parent = command.getParent(); - while(parent != null) { - usage.insert(0, parent.getLabel()+" "); - parent = parent.getParent(); - } - - usage.insert(0, "/"); - - if(!command.isSet()) - return usage.toString(); - - usage.append(ChatColor.AQUA); - - for(CommandArgument argument : command.getArguments()) { - usage.append(" ["+argument.getName()+"]"); - } - - usage.append(ChatColor.WHITE); - - for(Flag flag : command.getFlags()) { - usage.append(" (-"+flag.getIdentifier()+ChatColor.AQUA); - for(FlagArgument arg : flag.getArguments()) { - usage.append(" ["+arg.getName()+"]"); - } - usage.append(ChatColor.WHITE+")"); - } - - if(command.getWildcard() != null) { - usage.append(ChatColor.AQUA+" ["+command.getWildcard().getName()+"]"); - } - - return usage.toString(); - } - }; - - private String helpSuffix = "help"; - - public CommandHandler(JavaPlugin plugin) { - this.plugin = plugin; - - registerArgumentHandler(String.class, new StringArgumentHandler()); - registerArgumentHandler(int.class, new IntegerArgumentHandler()); - registerArgumentHandler(double.class, new DoubleArgumentHandler()); - registerArgumentHandler(Player.class, new PlayerArgumentHandler()); - registerArgumentHandler(World.class, new WorldArgumentHandler()); - registerArgumentHandler(EntityType.class, new EntityTypeArgumentHandler()); - registerArgumentHandler(Material.class, new MaterialArgumentHandler()); - } - - @SuppressWarnings("unchecked") - public ArgumentHandler getArgumentHandler(Class clazz) { - return (ArgumentHandler) argumentHandlers.get(clazz); - } - - public HelpHandler getHelpHandler() { - return helpHandler; - } - - public PermissionHandler getPermissionHandler() { - return permissionHandler; - } - - public void registerArgumentHandler(Class clazz, ArgumentHandler argHandler) { - if(argumentHandlers.get(clazz) != null) - throw new IllegalArgumentException("The is already a ArgumentHandler bound to the class "+clazz.getName()+"."); - - argHandler.handler = this; - argumentHandlers.put(clazz, argHandler); - } - - public void registerCommands(Object commands) { - for(Method method : commands.getClass().getDeclaredMethods()) { - Command commandAnno = method.getAnnotation(Command.class); - if(commandAnno == null) - continue; - - String[] identifiers = commandAnno.identifier().split(" "); - if(identifiers.length == 0) - throw new RegisterCommandMethodException(method, "Invalid identifiers"); - - PluginCommand rootPcommand = plugin.getCommand(identifiers[0]); - - if(rootPcommand == null) - throw new RegisterCommandMethodException(method, "The rootcommand (the first identifier) is not registerd in the plugin.yml"); - - if(rootPcommand.getExecutor() != this) - rootPcommand.setExecutor(this); - - RootCommand rootCommand = rootCommands.get(rootPcommand); - - if(rootCommand == null) { - rootCommand = new RootCommand(rootPcommand, this); - rootCommands.put(rootPcommand, rootCommand); - } - - RegisteredCommand mainCommand = rootCommand; - - for(int i = 1; i < identifiers.length; i++) { - String suffix = identifiers[i]; - if(mainCommand.doesSuffixCommandExist(suffix)) { - mainCommand = mainCommand.getSuffixCommand(suffix); - } - else { - RegisteredCommand newCommand = new RegisteredCommand(suffix, this, mainCommand); - mainCommand.addSuffixCommand(suffix, newCommand); - mainCommand = newCommand; - } - } - - mainCommand.set(commands, method); - } - } - - public void setHelpHandler(HelpHandler helpHandler) { - this.helpHandler = helpHandler; - } - - public void setPermissionHandler(PermissionHandler permissionHandler) { - this.permissionHandler = permissionHandler; - } - - public String getHelpSuffix() { - return helpSuffix; - } - - public void setHelpSuffix(String suffix) { - this.helpSuffix = suffix; - } - - @Override - public boolean onCommand(CommandSender sender, org.bukkit.command.Command command, String label, String[] args) { - RootCommand rootCommand = rootCommands.get(command); - if(rootCommand == null) { - return false; - } - - if(rootCommand.onlyPlayers() && !(sender instanceof Player)) { - sender.sendMessage(ChatColor.RED+"Sorry, but only players can execute this command."); - return true; - } - - rootCommand.execute(sender, args); - - return true; - } + + private JavaPlugin plugin; + private Map, ArgumentHandler> argumentHandlers = Maps.newHashMap(); + private Map rootCommands = Maps.newHashMap(); + + private PermissionHandler permissionHandler = (sender, permissions) -> { + for (String perm : permissions) { + if (!sender.hasPermission(perm)) + return false; + } + return true; + }; + + private HelpHandler helpHandler = new HelpHandler() { + private String formatArgument(CommandArgument argument) { + String def = argument.getDefault(); + if (def.equals(" ")) { + def = ""; + } else if (def.startsWith("?")) { + String varName = def.substring(1); + def = argument.getHandler().getVariableUserFriendlyName(varName); + if (def == null) + throw new IllegalArgumentException("The ArgumentVariable '" + varName + "' is not registered."); + def = ChatColor.GOLD + " | " + ChatColor.WHITE + def; + } else { + def = ChatColor.GOLD + " | " + ChatColor.WHITE + def; + } + + return ChatColor.AQUA + "[" + argument.getName() + def + ChatColor.AQUA + "] " + + ChatColor.DARK_AQUA + argument.getDescription(); + } + + @Override + public String[] getHelpMessage(RegisteredCommand command) { + ArrayList message = Lists.newArrayList(); + + if (command.isSet()) { + message.add(ChatColor.AQUA + command.getDescription()); + } + + message.add(getUsage(command)); + + if (command.isSet()) { + for (CommandArgument argument : command.getArguments()) { + message.add(formatArgument(argument)); + } + + if (command.getWildcard() != null) { + message.add(formatArgument(command.getWildcard())); + } + + List flags = command.getFlags(); + + if (flags.size() > 0) { + message.add(ChatColor.GOLD + "Flags:"); + + for (Flag flag : flags) { + StringBuilder args = new StringBuilder(); + for (FlagArgument argument : flag.getArguments()) { + args.append(" [" + argument.getName() + "]"); + } + + message.add("-" + flag.getIdentifier() + ChatColor.AQUA + args.toString()); + + for (FlagArgument argument : flag.getArguments()) { + message.add(formatArgument(argument)); + } + } + } + } + + List subcommands = command.getSuffixes(); + + if (subcommands.size() > 0) { + message.add(ChatColor.GOLD + "Subcommands:"); + + for (RegisteredCommand scommand : subcommands) { + message.add(scommand.getUsage()); + } + } + + return message.toArray(new String[0]); + } + + @Override + public String getUsage(RegisteredCommand command) { + StringBuilder usage = new StringBuilder(); + usage.append(command.getLabel()); + + RegisteredCommand parent = command.getParent(); + + while (parent != null) { + usage.insert(0, parent.getLabel() + " "); + parent = parent.getParent(); + } + + usage.insert(0, "/"); + + if (!command.isSet()) { + return usage.toString(); + } + + usage.append(ChatColor.AQUA); + + for (CommandArgument argument : command.getArguments()) { + usage.append(" [").append(argument.getName()).append("]"); + } + + usage.append(ChatColor.WHITE); + + for (Flag flag : command.getFlags()) { + usage.append(" (-").append(flag.getIdentifier()).append(ChatColor.AQUA); + for (FlagArgument arg : flag.getArguments()) { + usage.append(" [").append(arg.getName()).append("]"); + } + usage.append(ChatColor.WHITE).append(')'); + } + + if (command.getWildcard() != null) { + usage.append(ChatColor.AQUA).append(" [").append(command.getWildcard().getName()).append("]"); + } + + return usage.toString(); + } + }; + + private String helpSuffix = "help"; + + public CommandHandler(JavaPlugin plugin) { + this.plugin = plugin; + + registerArgumentHandler(String.class, new StringArgumentHandler()); + registerArgumentHandler(int.class, new IntegerArgumentHandler()); + registerArgumentHandler(double.class, new DoubleArgumentHandler()); + registerArgumentHandler(Player.class, new PlayerArgumentHandler()); + registerArgumentHandler(World.class, new WorldArgumentHandler()); + registerArgumentHandler(EntityType.class, new EntityTypeArgumentHandler()); + registerArgumentHandler(Material.class, new MaterialArgumentHandler()); + } + + @SuppressWarnings("unchecked") + public ArgumentHandler getArgumentHandler(Class clazz) { + return (ArgumentHandler) argumentHandlers.get(clazz); + } + + public HelpHandler getHelpHandler() { + return helpHandler; + } + + public void setHelpHandler(HelpHandler helpHandler) { + this.helpHandler = helpHandler; + } + + public PermissionHandler getPermissionHandler() { + return permissionHandler; + } + + public void setPermissionHandler(PermissionHandler permissionHandler) { + this.permissionHandler = permissionHandler; + } + + public void registerArgumentHandler(Class clazz, ArgumentHandler argHandler) { + if (argumentHandlers.get(clazz) != null) { + throw new IllegalArgumentException( + "The is already a ArgumentHandler bound to the class " + clazz.getName() + "." + ); + } + + argHandler.handler = this; + argumentHandlers.put(clazz, argHandler); + } + + public void registerCommands(Object commands) { + for (Method method : commands.getClass().getDeclaredMethods()) { + Command commandAnno = method.getAnnotation(Command.class); + if (commandAnno == null) { + continue; + } + + String[] identifiers = commandAnno.identifier().split(" "); + if (identifiers.length == 0) { + throw new RegisterCommandMethodException(method, "Invalid identifiers"); + } + + PluginCommand rootPcommand = plugin.getCommand(identifiers[0]); + + if (rootPcommand == null) { + throw new RegisterCommandMethodException( + method, + "The rootcommand (the first identifier) is not " + "registerd in the plugin.yml" + ); + } + + if (rootPcommand.getExecutor() != this) { + rootPcommand.setExecutor(this); + } + + RootCommand rootCommand = rootCommands.get(rootPcommand); + + if (rootCommand == null) { + rootCommand = new RootCommand(rootPcommand, this); + rootCommands.put(rootPcommand, rootCommand); + } + + RegisteredCommand mainCommand = rootCommand; + + for (int i = 1; i < identifiers.length; i++) { + String suffix = identifiers[i]; + + if (mainCommand.doesSuffixCommandExist(suffix)) { + mainCommand = mainCommand.getSuffixCommand(suffix); + } else { + RegisteredCommand newCommand = new RegisteredCommand(suffix, this, mainCommand); + mainCommand.addSuffixCommand(suffix, newCommand); + mainCommand = newCommand; + } + } + + mainCommand.set(commands, method); + } + } + + public String getHelpSuffix() { + return helpSuffix; + } + + public void setHelpSuffix(String suffix) { + this.helpSuffix = suffix; + } + + @Override + public boolean onCommand(CommandSender sender, org.bukkit.command.Command command, String label, String[] args) { + RootCommand rootCommand = rootCommands.get(command); + + if (rootCommand == null) { + return false; + } + + if (rootCommand.onlyPlayers() && !(sender instanceof Player)) { + sender.sendMessage(ChatColor.RED + "Sorry, but only players can execute this command."); + + return true; + } + + rootCommand.execute(sender, args); + + return true; + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/CommandUtil.java b/src/main/java/se/ranzdo/bukkit/methodcommand/CommandUtil.java index e24c065..0e0a01b 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/CommandUtil.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/CommandUtil.java @@ -1,50 +1,57 @@ package se.ranzdo.bukkit.methodcommand; -import java.util.ArrayList; -import java.util.LinkedHashMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class CommandUtil { - private static Pattern verifyArgumentsPattern = Pattern.compile("^(.*?)\\[(.*?)\\]$"); - public static String escapeArgumentVariable(String var) { - if(var == null) - return null; - - if(var.matches("^\\\\*\\?.*$")) - return "\\"+var; - - return var; - } - - public static Map parseVerifiers(String verifiers) { - Map map = new LinkedHashMap(); - - if(verifiers.equals("")) - return map; - - String[] arguments = verifiers.split("\\|"); - - for(String arg : arguments) { - Matcher matcher = verifyArgumentsPattern.matcher(arg); - if(!matcher.matches()) - throw new IllegalArgumentException("The argrument \""+arg+"\" is in invalid form."); - - List parameters = new ArrayList(); - - String sparameters = matcher.group(2); - if(sparameters != null) { - for(String parameter : sparameters.split(",")) - parameters.add(parameter.trim()); - } - - String argName = matcher.group(1).trim(); - - map.put(argName, parameters.toArray(new String[0])); - } - - return map; - } +public class CommandUtil { + private static Pattern verifyArgumentsPattern = Pattern.compile("^(.*?)\\[(.*?)\\]$"); + + public static String escapeArgumentVariable(String var) { + if (var == null) { + return null; + } + + if (var.matches("^\\\\*\\?.*$")) { + return "\\" + var; + } + + return var; + } + + public static Map parseVerifiers(String verifiers) { + Map map = Maps.newLinkedHashMap(); + + if (verifiers.equals("")) { + return map; + } + + String[] arguments = verifiers.split("\\|"); + + for (String arg : arguments) { + Matcher matcher = verifyArgumentsPattern.matcher(arg); + if (!matcher.matches()) { + throw new IllegalArgumentException("The argrument \"" + arg + "\" is in invalid form."); + } + + List parameters = Lists.newArrayList(); + + String sparameters = matcher.group(2); + if (sparameters != null) { + for (String parameter : sparameters.split(",")) { + parameters.add(parameter.trim()); + } + } + + String argName = matcher.group(1).trim(); + + map.put(argName, parameters.toArray(new String[0])); + } + + return map; + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/ExecutableArgument.java b/src/main/java/se/ranzdo/bukkit/methodcommand/ExecutableArgument.java index 3435d9a..5b11267 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/ExecutableArgument.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/ExecutableArgument.java @@ -3,5 +3,5 @@ import org.bukkit.command.CommandSender; public interface ExecutableArgument { - public Object execute(CommandSender sender, Arguments args) throws CommandError; + Object execute(CommandSender sender, Arguments args) throws CommandError; } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/Flag.java b/src/main/java/se/ranzdo/bukkit/methodcommand/Flag.java index 2e1d06d..beabcfb 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/Flag.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/Flag.java @@ -1,43 +1,43 @@ package se.ranzdo.bukkit.methodcommand; -import java.util.ArrayList; -import java.util.List; - +import com.google.common.collect.Lists; import org.bukkit.command.CommandSender; +import java.util.List; + public class Flag implements ExecutableArgument { - private final String identifier; - private final String description; - private List arguments = new ArrayList(); - - public Flag(String identifier, String description) { - this.identifier = identifier; - this.description = description; - } - - public void addArgument(FlagArgument argument) { - arguments.add(argument); - } - - @Override - public Object execute(CommandSender sender, Arguments args) { - return args.flagExists(this); - } - - public List getArguments() { - return arguments; - } - - public String getDescription() { - return description; - } - - public String getIdentifier() { - return identifier; - } - - @Override - public int hashCode() { - return identifier.hashCode(); - } + private final String identifier; + private final String description; + private List arguments = Lists.newArrayList(); + + public Flag(String identifier, String description) { + this.identifier = identifier; + this.description = description; + } + + public void addArgument(FlagArgument argument) { + arguments.add(argument); + } + + @Override + public Object execute(CommandSender sender, Arguments args) { + return args.flagExists(this); + } + + public List getArguments() { + return arguments; + } + + public String getDescription() { + return description; + } + + public String getIdentifier() { + return identifier; + } + + @Override + public int hashCode() { + return identifier.hashCode(); + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/FlagArg.java b/src/main/java/se/ranzdo/bukkit/methodcommand/FlagArg.java index 581caa4..d5da668 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/FlagArg.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/FlagArg.java @@ -8,5 +8,5 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) public @interface FlagArg { - String value(); + String value(); } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/FlagArgument.java b/src/main/java/se/ranzdo/bukkit/methodcommand/FlagArgument.java index c197230..4f9e09a 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/FlagArgument.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/FlagArgument.java @@ -4,32 +4,41 @@ public class FlagArgument extends CommandArgument { - private final Flag flag; - - public FlagArgument(Arg commandArgAnnotation, Class argumentClass, ArgumentHandler argumentHandler, Flag flag) { - super(commandArgAnnotation, argumentClass, argumentHandler); - this.flag = flag; - } - - public FlagArgument(String name, String description, String def, String verifiers, Class argumentClass, ArgumentHandler handler, Flag flag) { - super(name, description, def, verifiers, argumentClass, handler); - this.flag = flag; - } - - @Override - public Object execute(CommandSender sender, Arguments args) throws CommandError { - String arg; - if(!args.flagExists(flag)) - arg = getDefault(); - else if(!args.hasNext(flag)) - throw new CommandError("The argument s ["+getName()+"] to the flag -"+flag.getIdentifier()+" is not defined"); - else - arg = CommandUtil.escapeArgumentVariable(args.nextFlagArgument(flag)); - - return getHandler().handle(sender, this, arg); - } - - public Flag getFlag() { - return flag; - } + private final Flag flag; + + public FlagArgument(Arg commandArgAnnotation, Class argumentClass, + ArgumentHandler argumentHandler, + Flag flag) { + super(commandArgAnnotation, argumentClass, argumentHandler); + + this.flag = flag; + } + + public FlagArgument(String name, String description, String def, String verifiers, Class argumentClass, + ArgumentHandler handler, + Flag flag) { + super(name, description, def, verifiers, argumentClass, handler); + this.flag = flag; + } + + @Override + public Object execute(CommandSender sender, Arguments args) throws CommandError { + String arg; + if (!args.flagExists(flag)) { + arg = getDefault(); + } else if (!args.hasNext(flag)) { + throw new CommandError( + "The argument s [" + getName() + "] to the flag -" + + flag.getIdentifier() + " is " + "not defined" + ); + } else { + arg = CommandUtil.escapeArgumentVariable(args.nextFlagArgument(flag)); + } + + return getHandler().handle(sender, this, arg); + } + + public Flag getFlag() { + return flag; + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/Flags.java b/src/main/java/se/ranzdo/bukkit/methodcommand/Flags.java index 3d710de..6955091 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/Flags.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/Flags.java @@ -8,9 +8,10 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Flags { - /** - * @return description of the flags (in the same order as the identifiers) - */ - String[] description() default {}; - String[] identifier(); + /** + * @return description of the flags (in the same order as the identifiers) + */ + String[] description() default {}; + + String[] identifier(); } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/HelpHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/HelpHandler.java index b43e058..16a80d3 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/HelpHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/HelpHandler.java @@ -1,6 +1,7 @@ package se.ranzdo.bukkit.methodcommand; public interface HelpHandler { - public String[] getHelpMessage(RegisteredCommand command); - public String getUsage(RegisteredCommand command); + String[] getHelpMessage(RegisteredCommand command); + + String getUsage(RegisteredCommand command); } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/InvalidVerifyArgument.java b/src/main/java/se/ranzdo/bukkit/methodcommand/InvalidVerifyArgument.java index d84c755..0c916aa 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/InvalidVerifyArgument.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/InvalidVerifyArgument.java @@ -1,9 +1,9 @@ package se.ranzdo.bukkit.methodcommand; public class InvalidVerifyArgument extends RuntimeException { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - public InvalidVerifyArgument(String name) { - super("The verifier "+name+" is not valid."); - } + public InvalidVerifyArgument(String name) { + super("The verifier " + name + " is not valid."); + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/PermissionHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/PermissionHandler.java index 09266ee..4943764 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/PermissionHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/PermissionHandler.java @@ -3,5 +3,5 @@ import org.bukkit.command.CommandSender; public interface PermissionHandler { - public boolean hasPermission(CommandSender sender, String[] permissions); + boolean hasPermission(CommandSender sender, String[] permissions); } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/ReflectionUtil.java b/src/main/java/se/ranzdo/bukkit/methodcommand/ReflectionUtil.java index 35e0a22..a562d7d 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/ReflectionUtil.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/ReflectionUtil.java @@ -4,13 +4,13 @@ import java.lang.reflect.Method; public class ReflectionUtil { - @SuppressWarnings("unchecked") - public static T getAnnotation(Class clazz, Method method, int parameterIndex) { - for(Annotation annotation : method.getParameterAnnotations()[parameterIndex]) { - if(annotation.annotationType() == clazz) { - return (T) annotation; - } - } - return null; - } + @SuppressWarnings("unchecked") + public static T getAnnotation(Class clazz, Method method, int parameterIndex) { + for (Annotation annotation : method.getParameterAnnotations()[parameterIndex]) { + if (annotation.annotationType() == clazz) { + return (T) annotation; + } + } + return null; + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/RegisterCommandMethodException.java b/src/main/java/se/ranzdo/bukkit/methodcommand/RegisterCommandMethodException.java index 6b11804..9738580 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/RegisterCommandMethodException.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/RegisterCommandMethodException.java @@ -3,9 +3,10 @@ import java.lang.reflect.Method; public class RegisterCommandMethodException extends RuntimeException { - private static final long serialVersionUID = 1L; - - public RegisterCommandMethodException(Method method, String msg) { - super("Could not register the command method "+method.getName()+" in the class "+method.getDeclaringClass().getName()+". Reason: "+msg); - } + private static final long serialVersionUID = 1L; + + public RegisterCommandMethodException(Method method, String msg) { + super("Could not register the command method " + method.getName() + " in the class " + method + .getDeclaringClass().getName() + ". Reason: " + msg); + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/RegisteredCommand.java b/src/main/java/se/ranzdo/bukkit/methodcommand/RegisteredCommand.java index 0e2611e..8246f15 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/RegisteredCommand.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/RegisteredCommand.java @@ -1,316 +1,318 @@ package se.ranzdo.bukkit.methodcommand; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; public class RegisteredCommand { - private String label; - private RegisteredCommand parent; - private String description; - private String[] permissions; - private boolean onlyPlayers; - private Method method; - private Object methodInstance; - private CommandHandler handler; - - private boolean set = false; - - private ArrayList methodArguments = new ArrayList(); - private ArrayList arguments = new ArrayList(); - private ArrayList suffixes = new ArrayList(); - private ArrayList flags = new ArrayList(); - private WildcardArgument wildcard; - private Map flagsByName = new LinkedHashMap(); - private Map suffixesByName = new HashMap(); - - RegisteredCommand(String label, CommandHandler handler, RegisteredCommand parent) { - this.label = label; - this.handler = handler; - this.parent = parent; - } - - void addSuffixCommand(String suffix, RegisteredCommand command) { - suffixesByName.put(suffix.toLowerCase(), command); - suffixes.add(command); - } - - boolean doesSuffixCommandExist(String suffix) { - return suffixesByName.get(suffix) != null; - } - - void execute(CommandSender sender, String[] args) { - if(!testPermission(sender)) { - sender.sendMessage(ChatColor.RED+"You do not have permission to do this!"); - return; - } - - if(args.length > 0) { - String suffixLabel = args[0].toLowerCase(); - if(suffixLabel.equals(handler.getHelpSuffix())) { - sendHelpMessage(sender); - return; - } - - RegisteredCommand command = suffixesByName.get(suffixLabel); - if(command == null) { - executeMethod(sender, args); - } - else { - String[] nargs = new String[args.length-1]; - System.arraycopy(args, 1, nargs, 0, args.length-1); - command.execute(sender, nargs); - } - } - else - executeMethod(sender, args); - - } - - private void executeMethod(CommandSender sender, String[] args) { - if(!set) { - sendHelpMessage(sender); - return; - } - - ArrayList resultArgs = new ArrayList(); - resultArgs.add(sender); - - Arguments arguments; - try { - arguments = new Arguments(args, flagsByName); - } catch (CommandError e) { - sender.sendMessage(e.getColorizedMessage()); - return; - } - - for(ExecutableArgument ea : this.methodArguments) { - try { - resultArgs.add(ea.execute(sender, arguments)); - } catch (CommandError e) { - sender.sendMessage(e.getColorizedMessage()); - if(e.showUsage()) - sender.sendMessage(getUsage()); - return; - } - } - - try { - try { - method.invoke(methodInstance, resultArgs.toArray()); - } - catch(InvocationTargetException e) { - if(e.getCause() instanceof CommandError) { - CommandError ce = (CommandError)e.getCause(); - sender.sendMessage(ce.getColorizedMessage()); - if(ce.showUsage()) - sender.sendMessage(getUsage()); - } - else - throw e; - } - } catch (Exception e) { - sender.sendMessage(ChatColor.RED+"An internal error occurred while attempting to perform this command."); - e.printStackTrace(); - } - } - - private ArgumentHandler getArgumenHandler(Class argumentClass) { - ArgumentHandler argumentHandler = handler.getArgumentHandler(argumentClass); - - if(argumentHandler == null) - throw new RegisterCommandMethodException(method, "Could not find a ArgumentHandler for ("+argumentClass.getName()+")"); - - return argumentHandler; - } - - public List getArguments() { - return arguments; - } - - public String getDescription() { - return description; - } - - public List getFlags() { - return flags; - } - - public String[] getHelpMessage() { - return handler.getHelpHandler().getHelpMessage(this); - } - - public String getLabel() { - return label; - } - - public RegisteredCommand getParent() { - return parent; - } - - public String[] getPermissions() { - return permissions; - } - - public RegisteredCommand getSuffixCommand(String suffix) { - return suffixesByName.get(suffix); - } - - public List getSuffixes() { - return suffixes; - } - - public String getUsage() { - return handler.getHelpHandler().getUsage(this); - } - - public WildcardArgument getWildcard() { - return wildcard; - } - - public boolean isOnlyPlayers() { - return onlyPlayers; - } - - public boolean isSet() { - return set; - } - - public boolean onlyPlayers() { - return onlyPlayers; - } - - public void sendHelpMessage(CommandSender sender) { - sender.sendMessage(getHelpMessage()); - } - - void set(Object methodInstance, Method method) { - this.methodInstance = methodInstance; - this.method = method; - method.setAccessible(true); - Command command = method.getAnnotation(Command.class); - Flags flagsAnnotation = method.getAnnotation(Flags.class); - this.description = command.description(); - this.permissions = command.permissions(); - this.onlyPlayers = command.onlyPlayers(); - - Class[] methodParameters = method.getParameterTypes(); - - if(methodParameters.length == 0 ? true : !CommandSender.class.isAssignableFrom(methodParameters[0])) - throw new RegisterCommandMethodException(method, "The first parameter in the command method must be assignable to the CommandSender interface."); - - if(flagsAnnotation != null) { - String[] flags = flagsAnnotation.identifier(); - String[] flagdescriptions = flagsAnnotation.description(); - - for(int i = 0; i < flags.length; i++) { - Flag flag = new Flag(flags[i], i < flagdescriptions.length ? flagdescriptions[i] : ""); - this.flagsByName.put(flags[i], flag); - this.flags.add(flag); - } - } - - Annotation[][] parameterAnnotations = method.getParameterAnnotations(); - - for(int i = 1; i < methodParameters.length;i++) { - - //Find the CommandArgument annotation - Arg commandArgAnnotation = null; - for(Annotation annotation : parameterAnnotations[i]) { - if(annotation.annotationType() == Arg.class) { - commandArgAnnotation = (Arg) annotation; - } - } - - //Find the FlagArg annotation - FlagArg flagArgAnnotation = null; - for(Annotation annotation : parameterAnnotations[i]) { - if(annotation.annotationType() == FlagArg.class) { - flagArgAnnotation = (FlagArg) annotation; - } - } - - //If neither does not exist throw - if(commandArgAnnotation == null && flagArgAnnotation == null) - throw new RegisterCommandMethodException(method, "The command annonation is present on a method, however one of the parameters is not annotated."); - - Flag flag = null; - - if(flagArgAnnotation != null) { - flag = this.flagsByName.get(flagArgAnnotation.value()); - if(flag == null) - throw new RegisterCommandMethodException(method, "The flag annonation is present on a parameter, however the flag is not defined in the flags annonation."); - } - - Class argumentClass = methodParameters[i]; - - if(commandArgAnnotation == null) { - if(argumentClass != boolean.class && argumentClass != Boolean.class) - throw new RegisterCommandMethodException(method, "The flag annonation is present on a parameter without the arg annonation, however the parameter type is not an boolean."); - - methodArguments.add(flag); - - continue; - } - - - if(flagArgAnnotation == null) { - CommandArgument argument; - if(i == methodParameters.length-1) { - //Find the Wildcard annotation - Wildcard wildcard = null; - for(Annotation annotation : parameterAnnotations[i]) { - if(annotation.annotationType() == Wildcard.class) { - wildcard = (Wildcard) annotation; - } - } - - if(wildcard != null) { - boolean join = wildcard.join(); - if(!join) { - argumentClass = argumentClass.getComponentType(); - if(argumentClass == null) - throw new RegisterCommandMethodException(method, "The wildcard argument needs to be an array if join is false."); - } - this.wildcard = new WildcardArgument(commandArgAnnotation, argumentClass, getArgumenHandler(argumentClass), join); - argument = this.wildcard; - - } - else { - argument = new CommandArgument(commandArgAnnotation, argumentClass, getArgumenHandler(argumentClass)); - arguments.add(argument); - } - } - else { - argument = new CommandArgument(commandArgAnnotation, argumentClass, getArgumenHandler(argumentClass)); - arguments.add(argument); - } - - methodArguments.add(argument); - } - else { - FlagArgument argument = new FlagArgument(commandArgAnnotation, argumentClass, getArgumenHandler(argumentClass), flag); - methodArguments.add(argument); - flag.addArgument(argument); - } - } - - this.set = true; - } - - public boolean testPermission(CommandSender sender) { - if(!set) - return true; - - return handler.getPermissionHandler().hasPermission(sender, permissions); - } - + private String label; + private RegisteredCommand parent; + private String description; + private String[] permissions; + private boolean onlyPlayers; + private Method method; + private Object methodInstance; + private CommandHandler handler; + + private boolean set = false; + + private ArrayList methodArguments = Lists.newArrayList(); + private ArrayList arguments = Lists.newArrayList(); + private ArrayList suffixes = Lists.newArrayList(); + private ArrayList flags = Lists.newArrayList(); + private WildcardArgument wildcard; + private Map flagsByName = Maps.newLinkedHashMap(); + private Map suffixesByName = Maps.newHashMap(); + + RegisteredCommand(String label, CommandHandler handler, RegisteredCommand parent) { + this.label = label; + this.handler = handler; + this.parent = parent; + } + + void addSuffixCommand(String suffix, RegisteredCommand command) { + suffixesByName.put(suffix.toLowerCase(), command); + suffixes.add(command); + } + + boolean doesSuffixCommandExist(String suffix) { + return suffixesByName.get(suffix) != null; + } + + void execute(CommandSender sender, String[] args) { + if (!testPermission(sender)) { + sender.sendMessage(ChatColor.RED + "You do not have permission to do this!"); + return; + } + + if (args.length > 0) { + String suffixLabel = args[0].toLowerCase(); + if (suffixLabel.equals(handler.getHelpSuffix())) { + sendHelpMessage(sender); + return; + } + + RegisteredCommand command = suffixesByName.get(suffixLabel); + if (command == null) { + executeMethod(sender, args); + } else { + String[] nargs = new String[args.length - 1]; + System.arraycopy(args, 1, nargs, 0, args.length - 1); + command.execute(sender, nargs); + } + } else + executeMethod(sender, args); + + } + + private void executeMethod(CommandSender sender, String[] args) { + if (!set) { + sendHelpMessage(sender); + return; + } + + ArrayList resultArgs = Lists.newArrayList(); + resultArgs.add(sender); + + Arguments arguments; + try { + arguments = new Arguments(args, flagsByName); + } catch (CommandError e) { + sender.sendMessage(e.getColorizedMessage()); + return; + } + + for (ExecutableArgument ea : this.methodArguments) { + try { + resultArgs.add(ea.execute(sender, arguments)); + } catch (CommandError e) { + sender.sendMessage(e.getColorizedMessage()); + if (e.showUsage()) + sender.sendMessage(getUsage()); + return; + } + } + + try { + try { + method.invoke(methodInstance, resultArgs.toArray()); + } catch (InvocationTargetException e) { + if (e.getCause() instanceof CommandError) { + CommandError ce = (CommandError) e.getCause(); + sender.sendMessage(ce.getColorizedMessage()); + if (ce.showUsage()) + sender.sendMessage(getUsage()); + } else + throw e; + } + } catch (Exception e) { + sender.sendMessage(ChatColor.RED + "An internal error occurred while attempting to perform this command."); + e.printStackTrace(); + } + } + + private ArgumentHandler getArgumenHandler(Class argumentClass) { + ArgumentHandler argumentHandler = handler.getArgumentHandler(argumentClass); + + if (argumentHandler == null) + throw new RegisterCommandMethodException( + method, + "Could not find a ArgumentHandler for (" + argumentClass.getName() + ")" + ); + + return argumentHandler; + } + + public List getArguments() { + return arguments; + } + + public String getDescription() { + return description; + } + + public List getFlags() { + return flags; + } + + public String[] getHelpMessage() { + return handler.getHelpHandler().getHelpMessage(this); + } + + public String getLabel() { + return label; + } + + public RegisteredCommand getParent() { + return parent; + } + + public String[] getPermissions() { + return permissions; + } + + public RegisteredCommand getSuffixCommand(String suffix) { + return suffixesByName.get(suffix); + } + + public List getSuffixes() { + return suffixes; + } + + public String getUsage() { + return handler.getHelpHandler().getUsage(this); + } + + public WildcardArgument getWildcard() { + return wildcard; + } + + public boolean isOnlyPlayers() { + return onlyPlayers; + } + + public boolean isSet() { + return set; + } + + public boolean onlyPlayers() { + return onlyPlayers; + } + + public void sendHelpMessage(CommandSender sender) { + sender.sendMessage(getHelpMessage()); + } + + void set(Object methodInstance, Method method) { + this.methodInstance = methodInstance; + this.method = method; + method.setAccessible(true); + Command command = method.getAnnotation(Command.class); + Flags flagsAnnotation = method.getAnnotation(Flags.class); + this.description = command.description(); + this.permissions = command.permissions(); + this.onlyPlayers = command.onlyPlayers(); + + Class[] methodParameters = method.getParameterTypes(); + + if (methodParameters.length == 0 || !CommandSender.class.isAssignableFrom(methodParameters[0])) + throw new RegisterCommandMethodException(method, "The first parameter in the command method must be " + + "assignable to the CommandSender interface."); + + if (flagsAnnotation != null) { + String[] flags = flagsAnnotation.identifier(); + String[] flagdescriptions = flagsAnnotation.description(); + + for (int i = 0; i < flags.length; i++) { + Flag flag = new Flag(flags[i], i < flagdescriptions.length ? flagdescriptions[i] : ""); + this.flagsByName.put(flags[i], flag); + this.flags.add(flag); + } + } + + Annotation[][] parameterAnnotations = method.getParameterAnnotations(); + + for (int i = 1; i < methodParameters.length; i++) { + + //Find the CommandArgument annotation + Arg commandArgAnnotation = null; + for (Annotation annotation : parameterAnnotations[i]) { + if (annotation.annotationType() == Arg.class) { + commandArgAnnotation = (Arg) annotation; + } + } + + //Find the FlagArg annotation + FlagArg flagArgAnnotation = null; + for (Annotation annotation : parameterAnnotations[i]) { + if (annotation.annotationType() == FlagArg.class) { + flagArgAnnotation = (FlagArg) annotation; + } + } + + //If neither does not exist throw + if (commandArgAnnotation == null && flagArgAnnotation == null) + throw new RegisterCommandMethodException(method, "The command annonation is present on a method, " + + "however one of the parameters is not annotated."); + + Flag flag = null; + + if (flagArgAnnotation != null) { + flag = this.flagsByName.get(flagArgAnnotation.value()); + if (flag == null) + throw new RegisterCommandMethodException(method, "The flag annonation is present on a parameter, " + + "however the flag is not defined in the flags annonation."); + } + + Class argumentClass = methodParameters[i]; + + if (commandArgAnnotation == null) { + if (argumentClass != boolean.class && argumentClass != Boolean.class) + throw new RegisterCommandMethodException(method, "The flag annonation is present on a parameter " + + "without the arg annonation, however the parameter type is not an boolean."); + + methodArguments.add(flag); + + continue; + } + + + if (flagArgAnnotation == null) { + CommandArgument argument; + if (i == methodParameters.length - 1) { + //Find the Wildcard annotation + Wildcard wildcard = null; + for (Annotation annotation : parameterAnnotations[i]) { + if (annotation.annotationType() == Wildcard.class) { + wildcard = (Wildcard) annotation; + } + } + + if (wildcard != null) { + boolean join = wildcard.join(); + if (!join) { + argumentClass = argumentClass.getComponentType(); + if (argumentClass == null) + throw new RegisterCommandMethodException(method, "The wildcard argument needs to be " + + "an array if join is false."); + } + this.wildcard = new WildcardArgument(commandArgAnnotation, argumentClass, getArgumenHandler + (argumentClass), join); + argument = this.wildcard; + + } else { + argument = new CommandArgument(commandArgAnnotation, argumentClass, getArgumenHandler + (argumentClass)); + arguments.add(argument); + } + } else { + argument = new CommandArgument(commandArgAnnotation, argumentClass, getArgumenHandler + (argumentClass)); + arguments.add(argument); + } + + methodArguments.add(argument); + } else { + FlagArgument argument = new FlagArgument(commandArgAnnotation, argumentClass, getArgumenHandler + (argumentClass), flag); + methodArguments.add(argument); + flag.addArgument(argument); + } + } + + this.set = true; + } + + public boolean testPermission(CommandSender sender) { + return !set || handler.getPermissionHandler().hasPermission(sender, permissions); + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/RootCommand.java b/src/main/java/se/ranzdo/bukkit/methodcommand/RootCommand.java index 5d15482..5a380d8 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/RootCommand.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/RootCommand.java @@ -1,26 +1,26 @@ package se.ranzdo.bukkit.methodcommand; -import java.lang.reflect.Method; - import org.bukkit.command.PluginCommand; +import java.lang.reflect.Method; + public class RootCommand extends RegisteredCommand { - private PluginCommand root; - - RootCommand(PluginCommand root, CommandHandler handler) { - super(root.getLabel(), handler, null); - this.root = root; - } - - public PluginCommand getBukkitCommand() { - return root; - } - - @Override - void set(Object methodInstance, Method method) { - super.set(methodInstance, method); - root.setDescription(getDescription()); - root.setUsage(getUsage()); - } + private PluginCommand root; + + RootCommand(PluginCommand root, CommandHandler handler) { + super(root.getLabel(), handler, null); + this.root = root; + } + + public PluginCommand getBukkitCommand() { + return root; + } + + @Override + void set(Object methodInstance, Method method) { + super.set(methodInstance, method); + root.setDescription(getDescription()); + root.setUsage(getUsage()); + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/TransformError.java b/src/main/java/se/ranzdo/bukkit/methodcommand/TransformError.java index 7dba368..bb14848 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/TransformError.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/TransformError.java @@ -1,10 +1,10 @@ package se.ranzdo.bukkit.methodcommand; public class TransformError extends CommandError { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - public TransformError(String msg) { - super(msg); - } + public TransformError(String msg) { + super(msg); + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/VerifierNotRegistered.java b/src/main/java/se/ranzdo/bukkit/methodcommand/VerifierNotRegistered.java index c7c6682..06f0046 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/VerifierNotRegistered.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/VerifierNotRegistered.java @@ -1,9 +1,9 @@ package se.ranzdo.bukkit.methodcommand; public class VerifierNotRegistered extends RuntimeException { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - public VerifierNotRegistered(String verifierName) { - super("The verify method named "+verifierName+" is not registered"); - } + public VerifierNotRegistered(String verifierName) { + super("The verify method named " + verifierName + " is not registered"); + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/VerifyError.java b/src/main/java/se/ranzdo/bukkit/methodcommand/VerifyError.java index e2c4940..13bdf12 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/VerifyError.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/VerifyError.java @@ -1,10 +1,10 @@ package se.ranzdo.bukkit.methodcommand; public class VerifyError extends CommandError { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - public VerifyError(String msg) { - super(msg); - } + public VerifyError(String msg) { + super(msg); + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/Wildcard.java b/src/main/java/se/ranzdo/bukkit/methodcommand/Wildcard.java index dbada08..d6fd48e 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/Wildcard.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/Wildcard.java @@ -8,5 +8,5 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) public @interface Wildcard { - boolean join() default true; + boolean join() default true; } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/WildcardArgument.java b/src/main/java/se/ranzdo/bukkit/methodcommand/WildcardArgument.java index 2e3eaef..ffbe6f6 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/WildcardArgument.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/WildcardArgument.java @@ -1,56 +1,58 @@ package se.ranzdo.bukkit.methodcommand; -import java.lang.reflect.Array; - import org.bukkit.command.CommandSender; +import java.lang.reflect.Array; + public class WildcardArgument extends CommandArgument { - private boolean join; - - public WildcardArgument(Arg commandArgAnnotation, Class argumentClass, ArgumentHandler argumentHandler, boolean join) { - super(commandArgAnnotation, argumentClass, argumentHandler); - this.join = join; - } - - public WildcardArgument(String name, String description, String def, String verifiers, Class argumentClass, ArgumentHandler handler, boolean join) { - super(name, description, def, verifiers, argumentClass, handler); - this.join = join; - } - - @Override - public Object execute(CommandSender sender, Arguments args) throws CommandError { - if(!args.hasNext()) { - Object o = getHandler().handle(sender, this, getDefault().equals(" ") ? "" : getDefault()); - if(join) - return o; - else { - Object array = Array.newInstance(getArgumentClass(), 1); - Array.set(array, 0, o); - return array; - } - } - - if(join) { - StringBuilder sb = new StringBuilder(); - - while(args.hasNext()) { - sb.append(args.nextArgument()).append(" "); - } - - return getHandler().handle(sender, this, CommandUtil.escapeArgumentVariable(sb.toString().trim())); - } - else { - Object array = Array.newInstance(getArgumentClass(), args.over()); - - for(int i = 0; i < args.over();i++) - Array.set(array, i, getHandler().handle(sender, this, CommandUtil.escapeArgumentVariable(args.nextArgument()))); - - return array; - } - } - - public boolean willJoin() { - return join; - } + private boolean join; + + public WildcardArgument(Arg commandArgAnnotation, Class argumentClass, ArgumentHandler argumentHandler, + boolean join) { + super(commandArgAnnotation, argumentClass, argumentHandler); + this.join = join; + } + + public WildcardArgument(String name, String description, String def, String verifiers, Class argumentClass, + ArgumentHandler handler, boolean join) { + super(name, description, def, verifiers, argumentClass, handler); + this.join = join; + } + + @Override + public Object execute(CommandSender sender, Arguments args) throws CommandError { + if (!args.hasNext()) { + Object o = getHandler().handle(sender, this, getDefault().equals(" ") ? "" : getDefault()); + if (join) + return o; + else { + Object array = Array.newInstance(getArgumentClass(), 1); + Array.set(array, 0, o); + return array; + } + } + + if (join) { + StringBuilder sb = new StringBuilder(); + + while (args.hasNext()) { + sb.append(args.nextArgument()).append(" "); + } + + return getHandler().handle(sender, this, CommandUtil.escapeArgumentVariable(sb.toString().trim())); + } else { + Object array = Array.newInstance(getArgumentClass(), args.over()); + + for (int i = 0; i < args.over(); i++) + Array.set(array, i, getHandler().handle(sender, this, CommandUtil.escapeArgumentVariable(args + .nextArgument()))); + + return array; + } + } + + public boolean willJoin() { + return join; + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/DoubleArgumentHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/DoubleArgumentHandler.java index 478c28d..7ca7d8f 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/DoubleArgumentHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/DoubleArgumentHandler.java @@ -1,22 +1,20 @@ package se.ranzdo.bukkit.methodcommand.handlers; import org.bukkit.command.CommandSender; - import se.ranzdo.bukkit.methodcommand.CommandArgument; import se.ranzdo.bukkit.methodcommand.TransformError; public class DoubleArgumentHandler extends NumberArgumentHandler { - public DoubleArgumentHandler() { - setMessage("parse_error", "The parameter [%p] is not a number"); - } - - @Override - public Double transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { - try { - return Double.parseDouble(value); - } - catch(NumberFormatException e) { - throw new TransformError(argument.getMessage("parse_error")); - } - } + public DoubleArgumentHandler() { + setMessage("parse_error", "The parameter [%p] is not a number"); + } + + @Override + public Double transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { + try { + return Double.parseDouble(value); + } catch (NumberFormatException e) { + throw new TransformError(argument.getMessage("parse_error")); + } + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/EntityTypeArgumentHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/EntityTypeArgumentHandler.java index 583ee5d..7600f04 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/EntityTypeArgumentHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/EntityTypeArgumentHandler.java @@ -2,32 +2,31 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.EntityType; - import se.ranzdo.bukkit.methodcommand.ArgumentHandler; import se.ranzdo.bukkit.methodcommand.CommandArgument; import se.ranzdo.bukkit.methodcommand.TransformError; public class EntityTypeArgumentHandler extends ArgumentHandler { - public EntityTypeArgumentHandler() { - setMessage("parse_error", "There is no entity named %1"); - setMessage("include_error", "There is no entity named %1"); - setMessage("exclude_error", "There is no entity named %1"); - } - - @Override - public EntityType transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { - try { - return EntityType.fromId(Integer.parseInt(value)); - } - catch(NumberFormatException e) {} - - EntityType t = EntityType.fromName(value); - - if(t != null) - return t; - - throw new TransformError(argument.getMessage("parse_error", value)); - } - + public EntityTypeArgumentHandler() { + setMessage("parse_error", "There is no entity named %1"); + setMessage("include_error", "There is no entity named %1"); + setMessage("exclude_error", "There is no entity named %1"); + } + + @Override + public EntityType transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { + try { + return EntityType.fromId(Integer.parseInt(value)); + } catch (NumberFormatException ignored) {} + + EntityType t = EntityType.fromName(value); + + if (t != null) { + return t; + } + + throw new TransformError(argument.getMessage("parse_error", value)); + } + } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/IntegerArgumentHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/IntegerArgumentHandler.java index 02830b4..55bf0c7 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/IntegerArgumentHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/IntegerArgumentHandler.java @@ -1,22 +1,20 @@ package se.ranzdo.bukkit.methodcommand.handlers; import org.bukkit.command.CommandSender; - import se.ranzdo.bukkit.methodcommand.CommandArgument; import se.ranzdo.bukkit.methodcommand.TransformError; public class IntegerArgumentHandler extends NumberArgumentHandler { - public IntegerArgumentHandler() { - setMessage("parse_error", "The parameter [%p] is not an integer"); - } - - @Override - public Integer transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { - try { - return Integer.parseInt(value); - } - catch(NumberFormatException e) { - throw new TransformError(argument.getMessage("parse_error")); - } - } + public IntegerArgumentHandler() { + setMessage("parse_error", "The parameter [%p] is not an integer"); + } + + @Override + public Integer transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + throw new TransformError(argument.getMessage("parse_error")); + } + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/MaterialArgumentHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/MaterialArgumentHandler.java index 6af5503..791937d 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/MaterialArgumentHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/MaterialArgumentHandler.java @@ -2,37 +2,36 @@ import org.bukkit.Material; import org.bukkit.command.CommandSender; - import se.ranzdo.bukkit.methodcommand.ArgumentHandler; import se.ranzdo.bukkit.methodcommand.CommandArgument; import se.ranzdo.bukkit.methodcommand.TransformError; -public class MaterialArgumentHandler extends ArgumentHandler{ - - public MaterialArgumentHandler() { - setMessage("parse_error", "The parameter [%p] is not a valid material."); - setMessage("include_error", "There is no material named %1"); - setMessage("exclude_error", "There is no material named %1"); - } - - @Override - public Material transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { - Material m = null; - try { - m = Material.getMaterial(Integer.parseInt(value)); - } - catch(NumberFormatException e) {} - - if(m != null) - return m; - - m = Material.getMaterial(value); - - if(m != null) - return m; - - - throw new TransformError(argument.getMessage("parse_error")); - } +public class MaterialArgumentHandler extends ArgumentHandler { + + public MaterialArgumentHandler() { + setMessage("parse_error", "The parameter [%p] is not a valid material."); + setMessage("include_error", "There is no material named %1"); + setMessage("exclude_error", "There is no material named %1"); + } + + @Override + public Material transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { + Material m = null; + try { + m = Material.getMaterial(Integer.parseInt(value)); + } catch (NumberFormatException ignored) {} + + if (m != null) { + return m; + } + + m = Material.getMaterial(value); + + if (m == null) { + throw new TransformError(argument.getMessage("parse_error")); + } + + return m; + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/NumberArgumentHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/NumberArgumentHandler.java index f856724..67d5877 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/NumberArgumentHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/NumberArgumentHandler.java @@ -1,72 +1,65 @@ package se.ranzdo.bukkit.methodcommand.handlers; -import org.bukkit.command.CommandSender; - import se.ranzdo.bukkit.methodcommand.ArgumentHandler; -import se.ranzdo.bukkit.methodcommand.ArgumentVerifier; -import se.ranzdo.bukkit.methodcommand.CommandArgument; import se.ranzdo.bukkit.methodcommand.InvalidVerifyArgument; import se.ranzdo.bukkit.methodcommand.VerifyError; public abstract class NumberArgumentHandler extends ArgumentHandler { - - public NumberArgumentHandler() { - setMessage("min_error", "The parameter [%p] must be equal or greater than %1"); - setMessage("max_error", "The parameter [%p] must be equal or less than %1"); - setMessage("range_error", "The parameter [%p] must be equal or greater than %1 and less than or equal to %2"); - - addVerifier("min", new ArgumentVerifier() { - @Override - public void verify(CommandSender sender, CommandArgument argument, String verifyName, String[] verifyArgs, T value, String valueRaw) throws VerifyError { - if(verifyArgs.length != 1) - throw new InvalidVerifyArgument(argument.getName()); - - try { - double min = Double.parseDouble(verifyArgs[0]); - if(value.doubleValue() < min) - throw new VerifyError(argument.getMessage("min_error", verifyArgs[0])); - } - catch (NumberFormatException e) { - throw new InvalidVerifyArgument(argument.getName()); - } - } - }); - - addVerifier("max", new ArgumentVerifier() { - @Override - public void verify(CommandSender sender, CommandArgument argument, String verifyName, String[] verifyArgs, T value, String valueRaw) throws VerifyError { - if(verifyArgs.length != 1) - throw new InvalidVerifyArgument(argument.getName()); - - try { - double max = Double.parseDouble(verifyArgs[0]); - if(value.doubleValue() > max) - throw new VerifyError(argument.getMessage("max_error", verifyArgs[0])); - } - catch (NumberFormatException e) { - throw new InvalidVerifyArgument(argument.getName()); - } - } - }); - - addVerifier("range", new ArgumentVerifier() { - @Override - public void verify(CommandSender sender, CommandArgument argument, String verifyName, String[] verifyArgs, T value, String valueRaw) throws VerifyError { - if(verifyArgs.length != 2) - throw new InvalidVerifyArgument(argument.getName()); - - try { - double min = Double.parseDouble(verifyArgs[0]); - double max = Double.parseDouble(verifyArgs[1]); - double dvalue = value.doubleValue(); - if(dvalue < min || dvalue > max) - throw new VerifyError(argument.getMessage("range_error", verifyArgs[0], verifyArgs[1])); - } - catch (NumberFormatException e) { - throw new InvalidVerifyArgument(argument.getName()); - } - } - }); - } + + public NumberArgumentHandler() { + setMessage("min_error", "The parameter [%p] must be equal or greater than %1"); + setMessage("max_error", "The parameter [%p] must be equal or less than %1"); + setMessage("range_error", "The parameter [%p] must be equal or greater than %1 and less than or equal to %2"); + + addVerifier("min", (sender, argument, verifyName, verifyArgs, value, valueRaw) -> { + if (verifyArgs.length != 1) { + throw new InvalidVerifyArgument(argument.getName()); + } + + try { + double min = Double.parseDouble(verifyArgs[0]); + + if (value.doubleValue() < min) { + throw new VerifyError(argument.getMessage("min_error", verifyArgs[0])); + } + } catch (NumberFormatException e) { + throw new InvalidVerifyArgument(argument.getName()); + } + }); + + addVerifier("max", (sender, argument, verifyName, verifyArgs, value, valueRaw) -> { + if (verifyArgs.length != 1) { + throw new InvalidVerifyArgument(argument.getName()); + } + + try { + double max = Double.parseDouble(verifyArgs[0]); + + if (value.doubleValue() > max) { + throw new VerifyError(argument.getMessage("max_error", verifyArgs[0])); + } + } catch (NumberFormatException e) { + throw new InvalidVerifyArgument(argument.getName()); + } + }); + + addVerifier("range", (sender, argument, verifyName, verifyArgs, value, valueRaw) -> { + if (verifyArgs.length != 2) { + throw new InvalidVerifyArgument(argument.getName()); + } + + try { + double min = Double.parseDouble(verifyArgs[0]); + double max = Double.parseDouble(verifyArgs[1]); + double dvalue = value.doubleValue(); + + if (dvalue < min || dvalue > max) { + throw new VerifyError(argument.getMessage("range_error", verifyArgs[0], verifyArgs[1])); + } + } catch (NumberFormatException e) { + throw new InvalidVerifyArgument(argument.getName()); + } + }); + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/PlayerArgumentHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/PlayerArgumentHandler.java index 8ef30e4..07e0871 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/PlayerArgumentHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/PlayerArgumentHandler.java @@ -3,35 +3,32 @@ import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; - import se.ranzdo.bukkit.methodcommand.ArgumentHandler; -import se.ranzdo.bukkit.methodcommand.ArgumentVariable; import se.ranzdo.bukkit.methodcommand.CommandArgument; import se.ranzdo.bukkit.methodcommand.CommandError; import se.ranzdo.bukkit.methodcommand.TransformError; public class PlayerArgumentHandler extends ArgumentHandler { - public PlayerArgumentHandler() { - setMessage("player_not_online", "The player %1 is not online"); - - addVariable("sender", "The command executor", new ArgumentVariable() { - @Override - public Player var(CommandSender sender, CommandArgument argument, String varName) throws CommandError { - if(!(sender instanceof Player)) - throw new CommandError(argument.getMessage("cant_as_console")); - - return ((Player)sender); - } - }); - } + public PlayerArgumentHandler() { + setMessage("player_not_online", "The player %1 is not online"); + + addVariable("sender", "The command executor", (sender, argument, varName) -> { + if (!(sender instanceof Player)) { + throw new CommandError(argument.getMessage("cant_as_console")); + } + + return ((Player) sender); + }); + } + + @Override + public Player transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { + Player p = Bukkit.getPlayer(value); + if (p == null) { + throw new TransformError(argument.getMessage("player_not_online", value)); + } - @Override - public Player transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { - Player p = Bukkit.getPlayer(value); - if(p == null) - throw new TransformError(argument.getMessage("player_not_online", value)); - - return p; - } + return p; + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/StringArgumentHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/StringArgumentHandler.java index d76ca99..60549d1 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/StringArgumentHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/StringArgumentHandler.java @@ -1,58 +1,50 @@ package se.ranzdo.bukkit.methodcommand.handlers; import org.bukkit.command.CommandSender; - -import se.ranzdo.bukkit.methodcommand.ArgumentHandler; -import se.ranzdo.bukkit.methodcommand.ArgumentVerifier; -import se.ranzdo.bukkit.methodcommand.CommandArgument; -import se.ranzdo.bukkit.methodcommand.InvalidVerifyArgument; -import se.ranzdo.bukkit.methodcommand.TransformError; +import se.ranzdo.bukkit.methodcommand.*; import se.ranzdo.bukkit.methodcommand.VerifyError; public class StringArgumentHandler extends ArgumentHandler { - public StringArgumentHandler() { - setMessage("min_error", "The parameter [%p] must be more than %1 characters."); - setMessage("max_error", "The parameter [%p] can't be more than %1 characters."); - - addVerifier("min", new ArgumentVerifier() { - @Override - public void verify(CommandSender sender, CommandArgument argument, String verifyName, String[] verifyArgs, String value, String valueRaw) throws VerifyError { - if(verifyArgs.length != 1) - throw new InvalidVerifyArgument(argument.getName()); - - try { - int min = Integer.parseInt(verifyArgs[0]); - if(value.length() < min) - throw new VerifyError(argument.getMessage("min_error", verifyArgs[0])); - } - catch (NumberFormatException e) { - throw new InvalidVerifyArgument(argument.getName()); - } - } - }); - - - addVerifier("max", new ArgumentVerifier() { - @Override - public void verify(CommandSender sender, CommandArgument argument, String verifyName, String[] verifyArgs, String value, String valueRaw) throws VerifyError { - if(verifyArgs.length != 1) - throw new InvalidVerifyArgument(argument.getName()); - - try { - int max = Integer.parseInt(verifyArgs[0]); - if(value.length() > max) - throw new VerifyError(argument.getMessage("max_error", verifyArgs[0])); - } - catch (NumberFormatException e) { - throw new InvalidVerifyArgument(argument.getName()); - } - } - }); - } - - @Override - public String transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { - return value; - } + public StringArgumentHandler() { + setMessage("min_error", "The parameter [%p] must be more than %1 characters."); + setMessage("max_error", "The parameter [%p] can't be more than %1 characters."); + + addVerifier("min", (sender, argument, verifyName, verifyArgs, value, valueRaw) -> { + if (verifyArgs.length != 1) { + throw new InvalidVerifyArgument(argument.getName()); + } + + try { + int min = Integer.parseInt(verifyArgs[0]); + + if (value.length() < min) { + throw new VerifyError(argument.getMessage("min_error", verifyArgs[0])); + } + } catch (NumberFormatException e) { + throw new InvalidVerifyArgument(argument.getName()); + } + }); + + addVerifier("max", (sender, argument, verifyName, verifyArgs, value, valueRaw) -> { + if (verifyArgs.length != 1) { + throw new InvalidVerifyArgument(argument.getName()); + } + + try { + int max = Integer.parseInt(verifyArgs[0]); + + if (value.length() > max) { + throw new VerifyError(argument.getMessage("max_error", verifyArgs[0])); + } + } catch (NumberFormatException e) { + throw new InvalidVerifyArgument(argument.getName()); + } + }); + } + + @Override + public String transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { + return value; + } } diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/WorldArgumentHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/WorldArgumentHandler.java index 986355e..a4da9ae 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/WorldArgumentHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/handlers/WorldArgumentHandler.java @@ -4,34 +4,33 @@ import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; - import se.ranzdo.bukkit.methodcommand.ArgumentHandler; -import se.ranzdo.bukkit.methodcommand.ArgumentVariable; import se.ranzdo.bukkit.methodcommand.CommandArgument; import se.ranzdo.bukkit.methodcommand.CommandError; import se.ranzdo.bukkit.methodcommand.TransformError; public class WorldArgumentHandler extends ArgumentHandler { - public WorldArgumentHandler() { - setMessage("world_not_found", "The world \"%1\" was not found"); - - addVariable("sender", "The command executor", new ArgumentVariable() { - @Override - public World var(CommandSender sender, CommandArgument argument, String varName) throws CommandError { - if(!(sender instanceof Player)) - throw new CommandError(argument.getMessage("cant_as_console")); - - return ((Player)sender).getWorld(); - } - }); - } - - @Override - public World transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { - World world = Bukkit.getWorld(value); - if(world == null) - throw new TransformError(argument.getMessage("world_not_found", value)); - return world; - } + public WorldArgumentHandler() { + setMessage("world_not_found", "The world \"%1\" was not found"); + + addVariable("sender", "The command executor", (sender, argument, varName) -> { + if (!(sender instanceof Player)) { + throw new CommandError(argument.getMessage("cant_as_console")); + } + + return ((Player) sender).getWorld(); + }); + } + + @Override + public World transform(CommandSender sender, CommandArgument argument, String value) throws TransformError { + World world = Bukkit.getWorld(value); + + if (world == null) { + throw new TransformError(argument.getMessage("world_not_found", value)); + } + + return world; + } } From 7a1d1106df89f43617ac93c801b720cebb33abda Mon Sep 17 00:00:00 2001 From: Nikolaos Grammatikos Date: Fri, 26 May 2017 23:30:53 +0100 Subject: [PATCH 2/2] Update for Spigot API v1.12-pre5-SNAPSHOT. --- pom.xml | 2 +- .../bukkit/methodcommand/CommandHandler.java | 14 +++++--------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 19758f3..5bd8cfc 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ org.spigotmc spigot-api - 1.11.2-R0.1-SNAPSHOT + 1.12-pre5-SNAPSHOT jar provided diff --git a/src/main/java/se/ranzdo/bukkit/methodcommand/CommandHandler.java b/src/main/java/se/ranzdo/bukkit/methodcommand/CommandHandler.java index 49eb485..942f262 100644 --- a/src/main/java/se/ranzdo/bukkit/methodcommand/CommandHandler.java +++ b/src/main/java/se/ranzdo/bukkit/methodcommand/CommandHandler.java @@ -79,7 +79,7 @@ public String[] getHelpMessage(RegisteredCommand command) { for (Flag flag : flags) { StringBuilder args = new StringBuilder(); for (FlagArgument argument : flag.getArguments()) { - args.append(" [" + argument.getName() + "]"); + args.append(" [").append(argument.getName()).append("]"); } message.add("-" + flag.getIdentifier() + ChatColor.AQUA + args.toString()); @@ -217,14 +217,10 @@ public void registerCommands(Object commands) { rootPcommand.setExecutor(this); } - RootCommand rootCommand = rootCommands.get(rootPcommand); - - if (rootCommand == null) { - rootCommand = new RootCommand(rootPcommand, this); - rootCommands.put(rootPcommand, rootCommand); - } - - RegisteredCommand mainCommand = rootCommand; + RegisteredCommand mainCommand = rootCommands.computeIfAbsent( + rootPcommand, + k -> new RootCommand(rootPcommand, this) + ); for (int i = 1; i < identifiers.length; i++) { String suffix = identifiers[i];