//===========================================================================
// 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>
 * 
 * SpecVersionクラス
 * 
 *</PRE>
 * @version	0.0, 2001/09/10
 * @author	鰐川　正寛
 */
//===========================================================================
public class SpecVersion implements IUpdatable, ILoadable, ISelection
{
//===========================================================================
// attributes
//===========================================================================
	/**
	 *	コード
	 */
	private String m_code = null;
	/**
	 *	名前
	 */
	private String m_name = null;
	/**
	 *	略称
	 */
	private String m_shortName = null;
	/**
	 *	説明
	 */
	private String m_info = null;
	/**
	 *	更新者
	 */
	private int m_updateUno = 0;
	/**
	 *	更新日時
	 */
	private Date m_updateDate = new Date();
//=====================================
// DB用項目定義
//=====================================
	/**
	 * 排他制御
	 */
	private static final boolean EXCLUSION = true;	//あり
	/**
	 * AutoIncrement
	 */
	private static final boolean ATOINCREMENT = false;	//なし
	/**
	 * PK 
	 */
	private static final String[] PK = {"code"};
	/**
	 * 更新項目名
	 */
	private static final String[] DB_ITEMS = {
									"code","name","shortName",
									"info","updateUno" };
//===========================================================================
// methods
//===========================================================================
	/**
	 *	デフォルトコンストラクタ
	 *
	 */
	public SpecVersion()
	{
		
	}
	/**
	 *	コンストラクタ(コード指定）
	 *
	 * @param	 code		String型
	 */
	public SpecVersion(String code)
	{
		setCode(code);
		
		load();
		
	}
//======================================
// db access methods
//======================================
	/**
	 *	insertDB
	 *
	 * @return	処理結果
	 */
	public void insert(int updateUno)
	{
		setUpdateUno(updateUno);
//		setUpdateDate(new Date());
		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);
	}
	/**
	 *	load
	 *
	 * @return	処理結果
	 */
	public void load()
	{
		DAO.load(this);
	}
	/**
	 *	findAll
	 *
	 * @return	処理結果
	 */
	public static Collection findAll()
	{
		return DAO.findAll(new SpecVersion());
	}
	/**
	 *	SpecVersionの取得（コード指定）
	 *
	 * @return	処理結果
	 */
	public static SpecVersion getSpecVersion(String code)
	{
		String sql = "SELECT * FROM SpecVersion WHERE code = ?";
		ArrayList params = new ArrayList();
		params.add(code);
		
		ArrayList list = DAO.find(new SpecVersion(), sql, params);
		
		SpecVersion resolution = null;
		if ((list != null) && (list.size() > 0)) {
			resolution = (SpecVersion)list.get(0);
		}
		return resolution;
	}
	/**
	 * ラベル表示用コレクション
	 */
	public static Collection getLabelCollection()
	{
		String sql = "SELECT code,name,shortName FROM SpecVersion ORDER BY code";
		ArrayList params = new ArrayList();
		
		ArrayList list = DAO.find(new Resolution(), sql, params);
		
		return list;
	}
//======================================
// 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("t", "SpecVersion");
		map.put("code", m_code);
		return map;
	}
