//===========================================================================
// package
//===========================================================================
package jp.gr.java_conf.bugslife.selections;

//===========================================================================
// import
//===========================================================================
// Java core API
import java.util.*;
import java.text.*;

// DB API
import jp.gr.java_conf.bugslife.db.*;

// Util API
import jp.gr.java_conf.bugslife.util.*;
//import jp.gr.java_conf.bugslife.system.*;


/**
 *<PRE>
 * 
 * SelectionControlクラス
 * 
 *</PRE>
 * @version	0.0, 2001/09/10
 * @author	鰐川　正寛
 */
//===========================================================================
public class SelectionControl
{
//===========================================================================
// attributes
//===========================================================================
	/**
	 *	テーブル名
	 */
	private String m_tableName = null;
	/**
	 *	テーブル名(和名)
	 */
	private String m_tableNameJapanses = null;
	/**
	 *	ターゲットクラス
	 */
	private Object m_target = null;
	/**
	 *	コード
	 */
	private String m_code = null;
	/**
	 *	アクション
	 */
	private String m_action = null;
	/**
	 * 対象クラス名
	 */
	private static final String[] SELECTION_CLASS = {
									"ProcessName",
									"Milestone",
									"Subsystem",
									"FunctionName",
									"Resolution",
									"Priority",
									"Severity",
									"Location",
									"Os",
									"Browser",
									"AppVersion",
									"DbVersion",
									"HtmlVersion",
									"SpecVersion",
									"ErrorType",
									"ErrorCause",
									"ErrorPoint",
									"ErrorDelayReason",
									};
	/**
	 * 対象クラス名(和名)
	 */
	private static final String[] SELECTION_CLASS_NAME = {
									"工程名称",
									"マイルストーン",
									"サブシステム",
									"機能名",
									"対処方法",
									"優先度",
									"故障度",
									"ロケーション",
									"ＯＳ",
									"ブラウザ",
									"ＡＰバージョン",
									"ＤＢバージョン",
									"ＨＴＭＬバージョン",
									"機能バージョン",
									"エラー内容",
									"エラー原因",
									"エラー機能箇所",
									"エラー摘出遅延理由",
									};
//===========================================================================
// methods
//===========================================================================
	/**
	 *	デフォルトコンストラクタ
	 *
	 */
	public SelectionControl()
	{
		
	}
	/**
	 *	コンストラクタ(テーブル名指定）
	 *
	 * @param	 tableName	テーブル名
	 */
	public SelectionControl(String tableName)
	{
		this();
		
		m_target = getTarget(tableName);
		
	}
	/**
	 *	対象クラスの生成
	 *
	 * @param	 tableName	テーブル名
	 */
	private Object getTarget(String tableName) {
		//テーブル名チェック
		for (int i = 0; i < SELECTION_CLASS.length; i++) {
			if (SELECTION_CLASS[i].equals(tableName)) {
				m_tableName = tableName;
				m_tableNameJapanses = SELECTION_CLASS_NAME[i];
				break;
			}
		}
		if ( m_tableName == null) {
			Assert.check(false, "invalid table name tablename = " + tableName);
		}
		//インスタンス生成
		Object target = null;
		try {
			String className = "jp.gr.java_conf.bugslife.selections." + tableName;
			target = Class.forName(className).newInstance();
			
			if (target == null) {
				Assert.check(false, "instance is null className = " + className);
				
			}
			//ISelectionを備えているかチェック
			ISelection is  = (ISelection)target;
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return target;
	}
//======================================
// db access methods
//======================================
	/**
	 *	Selectionの取得
	 *
	 * @return	処理結果
	 */
	public Object getSelection()
	{
		
		//テーブル名確定前
		if (m_tableName == null) {
			
			Assert.check(false, "tableName null");
			
		//テーブル名確定後
		} else {
			if (m_code != null) {
				ISelection selection = (ISelection)m_target;
				selection.setCode(m_code);
				selection.load();
			}
		}
		return m_target;
	}
	/**
	 *	Collectionの取得
	 *
	 * @return	処理結果
	 */
	public Collection getCollection()
	{
		ArrayList list = null;
		
		//テーブル名確定前
		if (m_tableName == null) {
			list = new ArrayList(0);
		//テーブル名確定後
		} else {
			String sql = "SELECT * FROM " + m_tableName + " ORDER BY code";
			ArrayList params = new ArrayList();
			
			//debug
			debug("getCollection" + toString());
			
			list = DAO.find(m_target, sql, params);
		}
		return list;
	}
//======================================
// request param
//======================================
	/**
	 *	request parametorの生成
	 */
	public Map getMapping() {
		HashMap map = new HashMap();
		if (m_tableName != null) {
			map.put("t", m_tableName);
			if (m_code != null) {
				map.put("code", m_code);
			}
		}
		return map;
	}
	/**
	 *	request parametorの生成
	 */
	public String getTableParam(int index) {
		return SELECTION_CLASS[index];
	}
//======================================
// Property
//======================================
	/**
	 * テーブル名の取得
	 * 
	 * @return テーブル名
	 */
	public String getTableName()
	{
		return m_tableName;
	}
	/**
	 * テーブル名のセット
	 * 
	 * @param tableName テーブル名
	 */
	public void setTableName(String tableName)
	{
		m_tableName = tableName;
	}
	/**
	 * テーブル名の取得（文字列）
	 * 
	 * @return テーブル名
	 */
	public String getTableNameString()
	{
		return (m_tableName == null ? "" : m_tableName);
	}
	/**
	 * テーブル名(和名)の取得
	 * 
	 * @return テーブル名(和名)
	 */
	public String getTableNameJapanese()
	{
		return (m_tableNameJapanses == null ? "" : m_tableNameJapanses);
	}
	/**
	 * コードの取得
	 * 
	 * @return コード
	 */
	public String getCode()
	{
		return m_code;
	}
	/**
	 * コードのセット
	 * 
	 * @param code コード
	 */
	public void setCode(String code)
	{
		m_code = code;
	}
	/**
	 * アクションの取得
	 * 
	 * @return アクション
	 */
	public String getAction()
	{
		return m_action;
	}
	/**
	 * アクションのセット
	 * 
	 * @param action アクション
	 */
	public void setAction(String action)
	{
		m_action = action;
	}
//===========================================================================
// methods
//===========================================================================
	/**
	 *	クラス情報
	 */
	public String toString()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("--- [SELECTION CONTROL] --- \n");
		sb.append("tableName: " + m_tableName + "(" + m_tableNameJapanses +")\n");
		sb.append("code     : " + m_code + "\n");
		sb.append("target   : " + m_target + "\n");
		sb.append("action   : " + m_action + "\n");
		sb.append("--- [SELECTION CONTROL] --- \n");
		return sb.toString();
	}
	/**
	 * debug
	 */
	private static void debug(String s) {
		 
		 System.out.println("[SelectionControl]" + s);
		 
	}
	/**
	 *	テストメイン
	 */
	public static void main(String[] args)
	{
		System.out.println("------- << SelectionControl Test Start >> -----------");
		
		unitTest1();	//新規作成テスト
		unitTest2();	//ロードテスト
/*------------------------------------------------
		unitTest3();	//削除テスト
		unitTest4();	//全件取得テスト
		unitTest5();	//コード指定コンストラクトテスト
------------------------------------------------*/
		
		System.out.println("------- << SelectionControl Test End >> -----------");
	}
	
