/**
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.shell;

import java.util.Hashtable;

import org.logical_paradox.shell.exception.CommandExecutionException;

/**
 * ロードされたコマンドを登録しておくオブジェクト
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.5 $
 */
public class Commands {
	/**
	 * JVMで唯一のコマンド辞書
	 */
	private static final Hashtable commands = new Hashtable();
	private static DynamicCommandLoader loader = null;

	/**
	 * コンストラクタ
	 * @param se シェル環境変数
	 */
	public Commands(ShellEnv se) {
		if(loader == null) {
			loader = new DynamicCommandLoader(se);
		}
	}
	/**
	 * コマンドを登録する
	 * @param command 登録するコマンド
	 */
	public static void register(Command command) {
		commands.put(command.toString(), command);
	}
	/**
	 * コマンドを登録解除する
	 * @param command コマンド
	 */
	public static void unregister(Command command) {
		unregister(command.toString());
	}
	/**
	 * コマンドを登録解除する
	 * @param command コマンド
	 */
	public static void unregister(String command) {
		commands.remove(command);
	}
	/**
	 * コマンドが既にロードされているかどうかを返す
	 * @param name ロードするコマンド名
	 * @return true:ロードされている / false:ロードされていない
	 */
	public boolean isLoaded(String name) {
		if(commands.get(name) == null) {
			return false;
		} else {
			return true;
		}
	}
	/**
	 * 指定名称に対応するコマンドを返す
	 * @param name コマンド名
	 * @return コマンドクラス
	 * @throws CommandExecutionException ロードに失敗した
	 */
	public Command getCommand(String name) throws CommandExecutionException {
		Command command = (Command)commands.get(name);
		if(isLoaded(name) == false) {
			// コマンドクラスをロードする
			try {
				command = loader.load(name);
				commands.put(name, command);
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		return command;
	}
}
