/
area/
classes/net/sourceforge/pain/logic/
classes/net/sourceforge/pain/logic/event/
classes/net/sourceforge/pain/logic/fn/util/
classes/net/sourceforge/pain/network/console/
classes/net/sourceforge/pain/plugin/
classes/net/sourceforge/pain/plugin/reset/
classes/net/sourceforge/pain/plugin/shutdown/
classes/net/sourceforge/pain/plugin/social/
classest/net/sourceforge/pain/db/data/
doc/
doc/paindb/resources/
src/net/sourceforge/pain/logic/
src/net/sourceforge/pain/logic/event/
src/net/sourceforge/pain/logic/fn/util/
src/net/sourceforge/pain/network/console/
src/net/sourceforge/pain/network/console/telnet/
src/net/sourceforge/pain/plugin/
src/net/sourceforge/pain/plugin/command/
src/net/sourceforge/pain/plugin/reset/
src/net/sourceforge/pain/plugin/shutdown/
src/net/sourceforge/pain/plugin/social/
src/net/sourceforge/pain/util/
tests/
tests/net/sourceforge/pain/db/data/
package net.sourceforge.pain.logic.event.console.command.builder;

import net.sourceforge.pain.data.prototype.*;
import net.sourceforge.pain.data.type.*;
import net.sourceforge.pain.logic.event.console.*;
import net.sourceforge.pain.logic.event.console.command.*;
import net.sourceforge.pain.logic.fn.*;
import net.sourceforge.pain.logic.fn.util.*;
import net.sourceforge.pain.util.*;

/**
 * PAiN  Date: 05.06.2003  Time: 0:57:23
 */
public final class BuilderShell extends GrantedCommand {

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

	Builder builder = null;
	BuilderCommand activeCommand;

	public void processCommand() throws Exception {
		if (console.isCommandMode()) {
			builder = (Builder) player.getRole(Builder.class);
			if (builder != null) {
				showBuilderGreatings();
				showBuilderPrompt();
				Log.debug("BUILD_PROCESSOR:setting console to raw mode!");
				console.setRawMode(this);
			} else {
				processNotAccessible();
			}
		} else if (activeCommand != null) {
			processSubCommand();
		} else {
			String line = console.popInputLine();
			if (line.length() == 0) {
				showBuilderPrompt();
			} else if (line.equals("@")) {
				console.setCommandMode();
			} else {
				try {
					processBuildCommand(line);
				} catch (Exception e) {
					Log.error(e);
					MessageOutFn.outln(console, Utils.formattedStacktrace(e));
					throw e; // should rethrow to rollback changes since we do not craete internal subtransaction
				}
				if (activeCommand == null) {
					showBuilderPrompt();
				}
			}

		}
	}

	private void processSubCommand() throws Exception {
		try {
			activeCommand.processBuilderCommand(this, console.popInputLine());
		} catch (Exception e) {
			activeCommand = null;
			MessageOutFn.outln(console, Utils.formattedStacktrace(e));
			throw e;
		} finally {
			if (activeCommand == null) {
				showBuilderPrompt();
			}
		}
	}

	private void processBuildCommand(String line) throws Exception {
		ConsoleInputEvent.parseCommand(line, parsedCommand);
		String command = parsedCommand[0];
		String args = parsedCommand[1];
		Class builderCommandClass = null;

		Log.debug("BUILD_PROCESSOR: command:" + command);
		String className = commandNameToClassName(command);
		Log.debug("BUILD_PROCESSOR: commandNameToClassName" + className);
		try {
			builderCommandClass = Class.forName(className);
		} catch (ClassNotFoundException e) {
			Log.warn("Build command not found:"+command);
		}
		if (builderCommandClass == null) {
			MessageOutFn.outln(console, "ERROR:Unknown builder command\n");
		} else {
			BuilderCommand bcommand = (BuilderCommand) builderCommandClass.newInstance();
			bcommand.processBuilderCommand(this, args);
		}

	}

	static String commandNameToClassName(String command) {
		return "net.sourceforge.pain.logic.event.console.command.builder.BC_" + Utils.formatName(command);
	}

	private void showBuilderPrompt() {
		java.util.List pList = builder.getPrototypes();
		int pListSize = pList.size();
		MessageOutFn.out(console, "\n{c");
		if (pListSize == 0) {
			MessageOutFn.out(console, "[builder:no active prototypes]");
		} else {
			Prototype pr = builder.getEditedRole();
			if (pr == null) {
				MessageOutFn.out(console, "[builder: no active roles, prototypes in list:" + pListSize + "]");
			} else {
				PrototypeInfo pi = (PrototypeInfo) pr.getRole(PrototypeInfo.class);
				MessageOutFn.out(console, "[builder:" + pi.getVnum() + ":" + pi.getName() + "]");
				MessageOutFn.out(console, "[" + Utils.classNameWithoutPackage(pr.getClass()) + "]");
			}
		}
		MessageOutFn.out(console, (activeCommand == null ? "-" : activeCommand.getName()) + ">");
		MessageOutFn.out(console, "{x");
	}

	private void showBuilderGreatings() {
		MessageOutFn.outln(console, ">> Builder mode enabled!");
	}

	void setActiveCommand(BuilderCommand command) {
		activeCommand = command;
		if (activeCommand == null) {
			showBuilderPrompt();
		}
	}

	public void showHelp() {
		MessageOutFn.outln(console, command.name+": enables the builder mode");
	}

	public void onGrantAdded() throws Exception {
		player.addRole(Builder.class);
	}

	public void onGrantRemoved() throws Exception {
		player.removeRole(Builder.class);
	}
}