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

import org.logical_paradox.shell.exception.CommandExecutionException;


/**
 * ダイナミックコマンドローダー
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.5 $
 */
public class DynamicCommandLoader {
	/** コマンドが格納されているパッケージ */
	private String packageIdentifier = null;
	private ShellEnv env = null;

	/**
	 * コンストラクタ
	 * @param se シェル環境変数
	 */
	public DynamicCommandLoader(ShellEnv se) {
		env = se;
		if(env != null && env.getProperty("COMMAND_PACKAGE_NAME") != null) {
			packageIdentifier = env.getProperty("COMMAND_PACKAGE_NAME");
		}
	}
	/**
	 * 指定コマンドをロードする
	 * @param name コマンド名
	 * @return ロードしインスタンス化されたコマンドクラス
	 * @throws ClassNotFoundException 指定された名前のクラスがクラスパスに存在しない
	 * @throws InstantiationException ロードに失敗した
	 * @throws IllegalAccessException インスタンス化に必要なセキュリティが付与されていない
	 * @throws CommandExecutionException 生成されたクラスがコマンドでない
	 */
	Command load(String name) throws InstantiationException, IllegalAccessException, CommandExecutionException {
		Class commandClass = null;
		Command command = null;
		try {
			if(packageIdentifier != null) {
				name = packageIdentifier + "." + name;
			}
			commandClass = ClassLoader.getSystemClassLoader().loadClass(name);
			command = (Command)commandClass.newInstance();
			if(command instanceof Command == false) {
				throw new CommandExecutionException();
			}
		} catch (ClassNotFoundException e) {
			// 指定されたコマンドがない場合
			throw new CommandExecutionException();
		}
		return command;
	}
}
