diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/abstraction/Command.java b/common/src/main/java/me/lucko/luckperms/common/commands/abstraction/Command.java index a154dc802..3837970d4 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/abstraction/Command.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/abstraction/Command.java @@ -34,43 +34,57 @@ import me.lucko.luckperms.common.commands.CommandResult; import me.lucko.luckperms.common.commands.sender.Sender; import me.lucko.luckperms.common.locale.LocalizedSpec; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; +import me.lucko.luckperms.common.utils.Predicates; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Predicate; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + /** * An abstract command class * - * @param the type required by the {@link #execute(LuckPermsPlugin, Sender, Object, List, String)} method of this command + * @param the argument type required by the command * @param the type of any child commands */ public abstract class Command { + /** + * The commands specification. + * + * Contains details about usage, description, etc + */ + @Nonnull private final LocalizedSpec spec; /** * The name of the command. Should be properly capitalised. */ + @Nonnull private final String name; /** * The permission required to use this command. Nullable. */ + @Nullable private final CommandPermission permission; /** * A predicate used for testing the size of the arguments list passed to this command */ - private final Predicate argumentCheck; + @Nonnull + private Predicate argumentCheck = Predicates.alwaysFalse(); /** * Child commands. Nullable. */ + @Nullable private final List> children; - public Command(LocalizedSpec spec, String name, CommandPermission permission, Predicate argumentCheck, List> children) { + public Command(@Nonnull LocalizedSpec spec, @Nonnull String name, @Nullable CommandPermission permission, @Nonnull Predicate argumentCheck, @Nullable List> children) { this.spec = spec; this.name = name; this.permission = permission; @@ -78,32 +92,104 @@ public abstract class Command { this.children = children == null ? null : ImmutableList.copyOf(children); } - public Command(LocalizedSpec spec, String name, CommandPermission permission, Predicate argumentCheck) { + public Command(@Nonnull LocalizedSpec spec, @Nonnull String name, @Nullable CommandPermission permission, @Nonnull Predicate argumentCheck) { this(spec, name, permission, argumentCheck, null); } - public Command(LocalizedSpec spec, String name, Predicate argumentCheck) { + public Command(@Nonnull LocalizedSpec spec, @Nonnull String name, @Nonnull Predicate argumentCheck) { this(spec, name, null, argumentCheck, null); } - public abstract CommandResult execute(LuckPermsPlugin plugin, Sender sender, T t, List args, String label) throws CommandException; - - public List tabComplete(LuckPermsPlugin plugin, Sender sender, List args) { - return Collections.emptyList(); - } - + /** + * Gets the commands spec. + * + * @return the command spec + */ + @Nonnull public LocalizedSpec getSpec() { return this.spec; } + /** + * Gets the short name of this command + * + *

The result should be appropriately capitalised.

+ * + * @return the command name + */ + @Nonnull public String getName() { return this.name; } + /** + * Gets the permission required by this command, if present + * + * @return the command permission + */ + @Nonnull + public Optional getPermission() { + return Optional.ofNullable(this.permission); + } + + /** + * Gets the predicate used to validate the number of arguments provided to + * the command on execution + * + * @return the argument checking predicate + */ + @Nonnull public Predicate getArgumentCheck() { return this.argumentCheck; } + /** + * Gets the commands children + * + * @return any child commands + */ + @Nonnull + public Optional>> getChildren() { + return Optional.ofNullable(this.children); + } + + /** + * Gets the commands description. + * + * @return the description + */ + public String getDescription() { + return getSpec().description(); + } + + /** + * Gets the usage of this command. + * Will only return a non empty result for main commands. + * + * @return the usage of this command. + */ + public String getUsage() { + String usage = getSpec().usage(); + return usage == null ? "" : usage; + } + + /** + * Gets the arguments required by this command + * + * @return the commands arguments + */ + public Optional> getArgs() { + return Optional.ofNullable(getSpec().args()); + } + + // Main execution method for the command. + public abstract CommandResult execute(LuckPermsPlugin plugin, Sender sender, T t, List args, String label) throws CommandException; + + // Tab completion method - default implementation is provided as some commands do not provide tab completions. + public List tabComplete(LuckPermsPlugin plugin, Sender sender, List args) { + return Collections.emptyList(); + } + /** * Sends a brief command usage message to the Sender. * If this command has child commands, the children are listed. Otherwise, a basic usage message is sent. @@ -137,37 +223,12 @@ public abstract class Command { } /** - * Returns if this command should be displayed in command listings, or "hidden" + * Gets if this command should be displayed in command listings, or "hidden" * - * @return if this command should be displayed in command listings, or "hidden" + * @return if the command should be displayed */ public boolean shouldDisplay() { return true; } - public String getDescription() { - return this.spec.description(); - } - - /** - * Returns the usage of this command. Will only return a non empty result for main commands. - * - * @return the usage of this command. - */ - public String getUsage() { - String usage = this.spec.usage(); - return usage == null ? "" : usage; - } - - public Optional getPermission() { - return Optional.ofNullable(this.permission); - } - - public Optional> getArgs() { - return Optional.ofNullable(this.spec.args()); - } - - public Optional>> getChildren() { - return Optional.ofNullable(this.children); - } } diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/abstraction/MainCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/abstraction/MainCommand.java index a8b9fe090..e6d26b393 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/abstraction/MainCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/abstraction/MainCommand.java @@ -42,6 +42,8 @@ import java.util.Optional; import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; +import javax.annotation.Nonnull; + public abstract class MainCommand extends Command { // equals 1 if the command doesn't take a mid argument, e.g. /lp log sub-command.... @@ -191,6 +193,7 @@ public abstract class MainCommand extends Command { return getChildren().get().stream().anyMatch(sc -> sc.isAuthorized(sender)); } + @Nonnull @Override public Optional>> getChildren() { return super.getChildren(); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/impl/migration/MigrationMainCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/impl/migration/MigrationMainCommand.java index 198758b3d..41e340bdc 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/impl/migration/MigrationMainCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/impl/migration/MigrationMainCommand.java @@ -45,6 +45,8 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.locks.ReentrantLock; +import javax.annotation.Nonnull; + public class MigrationMainCommand extends MainCommand { private static final Map PLUGINS = ImmutableBiMap.builder() // bukkit @@ -69,6 +71,7 @@ public class MigrationMainCommand extends MainCommand { super(CommandSpec.MIGRATION.spec(locale), "Migration", 1, null); } + @Nonnull @Override public synchronized Optional>> getChildren() { if (this.commands == null) { diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/commands/SpongeMainCommand.java b/sponge/src/main/java/me/lucko/luckperms/sponge/commands/SpongeMainCommand.java index 33f8d0731..c3ae3470f 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/commands/SpongeMainCommand.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/commands/SpongeMainCommand.java @@ -53,6 +53,8 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; +import javax.annotation.Nonnull; + public class SpongeMainCommand extends Command { private final LPSpongePlugin plugin; @@ -225,6 +227,7 @@ public class SpongeMainCommand extends Command { return this.subCommands.values().stream().flatMap(List::stream).collect(ImmutableCollectors.toList()); } + @Nonnull @Override public Optional>> getChildren() { return Optional.of(getSubCommands());