//===========================================================================
// 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.user.*;
import jp.gr.java_conf.bugslife.system.*;


/**
 *<PRE>
 * 
 * Bugクラス
 * 
 *</PRE>
 * @version	0.0, 2001/09/10
 * @author	鰐川　正寛
 */
//===========================================================================
public class Bug implements IUpdatable, ILoadable
{
//===========================================================================
// attributes
//===========================================================================
	/**
	 *	バグ番号
	 */
	private int m_bno = 0;
	/**
	 *	バグＩＤ
	 */
	private String m_bid = null;
	/**
	 *	タイトル
	 */
	private String m_title = null;
	/**
	 *	発生環境
	 */
	private String m_location = null;
	/**
	 *	発生サブシステム
	 */
	private String m_subsystem = null;
	/**
	 *	発生機能
	 */
	private String m_functionName = null;
	/**
	 *	発生画面
	 */
	private String m_screen = null;
	/**
	 *	発生ブラウザ
	 */
	private String m_browser = null;
	/**
	 *	発生ＯＳ
	 */
	private String m_os = null;
	/**
	 *	試験項目ID
	 */
	private String m_tid = null;
	/**
	 *	ＡＰバージョン
	 */
	private String m_appVersion = null;
	/**
	 *	ＤＢバージョン
	 */
	private String m_dbVersion = null;
	/**
	 *	ＨＴＭＬバージョン
	 */
	private String m_htmlVersion = null;
	/**
	 *	仕様バージョン
	 */
	private String m_specVersion = null;
	/**
	 *	発行者
	 */
	private int m_issuer = 0;
	/**
	 *	発行者名
	 */
	private String m_issuerName = null;
	/**
	 *	発生日
	 */
	private Date m_issuDate = null;
	/**
	 *	登録日
	 */
	private Date m_registDate = null;
	/**
	 *	故障度
	 */
	private String m_severity = null;
	/**
	 *	故障度(文字列)
	 */
	private String m_severityString = null;
	/**
	 *	優先度
	 */
	private String m_priority = null;
	/**
	 *	優先度(文字列)
	 */
	private String m_priorityString = null;
	/**
	 *	ステータス
	 */
	private byte m_status = STS_UNCONFIRMED;	//未確認
	/**
	 *	ステータス状況
	 */
	private String m_statusWhitebord = null;
	/**
	 *	対処方法
	 */
	private String m_resolution = null;
	/**
	 *	対処方法名
	 */
	private String m_resolutionString = null;
	/**
	 *	マイルストーン
	 */
	private String m_milestone = null;
	/**
	 *	マイルストーン(文字列)
	 */
	private String m_milestoneString = null;
	/**
	 *	仕様変更ID
	 */
	private String m_scid = null;
	/**
	 *	キーワード１
	 */
	private String m_keyword1 = null;
	/**
	 *	キーワード２
	 */
	private String m_keyword2 = null;
	/**
	 *	キーワード３
	 */
	private String m_keyword3 = null;
	/**
	 *	コンポーネント１
	 */
	private String m_cpid1 = null;
	/**
	 *	コンポーネント２
	 */
	private String m_cpid2 = null;
	/**
	 *	コンポーネント３
	 */
	private String m_cpid3 = null;
	/**
	 *	コンポーネント４
	 */
	private String m_cpid4 = null;
	/**
	 *	コンポーネント５
	 */
	private String m_cpid5 = null;
	/**
	 *	関連ドキュメント
	 */
	private String m_reletedDoc = null;
	/**
	 *	承認者
	 */
	private int m_auther = 0;
	/**
	 *	承認者名
	 */
	private String m_autherName = null;
	/**
	 *	承認日
	 */
	private Date m_authDate = null;
	/**
	 *	エラー内容
	 */
	private String m_errorType = null;
	/**
	 *	エラー原因
	 */
	private String m_errorCause = null;
	/**
	 *	エラー機能箇所
	 */
	private String m_errorPoint = null;
	/**
	 *	エラー摘出工程
	 */
	private String m_issuPno = null;
	/**
	 *	エラー混入工程
	 */
	private String m_trainPno = null;
	/**
	 *	摘出すべき工程
	 */
	private String m_shouldFindPno = null;
	/**
	 *	摘出遅延理由
	 */
	private String m_errorDelayReason = null;
	/**
	 *	提供予定日
	 */
	private Date m_releaseSchDate = null;
	/**
	 *	解析者
	 */
	private int m_analyst = 0;
	/**
	 *	解析者名
	 */
	private String m_analystName = null;
	/**
	 *	解析日
	 */
	private Date m_analizeDate = null;
	/**
	 *	修正ソース
	 */
	private String m_updateSrc = null;
	/**
	 *	修正ドキュメント
	 */
	private String m_updateDoc = null;
	/**
	 *	対処者
	 */
	private int m_updater = 0;
	/**
	 *	対処者名
	 */
	private String m_updaterName = null;
	/**
	 *	対処日
	 */
	private Date m_bugUpdateDate = null;
	/**
	 *	解放日
	 */
	private Date m_releaseDate = null;
	/**
	 *	確認者
	 */
	private int m_comfirmer = 0;
	/**
	 *	確認者名
	 */
	private String m_comfirmerName = null;
	/**
	 *	確認日
	 */
	private Date m_comfirmDate = null;
	/**
	 *	メッセージID(7/5)
	 */
	private String m_messageId = null;
	/**
	 *	最終更新者
	 */
	private int m_updateUno = 0;
	/**
	 *	更新日時
	 */
	private Date m_updateDate = new Date();
	/**
	 *	保存日時
	 */
	private Date m_persistDate;
	/**
	 * Log
	 */
	private Log log = LogFactory.getLog(this.getClass().getName());
//=====================================
// OTHER DB ITEMS
//=====================================
	/**
	 *	追加情報
	 */
//	private Collection m_allAddText = null;
	private ArrayList m_allAddText = null;
	/**
	 *	追加情報ありなし(7/5)
	 */
	private boolean m_addTextEnable = false;
	/**
	 *	関連バグ番号コレクション
	 */
	private Collection m_reletedBug = null;
	/**
	 *	CCコレクション
	 */
	private Collection m_cc = null;
	/**
	 *	入力情報タイプ(7/5)
	 */
	private byte m_inputType = ITYPE_DETAIL0;
	/** 新規 */
	public static final byte ITYPE_DETAIL0 = 1;
	/** 故障 */
	public static final byte ITYPE_DETAIL1 = 2;
	/** 方針 */
	public static final byte ITYPE_DETAIL2 = 3;
	/** 解析 */
	public static final byte ITYPE_DETAIL3 = 4;
	/** 処置 */
	public static final byte ITYPE_DETAIL4 = 5;
	/** 確認 */
	public static final byte ITYPE_DETAIL5 = 6;
	/**
	 *	担当者番号(7/5)
	 */
	private int m_dispatch = 0;
	/**
	 *	担当者名(7/5)
	 */
	private UserInfo m_dispatchUser = null;
	/**
	 * 短いタイトル長
	 */
	public static final int SHORT_TITLE_LEN = 20;
	
//=====================================
// 定数定義
//=====================================
	/** 未確認 */
	public static final byte STS_UNCONFIRMED = 0;
	/** 新規 */
	public static final byte STS_NEW = 1;
	/** 担当者割り当て */
	public static final byte STS_DISPATCH = 2;
	/** 解析中 */
	public static final byte STS_INVESTIGATION = 3;
	/** 修正中 */
	public static final byte STS_REPAIRED = 4;
	/** 確認中 */
	public static final byte STS_RESOLVED = 5;
	/** 再開 */
	public static final byte STS_REOPEN = 6;
	/** 確認済み */
	public static final byte STS_VERIFIED = 7;
	/** 完了 */
	public static final byte STS_CLOSE = 8;
//=====================================
// その他項目定義
//=====================================
	/**
	 * activitys
	 */
	private Activitys m_activitys = null;
	/**
	 * activity
	 */
	private boolean m_activity = false;
//=====================================
// DB用項目定義
//=====================================
	/**
	 * 排他制御
	 */
	private boolean EXCLUSION = true;	//あり
	/**
	 * AutoIncrement
	 */
	private static final boolean ATOINCREMENT = true;	//あり
	/**
	 * PK 
	 */
	private static final String[] PK = {"bno"};
	/**
	 * 更新項目名
	 */
	private static final String[] DB_ITEMS = {
	"bid", "title","location","subsystem","functionName","screen",
	"browser","os","tid","appVersion","dbVersion",
	"htmlVersion","specVersion","issuer","issuDate","registDate",
	"severity","priority","status","statusWhitebord",
	"resolution","milestone","scid",
	"keyword1","keyword2","keyword3",
	"cpid1","cpid2","cpid3","cpid4","cpid5",
	"reletedDoc","auther","authDate",
	"errorType","errorCause","errorPoint",
	"issuPno","trainPno","shouldFindPno","errorDelayReason",
	"releaseSchDate","analyst","analizeDate","updateDoc","updateSrc",
	"updater","bugUpdateDate","releaseDate","comfirmer",
	"comfirmDate","messageId","updateUno", "persistDate",
	//8/30 追加
	"dispatch" 
	};
//===========================================================================
// methods
//===========================================================================
	/**
	 *	デフォルトコンストラクタ
	 *
	 */
	public Bug()
	{
		
	}
	/**
	 *	コンストラクタ(コード指定）
	 *
	 * @param	 code		String型
	 */
	public Bug(int bno)
	{
		setBno(bno);
		
		load();
		
	}
//======================================
// db access methods
//======================================
	/**
	 *	insertDB
	 *
	 * @return	処理結果
	 */
	public void insert(int uno)
	{
		setUpdateUno(uno);
		setPersistDate(new Date());
		
		int bno = DAO.insert(this);
		setBno(bno);
		
		//最終更新日のみ再取得
		m_updateDate = BugFinder.getUpdateDate(bno);
		
//		load();
	}
	/**
	 *	update(標準)排他制御あり
	 *
	 * @return	処理結果
	 */
	public void update(int uno)
	{
		update(uno, true);
	}
	/**
	 *	update(排他制御選択)
	 *
	 * @return	処理結果
	 */
	public void update(int uno, boolean exclusion)
	{
		setUpdateUno(uno);
		setPersistDate(new Date());
		//debug
//		log.debug("bno = " + m_bno + " update = " + getUpdateDateString());
		EXCLUSION = exclusion;
		
		DAO.update(this);
		
		//最終更新日のみ再取得
		m_updateDate = BugFinder.getUpdateDate(m_bno);
		//debug
//		log.debug("update:updateDate = " + m_updateDate);
		
//		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 Bug());
	}
	/**
	 *	Bugの取得（コード指定）
	 *
	 * @return	処理結果
	 */
	public static Bug getBug(int bno)
	{
		String sql = "SELECT * FROM Bug WHERE bno = ?";
		ArrayList params = new ArrayList();
		params.add(new Integer(bno));
		
		ArrayList list = DAO.find(new Bug(), sql, params);
		
		Bug bug = null;
		if ((list != null) && (list.size() > 0)) {
			bug = (Bug)list.get(0);
		}
		return bug;
	}
//======================================
// 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));
		return map;
	}
