001package fr.aumgn.bukkitutils.command.executor;
002
003import org.apache.commons.lang.Validate;
004import org.bukkit.command.Command;
005import org.bukkit.command.CommandExecutor;
006import org.bukkit.command.CommandSender;
007import org.bukkit.command.PluginCommand;
008import org.bukkit.plugin.java.JavaPlugin;
009
010import fr.aumgn.bukkitutils.command.CommandsMessages;
011import fr.aumgn.bukkitutils.command.args.CommandArgsParser;
012
013public class NestedCommandExecutor implements CommandExecutor {
014
015    private final JavaPlugin plugin;
016    private final CommandsMessages messages;
017    private final String defaultTo;
018
019    public NestedCommandExecutor(JavaPlugin plugin, CommandsMessages messages,
020            String defaultTo) {
021        this.plugin = plugin;
022        this.messages = messages;
023        this.defaultTo = defaultTo;
024    }
025
026    @Override
027    public boolean onCommand(CommandSender sender,
028            Command cmd, String label, String[] rawArgs) {
029
030        CommandArgsParser parser =  new CommandArgsParser(messages, rawArgs);
031        String[] args = parser.linearize();
032
033        PluginCommand subCmd;
034        String[] subCmdArgs;
035        if (args.length == 0) {
036            if (defaultTo.isEmpty()) {
037                return false;
038            }
039
040            subCmd = plugin.getCommand(cmd.getName() + " " + defaultTo);
041            Validate.notNull(subCmd);
042            subCmdArgs = args;
043        } else {
044            subCmd = plugin.getCommand(cmd.getName() + " " + args[0]);
045            if (subCmd == null) {
046                if (defaultTo.isEmpty()) {
047                    return false;
048                }
049
050                subCmd = plugin.getCommand(cmd.getName() + " " + defaultTo);
051                Validate.notNull(subCmd);
052                subCmdArgs = args;
053            } else {
054                subCmdArgs = new String[args.length - 1];
055                System.arraycopy(args, 1, subCmdArgs, 0, args.length - 1);
056            }
057        }
058
059        subCmd.execute(sender, label + " " + args[0], subCmdArgs);
060        return true;
061    }
062}