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

//===========================================================================
// 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>
 * 
 * Sysconfクラス
 * 
 *</PRE>
 * @version	0.0, 2001/09/10
 * @author	鰐川　正寛
 */
//===========================================================================
public class Sysconf implements IUpdatable, ILoadable
{
//===========================================================================
// attributes
//===========================================================================
	/**
	 *	システム番号
	 */
	private byte m_sysno = SYSTEM_NO;
	private static byte SYSTEM_NO = 1;			//システム番号は１固定
	/**
	 *	システムＩＤ
	 */
	private String m_sysid = null;
	/**
	 *	システム名
	 */
	private String m_sysname = null;
	/**
	 *	システム情報
	 */
	private String m_sysinfo = null;
	/**
	 *	カレント工程
	 */
	private String m_currentPno = null;
	/**
	 *	カレントＡＰバージョン
	 */
	private String m_currentAppver = null;
	/**
	 *	カレントＤＢバージョン
	 */
	private String m_currentDbver = null;
	/**
	 *	カレントＨＴＭＬバージョン
	 */
	private String m_currentHtmlver = null;
	/**
	 *	カレント機能バージョン
	 */
	private String m_currentSpecver = null;
	/**
	 *	添付ファイルパス
	 */
	private String m_attachPath = null;
	/**
	 * SMTPアドレス
	 */
	private String m_smtpAdress;
	/**
	 * FROMアドレス
	 */
	private String m_fromAdress;
	/**
	 *	更新者
	 */
	private int m_updateUno = 0;
	/**
	 *	更新日時
	 */
	private Date m_updateDate = null;
	/**
	 *	メールの使用状態
	 */
	private int m_disableMail = ENABLE_MAIL;
	public static final int DISABLE_MAIL = 1;//メール無効
	public static final int ENABLE_MAIL = 0;//メール有効
	/**
	 * 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 = {"sysno"};
	/**
	 * 更新項目名
	 */
	private static final String[] DB_ITEMS = {
		"sysno","sysid","sysname","sysinfo","currentPno","currentAppver",
		"currentDbver","currentHtmlver","currentSpecver","attachPath",
		"smtpAdress","fromAdress",
		"updateUno" ,"disableMail"};
//===========================================================================
// methods
//===========================================================================
	/**
	 *	デフォルトコンストラクタ
	 *
	 */
	public Sysconf()
	{
		
	}
//======================================
// 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);
	}
	/**
	 *	load
	 *
	 * @return	処理結果
	 */
	public void load()
	{
		DAO.load(this);
	}
	/**
	 *	Sysconfの取得
	 *
	 * @return	処理結果
	 */
	public static Sysconf getSysconf()
	{
		String sql = "SELECT * FROM Sysconf WHERE sysno = ?";
		ArrayList params = new ArrayList();
		params.add(new Byte(SYSTEM_NO));
		ArrayList list = DAO.find(new Sysconf(), sql, params);
		
		Sysconf Sysconf = null;
		if ((list != null) && (list.size() > 0)) {
			Sysconf = (Sysconf)list.get(0);
		}
		return Sysconf;
	}
//======================================
// 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;
	}