//======================================
// Property
//======================================
	/**
	 * バグ番号の取得
	 * 
	 * @return バグ番号
	 */
	public int getBno()
	{
		return m_bno;
	}
	/**
	 * バグ番号の取得(文字列)
	 * 
	 * @return バグ番号
	 */
	public String getBnoString()
	{
		String s = null;
		if (m_bno == 0) {
			s = "#";
		} else {
			s = Converter.getNumberString(m_bno, "0000");
		}
		return s;
	}
	/**
	 * バグ番号のセット
	 * 
	 * @param bno バグ番号
	 */
	public void setBno(int bno)
	{
		m_bno = bno;
	}
	/**
	 * バグIDの取得
	 * 
	 * @return バグID
	 */
	public String getBid()
	{
		return m_bid;
	}
	/**
	 * バグIDのセット
	 * 
	 * @param bid バグID
	 */
	public void setBid(String bid)
	{
		//activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullString(m_bid);
			String newVal = nullString(bid);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				
				addActivity(BugItem.BID, oldVal, newVal);
			}
		}
		m_bid = bid;
	}
	/**
	 * バグIDの生成
	 * 
	 * @param sysid システムＩＤ
	 */
	public void makeBid(String sysid)
	{
		StringBuffer sb = new StringBuffer();
		sb.append(sysid);
		sb.append("-");
		sb.append(ProcessName.getProcessName(m_issuPno).getShortName());
		sb.append("-");
		sb.append(getBnoString());
		setBid(new String(sb));
		
	}
	/**
	 * タイトルの取得
	 * 
	 * @return タイトル
	 */
	public String getTitle()
	{
		return m_title;
	}
	/**
	 * タイトルの取得(短い)
	 * 
	 * @return タイトル
	 */
	public String getShortTitle()
	{
	    String ret = m_title;
	    if (m_title != null) {
	        if (m_title.length() > SHORT_TITLE_LEN) {
	            ret = m_title.substring(0,SHORT_TITLE_LEN-3) + "...";
	        }
	    }
		return ret;
	}
	/**
	 * タイトルのセット
	 * 
	 * @param title タイトル
	 */
	public void setTitle(String title)
	{
	    
		//新規以外の時に差分を取る
		if (m_bno != 0) {
			//activity取得中か？
			if (isActivity()) {
				//null変換
				String oldVal = nullString(m_title);
				String newVal = nullString(title);
				//一致したか？
				if (! oldVal.equals(newVal)) {
					
					addActivity(BugItem.TITLE, oldVal, newVal);
				}
			}
		}
		m_title = title;
	}
	/**
	 * 発生環境の取得
	 * 
	 * @return 発生環境
	 */
	public String getLocation()
	{
		return m_location;
	}
	/**
	 * 発生環境のセット
	 * 
	 * @param location 発生環境
	 */
	public void setLocation(String location)
	{
		//activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_location);
			String newVal = nullCode(location);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new Location(oldVal).getShortName();
				String newValString = new Location(newVal).getShortName();
				//debug 
//				log.debug("old location = " + oldVal + ":" + oldValString );
//				log.debug("new location = " + newVal + ":" + newValString );
				
				addActivity(BugItem.LOCATION, oldValString, newValString);
			}
		}
		m_location = location;
	}
	/**
	 * 発生サブシステムの取得
	 * 
	 * @return 発生サブシステム
	 */
	public String getSubsystem()
	{
		return m_subsystem;
	}
	/**
	 * 発生サブシステムのセット
	 * 
	 * @param subsystem 発生サブシステム
	 */
	public void setSubsystem(String subsystem)
	{
		//activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_subsystem);
			String newVal = nullCode(subsystem);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new Subsystem(oldVal).getShortName();
				String newValString = new Subsystem(newVal).getShortName();
				
				addActivity(BugItem.SUBSYSTEM, oldValString, newValString);
			}
		}
		m_subsystem = subsystem;
	}
	/**
	 * 発生機能名の取得
	 * 
	 * @return 発生機能名
	 */
	public String getFunctionName()
	{
		return m_functionName;
	}
	/**
	 * 発生機能名のセット
	 * 
	 * @param functionName 発生機能名
	 */
	public void setFunctionName(String functionName)
	{
		//activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_functionName);
			String newVal = nullCode(functionName);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new FunctionName(oldVal).getShortName();
				String newValString = new FunctionName(newVal).getShortName();
				
				addActivity(BugItem.FUNCTIONNAME, oldValString, newValString);
			}
		}
		m_functionName = functionName;
	}
	/**
	 * 画面ＩＤの取得
	 * 
	 * @return 画面ＩＤ
	 */
	public String getScreen() {
		return m_screen;
	}
	/**
	 * 画面ＩＤのセット
	 * 
	 * @return 画面ＩＤ配列
	 */
	public void setScreen(String screen) {
		//activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullString(m_screen);
			String newVal = nullString(screen);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ差分出力
				addActivity(BugItem.SCREEN, oldVal, newVal);
			}
		}
		m_screen = screen;
	}
	/**
	 * 発生ブラウザの取得
	 * 
	 * @return 発生ブラウザ
	 */
	public String getBrowser()
	{
		return m_browser;
	}
	/**
	 * 発生ブラウザのセット
	 * 
	 * @param browser 発生ブラウザ
	 */
	public void setBrowser(String browser)
	{
		//activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_browser);
			String newVal = nullCode(browser);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new Browser(oldVal).getShortName();
				String newValString = new Browser(newVal).getShortName();
				
				addActivity(BugItem.BROWSER, oldValString, newValString);
			}
		}
		m_browser = browser;
	}
	/**
	 * ＯＳの取得
	 * 
	 * @return ＯＳ
	 */
	public String getOs()
	{
		return m_os;
	}
	/**
	 * ＯＳのセット
	 * 
	 * @param os ＯＳ
	 */
	public void setOs(String os)
	{
		//activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_os);
			String newVal = nullCode(os);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new Os(oldVal).getShortName();
				String newValString = new Os(newVal).getShortName();
				
				addActivity(BugItem.OS, oldValString, newValString);
			}
		}
		m_os = os;
	}
	/**
	 * 試験項目IDの取得
	 * 
	 * @return 試験項目ID
	 */
	public String getTid()
	{
		return m_tid;
	}
	/**
	 * 試験項目IDのセット
	 * 
	 * @param tid 試験項目ID
	 */
	public void setTid(String tid)
	{
		//(String)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullString(m_tid);
			String newVal = nullString(tid);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ差分出力
				addActivity(BugItem.TID, oldVal, newVal);
			}
		}
		m_tid = tid;
	}
	/**
	 * ＡＰバージョンの取得
	 * 
	 * @return ＡＰバージョン
	 */
	public String getAppVersion()
	{
		return m_appVersion;
	}
	/**
	 * ＡＰバージョンのセット
	 * 
	 * @param appVersion ＡＰバージョン
	 */
	public void setAppVersion(String appVersion)
	{
		//activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_appVersion);
			String newVal = nullCode(appVersion);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new AppVersion(oldVal).getShortName();
				String newValString = new AppVersion(newVal).getShortName();
				
				addActivity(BugItem.APPVERSION, oldValString, newValString);
			}
		}
		m_appVersion = appVersion;
	}
	/**
	 * ＤＢバージョンの取得
	 * 
	 * @return ＤＢバージョン
	 */
	public String getDbVersion()
	{
		return m_dbVersion;
	}
	/**
	 * ＤＢバージョンのセット
	 * 
	 * @param dbVersion ＤＢバージョン
	 */
	public void setDbVersion(String dbVersion)
	{
		//activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_dbVersion);
			String newVal = nullCode(dbVersion);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new DbVersion(oldVal).getShortName();
				String newValString = new DbVersion(newVal).getShortName();
				
				addActivity(BugItem.DBVERSION, oldValString, newValString);
			}
		}
		m_dbVersion = dbVersion;
	}
	/**
	 * ＨＴＭＬバージョンの取得
	 * 
	 * @return ＨＴＭＬバージョン
	 */
	public String getHtmlVersion()
	{
		return m_htmlVersion;
	}
	/**
	 * ＨＴＭＬバージョンのセット
	 * 
	 * @param htmlVersion ＨＴＭＬバージョン
	 */
	public void setHtmlVersion(String htmlVersion)
	{
		//activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_htmlVersion);
			String newVal = nullCode(htmlVersion);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new HtmlVersion(oldVal).getShortName();
				String newValString = new HtmlVersion(newVal).getShortName();
				
				addActivity(BugItem.HTMLVERSION, oldValString, newValString);
			}
		}
		m_htmlVersion = htmlVersion;
	}
	/**
	 * 仕様バージョンの取得
	 * 
	 * @return 仕様バージョン
	 */
	public String getSpecVersion()
	{
		return m_specVersion;
	}
	/**
	 * 仕様バージョンのセット
	 * 
	 * @param specVersion 仕様バージョン
	 */
	public void setSpecVersion(String specVersion)
	{
		//activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_specVersion);
			String newVal = nullCode(specVersion);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new SpecVersion(oldVal).getShortName();
				String newValString = new SpecVersion(newVal).getShortName();
				
				addActivity(BugItem.SPECVERSION, oldValString, newValString);
			}
		}
		m_specVersion = specVersion;
	}
	/**
	 * 発行者の取得
	 * 
	 * @return 発行者
	 */
	public int getIssuer()
	{
		return m_issuer;
	}
	/**
	 * 発行者名の取得
	 * 
	 * @return 発行者名
	 */
	public String getIssuerName()
	{
		//名前が無く、担当が割り当てられていれば取りに行く
		if ((m_issuerName == null) && (m_issuer != 0)) {
			m_issuerName = UserInfo.getUser(m_issuer).getNickname();
		}
		return Converter.StringToHtml(m_issuerName);
	}
	/**
	 * 発行者のセット
	 * 
	 * @param issuer 発行者
	 */
	public void setIssuer(int issuer)
	{
		
		//(int)activity取得中か？
		if (isActivity()) {
			//不一致か？
			if (m_issuer != issuer) {
				//しなければ略名を取ってくる
				
				String oldValString = "";		//old
				if (m_issuer != 0) {
					oldValString = UserInfo.getUser(m_issuer).getNickname();
				}
				String newValString = "";		//new
				if (issuer != 0) {
					newValString = UserInfo.getUser(issuer).getNickname();
					m_issuerName = newValString;
				}
				addActivity(BugItem.ISSUER, oldValString, newValString);
			}
		}
		m_issuer = issuer;
		
		//ディスパッチ先を更新(8/30)
		setDispatch();
		
	}
	/**
	 * 発生日の取得
	 * 
	 * @return 発生日
	 */
	public Date getIssuDate()
	{
		return m_issuDate;
	}
	/**
	 * 発生日の取得（文字列）
	 * 
	 * @return 発生日
	 */
	public String getIssuDateString()
	{
		return (Converter.getDateString(m_issuDate, Converter.DATE));
	}
	/**
	 * 発生日の取得（文字列）
	 * 
	 * @return 発生日
	 */
	public String getIssuDateStringShort()
	{
		return (Converter.getDateString(m_issuDate, Converter.SHORT_DATE_TIME));
	}
	/**
	 * 発生日のセット
	 * 
	 * @param issuDate 発生日
	 */
	public void setIssuDate(Date issuDate)
	{
		//(Date)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullDate(m_issuDate);
			String newVal = nullDate(issuDate);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				
				addActivity(BugItem.ISSUDATE, oldVal, newVal);
			}
		}
		
		m_issuDate = issuDate;
	}
	/**
	 * 登録日の取得
	 * 
	 * @return 登録日
	 */
	public Date getRegistDate()
	{
		return m_registDate;
	}
	/**
	 * 登録日の取得(文字列)
	 * 
	 * @return 登録日
	 */
	public String getRegistDateString()
	{
		return (Converter.getDateString(m_registDate, Converter.DATE));
	}
	/**
	 * 登録日のセット
	 * 
	 * @param resistDate 登録日
	 */
	public void setRegistDate(Date registDate)
	{
		m_registDate = registDate;
	}
	/**
	 * 故障度の取得
	 * 
	 * @return 故障度
	 */
	public String getSeverity()
	{
		return m_severity;
	}
	/**
	 * 故障度のセット
	 * 
	 * @param severity 故障度
	 */
	public void setSeverity(String severity)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_severity);
			String newVal = nullCode(severity);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new Severity(oldVal).getShortName();
				String newValString = new Severity(newVal).getShortName();
				
				addActivity(BugItem.SEVERITY, oldValString, newValString);
			}
		}
		m_severity = severity;
	}
	/**
	 * 優先度の取得
	 * 
	 * @return 優先度
	 */
	public String getPriority()
	{
		return m_priority;
	}
	/**
	 * 優先度の取得(文字列)
	 * 
	 * @return 優先度
	 */
	public String getPriorityString()
	{
		
	    if (m_priorityString == null) {
	        Priority pri = Priority.getPriority(m_priority);
	        if (pri != null) {
	            m_priorityString = pri.getShortName();
	        }
	    }
		return m_priorityString;
		
	}
	/**
	 * 優先度のセット
	 * 
	 * @param priority 優先度
	 */
	public void setPriority(String priority)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_priority);
			String newVal = nullCode(priority);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new Priority(oldVal).getShortName();
				String newValString = new Priority(newVal).getShortName();
				
				addActivity(BugItem.PRIORITY, oldValString, newValString);
			}
		}
		m_priority = priority;
	}
	/**
	 * 優先度のセット(文字列)
	 * 
	 * @param priority 優先度
	 */
	public void setPriorityString(String priorityString)
	{
		m_priorityString = priorityString;
	}
	/**
	 * ステータスの取得
	 * 
	 * @return ステータス
	 */
	public byte getStatus()
	{
		return m_status;
	}
	/**
	 * ステータスの取得(文字列)
	 * 
	 * @return ステータス
	 */
	public String getStatusString()
	{
		return getStatusString(m_status);
		
	}
	/**
	 * ステータスの取得(文字列)
	 * 
	 * @return ステータス
	 */
	public static String getStatusString(byte status)
	{
	    MessageString ms = new MessageString();
		String s = null;
		switch(status) {
		case STS_UNCONFIRMED :
//			s = "未確認(unconfirmd)";
		    s = ms.get("status.name.unconfirmd");
			break;
		case STS_NEW :
//			s = "新規(new)";
		    s = ms.get("status.name.new");
			break;
		case STS_DISPATCH :
//			s = "担当者割当て(judge)";
		    s = ms.get("status.name.resolved");
			break;
		case STS_INVESTIGATION :
//			s = "解析中(analyze)";
		    s = ms.get("status.name.analyze");
			break;
		case STS_REPAIRED :
//			s = "修正中(update)";
		    s = ms.get("status.name.update");
			break;
		case STS_RESOLVED :
//			s = "確認中(resolved)";
		    s = ms.get("status.name.confirm");
			break;
		case STS_REOPEN :
//			s = "再開(reopen)";
		    s = ms.get("status.name.reopen");
			break;
		case STS_VERIFIED :
//			s = "確認済み(verified)";
		    s = ms.get("status.name.verified");
			break;
		case STS_CLOSE :
//			s = "完了(close)";
		    s = ms.get("status.name.close");
			break;
		}
		return s;
	}
	/**
	 * ステータスのセット
	 * 
	 * @param status ステータス
	 */
	public void setStatus(byte status)
	{
		//新規以外の時に差分を取る
		if (m_bno != 0) {
			//(byte)activity取得中か？
			if (isActivity()) {
				//不一致か？
				if (m_status != status) {
					//しなければ略名を取ってくる
					String oldValString = getStatusString(m_status);
					String newValString = getStatusString(status);
					addActivity(BugItem.STATUS, oldValString, newValString);
				}
			}
		}
		m_status = status;
		//ディスパッチ先を更新(8/30)
		setDispatch();
	}
	/**
	 * ステータス状況の取得
	 * 
	 * @return ステータス状況
	 */
	public String getStatusWhitebord()
	{
		return m_statusWhitebord;
	}
	/**
	 * ステータス状況の取得
	 * 
	 * @return ステータス状況
	 */
	public String getStatusWhitebordString()
	{
		return Converter.StringToHtml(m_statusWhitebord);
	}
	/**
	 * ステータス状況のセット
	 * 
	 * @param statusWhitebord ステータス状況
	 */
	public void setStatusWhitebord(String statusWhitebord)
	{
		//(String)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullString(m_statusWhitebord);
			String newVal = nullString(statusWhitebord);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ差分出力
				addActivity(BugItem.STATUSWHITEBORD, oldVal, newVal);
			}
		}
		m_statusWhitebord = statusWhitebord;
	}
	/**
	 * 対処方法の取得
	 * 
	 * @return 対処方法
	 */
	public String getResolution()
	{
		return m_resolution;
	}
	/**
	 * 対処方法文字列の取得
	 * 08.02.08 追加
	 * @return 対処方法
	 */
	public String getResolutionString()
	{
	    if (m_resolutionString == null) {
	        Resolution res = Resolution.getResolution(m_resolution);
	        if (res != null) {
	            m_resolutionString = res.getShortName();
	        }
	    }
		return m_resolutionString;
	}
	/**
	 * 対処方法のセット
	 * 
	 * @param resolution 対処方法
	 */
	public void setResolution(String resolution)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_resolution);
			String newVal = nullCode(resolution);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new Resolution(oldVal).getShortName();
				String newValString = new Resolution(newVal).getShortName();
				
				addActivity(BugItem.RESOLUTION, oldValString, newValString);
			}
		}
		m_resolution = resolution;
	}
	/**
	 * マイルストーンの取得
	 * 
	 * @return マイルストーン
	 */
	public String getMilestone()
	{
		return m_milestone;
	}
	/**
	 * マイルストーンのセット
	 * 
	 * @param milestone マイルストーン
	 */
	public void setMilestone(String milestone)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_milestone);
			String newVal = nullCode(milestone);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new Milestone(oldVal).getShortName();
				String newValString = new Milestone(newVal).getShortName();
				
				addActivity(BugItem.MILESTONE, oldValString, newValString);
			}
		}
		m_milestone = milestone;
	}
	/**
	 * 仕様変更IDの取得
	 * 
	 * @return 仕様変更ID
	 */
	public String getScid()
	{
		return m_scid;
	}
	/**
	 * 仕様変更IDのセット
	 * 
	 * @param scid 仕様変更ID
	 */
	public void setScid(String scid)
	{
		//(String)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullString(m_scid);
			String newVal = nullString(scid);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ差分出力
				addActivity(BugItem.SCID, oldVal, newVal);
			}
		}
		m_scid = scid;
	}
	/**
	 * キーワード１の取得
	 * 
	 * @return キーワード１
	 */
	public String getKeyword1()
	{
		return m_keyword1;
	}
	/**
	 * キーワード１のセット
	 * 
	 * @param keyword1 キーワード１
	 */
	public void setKeyword1(String keyword1)
	{
		//(String)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullString(m_keyword1);
			String newVal = nullString(keyword1);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ差分出力
				addActivity(BugItem.KEYWORD1, oldVal, newVal);
			}
		}
		m_keyword1 = keyword1;
	}
	/**
	 * キーワード２の取得
	 * 
	 * @return キーワード２
	 */
	public String getKeyword2()
	{
		return m_keyword2;
	}
	/**
	 * キーワード２のセット
	 * 
	 * @param keyword2 キーワード２
	 */
	public void setKeyword2(String keyword2)
	{
		//(String)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullString(m_keyword2);
			String newVal = nullString(keyword2);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ差分出力
				addActivity(BugItem.KEYWORD2, oldVal, newVal);
			}
		}
		m_keyword2 = keyword2;
	}
	/**
	 * キーワード３の取得
	 * 
	 * @return キーワード３
	 */
	public String getKeyword3()
	{
		return m_keyword3;
	}
	/**
	 * キーワード３のセット
	 * 
	 * @param keyword3 キーワード３
	 */
	public void setKeyword3(String keyword3)
	{
		//(String)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullString(m_keyword3);
			String newVal = nullString(keyword3);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ差分出力
				addActivity(BugItem.KEYWORD3, oldVal, newVal);
			}
		}
		m_keyword3 = keyword3;
	}
	/**
	 * キーワード１，２，３の取得
	 * 
	 * @return キーワード
	 */
	public String getKeywordString() {
		StringBuffer sb = new StringBuffer();
		addKeyword(m_keyword1, sb);
		addKeyword(m_keyword2, sb);
		addKeyword(m_keyword3, sb);
		
		return new String(sb);
	}
	/**
	 * キーワードの結合
	 * 
	 */
	private void addKeyword(String keyword, StringBuffer sb) {
		
		if ((keyword != null) && (keyword.length() > 0)) {
			if (sb.length() > 0) {
				sb.append("/");
			}
			sb.append(keyword);
		}
	
	}
	/**
	 * コンポーネント1の取得
	 * 
	 * @return コンポーネント1
	 */
	public String getCpid1()
	{
		return m_cpid1;
	}
	/**
	 * コンポーネント1のセット
	 * 
	 * @param cpid1 コンポーネント1
	 */
	public void setCpid1(String cpid1)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_cpid1);
			String newVal = nullCode(cpid1);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new ComponentName(oldVal).getName();
				String newValString = new ComponentName(newVal).getName();
				
				addActivity(BugItem.CPID1, oldValString, newValString);
			}
		}
		m_cpid1 = cpid1;
	}
	/**
	 * コンポーネント2の取得
	 * 
	 * @return コンポーネント2
	 */
	public String getCpid2()
	{
		return m_cpid2;
	}
	/**
	 * コンポーネント2のセット
	 * 
	 * @param cpid2 コンポーネント2
	 */
	public void setCpid2(String cpid2)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_cpid2);
			String newVal = nullCode(cpid2);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new ComponentName(oldVal).getName();
				String newValString = new ComponentName(newVal).getName();
				
				addActivity(BugItem.CPID2, oldValString, newValString);
			}
		}
		m_cpid2 = cpid2;
	}
	/**
	 * コンポーネント3の取得
	 * 
	 * @return コンポーネント3
	 */
	public String getCpid3()
	{
		return m_cpid3;
	}
	/**
	 * コンポーネント3のセット
	 * 
	 * @param cpid コンポーネント3
	 */
	public void setCpid3(String cpid3)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_cpid3);
			String newVal = nullCode(cpid3);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new ComponentName(oldVal).getName();
				String newValString = new ComponentName(newVal).getName();
				
				addActivity(BugItem.CPID3, oldValString, newValString);
			}
		}
		m_cpid3 = cpid3;
	}
	/**
	 * コンポーネント4の取得
	 * 
	 * @return コンポーネント4
	 */
	public String getCpid4()
	{
		return m_cpid4;
	}
	/**
	 * コンポーネント4のセット
	 * 
	 * @param cpid4 コンポーネント4
	 */
	public void setCpid4(String cpid4)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_cpid4);
			String newVal = nullCode(cpid4);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new ComponentName(oldVal).getName();
				String newValString = new ComponentName(newVal).getName();
				
				addActivity(BugItem.CPID4, oldValString, newValString);
			}
		}
		m_cpid4 = cpid4;
	}
	/**
	 * コンポーネント5の取得
	 * 
	 * @return コンポーネント5
	 */
	public String getCpid5()
	{
		return m_cpid5;
	}
	/**
	 * コンポーネント5のセット
	 * 
	 * @param cpid5 コンポーネント5
	 */
	public void setCpid5(String cpid5)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_cpid5);
			String newVal = nullCode(cpid5);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new ComponentName(oldVal).getName();
				String newValString = new ComponentName(newVal).getName();
				
				addActivity(BugItem.CPID5, oldValString, newValString);
			}
		}
		m_cpid5 = cpid5;
	}
	public String getComponentString() {
		
		StringBuffer sb = new StringBuffer();
		
		addComponentString(m_cpid1, sb);
		addComponentString(m_cpid2, sb);
		addComponentString(m_cpid3, sb);
		addComponentString(m_cpid4, sb);
		addComponentString(m_cpid5, sb);
		return new String(sb);
		
	}
	/**
	 * コンポーネント名編集
	 */
	private void addComponentString(String cpid, StringBuffer sb) {
		if ((cpid != null) && (! cpid.equals("00"))) {
			String cpName = ComponentName.getComponentName(cpid).getName();
			if (sb.length() != 0) {
				sb.append("->");
			}
			sb.append(cpName);
		}
	}
	/**
	 * 関連ドキュメントの取得
	 * 
	 * @return 関連ドキュメント
	 */
	public String getReletedDoc()
	{
		return m_reletedDoc;
	}
	/**
	 * 関連ドキュメントのセット
	 * 
	 * @param reletedDoc 関連ドキュメント
	 */
	public void setReletedDoc(String reletedDoc)
	{
		//(String)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullString(m_reletedDoc);
			String newVal = nullString(reletedDoc);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ差分出力
				addActivity(BugItem.RELETEDDOC, oldVal, newVal);
			}
		}
		m_reletedDoc = reletedDoc;
	}
	/**
	 * 承認者の取得
	 * 
	 * @return 承認者
	 */
	public int getAuther()
	{
		return m_auther;
	}
	/**
	 * 承認者名の取得
	 * 
	 * @return 承認者名
	 */
	public String getAutherName()
	{
		//名前が無く、担当が割り当てられていれば取りに行く
		if ((m_autherName == null) && (m_auther != 0)) {
			m_autherName = UserInfo.getUser(m_auther).getNickname();
		}
		return Converter.StringToHtml(m_autherName);
	}
	/**
	 * 承認者のセット
	 * 
	 * @param auther 承認者
	 */
	public void setAuther(int auther)
	{
		//(int)activity取得中か？
		if (isActivity()) {
			//不一致か？
			if (m_auther != auther) {
				//しなければ略名を取ってくる
				
				String oldValString = "";		//old
				if (m_auther != 0) {
					oldValString = UserInfo.getUser(m_auther).getNickname();
				}
				String newValString = "";		//new
				if (auther != 0) {
					newValString = UserInfo.getUser(auther).getNickname();
					m_autherName = newValString;
				}
				addActivity(BugItem.AUTHER, oldValString, newValString);
			}
		}
		m_auther = auther;
		//ディスパッチ先を更新(8/30)
		setDispatch();
		
	}
	/**
	 * 承認日の取得
	 * 
	 * @return 承認日
	 */
	public Date getAuthDate()
	{
		return m_authDate;
	}
	/**
	 * 承認日の取得(文字列)
	 * 
	 * @return 承認日
	 */
	public String getAuthDateString()
	{
		return (Converter.getDateString(m_authDate, Converter.DATE));
	}
	/**
	 * 承認日のセット
	 * 
	 * @param authDate 承認日
	 */
	public void setAuthDate(Date authDate)
	{
		//(Date)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullDate(m_authDate);
			String newVal = nullDate(authDate);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				
				addActivity(BugItem.AUTHDATE, oldVal, newVal);
			}
		}
		m_authDate = authDate;
	}
	/**
	 * エラー内容の取得
	 * 
	 * @return エラー内容
	 */
	public String getErrorType()
	{
		return m_errorType;
	}
	/**
	 * エラー内容のセット
	 * 
	 * @param errorType エラー内容
	 */
	public void setErrorType(String errorType)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_errorType);
			String newVal = nullCode(errorType);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new ErrorType(oldVal).getName();
				String newValString = new ErrorType(newVal).getName();
				
				addActivity(BugItem.ERRORTYPE, oldValString, newValString);
			}
		}
		m_errorType = errorType;
	}
	/**
	 * エラー原因の取得
	 * 
	 * @return エラー原因
	 */
	public String getErrorCause()
	{
		return m_errorCause;
	}
	/**
	 * エラー原因のセット
	 * 
	 * @param errorCause エラー原因
	 */
	public void setErrorCause(String errorCause)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_errorCause);
			String newVal = nullCode(errorCause);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new ErrorCause(oldVal).getName();
				String newValString = new ErrorCause(newVal).getName();
				
				addActivity(BugItem.ERRORCAUSE, oldValString, newValString);
			}
		}
		m_errorCause = errorCause;
	}
	/**
	 * エラー機能箇所の取得
	 * 
	 * @return エラー機能箇所
	 */
	public String getErrorPoint()
	{
		return m_errorPoint;
	}
	/**
	 * エラー機能箇所のセット
	 * 
	 * @param errorPoint エラー機能箇所
	 */
	public void setErrorPoint(String errorPoint)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_errorPoint);
			String newVal = nullCode(errorPoint);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new ErrorPoint(oldVal).getName();
				String newValString = new ErrorPoint(newVal).getName();
				
				addActivity(BugItem.ERRORPOINT, oldValString, newValString);
			}
		}
		m_errorPoint = errorPoint;
	}
	/**
	 * エラー摘出工程の取得
	 * 
	 * @return エラー摘出工程
	 */
	public String getIssuPno()
	{
		return m_issuPno;
	}
	/**
	 * エラー摘出工程の取得
	 * 
	 * @return エラー摘出工程
	 */
	public String getIssuPnoName()
	{
		String s = null;
		if ((m_issuPno == null) || (m_issuPno.equals("00"))) {
			s = new String();	//空文字
		} else {
			s = ProcessName.getProcessName(m_issuPno).getShortName();
		}
		return s;
	}
	/**
	 * エラー摘出工程のセット
	 * 
	 * @param issuPno エラー摘出工程
	 */
	public void setIssuPno(String issuPno)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_issuPno);
			String newVal = nullCode(issuPno);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new ProcessName(oldVal).getName();
				String newValString = new ProcessName(newVal).getName();
				
				addActivity(BugItem.ISSUPNO, oldValString, newValString);
			}
		}
		m_issuPno = issuPno;
	}
	/**
	 * エラー混入工程の取得
	 * 
	 * @return エラー混入工程
	 */
	public String getTrainPno()
	{
		return m_trainPno;
	}
	/**
	 * エラー混入工程の取得
	 * 
	 * @return エラー混入工程
	 */
	public String getTrainPnoName()
	{
		String s = null;
		if ((m_trainPno == null) || (m_trainPno.equals("00"))) {
			s = new String();	//空文字
		} else {
			s = ProcessName.getProcessName(m_trainPno).getShortName();
		}
		return s;
	}
	/**
	 * エラー混入工程のセット
	 * 
	 * @param trainPno エラー混入工程
	 */
	public void setTrainPno(String trainPno)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_trainPno);
			String newVal = nullCode(trainPno);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new ProcessName(oldVal).getName();
				String newValString = new ProcessName(newVal).getName();
				
				addActivity(BugItem.TRAINPNO, oldValString, newValString);
			}
		}
		m_trainPno = trainPno;
	}
	/**
	 * 摘出すべき工程の取得
	 * 
	 * @return 摘出すべき工程
	 */
	public String getShouldFindPno()
	{
		return m_shouldFindPno;
	}
	/**
	 * 摘出すべき工程の取得
	 * 
	 * @return 摘出すべき工程
	 */
	public String getShouldFindPnoName()
	{
		String s = null;
		if ((m_shouldFindPno == null) || (m_shouldFindPno.equals("00"))) {
			s = new String();	//空文字
		} else {
			s = ProcessName.getProcessName(m_shouldFindPno).getShortName();
		}
		return s;
	}
	/**
	 * 摘出すべき工程のセット
	 * 
	 * @param shouldFindPno 摘出すべき工程
	 */
	public void setShouldFindPno(String shouldFindPno)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_shouldFindPno);
			String newVal = nullCode(shouldFindPno);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new ProcessName(oldVal).getName();
				String newValString = new ProcessName(newVal).getName();
				
				addActivity(BugItem.SHOULDFINDPNO, oldValString, newValString);
			}
		}
		m_shouldFindPno = shouldFindPno;
	}
	/**
	 * 摘出遅延理由の取得
	 * 
	 * @return 摘出遅延理由
	 */
	public String getErrorDelayReason()
	{
		return m_errorDelayReason;
	}
	/**
	 * 摘出遅延理由のセット
	 * 
	 * @param errorDelayReason 摘出遅延理由
	 */
	public void setErrorDelayReason(String errorDelayReason)
	{
		//(CODE)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullCode(m_errorDelayReason);
			String newVal = nullCode(errorDelayReason);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ略名を取ってくる
				String oldValString = new ErrorDelayReason(oldVal).getName();
				String newValString = new ErrorDelayReason(newVal).getName();
				
				addActivity(BugItem.ERRORDELAYREASON, oldValString, newValString);
			}
		}
		m_errorDelayReason = errorDelayReason;
	}
	/**
	 * 提供予定日の取得
	 * 
	 * @return 提供予定日
	 */
	public Date getReleaseSchDate()
	{
		return m_releaseSchDate;
	}
	/**
	 * 提供予定日の取得(文字列)
	 * 
	 * @return 提供予定日
	 */
	public String getReleaseSchDateString()
	{
		return (Converter.getDateString(m_releaseSchDate, Converter.DATE));
	}
	/**
	 * 提供予定日のセット
	 * 
	 * @param releaseSchDate 提供予定日
	 */
	public void setReleaseSchDate(Date releaseSchDate)
	{
		//(Date)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullDate(m_releaseSchDate);
			String newVal = nullDate(releaseSchDate);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				
				addActivity(BugItem.RELEASESCHDATE, oldVal, newVal);
			}
		}
		m_releaseSchDate = releaseSchDate;
	}
	/**
	 * 解析者の取得
	 * 
	 * @return 解析者
	 */
	public int getAnalyst()
	{
		return m_analyst;
	}
	/**
	 * 解析者の取得
	 * 
	 * @return 解析者
	 */
	public String getAnalystName()
	{
		//名前が無く、担当が割り当てられていれば取りに行く
		if ((m_analystName == null) && (m_analyst != 0)) {
			m_analystName = UserInfo.getUser(m_analyst).getNickname();
		}
		return Converter.StringToHtml(m_analystName);
	}
	/**
	 * 解析者のセット
	 * 
	 * @param analyst 解析者
	 */
	public void setAnalyst(int analyst)
	{
		//(int)activity取得中か？
		if (isActivity()) {
			//不一致か？
			if (m_analyst != analyst) {
				//しなければ略名を取ってくる
				
				String oldValString = "";		//old
				if (m_analyst != 0) {
					oldValString = UserInfo.getUser(m_analyst).getNickname();
				}
				String newValString = "";		//new
				if (analyst != 0) {
					newValString = UserInfo.getUser(analyst).getNickname();
					m_analystName = newValString;
				}
				addActivity(BugItem.ANALYST, oldValString, newValString);
			}
		}
		m_analyst = analyst;
		//ディスパッチ先を更新(8/30)
		setDispatch();
		
	}
	/**
	 * 解析日の取得
	 * 
	 * @return 解析日
	 */
	public Date getAnalizeDate()
	{
		return m_analizeDate;
	}
	/**
	 * 解析日の取得(文字列)
	 * 
	 * @return 解析日
	 */
	public String getAnalizeDateString()
	{
		return (Converter.getDateString(m_analizeDate, Converter.DATE));
	}
	/**
	 * 解析日のセット
	 * 
	 * @param analizeDate 解析日
	 */
	public void setAnalizeDate(Date analizeDate)
	{
		//(Date)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullDate(m_analizeDate);
			String newVal = nullDate(analizeDate);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				
				addActivity(BugItem.ANALIZEDATE, oldVal, newVal);
			}
		}
		m_analizeDate = analizeDate;
	}
	/**
	 * 修正ソースの取得
	 * 
	 * @return 修正ソース
	 */
	public String getUpdateSrc()
	{
		return m_updateSrc;
	}
	/**
	 * 修正ソースのセット
	 * 
	 * @param updateSrc 修正ソース
	 */
	public void setUpdateSrc(String updateSrc)
	{
		//(String)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullString(m_updateSrc);
			String newVal = nullString(updateSrc);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ差分出力
				addActivity(BugItem.UPDATESRC, oldVal, newVal);
			}
		}
		m_updateSrc = updateSrc;
	}
	/**
	 * 修正ドキュメントの取得
	 * 
	 * @return 修正ドキュメント
	 */
	public String getUpdateDoc()
	{
		return m_updateDoc;
	}
	/**
	 * 修正ドキュメントのセット
	 * 
	 * @param updateDoc 修正ドキュメント
	 */
	public void setUpdateDoc(String updateDoc)
	{
		//(String)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullString(m_updateDoc);
			String newVal = nullString(updateDoc);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				//しなければ差分出力
				addActivity(BugItem.UPDATEDOC, oldVal, newVal);
			}
		}
		m_updateDoc = updateDoc;
	}
	/**
	 * 対処者の取得
	 * 
	 * @return 対処者
	 */
	public int getUpdater()
	{
		return m_updater;
	}
	/**
	 * 対処者名の取得
	 * 
	 * @return 対処者名
	 */
	public String getUpdaterName()
	{
		//名前が無く、担当が割り当てられていれば取りに行く
		if ((m_updaterName == null) && (m_updater != 0)) {
			m_updaterName = UserInfo.getUser(m_updater).getNickname();
		}
		return Converter.StringToHtml(m_updaterName);
	}
	/**
	 * 対処者のセット
	 * 
	 * @param updater 対処者
	 */
	public void setUpdater(int updater)
	{
		//(int)activity取得中か？
		if (isActivity()) {
			//不一致か？
			if (m_updater != updater) {
				//しなければ略名を取ってくる
				
				String oldValString = "";		//old
				if (m_updater != 0) {
					oldValString = UserInfo.getUser(m_updater).getNickname();
				}
				String newValString = "";		//new
				if (updater != 0) {
					newValString = UserInfo.getUser(updater).getNickname();
					m_updaterName = newValString;
				}
				addActivity(BugItem.UPDATER, oldValString, newValString);
			}
		}
		m_updater = updater;
		//ディスパッチ先を更新(8/30)
		setDispatch();
	}
	/**
	 * 対処日の取得
	 * 
	 * @return 対処日
	 */
	public Date getBugUpdateDate()
	{
		return m_bugUpdateDate;
	}
	/**
	 * 対処日の取得(文字列)
	 * 
	 * @return 対処日
	 */
	public String getBugUpdateDateString()
	{
		return (Converter.getDateString(m_bugUpdateDate, Converter.DATE));
	}
	/**
	 * 対処日のセット
	 * 
	 * @param bugUpdateDate 対処日
	 */
	public void setBugUpdateDate(Date bugUpdateDate)
	{
		//(Date)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullDate(m_bugUpdateDate);
			String newVal = nullDate(bugUpdateDate);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				
				addActivity(BugItem.BUGUPDATEDATE, oldVal, newVal);
			}
		}
		m_bugUpdateDate = bugUpdateDate;
	}
	/**
	 * 解放日の取得
	 * 
	 * @return 解放日
	 */
	public Date getReleaseDate()
	{
		return m_releaseDate;
	}
	/**
	 * 解放日の取得(文字列)
	 * 
	 * @return 解放日
	 */
	public String getReleaseDateString()
	{
		return (Converter.getDateString(m_releaseDate, Converter.DATE));
	}
	/**
	 * 解放日のセット
	 * 
	 * @param releaseDate 解放日
	 */
	public void setReleaseDate(Date releaseDate)
	{
		//(Date)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullDate(m_releaseDate);
			String newVal = nullDate(releaseDate);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				
				addActivity(BugItem.RELEASEDATE, oldVal, newVal);
			}
		}
		m_releaseDate = releaseDate;
	}
	/**
	 * 確認者の取得
	 * 
	 * @return 確認者
	 */
	public int getComfirmer()
	{
		return m_comfirmer;
	}
	/**
	 * 確認者の取得
	 * 
	 * @return 確認者
	 */
	public String getComfirmerName()
	{
		//名前が無く、担当が割り当てられていれば取りに行く
		if ((m_comfirmerName == null) && (m_comfirmer != 0)) {
			m_comfirmerName = UserInfo.getUser(m_comfirmer).getNickname();
		}
		return Converter.StringToHtml(m_comfirmerName);
	}
	/**
	 * 確認者のセット
	 * 
	 * @param comfirmer 確認者
	 */
	public void setComfirmer(int comfirmer)
	{
		//(int)activity取得中か？
		if (isActivity()) {
			//不一致か？
			if (m_comfirmer != comfirmer) {
				//しなければ略名を取ってくる
				
				String oldValString = "";		//old
				if (m_comfirmer != 0) {
					oldValString = UserInfo.getUser(m_comfirmer).getNickname();
				}
				String newValString = "";		//new
				if (comfirmer != 0) {
					newValString = UserInfo.getUser(comfirmer).getNickname();
					m_comfirmerName = newValString;
				}
				addActivity(BugItem.COMFIRMER, oldValString, newValString);
			}
		}
		m_comfirmer = comfirmer;
		//ディスパッチ先を更新(8/30)
		setDispatch();
		
	}
	/**
	 * 確認日の取得
	 * 
	 * @return 確認日
	 */
	public Date getComfirmDate()
	{
		return m_comfirmDate;
	}
	/**
	 * 確認日の取得(文字列)
	 * 
	 * @return 確認日
	 */
	public String getComfirmDateString()
	{
		return (Converter.getDateString(m_comfirmDate, Converter.DATE));
	}
	/**
	 * 確認日のセット
	 * 
	 * @param comfirmDate 確認日
	 */
	public void setComfirmDate(Date comfirmDate)
	{
		//(Date)activity取得中か？
		if (isActivity()) {
			//null変換
			String oldVal = nullDate(m_comfirmDate);
			String newVal = nullDate(comfirmDate);
			//一致したか？
			if (! oldVal.equals(newVal)) {
				
				addActivity(BugItem.COMFIRMDATE, oldVal, newVal);
			}
		}
		m_comfirmDate = comfirmDate;
	}
	/**
	 * メッセージidの取得
	 * 
	 * @return メッセージid
	 */
	public String getMessageId()
	{
		return m_messageId;
	}
	/**
	 * メッセージidのセット
	 * 
	 * @param messageId メッセージid
	 */
	public void setMessageId(String messageId)
	{
		//差分は取らない
		
		m_messageId = messageId;
	}
	
	/**
	 * 更新者の取得
	 * 
	 * @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;
	}
	/**
	 * 保存日の取得
	 * 
	 * @return 保存日
	 */
	public Date getPersistDate()
	{
		return m_persistDate;
	}
	/**
	 *	保存日の取得（文字列）
	 *
	 * @return	persist		保存日文字列
	 */
	public String getPersistDateString()
	{
		return (Converter.getDateString(m_persistDate, Converter.DATE_TIME));
	}
	/**
	 * 保存日のセット
	 * 
	 * @param persistDate 保存日
	 */
	public void setPersistDate(Date persistDate)
	{
		m_persistDate = persistDate;
	}
