//===========================================================================
// 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.system.*;


/**
 *<PRE>
 * 
 * BugDependsクラス
 * 
 *</PRE>
 * @version	0.0, 2001/09/10
 * @author	鰐川　正寛
 */
//===========================================================================
public class BugDepends implements IUpdatable, ILoadable
{
//===========================================================================
// attributes
//===========================================================================
	/**
	 *	バグ番号
	 */
	private int m_bno = 0;
	/**
	 *	依存バグ番号
	 */
	private int m_dependBno = 0;
	/**
	 *	依存バグ
	 */
	private Bug m_dependBug = new Bug();
	/**
	 *	更新者
	 */
	private int m_updateUno = 0;
	/**
	 *	更新日時
	 */
	private Date m_updateDate = new Date();
	/**
	 * Log
	 */
	private Log log = LogFactory.getLog(this.getClass().getName());
//=====================================
// DB用項目定義
//=====================================
	/**
	 * 排他制御
	 */
	private static final boolean EXCLUSION = true;	//あり
	/**
	 * AutoIncrement
	 */
	private static final boolean ATOINCREMENT = false;	//なし
	/**
	 * PK 
	 */
	private static final String[] PK = {"bno", "dependBno"};
	/**
	 * 更新項目名
	 */
	private static final String[] DB_ITEMS = {
									"bno","dependBno",
									"updateUno" };
//===========================================================================
// methods
//===========================================================================
	/**
	 *	デフォルトコンストラクタ
	 *
	 */
	public BugDepends()
	{
		
	}
//======================================
// db access methods
//======================================
	/**
	 *	insertDB
	 *
	 * @return	処理結果
	 */
	public void insert(int updateUno)
	{
		setUpdateUno(updateUno);
		setUpdateDate(Calendar.getInstance().getTime());
		DAO.insert(this);
//		load();		//最終更新日がほしいので再ロード
	}
	/**
	 *	delete
	 *
	 * @return	処理結果
	 */
	public void delete(int updateUno)
	{
		setUpdateUno(updateUno);
		delete();
	}
	/**
	 *	delete
	 *
	 * @return	処理結果
	 */
	public void delete()
	{
		DAO.delete(this);
	}
	/**
	 *	load
	 *
	 * @return	処理結果
	 */
	public void load()
	{
		DAO.load(this);
	}
	/**
	 *	findAll
	 *
	 * @return	処理結果
	 */
	public static Collection findAll()
	{
		return DAO.findAll(new BugDepends());
	}
	/**
	 *	BugDependsの取得（バグ番号指定）
	 *
	 * @return	処理結果
	 */
	public static Collection getBugDepends(int bno)
	{
		String sql = 
		"SELECT" +
		" A.bno as bno," +
		" A.dependBno as dependBno," +
		" A.updateUno as updateUno," +
		" A.updateDate as updateDate," +
		" B.status as status," +
		" B.title as title" +
		" FROM BugDepends AS A" +
		" LEFT JOIN Bug AS B ON A.dependBno = B.bno" +
		" WHERE A.bno = ?" +
		" ORDER BY A.bno,A.dependBno";
		
		ArrayList params = new ArrayList();
		params.add(new Integer(bno));
		
		return( DAO.find(new BugDepends(), sql, params));
	}
	/**
	 *	BugDependsの取得（依存バグ番号指定）
	 *
	 * @return	処理結果
	 */
	public static Collection getChildBugDepends(int bno)
	{
		String sql = 
		"SELECT" +
		" A.bno as bno," +
		" A.dependBno as dependBno," +
		" A.updateUno as updateUno," +
		" A.updateDate as updateDate," +
		" B.status as status," +
		" B.title as title" +
		" FROM BugDepends AS A" +
		" LEFT JOIN Bug AS B ON A.dependBno = B.bno" +
		" WHERE A.dependBno = ?" +
		" ORDER BY A.bno,A.dependBno";
		
		ArrayList params = new ArrayList();
		params.add(new Integer(bno));
		
		return( DAO.find(new BugDepends(), sql, params));
	}
	/**
	 *	親バグ番号文字列の取得（バグ番号指定）
	 *
	 * @return	処理結果
	 */
	public static String getParentsString(int bno)
	{
		StringBuffer ret = new StringBuffer();
		Collection collection = getChildBugDepends(bno);
		if (collection != null) {
			Iterator ite = collection.iterator();
			while (ite.hasNext()) {
				if (ret.length() != 0) {
					ret.append(",");
				}
				ret.append(String.valueOf(((BugDepends)ite.next()).getBno()));
			}
		}
		
		return ret.toString();
	}
	/**
	 *	子バグ番号文字列の取得（バグ番号指定）
	 *
	 * @return	処理結果
	 */
	public static String getChildsString(int bno)
	{
		StringBuffer ret = new StringBuffer();
		Collection collection = getBugDepends(bno);
		if (collection != null) {
			Iterator ite = collection.iterator();
			while (ite.hasNext()) {
				if (ret.length() != 0) {
					ret.append(",");
				}
				ret.append(String.valueOf(((BugDepends)ite.next()).getDependBno()));
			}
		}
		
		return ret.toString();
	}
//======================================
// 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_dependBno));
		return map;
	}