//======================================
// Property
//======================================
	/**
	 * システム番号の取得
	 * 
	 * @return システム番号
	 */
	public byte getSysno()
	{
		return m_sysno;
	}
	/**
	 * システム番号のセット
	 * 
	 * @param sysno システム番号
	 */
	public void setSysno(byte sysno)
	{
		m_sysno = sysno;
	}
	/**
	 * システムIDの取得
	 * 
	 * @return システムID
	 */
	public String getSysid()
	{
		return m_sysid;
	}
	/**
	 * システムIDのセット
	 * 
	 * @param sysid システムID
	 */
	public void setSysid(String sysid)
	{
		m_sysid = sysid;
	}
	/**
	 * システム名称の取得
	 * 
	 * @return システム名称
	 */
	public String getSysname()
	{
		return m_sysname;
	}
	/**
	 * システム名称のセット
	 * 
	 * @param sysname システム名称
	 */
	public void setSysname(String sysname)
	{
		m_sysname = sysname;
	}
	/**
	 * システム情報の取得
	 * 
	 * @return システム情報
	 */
	public String getSysinfo()
	{
		return m_sysinfo;
	}
	/**
	 * システム情報の取得
	 * 
	 * @return システム情報
	 */
	public String getSysinfoString()
	{
		return Converter.StringToHtml(m_sysinfo);
	}
	/**
	 * システム情報のセット
	 * 
	 * @param sysinfo システム情報
	 */
	public void setSysinfo(String sysinfo)
	{
		m_sysinfo = sysinfo;
	}
	/**
	 * カレント工程の取得
	 * 
	 * @return カレント工程
	 */
	public String getCurrentPno()
	{
		return m_currentPno;
	}
	/**
	 * カレント工程のセット
	 * 
	 * @param currentPno カレント工程
	 */
	public void setCurrentPno(String currentPno)
	{
		m_currentPno = currentPno;
	}
	/**
	 * カレントＡＰバージョンの取得
	 * 
	 * @return カレントＡＰバージョン
	 */
	public String getCurrentAppver()
	{
		return m_currentAppver;
	}
	/**
	 * カレントＡＰバージョンのセット
	 * 
	 * @param currentAppver カレントＡＰバージョン
	 */
	public void setCurrentAppver(String currentAppver)
	{
		m_currentAppver = currentAppver;
	}
	/**
	 * カレントＤＢバージョンの取得
	 * 
	 * @return カレントＤＢバージョン
	 */
	public String getCurrentDbver()
	{
		return m_currentDbver;
	}
	/**
	 * カレントＤＢバージョンのセット
	 * 
	 * @param currentDbver カレントＤＢバージョン
	 */
	public void setCurrentDbver(String currentDbver)
	{
		m_currentDbver = currentDbver;
	}
	/**
	 * カレントＨＴＭＬバージョンの取得
	 * 
	 * @return カレントＨＴＭＬバージョン
	 */
	public String getCurrentHtmlver()
	{
		return m_currentHtmlver;
	}
	/**
	 * カレントＨＴＭＬバージョンのセット
	 * 
	 * @param currentHtmlver カレントＨＴＭＬバージョン
	 */
	public void setCurrentHtmlver(String currentHtmlver)
	{
		m_currentHtmlver = currentHtmlver;
	}
	/**
	 * カレント機能バージョンの取得
	 * 
	 * @return カレント機能バージョン
	 */
	public String getCurrentSpecver()
	{
		return m_currentSpecver;
	}
	/**
	 * カレント機能バージョンのセット
	 * 
	 * @param currentSpecver カレント機能バージョン
	 */
	public void setCurrentSpecver(String currentSpecver)
	{
		m_currentSpecver = currentSpecver;
	}
	/**
	 * 添付ファイルパスの取得
	 * 
	 * @return 添付ファイルパス
	 */
	public String getAttachPath()
	{
		return m_attachPath;
	}
	/**
	 * 添付ファイルパスのセット
	 * 
	 * @param attachPath 添付ファイルパス
	 */
	public void setAttachPath(String attachPath)
	{
		m_attachPath = attachPath;
	}
	/**
	 * SMTPアドレスの取得
	 * 
	 * @return SMTPアドレス
	 */
	public String getSmtpAdress()
	{
		return m_smtpAdress;
	}
	/**
	 * SMTPアドレスのセット
	 * 
	 * @param smtpAdress SMTPアドレス
	 */
	public void setSmtpAdress(String smtpAdress)
	{
		m_smtpAdress = smtpAdress;
	}
	/**
	 * FROMアドレスの取得
	 * 
	 * @return FROMアドレス
	 */
	public String getFromAdress()
	{
		return m_fromAdress;
	}
	/**
	 * FROMアドレスのセット
	 * 
	 * @param fromAdress FROMアドレス
	 */
	public void setFromAdress(String fromAdress)
	{
		m_fromAdress = fromAdress;
	}
	/**
	 * 更新者の取得
	 * 
	 * @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;
	}
	// 石田　2007/10/16 insert start
	/**
	 * メール状態のセット
	 * 
	 * @param memo メモ
	 */
	public void setDisableMail(int disableMail) {
		m_disableMail = disableMail;
	}
	/**
	 * メール状態の取得
	 * 
	 * @return メモ
	 */
	public int getDisableMail() {
		return m_disableMail;
	}
	/**
	 * メール購読の確認
	 * 
	 * @return 
	 */
	public boolean isDisableMail(int disableMail)
	{
		return ((m_disableMail & disableMail) > 0 ? true : false);
	}