//===========================================================================
// adding methods
//===========================================================================
	/**
	 * 故障度(文字列)の取得
	 * 
	 * @return 故障度(文字列)
	 */
	public String getSeverityString()
	{
		return (m_severityString == null ? "" : m_severityString);
	}
	/**
	 * 故障度(文字列)のセット
	 * 
	 * @param severityString 故障度(文字列)
	 */
	public void setSeverityString(String severityString)
	{
		m_severityString = severityString;
	}
	/**
	 * マイルストーン(文字列)の取得
	 * 
	 * @return マイルストーン(文字列)
	 */
	public String getMilestoneString()
	{
		return m_milestoneString;
	}
	/**
	 * マイルストーン(文字列)のセット
	 * 
	 * @param milestoneString マイルストーン(文字列)
	 */
	public void setMilestoneString(String milestoneString)
	{
		m_milestoneString = milestoneString;
	}
	/**
	 * 役割の取得
	 * 
	 * @return 役割
	 */
	 public String getRole(int uno) {
		 
		MessageString ms = new MessageString();
		 StringBuffer sb = new StringBuffer();
		 
		 if(m_issuer == uno) {
//			 sb.append("発行(issue)\n");
		     sb.append(ms.get("bug.trouble.displayname"));
			 sb.append("\n");
		 }
		 if(m_auther == uno) {
//			 sb.append("承認(judge)\n");
		     sb.append(ms.get("bug.judge.displayname"));
			 sb.append("\n");
		 }
		 if(m_analyst == uno) {
//			 sb.append("解析(analyze)\n");
		     sb.append(ms.get("bug.analyze.displayname"));
			 sb.append("\n");
		 }
		 if(m_updater == uno) {
//			 sb.append("修正(update)\n");
		     sb.append(ms.get("bug.update.displayname"));
			 sb.append("\n");
		 }
		 if(m_comfirmer == uno) {
//			 sb.append("確認(confirm)\n");
		     sb.append(ms.get("bug.confirm.displayname"));
			 sb.append("\n");
		 }
		 
		 return Converter.StringToHtml(sb.toString());
	}
