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

//===========================================================================
// import
//===========================================================================
// Java core API
import java.util.*;
import java.text.*;
import org.apache.commons.logging.*;

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

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


/**
 *<PRE>
 * 
 * BugScreenクラス
 * 
 *</PRE>
 * @version	0.0, 2001/09/10
 * @author	鰐川　正寛
 */
//===========================================================================
public class BugScreen implements IUpdatable, ILoadable
{
//===========================================================================
// attributes
//===========================================================================
	/**
	 *	バグ番号
	 */
	private int m_bno = 0;
	/**
	 *	画面ＩＤ
	 */
	private String m_scid = null;
	/**
	 *	ステータス
	 */
	private byte m_status = STS_TROUBLE;
	/**
	 *	更新者
	 */
	private int m_updateUno = 0;
	/**
	 *	更新日時
	 */
	private Date m_updateDate = new Date();
	/**
	 * Log
	 */
	private Log log = LogFactory.getLog(this.getClass().getName());
//=====================================
// 非ＤＢ項目
//=====================================
	/**
	 *	画面名
	 */
	private String m_name = null;
//=====================================
// 定数定義
//=====================================
	/**
	 * ステータス
	 */
	public static final byte STS_TROUBLE = 0;	//故障
	public static final byte STS_REPAIRED = 1;	//解決
	public static final byte STS_PENDING = 2;	//保留
//=====================================
// その他定義
//=====================================
	/**
	 *	ＤＢ操作用情報
	 */
	private byte m_mode = MODE_NONE;
	public static final byte MODE_NONE   = 0;	//なにもしない
	public static final byte MODE_INSERT = 1;	//追加
	public static final byte MODE_DELETE = 2;	//削除
//=====================================
// DB用項目定義
//=====================================
	/**
	 * 排他制御
	 */
	private static final boolean EXCLUSION = true;	//あり
	/**
	 * AutoIncrement
	 */
	private static final boolean ATOINCREMENT = false;	//なし
	/**
	 * PK 
	 */
	private static final String[] PK = {"bno", "scid"};
	/**
	 * 更新項目名
	 */
	private static final String[] DB_ITEMS = {
									"bno","scid","status",
									"updateUno" };
//===========================================================================
// methods
//===========================================================================
	/**
	 *	デフォルトコンストラクタ
	 *
	 */
	public BugScreen()
	{
		
	}
	/**
	 *	コンストラクタ(ＩＤ指定）
	 *
	 * @param	 scid		String型
	 */
	public BugScreen(int bno, String scid)
	{
		setBno(bno);
		setScid(scid);
		
		load();
		
	}
//======================================
// db access methods
//======================================
	/**
	 *	insertDB
	 *
	 * @return	処理結果
	 */
	public void insert(int updateUno)
	{
		setUpdateUno(updateUno);
		DAO.insert(this);
//		load();		//最終更新日がほしいので再ロード
	}
	/**
	 *	update
	 *
	 * @return	処理結果
	 */
	public void update(int updateUno)
	{
		setUpdateUno(updateUno);
		DAO.update(this);
//		load();		//最終更新日がほしいので再ロード
	}
	/**
	 *	delete
	 *
	 * @return	処理結果
	 */
	public void delete(int updateUno)
	{
		setUpdateUno(updateUno);
		DAO.delete(this);
	}
	/**
	 *	store
	 *
	 * @return	処理結果
	 */
	public void store(int uno)
	{
		switch(m_mode) {
		case MODE_INSERT :
			insert(uno);
			break;
		case MODE_DELETE :
			delete(uno);
			break;
		}
	}
	/**
	 *	load
	 *
	 * @return	処理結果
	 */
	public void load()
	{
		DAO.load(this);
	}
	/**
	 *	findAll
	 *
	 * @return	処理結果
	 */
	public static Collection findAll()
	{
		return DAO.findAll(new BugScreen());
	}
	/**
	 *	BugScreenの取得（バグ番号指定）
	 *
	 * @return	処理結果
	 */
	public static BugScreen getBugScreen(int bno, String scid)
	{
		String sql = 
			"SELECT" +
			" A.bno as bno," +
			" A.scid as scid," +
			" A.status as status," +
			" A.updateUno as updateUno," +
			" A.updateDate as updateDate," +
			" B.name as name" +
			" FROM BugScreen AS A" +
			" LEFT JOIN Screen AS B ON A.scid = B.scid" +
			" WHERE A.bno = ? AND A.scid = ?" +
			" ORDER BY A.bno,A.scid";
		ArrayList params = new ArrayList();
		params.add(new Integer(bno));
		params.add(scid);
		
		ArrayList list = DAO.find(new BugScreen(), sql, params);
		
		BugScreen bugScreen = null;
		if ((list != null) && (list.size() > 0)) {
			bugScreen = (BugScreen)list.get(0);
		}
		return bugScreen;
	}
	/**
	 *	BugScreenの取得（バグ番号指定）
	 *
	 * @return	処理結果
	 */
	public static Collection getScreens(int bno)
	{
		String sql = 
			"SELECT" +
			" A.bno as bno," +
			" A.scid as scid," +
			" A.status as status," +
			" A.updateUno as updateUno," +
			" A.updateDate as updateDate," +
			" B.name as name" +
			" FROM BugScreen AS A" +
			" LEFT JOIN Screen AS B ON A.scid = B.scid" +
			" WHERE A.bno = ?" +
			" ORDER BY A.bno,A.scid";
		ArrayList params = new ArrayList();
		params.add(new Integer(bno));
		
		return (DAO.find(new BugScreen(), sql, params));
		
	}
//======================================
// Db Interface
//======================================
	/**
	 * 
	 */
	public String[] getUpdateItemNames() {
		
		return DB_ITEMS;
		
	}
	/**
	 * PK items
	 */
	 public String[] getPKItems() {
		return PK;
	}
	/**
	 * 排他制御ありなし
	 */
	public boolean isExclusion() {
		return EXCLUSION;
	}
	/**
	 * AutoIncrementありなし
	 */
	public boolean isAutoIncrement() {
		return ATOINCREMENT;
	}
//======================================
// request param
//======================================
	/**
	 *	request parametorの生成
	 */
	public Map getMapping() {
		HashMap map = new HashMap();
		map.put("bno", new Integer(m_bno));
		map.put("scid", m_scid);
		return map;
	}
//======================================
// Property
//======================================
	/**
	 * バグＩＤの取得
	 * 
	 * @return バグＩＤ
	 */
	public int getBno()
	{
		return m_bno;
	}
	/**
	 * バグＩＤのセット
	 * 
	 * @param bno バグＩＤ
	 */
	public void setBno(int bno)
	{
		m_bno = bno;
	}
	/**
	 * 画面IDの取得
	 * 
	 * @return 画面ID
	 */
	public String getScid()
	{
		return m_scid;
	}
	/**
	 * 画面IDのセット
	 * 
	 * @param scid 画面ID
	 */
	public void setScid(String scid)
	{
		m_scid = scid;
	}
	/**
	 * 画面名称の取得
	 * 
	 * @return 画面名称
	 */
	public String getName()
	{
		return m_name;
	}
	/**
	 * 画面名称の取得(ラベル用)
	 * 
	 * @return 画面名称
	 */
	public String getDisplayName()
	{
		return  m_name + "(" + m_scid + ")";
	}
	/**
	 * 画面名称のセット
	 * 
	 * @param name 画面名称
	 */
	public void setName(String name)
	{
		m_name = name;
	}
	/**
	 * ステータスの取得
	 * 
	 * @return ステータス
	 */
	public byte getStatus()
	{
		return m_status;
	}
	/**
	 * ステータスの取得(文字列)
	 * 
	 * @return ステータス
	 */
	public String getStatusString()
	{
		String s = null;
		switch(m_status) {
		case STS_TROUBLE :
			s = "故障";
			break;
		case STS_REPAIRED :
			s = "解決";
			break;
		case STS_PENDING :
			s = "保留";
			break;
		default :
			s = "(unknown):" + m_status;
			break;
		}
		return s;
	}
	/**
	 * 確認状況の取得
	 * 
	 * @return 状況
	 */
	public boolean getComfirm()
	{
		return (m_status == STS_REPAIRED);
	}
	/**
	 * ステータスのセット
	 * 
	 * @param status ステータス
	 */
	public void setStatus(byte status)
	{
		m_status = status;
	}
	/**
	 * 更新者の取得
	 * 
	 * @return 更新者
	 */
	public int getUpdateUno()
	{
		return m_updateUno;
	}
	/**
	 * 更新者のセット
	 * 
	 * @param updateUno 更新者
	 */
	public void setUpdateUno(int updateUno)
	{
		m_updateUno = updateUno;
	}
	/**
	 *	更新日の取得
	 *
	 * @return	update		更新日文字列
	 */
	public Date getUpdateDate()
	{
		return m_updateDate;
	}
	/**
	 *	更新日の取得
	 *
	 * @return	update		更新日文字列
	 */
	public String getUpdateDateString()
	{
		String s = null;
		if (m_updateDate != null) {
			s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(m_updateDate);
		}
		return s;
	}
	/**
	 *	更新日のセット
	 *
	 * @return	update		更新日文字列
	 */
	public void setUpdateDate(Date date)
	{
		m_updateDate = date;
	}
	