//======================================
// Property
//======================================
	/**
	 * バグ番号の取得
	 * 
	 * @return バグ番号
	 */
	public int getBno()
	{
		return m_bno;
	}
	/**
	 * バグ番号のセット
	 * 
	 * @param bno バグ番号
	 */
	public void setBno(int bno)
	{
		m_bno = bno;
	}
	/**
	 * 依存バグ番号の取得
	 * 
	 * @return 依存バグ番号
	 */
	public int getDependBno()
	{
		return m_dependBno;
	}
	/**
	 * 依存バグ番号の取得
	 * 
	 * @return 依存バグ番号
	 */
	public String getDependBnoString()
	{
		return m_dependBug.getBnoString();
	}
	/**
	 * 依存バグ番号のセット
	 * 
	 * @param dependBno 依存バグ番号
	 */
	public void setDependBno(int dependBno)
	{
		m_dependBno = dependBno;
		
		//add
		m_dependBug.setBno(dependBno);
		
	}
	/**
	 * ステータスの取得
	 * 
	 * @return ステータス
	 */
	public byte getStatus()
	{
		return m_dependBug.getStatus();
	}
	/**
	 * ステータスの取得(文字列)
	 * 
	 * @return ステータス
	 */
	public String getStatusString()
	{
		return m_dependBug.getStatusString();
	}
	/**
	 * ステータスのセット
	 * 
	 * @param status ステータス
	 */
	public void setStatus(byte status)
	{
		m_dependBug.setStatus(status);
	}
	/**
	 * タイトルの取得
	 * 
	 * @return タイトル
	 */
	public String getTitle()
	{
		return m_dependBug.getTitle();
	}
	/**
	 * タイトルのセット
	 * 
	 * @param title タイトル
	 */
	public void setTitle(String title)
	{
		m_dependBug.setTitle(title);
	}
	/**
	 * 更新者の取得
	 * 
	 * @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()
	{
		return Converter.getDateString(m_updateDate, Converter.DATE_TIME);
	}
	/**
	 *	更新日のセット
	 *
	 * @return	update		更新日文字列
	 */
	public void setUpdateDate(Date date)
	{
		m_updateDate = date;
	}
//===========================================================================
// methods
//===========================================================================
	/**
	 *	クラス情報
	 */
	public String toString()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("--- [BugDepends] --- \n");
		sb.append("bno      : " + m_bno + "\n");
		sb.append("depBno   : " + m_dependBno + "\n");
		sb.append("status   : " + getStatusString() + "\n");
		sb.append("title    : " + getTitle() + "\n");
		sb.append("updateUno: " + m_updateUno + "\n");
		sb.append("updateDate: " + getUpdateDateString() + "\n");
		sb.append("--- [BugDepends] --- \n");
		return sb.toString();
	}
	/**
	 *	テストメイン
	 */
	public static void main(String[] args)
	{
		System.out.println("------- << BugDepends Test Start >> -----------");
		unitTest1();	//新規作成テスト
		unitTest2();	//削除テスト
//		unitTest3();	//コード指定コンストラクトテスト
		
		System.out.println("------- << BugDepends Test End >> -----------");
	}
	
	/**
	 *	unitTest1
	 *
	 * 新規作成テスト
	 *
	 */
	public static void unitTest1()
	{
		System.out.println("------- unitTest1 -----------");
		
		//値のセット
		BugDepends bugDepends = new BugDepends();
		
		for(int i = 0; i < 3; i++) {
			bugDepends.setBno(2);
			bugDepends.setDependBno(i+1);
			
			//追加
			bugDepends.insert(0);
			
			//表示
			display(BugDepends.getBugDepends(2));
		}
		
	}
	/**
	 *	unitTest2
	 *
	 * ユーザ削除テスト
	 *
	 */
	public static void unitTest2()
	{
		System.out.println("------- unitTest2 -----------");
		
		//存在チェック
		Collection depends = BugDepends.getBugDepends(2);
		if (depends == null) {
			//存在していなかったらテスト中止
			throw new Error("target is nothing");
		}
		
		Iterator ite = depends.iterator();
		while(ite.hasNext()) {
			BugDepends dep = (BugDepends)ite.next();
			dep.delete(0);		//削除
		}
		
		//存在チェック
		depends = BugDepends.getBugDepends(2);
		if (depends != null) {
			//存在していなかったらテスト中止
			throw new Error("delete failer");
		}
	}
	/**
	 *	unitTest3
	 *
	 * コード指定検索
	 *
	 */
	public static void unitTest3()
	{
		System.out.println("------- unitTest3 -----------");
		
		display(BugDepends.getBugDepends(1));
		
	}
	/**
	 * リストの表示
	 *
	 */
	private static void display(Collection list)
	{
		Iterator ite = list.iterator();
		
		while(ite.hasNext()) {
			BugDepends BugDepends = (BugDepends)ite.next();
			
			System.out.println(BugDepends.toString());
		}
	}
}