//=====================================
// status method
//=====================================
	/**
	 * 入力情報タイプの取得
	 * 
	 * @return 入力情報タイプ
	 */
	public byte getInputType()
	{
		return m_inputType;
	}
	/**
	 * 入力情報タイプの取得
	 * 
	 * @return 入力情報タイプ
	 */
	public String getInputTypeString()
	{
		String s = null;
		
		MessageString ms = new MessageString();
		switch(m_inputType) {		//type
		//新規
		case ITYPE_DETAIL0 :
//			s = "発行(issue)";
			s = ms.get("buginput.type0.name");
			break;
		//故障
		case ITYPE_DETAIL1 :
//			s = "故障(trouble)";
			s = ms.get("buginput.type1.name");
			break;
		//方針
		case ITYPE_DETAIL2 :
//			s = "方針(judge)";
			s = ms.get("buginput.type2.name");
			break;
		//解析
		case ITYPE_DETAIL3 :
//			s = "解析(analyze)";
			s = ms.get("buginput.type3.name");
			break;
		//処置
		case ITYPE_DETAIL4 :
//			s = "処置(update)";
			s = ms.get("buginput.type4.name");
			break;
		//確認
		case ITYPE_DETAIL5 :
//			s = "確認(confirm)";
			s = ms.get("buginput.type5.name");
			break;
		}
		return s;
	}
	/**
	 * 入力情報タイプのセット
	 * 
	 * @param inputType 入力情報タイプ
	 */
	public void setInputType(byte inputType)
	{
		m_inputType = inputType;
	}
	/*
	 * ステータスを元に担当者を決定する
	 */
	public void setDispatch() {
		
		String s = null;
		int oldDispatch = m_dispatch;	//変更前
		
		switch(m_status) {
		//未確認
		case STS_UNCONFIRMED :
			m_dispatch = 0;				//未定
			break;
		//新規
		case STS_NEW :
			m_dispatch = m_auther;		//承認者へ
			break;
		//解析中
		case STS_INVESTIGATION :
			m_dispatch = m_analyst;		//解析者へ
			break;
		//修正中
		case STS_REPAIRED :
			m_dispatch = m_updater;		//修正者
			break;
		//確認中
		case STS_RESOLVED :
			m_dispatch = m_comfirmer;	//確認者へ
			break;
		//再開
		case STS_REOPEN :
			m_dispatch = m_auther;		//解析者へ
			break;
		//完了
		case STS_CLOSE :
			m_dispatch = 0;				//なし
			break;
		}
		
		//ディスパッチ先が変わったら
		if (oldDispatch != m_dispatch) {
			m_dispatchUser = null;			//ユーザをクリア
		}
		
	}
	/**
	 * ディスパッチ先の取得
	 * 
	 * @return ディスパッチ先
	 */
	public int getDispatch()
	{
		//ＤＢ項目に含めるため、取得時ではなく設定時にセットするように変更(8/30)
/*------------------------------------------
		//ディスパッチ先を更新
		setDispatch();
------------------------------------------*/
		return m_dispatch;
	}
	/**
	 * ディスパッチ先の取得
	 * 
	 * @return ディスパッチ先
	 */
	public UserInfo getDispatchUser()
	{
		if (m_dispatchUser == null) {
			if (getDispatch() != 0) {
				m_dispatchUser = UserInfo.getUser(m_dispatch);
			}
		}
		return m_dispatchUser;
	}
	/**
	 * ディスパッチ先名の取得
	 * 
	 * @return ディスパッチ先名
	 */
	public String getDispatchName()
	{
		String s = null;
		if (m_dispatchUser == null) {
			//担当者未定
			if (getDispatch() == 0) {
				if (m_status == STS_CLOSE) {
					s = "";
				} else {
					//未定を返す
					s = "(未定)";
				}
			} else {
				s = UserInfo.getUser(m_dispatch).getNickname();
				
			}
		} else {
			s = m_dispatchUser.getNickname();
		}
		return s;
	}
	//=====================================
	//	 追加 method
	//====================================
	/**
	 * 経過日数の算出
	 */
	public String getTat(){
	    
	    long ret = 0;
	    
	    if (m_issuDate != null) {
	        
	        ret = (new Date().getTime() - m_issuDate.getTime()) / (24*60*60*1000);
	    }
	    return Long.toString(ret);
	}
	//=====================================
	// AddText method
	//=====================================
	/**
	 * 追加情報の取得（全タイプ）
	 */
	public Collection getAllAddText() {
		
		if (m_allAddText == null) {
			//新規か？
			if (m_bno == 0) {
				m_allAddText = new ArrayList();			//空のリストを生成
			} else {
				m_allAddText = (ArrayList)AddText.getAddText(m_bno);
				//０件の時
				if (m_allAddText == null) {
					m_allAddText = new ArrayList();		//空のリストを生成
				}
			}
		}
		return m_allAddText;
	}
	/**
	 * 追加情報の取得（故障内容）
	 */
	public Collection getTroubleAddText() {
		
		return getAddText(AddText.TYPE_TROUBLE);
	}
	/**
	 * 追加情報の取得（対処方針／担当者連絡事項）
	 */
	public Collection getPrincipalAddText() {
		
		return getAddText(AddText.TYPE_PRINCIPAL);
	}
	/**
	 * 追加情報の取得（故障原因）
	 */
	public Collection getCauseAddText() {
		
		return getAddText(AddText.TYPE_CAUSE);
	}
	/**
	 * 追加情報の取得（処置内容）
	 */
	public Collection getUpdateAddText() {
		
		return getAddText(AddText.TYPE_UPDATE);
	}
	/**
	 * 追加情報の取得（確認内容）
	 */
	public Collection getConfirmAddText() {
		
		return getAddText(AddText.TYPE_CONFIRM);
	}
	/**
	 * 追加情報のクリア
	 */
	public void clearAddText() {
		
		m_allAddText = null;
	}
	/**
	 * 追加情報の追加
	 */
	public void addText(String text, UserInfo logonUser) {
		
		//追加テキストが入力されたか？
		if ((text != null) && (text.length() > 0)) {
			
			//追加テキストを作る
			AddText addText = new AddText();
			
			addText.setBno(m_bno);		//bno
			
			switch(m_inputType) {		//type
			//新規
			case ITYPE_DETAIL0 :
				addText.setTextType(AddText.TYPE_TROUBLE);
				break;
			//故障
			case ITYPE_DETAIL1 :
				addText.setTextType(AddText.TYPE_TROUBLE);
				break;
			//方針
			case ITYPE_DETAIL2 :
				addText.setTextType(AddText.TYPE_PRINCIPAL);
				break;
			//解析
			case ITYPE_DETAIL3 :
				addText.setTextType(AddText.TYPE_CAUSE);
				break;
			//処置
			case ITYPE_DETAIL4 :
				addText.setTextType(AddText.TYPE_UPDATE);
				break;
			//確認
			case ITYPE_DETAIL5 :
				addText.setTextType(AddText.TYPE_CONFIRM);
				break;
			}
			addText.setEntryUname(logonUser.getNickname());	//投入者名
			addText.setEntryUmail(logonUser.getEmail());	//投入者メールアドレス
			addText.setContent(text);		//内容
			
			addText.insert(logonUser.getUno());				//ＤＢに追加
			
			//まだ取ってきてなければ
			if (m_allAddText == null) {
				//取ってくる
				getAllAddText();
			}
			m_allAddText.add(addText);		//リストに追加
			m_addTextEnable = true;			//追加テキストあり。
		} else {
			
			m_addTextEnable = false;		//追加テキストなし。
			
		}
		
		
	}
	/**
	 * 追加情報のありなし
	 */
	public boolean isAddTextEnable() {
		return m_addTextEnable;
	}
	/**
	 * 最後の追加情報を取る
	 */
	public AddText getLastAddText() {
		
		if (m_allAddText == null) {
			getAllAddText();
		}
		
		if (m_allAddText.size() == 0) {
			return null;
		} else {
			return (AddText)m_allAddText.get(m_allAddText.size() - 1 );
		}
		
	}
	/**
	 * 追加情報の取得（タイプ指定）
	 */
	private Collection getAddText(byte type) {
		
		ArrayList newList = new ArrayList();	//新リスト
		
		//全件取ってくる
		Collection list = getAllAddText();
		Iterator ite = list.iterator();
		
		while(ite.hasNext()) {
			AddText text = (AddText)ite.next();
			if(text.getTextType() == type) {
				newList.add(text);
			}
		}
		return newList;
	}
