/
codebase/src/net/sourceforge/pain/admin/console/command/
codebase/src/net/sourceforge/pain/data/role/
codebase/src/net/sourceforge/pain/network/console/telnet/
codebase/src/net/sourceforge/pain/network/guitool/
codebase/src/net/sourceforge/pain/plugin/
codebase/src/net/sourceforge/pain/util/
db/src/net/sourceforge/pain/util/
gui/
gui/lib/
gui/src/net/sourceforge/pain/tools/guitool/dbbrowse/
gui/src/net/sourceforge/pain/tools/guitool/dialog/
gui/src/net/sourceforge/pain/tools/guitool/menu/
gui/src/net/sourceforge/pain/tools/guitool/resources/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/explorer/
mudlibs/tinylib/
mudlibs/tinylib/area/
mudlibs/tinylib/etc/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/prototype/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/deploy/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/fn/util/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/impl/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/command/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/reset/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/shutdown/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/social/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/util/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
package net.sourceforge.pain.tinylib.logic.event.console;

import net.sourceforge.pain.*;
import net.sourceforge.pain.admin.console.*;
import net.sourceforge.pain.data.*;
import net.sourceforge.pain.logic.*;
import net.sourceforge.pain.tinylib.*;
import net.sourceforge.pain.tinylib.data.type.*;
import net.sourceforge.pain.tinylib.logic.event.*;
import net.sourceforge.pain.tinylib.logic.fn.*;
import net.sourceforge.pain.tinylib.logic.trigger.*;
import net.sourceforge.pain.tinylib.plugin.command.*;
import net.sourceforge.pain.util.*;

import java.util.*;

/**
 * PAiN MUD CODEBASE.
 * User: fmike
 * Date: Jan 13, 2003
 * Time: 6:27:33 AM
 */
public class ConsoleInputEvent extends AbstractEvent {
    public static final String COMMAND_PACKAGE_PREFIX = "net.sourceforge.pain.tinylib.logic.event.console.command.";

    private static final String[] parsedCommand = new String[2];

    public Object execute(Object param) throws Exception {
        final Console console = (Console) param;
        triggerConsoleInput(console.getPlayer(), console.peekInputLine());
        CommandHandler handler;
        if (console.isRawMode()) {
            handler = (CommandHandler) console.getRawCommand();
        } else {
            final String line = console.popInputLine().trim();
            if (line.length() == 0) {
                return null;
            }
            handler = getCommandHandler(line, console);
            if (handler == null) {
                processFailedCommand(console);
            } else if (!handler.isAccessible()) {
                handler.processNotAccessible();
                handler = null;
            }
        }
        if (handler != null) {
            handler.processCommand();
        }
        return null;
    }

    private void triggerConsoleInput(Player p, String line) {
        if (p == null) {
            return;
        }
        for (Iterator it = p.getTriggersByEventType(TriggerType.TRIGGER_CONSOLE_INPUT); it.hasNext();) {
            try {
                ConsoleInputTrigger t = (ConsoleInputTrigger) TriggersLogicFactory.provideTriggerImpl((TriggerData) it.next());
                t.onConsoleInput(p, line);
            } catch (Exception e) {
                Log.error(e);
            }
        }
    }


    public static CommandHandler getCommandHandler(String inputLine, Console console) throws Exception {
        CommandHandler handler;
        parseCommand(inputLine, parsedCommand);
        String commandName = parsedCommand[0];
        String commandParams = parsedCommand[1];
        CommandMapper commandMapper = getCommandMapper();
        TextCommand textCommand = commandMapper.findCommand(commandName);
        if (textCommand == null) {
            return null;
        }
        handler = instantiateCommandHandler(textCommand.commandClassName);
        handler.commandParams = commandParams;
        handler.command = textCommand;
        Log.debug("ConsoleInputEvent.getCommandHandler: command:'" + commandName + "' tag:'" + textCommand.tag + "' args:'" + commandParams + "'");
        handler.console = console;
        handler.player = console.getPlayer();
        return handler;
    }

    public static CommandMapper getCommandMapper() {
        return (CommandMapper) Codebase.getPluginManager().getPlugin("command.CommandMapper");
    }

    public static CommandHandler instantiateCommandHandler(String commandClassName) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        return (CommandHandler) Codebase.getLogicLoader().provideClass(COMMAND_PACKAGE_PREFIX + commandClassName).newInstance();
    }


    public static void processFailedCommand(Console console) {
        MessageOutFn.out(console, "what?\n");
    }

    public static void parseCommand(String line, String[] parsedcommand) {
        AdminConsoleInputEvent.parseCommand(line, parsedcommand);
    }


}