1 package org.bukkit.command;
3 import static org.bukkit.util.Java15Compat.Arrays_copyOfRange;
5 import java.util.ArrayList;
6 import java.util.Collection;
7 import java.util.Collections;
8 import java.util.HashMap;
9 import java.util.HashSet;
10 import java.util.Iterator;
11 import java.util.List;
14 import java.util.regex.Pattern;
16 import org.apache.commons.lang.Validate;
17 import org.bukkit.Server;
18 import org.bukkit.command.defaults.*;
19 import org.bukkit.util.StringUtil;
22 private static final Pattern PATTERN_ON_SPACE = Pattern.compile(
" ", Pattern.LITERAL);
23 protected final Map<String, Command>
knownCommands =
new HashMap<String, Command>();
24 protected final Set<String>
aliases =
new HashSet<String>();
25 private final Server server;
26 protected static final Set<VanillaCommand>
fallbackCommands =
new HashSet<VanillaCommand>();
62 setDefaultCommands(server);
65 private void setDefaultCommands(
final Server server) {
66 register(
"bukkit",
new SaveCommand());
67 register(
"bukkit",
new SaveOnCommand());
68 register(
"bukkit",
new SaveOffCommand());
69 register(
"bukkit",
new StopCommand());
70 register(
"bukkit",
new VersionCommand(
"version"));
71 register(
"bukkit",
new ReloadCommand(
"reload"));
72 register(
"bukkit",
new PluginsCommand(
"plugins"));
73 register(
"bukkit",
new TimingsCommand(
"timings"));
79 public void registerAll(String fallbackPrefix, List<Command> commands) {
80 if (commands != null) {
82 register(fallbackPrefix, c);
90 public boolean register(String fallbackPrefix,
Command command) {
91 return register(command.getName(), fallbackPrefix, command);
97 public boolean register(String label, String fallbackPrefix,
Command command) {
98 boolean registeredPassedLabel =
register(label, fallbackPrefix, command,
false);
100 Iterator<String> iterator = command.getAliases().iterator();
101 while (iterator.hasNext()) {
102 if (!
register(iterator.next(), fallbackPrefix, command,
true)) {
108 command.register(
this);
110 return registeredPassedLabel;
123 private synchronized boolean register(String label, String fallbackPrefix,
Command command,
boolean isAlias) {
124 String lowerLabel = label.trim().toLowerCase();
132 String lowerPrefix = fallbackPrefix.trim().toLowerCase();
133 boolean registerdPassedLabel =
true;
137 lowerLabel = lowerPrefix +
":" + lowerLabel;
138 registerdPassedLabel =
false;
146 command.setLabel(lowerLabel);
150 return registerdPassedLabel;
155 if (cmd.matches(label)) {
171 String[] args = PATTERN_ON_SPACE.split(commandLine);
173 if (args.length == 0) {
177 String sentCommandLabel = args[0].toLowerCase();
180 if (target == null) {
186 target.
execute(sender, sentCommandLabel, Arrays_copyOfRange(args, 1, args.length));
189 }
catch (Throwable ex) {
190 throw new CommandException(
"Unhandled exception executing '" + commandLine +
"' in " + target, ex);
199 entry.getValue().unregister(
this);
203 setDefaultCommands(server);
208 if (target == null) {
215 Validate.notNull(sender,
"Sender cannot be null");
216 Validate.notNull(cmdLine,
"Command line cannot null");
218 int spaceIndex = cmdLine.indexOf(
' ');
220 if (spaceIndex == -1) {
221 ArrayList<String> completions =
new ArrayList<String>();
225 String name = command.getName();
227 if (!command.testPermissionSilent(sender)) {
230 if (knownCommands.containsKey(name)) {
239 completions.add(
'/' + name);
242 for (Map.Entry<String,
Command> commandEntry : knownCommands.entrySet()) {
243 Command command = commandEntry.getValue();
249 String name = commandEntry.getKey();
252 completions.add(
'/' + name);
256 Collections.sort(completions, String.CASE_INSENSITIVE_ORDER);
260 String commandName = cmdLine.substring(0, spaceIndex);
263 if (target == null) {
271 String argLine = cmdLine.substring(spaceIndex + 1, cmdLine.length());
272 String[] args = PATTERN_ON_SPACE.split(argLine, -1);
275 return target.
tabComplete(sender, commandName, args);
278 }
catch (Throwable ex) {
279 throw new CommandException(
"Unhandled exception executing tab-completer for '" + cmdLine +
"' in " + target, ex);
290 for (String alias : values.keySet()) {
291 String[] targetNames = values.get(alias);
292 List<Command> targets =
new ArrayList<Command>();
293 StringBuilder bad =
new StringBuilder();
295 for (String name : targetNames) {
298 if (command == null) {
299 if (bad.length() > 0) {
304 targets.add(command);
310 if (targets.size() > 0) {
316 if (bad.length() > 0) {
317 server.
getLogger().warning(
"The following command(s) could not be aliased under '" + alias +
"' because they do not exist: " + bad);