//=====================================
// 関連バグ method
//=====================================
	public Collection getReletedBug() {
		
		//既に取っているか？
		if (m_reletedBug == null) {
			//検索
			m_reletedBug = BugDepends.getBugDepends(m_bno);
			//0件か？
			if (m_reletedBug == null) {
				//空のリストを作る
				m_reletedBug = new ArrayList();
				
			}
		}
		return m_reletedBug;
	}
//=====================================
// CC method
//=====================================
	/**
	 * ＣＣの取得
	 */
	public Collection getCc() {
		//取ってない
		if (m_cc == null) {
			//新規
			if (m_bno == 0) {
				m_cc = new ArrayList();
			} else {
				//ccの検索
				m_cc = Cc.getCc(m_bno);
				//０件の場合
				if (m_cc == null) {
					m_cc = new ArrayList();
				}
			}
		}
		return m_cc;
	}
	/**
	 * ＣＣのセット
	 */
	public void setCc(Collection cc) {
		m_cc = cc;
	}
	/**
	 * ＣＣの更新
	 */
	public void updateCc(int uno) {
		
		//旧ＣＣの削除
		Collection oldCc = Cc.getCc(m_bno);
		if (oldCc != null) {
			Iterator ite = oldCc.iterator();
			while(ite.hasNext()) {
				Cc cc = (Cc)ite.next();
				cc.delete(uno);
			}
		}
		//新ＣＣの追加
		if (m_cc != null) {
			Iterator ite = m_cc.iterator();
			while(ite.hasNext()) {
				Cc cc = (Cc)ite.next();
				cc.insert(uno);
			}
		}
		
	}
