/
codebase/
codebase/area/
codebase/doc/
codebase/etc/
codebase/src/net/sourceforge/pain/data/trigger/
codebase/src/net/sourceforge/pain/logic/
codebase/src/net/sourceforge/pain/logic/affect/
codebase/src/net/sourceforge/pain/logic/event/
codebase/src/net/sourceforge/pain/logic/event/deploy/
codebase/src/net/sourceforge/pain/logic/event/guitool/
codebase/src/net/sourceforge/pain/logic/event/guitool/event/
codebase/src/net/sourceforge/pain/logic/fn/util/
codebase/src/net/sourceforge/pain/logic/trigger/
codebase/src/net/sourceforge/pain/logic/trigger/impl/
codebase/src/net/sourceforge/pain/network/console/
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/plugin/command/
codebase/src/net/sourceforge/pain/plugin/reset/
codebase/src/net/sourceforge/pain/plugin/shutdown/
codebase/src/net/sourceforge/pain/plugin/social/
codebase/src/net/sourceforge/pain/util/
db/doc/javadoc/resources/
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/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
package net.sourceforge.pain.logic.event.console;

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

import java.util.*;
import java.util.regex.*;

/**
 * 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.logic.event.console.command.";

    private static final String[] parsedCommand = new String[2];
    private static final Pattern commandPattern = Pattern.compile("\\S{1}\\s+\\S{1}");

    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) TriggerFactory.provideTrigger((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) Core.getPluginManager().getPlugin("command.CommandMapper");
    }

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


    public static void parseCommand(String line, String result[]) {
        Matcher matcher = commandPattern.matcher(line);
        if (matcher.find()) { // found spaces after command
            int commandEnd = matcher.start() + 1;
            result[0] = line.substring(0, commandEnd).trim(); //remove leading spaces
            int argStart = matcher.end() - 1;
            result[1] = line.substring(argStart);
        } else {
            result[0] = line.trim();
            result[1] = null;
        }
    }

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


}