	/**
	 *	unitTest1
	 *
	 * リスト系テスト
	 *
	 */
	public static void unitTest1()
	{
		System.out.println("------- unitTest1 -----------");
		
		SelectionControl sc = null;
		sc = new SelectionControl();
		System.out.println("default contructor");
		System.out.println(sc.getTableNameString());
		System.out.println(sc.getTableNameJapanese());
		displayCollection(sc.getCollection());
		displayMap(sc.getMapping());
		
		String tableName = "Resolution";
		sc = new SelectionControl(tableName);
		System.out.println("table contructor t = " + tableName);
		System.out.println(sc.getTableNameString());
		System.out.println(sc.getTableNameJapanese());
		displayCollection(sc.getCollection());
		displayMap(sc.getMapping());
		
	}
	/**
	 *	unitTest2
	 *
	 * ロード系テスト
	 *
	 */
	public static void unitTest2()
	{
		System.out.println("------- unitTest2 -----------");
		
		String tableName = "Resolution";
		String code = "01";
		SelectionControl sc = new SelectionControl(tableName);
		sc.setCode(code);
		System.out.println("table = " + tableName + " code = " + code);
		System.out.println(sc.getSelection());
		
		
	}
	/**
	 * コレクションの表示
	 */
	private static void displayCollection(Collection list)
	{
		Iterator ite = list.iterator();
		
		while(ite.hasNext()) {
			ISelection col = (ISelection)ite.next();
			
			System.out.println(col.getCode() + "-" + col.getName());
		}
	}
	/**
	 * MAPの表示
	 */
	private static void displayMap(Map map)
	{
		Iterator ite = map.keySet().iterator();
		
		while(ite.hasNext()) {
			String key = (String)ite.next();
			String val = (String)map.get(key);
			
			System.out.println(key + "=" + val);
		}
	}
}