//=====================================
// ステータス method
//=====================================
	/**
	 * ステータスコレクションの取得
	 */
	public static Collection getStatusCollection() {
		
		ArrayList list = new ArrayList();
		// 未確認
		list.add(new BugStatus(STS_UNCONFIRMED, getStatusString(STS_UNCONFIRMED)));
		// 新規
		list.add(new BugStatus(STS_NEW, getStatusString(STS_NEW)));
		// 解析中
		list.add(new BugStatus(STS_INVESTIGATION, getStatusString(STS_INVESTIGATION)));
		// 修正中
		list.add(new BugStatus(STS_REPAIRED, getStatusString(STS_REPAIRED)));
		// 確認中
		list.add(new BugStatus(STS_RESOLVED, getStatusString(STS_RESOLVED)));
		// 再開
		list.add(new BugStatus(STS_REOPEN, getStatusString(STS_REOPEN)));
		// 完了
		list.add(new BugStatus(STS_CLOSE, getStatusString(STS_CLOSE)));
		
		return list;
	 }
//=====================================
// Activitys method
//=====================================
	/**
	 * Activity取得開始
	 */
	public void startActivity() {
		m_activity = true;
		m_activitys = new Activitys();
		
	}
	/**
	 * Activity取得終了
	 */
	public void endActivity() {
		m_activity = false;
		
	}
	/**
	 * Activity取得中か？
	 */
	public boolean isActivity() {
		return m_activity;
		
	}
	/**
	 * Activityの追加
	 */
	public void addActivity(String id, Object oldValue, Object newValue) {
		m_activitys.add(new Activity(id, oldValue, newValue));
	}
	/**
	 * Activitysの取得
	 */
	public Activitys getActivitys() {
		if (m_activitys != null) {
			//bug自身を持たせる
			m_activitys.setBug(this);
		}
		return m_activitys;
	}
	/**
	 * null->string変換
	 */
	private String nullString(String s) {
		String ret = s;
		if ((s == null) || (s.length() == 0)) {
			s = new String();
		}
		return s;
	}
	/**
	 * null->string変換
	 */
	private String nullCode(String s) {
		String ret = s;
		if ((s == null) || (s.equals("00"))) {
			s = new String();
		}
		return s;
	}
	/**
	 * null->String and Date->String変換
	 */
	private String nullDate(Date date) {
		String s;
		if (date == null) {
			s = new String();
		} else {
			s = Converter.getDateString(date, Converter.SHORT_DATE);
		}
		return s;
	}
	/**
	 * BugActivitysの取得
	 */
	public Collection getBugActivitys() {
		
		Collection list = BugActivity.getBugActivity(m_bno);
		if (list == null) {
			list = new ArrayList();
		}
		return list;
	}