//	// 石田　2007/10/16 insert end

//===========================================================================
// methods
//===========================================================================
	/**
	 *	クラス情報
	 */
	public String toString()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("--- [Sysconf] --- \n");
		sb.append("sysno: " + m_sysno);
		sb.append(" sysid: " + m_sysid);
		sb.append(" sysname: " + m_sysname + "\n");
		
		sb.append("sysinfo   : " + m_sysinfo + "\n");
		
		sb.append("Pno: " + m_currentPno);
		sb.append(" appVer: " + m_currentAppver);
		sb.append(" dbVer: " + m_currentDbver);
		sb.append(" HtmlVer: " + m_currentHtmlver);
		sb.append(" SpecVer: " + m_currentSpecver + "\n");
		
		sb.append("attachPath: " + m_attachPath + "\n");
		sb.append("smtpAdress:"  + m_smtpAdress + "\n");
		sb.append("fromAdress:"  + m_fromAdress + "\n");
		sb.append("updateUno  : " + m_updateUno + "\n");
		sb.append("disableMail : " + m_disableMail + "\n");
		sb.append("updateDate : " + getUpdateDateString() + "\n");
		sb.append("--- [Sysconf] --- \n");
		return sb.toString();
	}
	/**
	 *	テストメイン
	 */
	public static void main(String[] args)
	{
		System.out.println("------- << Sysconf Test Start >> -----------");
		unitTest1();	//新規作成テスト
		unitTest2();	//更新テスト
		unitTest3();	//削除テスト
		
		System.out.println("------- << Sysconf Test End >> -----------");
	}
	
	/**
	 *	unitTest1
	 *
	 * 新規作成テスト
	 *
	 */
	public static void unitTest1()
	{
		System.out.println("------- unitTest1 -----------");
		
		//存在チェック
		Sysconf target = Sysconf.getSysconf();
		if (target != null) {
			//存在していたら削除する
			target.delete(1);
		}
		//値のセット
		Sysconf sysconf = new Sysconf();
		sysconf.setSysid("NOF");
		sysconf.setSysname("webオーダーシステム");
		sysconf.setSysinfo("システム情報");
		sysconf.setCurrentPno("01");
		sysconf.setCurrentAppver("01");
		sysconf.setCurrentDbver("01");
		sysconf.setCurrentHtmlver("01");
		sysconf.setCurrentSpecver("01");
		sysconf.setAttachPath("/attach/file/hoge/hoge/");
		
		//追加
		sysconf.insert(0);
		
		sysconf = Sysconf.getSysconf();		//読み込み
		
		System.out.println(sysconf.toString());
	}
	/**
	 *	unitTest2
	 *
	 * 更新テスト
	 *
	 */
	public static void unitTest2()
	{
		System.out.println("------- unitTest2 -----------");
		
		//存在チェック
		Sysconf sysconf = Sysconf.getSysconf();
		if (sysconf == null) {
			//存在していなかったらテスト中止
			throw new Error("target is nothing");
		}
		
		System.out.println(sysconf.toString());
		
		sysconf.setSysid("NOF2");
		sysconf.setSysname("webオーダーシステム2");
		sysconf.setSysinfo("システム情報2");
		sysconf.setCurrentPno("01");
		sysconf.setCurrentAppver("02");
		sysconf.setCurrentDbver("02");
		sysconf.setCurrentHtmlver("02");
		sysconf.setCurrentSpecver("02");
		sysconf.setAttachPath("/2/");
		//更新
		sysconf.update(1);
		
		sysconf = Sysconf.getSysconf();		//読み込み
		System.out.println(sysconf.toString());
	}
	/**
	 *	unitTest3
	 *
	 * ユーザ削除テスト
	 *
	 */
	public static void unitTest3()
	{
		System.out.println("------- unitTest3 -----------");
		
		//存在チェック
		Sysconf sysconf = Sysconf.getSysconf();
		if (sysconf == null) {
			//存在していなかったらテスト中止
			throw new Error("target is nothing");
		}
		
		//削除
		sysconf.delete(2);
		
		//存在チェック
		sysconf = Sysconf.getSysconf();
		if (sysconf != null) {
			//存在していなかったらテスト中止
			throw new Error("delete failer");
		}
	}
}