/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: CommandFactory.java,v 1.2 2005/09/07 13:38:07 rampil Exp $
 */
package org.logical_paradox.vsan.dac.command;

import java.util.HashMap;

import org.logical_paradox.common.util.StringUtils;
import org.logical_paradox.vsan.dac.DacProperty;
import org.logical_paradox.vsan.dac.command.handler.*;

/**
 * DACコマンドファクトリ
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public class CommandFactory {
	/** 既に生成されたプロトコルハンドラのマップ */
	private static final HashMap handlers = new HashMap();

	/**
	 * 指定されたタイプに応じたハンドラを返す
	 * @param type 命令種別
	 * @return 選択されたハンドラ
	 */
	public static final DacCommand getCommand(int type) {
		String key = "0" + Integer.toHexString(type);
		key = "0x" + key.substring(key.length() -2);

		DacCommand command = (DacCommand)handlers.get(key);
		if(command != null) {
			return command;
		}

		// キャッシュされていないので、新しいインスタンスを生成する
		String handlerClassname = DacProperty.getProperty(key);
		if(StringUtils.isEmpty(handlerClassname) == true) {
			return null;
		}
		try {
			Class clazz = Class.forName(handlerClassname);
			command = (DacCommand)clazz.newInstance();
			handlers.put(key, command);
			
			return command;
		} catch(Exception e) {
			return null;
		}
	}
}