	/**
	 * 追加削除モードの取得
	 * 
	 * @return 追加削除モード
	 */
	public byte getMode()
	{
		return m_mode;
	}
	/**
	 * 追加削除モードの取得
	 * 
	 * @return 追加削除モード
	 */
	public String getModeString()
	{
		String s = null;
		switch(m_mode) {
		case MODE_NONE :
			s = "NONE";
			break;
		case MODE_INSERT :
			s = "追加";
			break;
		case MODE_DELETE :
			s = "削除";
			break;
		default :
			s = "(unknown):" + m_mode;
			break;
		}
		return s;
	}
	/**
	 * 追加削除モードのセット
	 * 
	 * @param mode 追加削除モード
	 */
	public void setMode(byte mode)
	{
		m_mode = mode;
	}
//===========================================================================
// methods
//===========================================================================
	/**
	 *	クラス情報
	 */
	public String toString()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("--- [BugScreen] --- \n");
		sb.append("bno      : " + m_bno + "\n");
		sb.append("scid     : " + m_scid + "\n");
		sb.append("status   : " + getStatusString() + "(" + m_status + ")\n");
		sb.append("mode     : " + getModeString() + "(" + m_mode + ")\n");
		sb.append("updateUno: " + m_updateUno + "\n");
		sb.append("updateDat: " + getUpdateDateString() + "\n");
		sb.append("--- [BugScreen] --- \n");
		return sb.toString();
	}
	/**
	 *	テストメイン
	 */
	public static void main(String[] args)
	{
		System.out.println("------- << BugScreen Test Start >> -----------");
		unitTest1();	//新規作成テスト
		unitTest2();	//更新テスト
		unitTest3();	//削除テスト
		unitTest4();	//全件取得テスト
		unitTest5();	//コード指定コンストラクトテスト
		unitTest6();	//バグID指定
		
		System.out.println("------- << BugScreen Test End >> -----------");
	}
	
	/**
	 *	unitTest1
	 *
	 * 新規作成テスト
	 *
	 */
	public static void unitTest1()
	{
		System.out.println("------- unitTest1 -----------");
		
		//存在チェック
		BugScreen target = BugScreen.getBugScreen(1, "NOF_AXXDXX");
		if (target != null) {
			//存在していたら削除する
			target.delete(1);
		}
		//値のセット
		BugScreen BugScreen = new BugScreen();
		BugScreen.setBno(1);
		BugScreen.setScid("NOF_AXXDXX");
		
		//追加
		BugScreen.insert(0);
		
		System.out.println(BugScreen.toString());
	}
	/**
	 *	unitTest2
	 *
	 * 更新テスト
	 *
	 */
	public static void unitTest2()
	{
		System.out.println("------- unitTest2 -----------");
		
		//存在チェック
		BugScreen bugScreen = BugScreen.getBugScreen(1, "NOF_AXXDXX");
		if (bugScreen == null) {
			//存在していなかったらテスト中止
			throw new Error("target is nothing");
		}
		
		System.out.println(bugScreen.toString());
		
		bugScreen.setStatus(STS_REPAIRED);
		//更新
		bugScreen.update(1);
		
		System.out.println(bugScreen.toString());
	}
	/**
	 *	unitTest3
	 *
	 * 削除テスト
	 *
	 */
	public static void unitTest3()
	{
		System.out.println("------- unitTest3 -----------");
		
		//存在チェック
		BugScreen bugScreen = BugScreen.getBugScreen(1, "NOF_AXXDXX");
		if (bugScreen == null) {
			//存在していなかったらテスト中止
			throw new Error("target is nothing");
		}
		
		System.out.println(bugScreen.toString());
		
		//削除
		bugScreen.delete(2);
		
		//存在チェック
		bugScreen = BugScreen.getBugScreen(1, "NOF_AXXDXX");
		if (bugScreen != null) {
			//存在していなかったらテスト中止
			throw new Error("delete failer");
		}
	}
	/**
	 *	unitTest4
	 *
	 * 全件取得テスト
	 *
	 */
	public static void unitTest4()
	{
		System.out.println("------- unitTest4 -----------");
		
		Collection list = BugScreen.findAll();
		display(list);
	}
	/**
	 *	unitTest5
	 *
	 * コードコンストラクトテスト
	 *
	 */
	public static void unitTest5()
	{
		System.out.println("------- unitTest5 -----------");
		
		BugScreen BugScreen = new BugScreen(1, "NOF_A01D01");
		
		System.out.println(BugScreen.toString());
	}
	/**
	 *	unitTest6
	 *
	 * 全件取得テスト
	 *
	 */
	public static void unitTest6()
	{
		System.out.println("------- unitTest6 -----------");
		
		//追加
		BugScreen bugScreen = new BugScreen();
		bugScreen.setBno(10);
		
		bugScreen.setScid("NOF_A01D01");
		bugScreen.insert(1);
		bugScreen.setScid("NOF_A02D02");
		bugScreen.insert(1);
		bugScreen.setScid("NOF_A03D03");
		bugScreen.insert(1);
		bugScreen.setScid("NOF_C01D01");
		bugScreen.insert(1);
		bugScreen.setScid("NOF_N02D02");
		bugScreen.insert(1);
		
		Collection list = BugScreen.getScreens(10);
		display(list);
	}
	/**
	 * リストの表示
	 *
	 */
	private static void display(Collection list)
	{
		Iterator ite = list.iterator();
		
		while(ite.hasNext()) {
			BugScreen BugScreen = (BugScreen)ite.next();
			
			System.out.println(BugScreen.toString());
		}
	}
}