Added a registration method that returns information about successfully registered commands

Dieser Commit ist enthalten in:
zml2008 2011-11-11 15:47:50 -08:00
Ursprung 256897f473
Commit c29856f5a8

Datei anzeigen

@ -27,7 +27,6 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import com.sk89q.util.StringUtil; import com.sk89q.util.StringUtil;
import static com.sk89q.util.ArrayUtil.removePortionOfArray;
/** /**
* <p>Manager for handling commands. This allows you to easily process commands, * <p>Manager for handling commands. This allows you to easily process commands,
@ -103,21 +102,38 @@ public abstract class CommandsManager<T> {
registerMethods(cls, null); registerMethods(cls, null);
} }
/**
* Register an class that contains commands (denoted by {@link Command}.
* If no dependency injector is specified, then the methods of the
* class will be registered to be called statically. Otherwise, new
* instances will be created of the command classes and methods will
* not be called statically. A List of {@link Command} annotations from
* registered commands is returned.
*
* @param cls
* @return A List of {@link Command} annotations from registered commands,
* for use in eg. a dynamic command registration system.
*/
public List<Command> registerAndReturn(Class<?> cls) {
return registerMethods(cls, null);
}
/** /**
* Register the methods of a class. This will automatically construct * Register the methods of a class. This will automatically construct
* instances as necessary. * instances as necessary.
* *
* @param cls * @param cls
* @param parent * @param parent
* @return Commands Registered
*/ */
private void registerMethods(Class<?> cls, Method parent) { private List<Command> registerMethods(Class<?> cls, Method parent) {
try { try {
if (getInjector() == null) { if (getInjector() == null) {
registerMethods(cls, parent, null); return registerMethods(cls, parent, null);
} else { } else {
Object obj = null; Object obj = null;
obj = getInjector().getInstance(cls); obj = getInjector().getInstance(cls);
registerMethods(cls, parent, obj); return registerMethods(cls, parent, obj);
} }
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
logger.log(Level.SEVERE, "Failed to register commands", e); logger.log(Level.SEVERE, "Failed to register commands", e);
@ -126,6 +142,7 @@ public abstract class CommandsManager<T> {
} catch (InstantiationException e) { } catch (InstantiationException e) {
logger.log(Level.SEVERE, "Failed to register commands", e); logger.log(Level.SEVERE, "Failed to register commands", e);
} }
return null;
} }
/** /**
@ -134,8 +151,9 @@ public abstract class CommandsManager<T> {
* @param cls * @param cls
* @param parent * @param parent
*/ */
private void registerMethods(Class<?> cls, Method parent, Object obj) { private List<Command> registerMethods(Class<?> cls, Method parent, Object obj) {
Map<String, Method> map; Map<String, Method> map;
List<Command> registered = new ArrayList<Command>();
// Make a new hash map to cache the commands for this class // Make a new hash map to cache the commands for this class
// as looking up methods via reflection is fairly slow // as looking up methods via reflection is fairly slow
@ -180,6 +198,9 @@ public abstract class CommandsManager<T> {
} }
} }
// Add the command to the registered command list for return
registered.add(cmd);
// Look for nested commands -- if there are any, those have // Look for nested commands -- if there are any, those have
// to be cached too so that they can be quickly looked // to be cached too so that they can be quickly looked
// up when processing commands // up when processing commands
@ -191,6 +212,7 @@ public abstract class CommandsManager<T> {
} }
} }
} }
return registered;
} }
/** /**
@ -230,15 +252,21 @@ public abstract class CommandsManager<T> {
command.append(args[i] + " "); command.append(args[i] + " ");
} }
if (cmd.flags().length() > 0) { if (cmd.flags().length() > 0) {
List<Character> flagChars = new ArrayList<Character>();
char[] flags = cmd.flags().toCharArray(); char[] flags = cmd.flags().toCharArray();
for (int i = 0; i < flags.length; ++i) { for (int i = 0; i < flags.length; ++i) {
if (flags.length > i + 1) { if (flags.length > i + 1 && flags[i + 1] == ':') {
if (flags[i + 1] == ':') { i++; continue;
flags = removePortionOfArray(flags, i, i + 1, null);
} }
flagChars.add(flags[i]);
} }
if (flagChars.size() > 0) {
command.append("[-");
for (char character : flagChars) {
command.append(character);
}
command.append("] ");
} }
if (flags.length > 0) command.append("[-" + String.valueOf(flags) + "] ");
} }
command.append(cmd.usage()); command.append(cmd.usage());
@ -391,13 +419,13 @@ public abstract class CommandsManager<T> {
final Set<Character> valueFlags = new HashSet<Character>(); final Set<Character> valueFlags = new HashSet<Character>();
char[] flags = cmd.flags().toCharArray(); char[] flags = cmd.flags().toCharArray();
Set<Character> newFlags = new HashSet<Character>();
for (int i = 0; i < flags.length; ++i) { for (int i = 0; i < flags.length; ++i) {
if (flags.length > i + 1) { if (flags.length > i + 1 && flags[i + 1] == ':') {
if (flags[i + 1] == ':') {
valueFlags.add(flags[i]); valueFlags.add(flags[i]);
flags = removePortionOfArray(flags, i + 1, i + 1, null); ++i;
}
} }
newFlags.add(flags[i]);
} }
CommandContext context = new CommandContext(newArgs, valueFlags); CommandContext context = new CommandContext(newArgs, valueFlags);
@ -408,9 +436,8 @@ public abstract class CommandsManager<T> {
if (cmd.max() != -1 && context.argsLength() > cmd.max()) if (cmd.max() != -1 && context.argsLength() > cmd.max())
throw new CommandUsageException("Too many arguments.", getUsage(args, level, cmd)); throw new CommandUsageException("Too many arguments.", getUsage(args, level, cmd));
String flagStr = String.valueOf(flags);
for (char flag : context.getFlags()) { for (char flag : context.getFlags()) {
if (flagStr.indexOf(flag) == -1) if (!newFlags.contains(flag))
throw new CommandUsageException("Unknown flag: " + flag, getUsage(args, level, cmd)); throw new CommandUsageException("Unknown flag: " + flag, getUsage(args, level, cmd));
} }