//=====================================
// Attachments method
//=====================================
	/**
	 * Attachments取得開始
	 */
	public Collection getAttachments() {
		
		Collection attachs = Attachment.getAttachmentByBno(m_bno);
		if (attachs == null) {
			attachs = new ArrayList();
		}
		return attachs;
	}
//=====================================
// 排他制御用
//=====================================
	/**
	 * 最終更新日チェック
	 */
	public boolean isChanged() {
		
		Date updateDate = BugFinder.getUpdateDate(m_bno);
		
		//本当はこんな判定いらないが、DAOのdescribleが勝手に呼ぶので対策。
		if (updateDate != null) {
			return !(updateDate.equals(m_updateDate));
		} else {
			return false;
		}
		
	}
//===========================================================================
// debugging methods
//===========================================================================
	/**
	 *	クラス情報
	 */
	public String toString()
	{
		StringBuffer sb = new StringBuffer();
		StringBuffer sb1 = new StringBuffer();
		
		sb.append("--- [BUG] --- \n");
		sb.append("bug #" + m_bno);
		appendDebug(sb, "bid" , m_bid);
		sb.append(" status:" + getStatusString());
		sb.append("(" + m_status + ")\n");
		
		sb.append("title:" + m_title + "\n");
		
		appendDebug(sb1, "statusWhitebord", m_statusWhitebord);
		if (sb1.length() > 0)  {
			sb.append(sb1 + "\n");
		}
		sb1.delete(0, sb1.length());
		
		appendDebug(sb1, "loc" ,m_location);
		appendDebug(sb1, "sub" ,m_subsystem);
		appendDebug(sb1, "fun" ,m_functionName);
		appendDebug(sb1, "scr" ,m_screen);
		appendDebug(sb1, "brw" ,m_browser);
		appendDebug(sb1, "os" ,m_os);
		appendDebug(sb1, "tid" ,m_tid);
		if (sb1.length() > 0)  {
			sb.append(sb1 + "\n");
		}
		sb1.delete(0, sb1.length());
		
		appendDebug(sb1, "app" ,m_appVersion);
		appendDebug(sb1, "db" ,m_dbVersion);
		appendDebug(sb1, "html" ,m_htmlVersion);
		appendDebug(sb1, "spec" ,m_specVersion);
		appendDebug(sb1, "sev" ,m_severity);
		appendDebug(sb1, "pri" ,m_priority);
		appendDebug(sb1, "res" ,m_resolution);
		appendDebug(sb1, "mil" ,m_milestone);
		appendDebug(sb1, "scid" ,m_scid);
		if (sb1.length() > 0)  {
			sb.append(sb1 + "\n");
		}
		sb1.delete(0, sb1.length());
		
		appendDebug(sb1, "kw1" ,m_keyword1);
		appendDebug(sb1, "kw2" ,m_keyword2);
		appendDebug(sb1, "kw3" ,m_keyword3);
		appendDebug(sb1, "relDoc" ,m_reletedDoc);
		if (sb1.length() > 0)  {
			sb.append(sb1 + "\n");
		}
		sb1.delete(0, sb1.length());
		
		appendDebug(sb1, "cp1" ,m_cpid1);
		appendDebug(sb1, "cp2" ,m_cpid2);
		appendDebug(sb1, "cp3" ,m_cpid3);
		appendDebug(sb1, "cp4" ,m_cpid4);
		appendDebug(sb1, "cp5" ,m_cpid5);
		if (sb1.length() > 0)  {
			sb.append(sb1 + "\n");
		}
		sb1.delete(0, sb1.length());
		
		appendDebug(sb1, "upDoc" ,m_updateDoc);
		if (sb1.length() > 0)  {
			sb.append(sb1 + "\n");
		}
		sb1.delete(0, sb1.length());
		
		appendDebug(sb1, "eType" ,m_errorType);
		appendDebug(sb1, "eCause" ,m_errorCause);
		appendDebug(sb1, "ePoint" ,m_errorPoint);
		appendDebug(sb1, "iPno" ,m_issuPno);
		appendDebug(sb1, "tPno" ,m_trainPno);
		appendDebug(sb1, "sPno" ,m_shouldFindPno);
		appendDebug(sb1, "eReason" ,m_errorDelayReason);
		if (sb1.length() > 0)  {
			sb.append(sb1 + "\n");
		}
		sb1.delete(0, sb1.length());

		appendDebug(sb1, "issuer" ,m_issuer);
		appendDebug(sb1, "auther" ,m_auther);
		appendDebug(sb1, "analyst" ,m_analyst);
		appendDebug(sb1, "updater" ,m_updater);
		appendDebug(sb1, "comfirmer" ,m_comfirmer);
		appendDebug(sb1, "dispatch" ,m_dispatch);
		appendDebug(sb1, "dispatchUser" ,m_dispatchUser);
		if (sb1.length() > 0)  {
			sb.append(sb1 + "\n");
		}
		sb1.delete(0, sb1.length());
		
		appendDebug(sb1, "issuDate " ,getIssuDateString());
		appendDebug(sb1, "regDate  " ,getRegistDateString());
		appendDebug(sb1, "authDate " ,getAuthDateString());
		appendDebug(sb1, "anaDate  " ,getAnalizeDateString());
		if (sb1.length() > 0)  {
			sb.append(sb1 + "\n");
		}
		sb1.delete(0, sb1.length());
		
		appendDebug(sb1, "upDate   " ,getBugUpdateDateString());
		appendDebug(sb1, "relShDate" ,getReleaseSchDateString());
		appendDebug(sb1, "relDate  " ,getReleaseDateString());
		appendDebug(sb1, "comlDate " ,getComfirmDateString());
		if (sb1.length() > 0)  {
			sb.append(sb1 + "\n");
		}
		sb1.delete(0, sb1.length());
		
		appendDebug(sb1, "msgId" ,m_messageId);
		appendDebug(sb1, "upUno" ,m_updateUno);
		appendDebug(sb1, "updateDate" ,getUpdateDateString());
		appendDebug(sb1, "persistDate" ,getPersistDateString());
		if (sb1.length() > 0)  {
			sb.append(sb1 + "\n");
		}
		sb1.delete(0, sb1.length());
		
		sb.append("--- [BUG] --- \n");
		return sb.toString();
	}
	/**
	 *
	 */
	private void appendDebug(StringBuffer sb, String key, int i) {
		if (i != 0) {
			if (sb.length() > 0) {
				sb.append(" ");
			}
			sb.append(key + ":" + i);
		}
	}
	/**
	 *
	 */
	private void appendDebug(StringBuffer sb, String key, Object o) {
		if (o != null) {
			if (sb.length() > 0) {
				sb.append(" ");
			}
			sb.append(key + ":" + o);
		}
	}