//======================================
// Property
//======================================
	/**
	 * コードの取得
	 * 
	 * @return コード
	 */
	public String getCode()
	{
		return m_code;
	}
	/**
	 * コードのセット
	 * 
	 * @param code コード
	 */
	public void setCode(String code)
	{
		m_code = code;
	}
	/**
	 * 名前の取得
	 * 
	 * @return 名前
	 */
	public String getName()
	{
		return m_name;
	}
	/**
	 * 名前の取得(ラベル用)
	 * 
	 * @return 名前
	 */
	public String getNameLabel()
	{
		String s = null;
		if (m_code.equals("00")) {
			s = "";
		} else {
			s = m_code + "-" + m_name;
		}
		return s;
	}
	/**
	 * 名前のセット
	 * 
	 * @param name 名前
	 */
	public void setName(String name)
	{
		m_name = name;
	}
	/**
	 * 略称の取得
	 * 
	 * @return 略称
	 */
	public String getShortName()
	{
		return m_shortName;
	}
	/**
	 * 略称のセット
	 * 
	 * @param shortName 略称
	 */
	public void setShortName(String shortName)
	{
		m_shortName = shortName;
	}
	/**
	 * 略称の取得(文字列)
	 * 
	 * @return 略称
	 */
	public String getShortnameString()
	{
		//新規の場合はnullにならない様に
		return (m_code == null ? "名無し" : m_shortName);
	}
	/**
	 * 説明の取得
	 * 
	 * @return 説明
	 */
	public String getInfo()
	{
		return m_info;
	}
	/**
	 * 説明のセット
	 * 
	 * @param info 説明
	 */
	public void setInfo(String info)
	{
		m_info = info;
	}
	/**
	 * 更新者の取得
	 * 
	 * @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;
	}
//===========================================================================
// methods
//===========================================================================
	/**
	 *	クラス情報
	 */
	public String toString()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("--- [RESOLUTION] --- \n");
		sb.append("code     : " + m_code + "\n");
		sb.append("name     : " + m_name + "\n");
		sb.append("shortName: " + m_shortName + "\n");
		sb.append("info     : " + m_info + "\n");
		sb.append("updateUno  : " + m_updateUno + "\n");
		sb.append("updateDate : " + getUpdateDateString() + "\n");
		sb.append("--- [RESOLUTION] --- \n");
		return sb.toString();
	}
	/**
	 * debug
	 */
	private static void debug(String s) {
		 
		 System.out.println("[SpecVersion]" + s);
		 
	}
	/**
	 *	テストメイン
	 */
	public static void main(String[] args)
	{
		System.out.println("------- << SpecVersion Test Start >> -----------");
		
		unitTest1();	//新規作成テスト
		unitTest2();	//更新テスト
		unitTest3();	//削除テスト
		unitTest4();	//全件取得テスト
		unitTest5();	//コード指定コンストラクトテスト
		
		System.out.println("------- << SpecVersion Test End >> -----------");
	}
	
	/**
	 *	unitTest1
	 *
	 * 新規作成テスト
	 *
	 */
	public static void unitTest1()
	{
		System.out.println("------- unitTest1 -----------");
		
		//存在チェック
		SpecVersion target = SpecVersion.getSpecVersion("99");
		if (target != null) {
			//存在していたら削除する
			target.delete(1);
		}
		//値のセット
		SpecVersion resolution = new SpecVersion();
		resolution.setCode("99");
		resolution.setName("名前");
		resolution.setShortName("略称");
		resolution.setInfo("説明");
		
		//追加
		resolution.insert(0);
		
		System.out.println(resolution.toString());
	}
	/**
	 *	unitTest2
	 *
	 * 更新テスト
	 *
	 */
	public static void unitTest2()
	{
		System.out.println("------- unitTest2 -----------");
		
		//存在チェック
		SpecVersion resolution = SpecVersion.getSpecVersion("99");
		if (resolution == null) {
			//存在していなかったらテスト中止
			throw new Error("target is nothing");
		}
		
		System.out.println(resolution.toString());
		
		resolution.setName("名前２");
		resolution.setShortName("略称２");
		resolution.setInfo("説明２");
		//更新
		resolution.update(1);
		
		System.out.println(resolution.toString());
	}
	/**
	 *	unitTest3
	 *
	 * ユーザ削除テスト
	 *
	 */
	public static void unitTest3()
	{
		System.out.println("------- unitTest3 -----------");
		
		//存在チェック
		SpecVersion resolution = SpecVersion.getSpecVersion("99");
		if (resolution == null) {
			//存在していなかったらテスト中止
			throw new Error("target is nothing");
		}
		
		System.out.println(resolution.toString());
		
		//削除
		resolution.delete(2);
		
		//存在チェック
		resolution = SpecVersion.getSpecVersion("99");
		if (resolution != null) {
			//存在していなかったらテスト中止
			throw new Error("delete failer");
		}
	}
	/**
	 *	unitTest4
	 *
	 * 全件取得テスト
	 *
	 */
	public static void unitTest4()
	{
		System.out.println("------- unitTest4 -----------");
		
		Collection list = SpecVersion.findAll();
		display(list);
	}
	/**
	 *	unitTest5
	 *
	 * コードコンストラクトテスト
	 *
	 */
	public static void unitTest5()
	{
		System.out.println("------- unitTest5 -----------");
		
		SpecVersion resolution = new SpecVersion("01");
		
		System.out.println(resolution.toString());
	}
	/**
	 * リストの表示
	 *
	 */
	private static void display(Collection list)
	{
		Iterator ite = list.iterator();
		
		while(ite.hasNext()) {
			SpecVersion resolution = (SpecVersion)ite.next();
			
			System.out.println(resolution.getCode() + "-" + resolution.getName());
		}
	}
}