//===========================================================================
// test code
//===========================================================================
	/**
	 *	テストメイン
	 */
	public static void main(String[] args)
	{
		System.out.println("------- << Bug Test Start >> -----------");
		
		unitTest1();	//新規バグ作成テスト(初期項目)
		unitTest2();	//新規バグ作成テスト(全項目指定)
		unitTest3();	//バグ更新テスト
		unitTest4();	//バグ削除テスト
		unitTest5();	//全件取得テスト
		unitTest6();	//バグID検索テスト
		unitTest7();	//バグ番号指定コンストラクトテスト
		
		System.out.println("------- << Bug Test End >> -----------");
	}
	
	/**
	 *	unitTest1
	 *
	 * 新規バグ作成テスト(初期項目)
	 *
	 */
	public static void unitTest1()
	{
		System.out.println("------- unitTest1 -----------");
		
		Bug bug = new Bug();
		//値のセット
		bug.setIssuer(1);
		bug.setStatus(STS_NEW);
		bug.setRegistDate(new Date());
		//10件追加
		for(int i = 0; i < 10; i++) {
			bug.setTitle("テストバグ" + i);
			bug.insert(i);
		}
		System.out.println("insert success");
	}
	/**
	 *	unitTest2
	 *
	 * 新規バグ作成テスト(全項目指定)
	 *
	 */
	public static void unitTest2()
	{
		System.out.println("------- unitTest2 -----------");
		
		Bug bug = new Bug();
		//値のセット
		bug.setBid("NWO1-SI1-000000");
		bug.setTitle("タイトル");
		bug.setLocation("01");
		bug.setSubsystem("01");
		bug.setBrowser("01");
		bug.setOs("01");
		bug.setTid("010101-001");
		bug.setAppVersion("01");
		bug.setDbVersion("01");
		bug.setHtmlVersion("01");
		bug.setIssuer(8);
		bug.setIssuDate(new Date());
		bug.setRegistDate(new Date());
		bug.setSeverity("01");
		bug.setPriority("01");
		bug.setStatus(STS_CLOSE);
		bug.setStatusWhitebord("ステータス状況");
		bug.setResolution("01");
		bug.setMilestone("01");
		bug.setScid("scid-0001");
		bug.setKeyword1("keyword1");
		bug.setKeyword2("keyword2");
		bug.setKeyword3("keyword3");
		bug.setReletedDoc("関連ドキュメント");
		bug.setAuther(9);
		bug.setAuthDate(new Date());
		bug.setErrorType("01");
		bug.setErrorCause("01");
		bug.setErrorPoint("01");
		bug.setIssuPno("01");
		bug.setTrainPno("01");
		bug.setShouldFindPno("01");
		bug.setErrorDelayReason("01");
		bug.setReleaseSchDate(new Date());
		bug.setAnalyst(8);
		bug.setAnalizeDate(new Date());
		bug.setUpdateDoc("変更ドキュメント");
		bug.setUpdater(9);
		bug.setBugUpdateDate(new Date());
		bug.setReleaseDate(new Date());
		bug.setComfirmer(3);
		bug.setComfirmDate(new Date());
		//追加
		bug.insert(0);
		
		System.out.println(bug.toString());
	}
	/**
	 *	unitTest3
	 *
	 * 更新テスト
	 *
	 */
	public static void unitTest3()
	{
		System.out.println("------- unitTest3 -----------");
		
		//存在チェック
		Bug bug = Bug.getBug(1);		//test 1 bug
		if (bug == null) {
			//存在していなかったらテスト中止
			throw new Error("target is nothing");
		}
		
		System.out.println(bug.toString());
		
		bug.setBid("NWO1-SI1-000002");
		bug.setTitle("タイトル2");
		bug.setLocation("02");
		bug.setSubsystem("02");
		bug.setBrowser("02");
		bug.setOs("02");
		bug.setTid("010101-001");
		bug.setAppVersion("02");
		bug.setDbVersion("02");
		bug.setHtmlVersion("02");
		bug.setIssuer(1);
		bug.setIssuDate(new Date());
		bug.setRegistDate(new Date());
		bug.setSeverity("02");
		bug.setPriority("02");
		bug.setStatus(STS_CLOSE);
		bug.setStatusWhitebord("ステータス状況２");
		bug.setResolution("02");
		bug.setMilestone("02");
		bug.setScid("SCID-0002");
		bug.setKeyword1("keyword1");
		bug.setKeyword2("keyword2");
		bug.setKeyword3("keyword3");
		bug.setReletedDoc("関連ドキュメント");
		bug.setAuther(2);
		bug.setAuthDate(new Date());
		bug.setErrorType("02");
		bug.setErrorCause("02");
		bug.setErrorPoint("02");
		bug.setIssuPno("02");
		bug.setTrainPno("02");
		bug.setShouldFindPno("02");
		bug.setErrorDelayReason("02");
		bug.setReleaseSchDate(new Date());
		bug.setAnalyst(3);
		bug.setAnalizeDate(new Date());
		bug.setUpdateDoc("変更ドキュメント");
		bug.setUpdater(4);
		bug.setBugUpdateDate(new Date());
		bug.setReleaseDate(new Date());
		bug.setComfirmer(5);
		bug.setComfirmDate(new Date());
		//更新
		bug.update(5);
		
		System.out.println(bug.toString());
	}
	/**
	 *	unitTest4
	 *
	 * バグ削除テスト
	 *
	 */
	public static void unitTest4()
	{
		System.out.println("------- unitTest4 -----------");
		
		//存在チェック
		Bug bug = Bug.getBug(1);
		if (bug == null) {
			//存在していなかったらテスト中止
			throw new Error("target is nothing");
		}
		
		//削除
		bug.delete(2);
		
		//存在チェック
		bug = Bug.getBug(1);
		if (bug != null) {
			//存在していなかったらテスト中止
			throw new Error("delete failer");
		} else {
			System.out.println("delete success");
		}
	}
	/**
	 *	unitTest5
	 *
	 * 全件取得テスト
	 *
	 */
	public static void unitTest5()
	{
		System.out.println("------- unitTest5 -----------");
		
		Collection bugs = Bug.findAll();
		dispUser(bugs);
	}
	/**
	 *	unitTest6
	 *
	 * バグID検索テスト
	 *
	 */
	public static void unitTest6()
	{
		System.out.println("------- unitTest6 -----------");
		
		Bug bug = Bug.getBug(6);
		
		System.out.println(bug.toString());
	}
	/**
	 *	unitTest7
	 *
	 * バグ番号コンストラクトテスト
	 *
	 */
	public static void unitTest7()
	{
		System.out.println("------- unitTest7 -----------");
		
		Bug bug = new Bug(7);
		
		System.out.println(bug.toString());
	}
	/**
	 * バグリストの表示
	 *
	 */
	private static void dispUser(Collection bugs)
	{
		Iterator ite = bugs.iterator();
		
		while(ite.hasNext()) {
			Bug bug = (Bug)ite.next();
			
			System.out.println(bug.getBno() + "-" + bug.getTitle());
		}
	}
}