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


/**
 *<PRE>
 * 
 * Attachmentクラス
 * 
 *</PRE>
 * @version	0.0, 2001/09/10
 * @author	鰐川　正寛
 */
//===========================================================================
public class Attachment implements IUpdatable, ILoadable
{
//===========================================================================
// attributes
//===========================================================================
	/**
	 *	アタッチメント番号
	 */
	private int m_ano = 0;
	/**
	 *	バグ番号
	 */
	private int m_bno = 0;
	/**
	 *	ファイルタイプ
	 */
	private byte m_fileType;
	public static final byte TYPE_TEXT = 1;		//TEXT
	public static final byte TYPE_WORD = 2;		//WORD
	public static final byte TYPE_EXEL = 3;		//EXEL
	public static final byte TYPE_ZIP = 4;		//ZIP
	public static final byte TYPE_LZH = 5;		//LZH
	public static final byte TYPE_GIF = 6;		//GIF
	public static final byte TYPE_JPEG = 7;		//JPEG
	public static final byte TYPE_BINARY = 8;	//バイナリ
	public static final byte TYPE_OTHER = 9;	//OTHER
	/**
	 *	ファイルタイプ名
	 */
	public static final String[] TYPE_NAMES = {
		"", "text", "Word", "Exel", "Zip","Lzh","Gif","Jpeg","バイナリ","その他"};
							
	/**
	 *	MIMEタイプ
	 */
	private String m_mimeType = null;
	public static final String[] MIME_TYPES = {
										"", 
										"text/plain",
										"application/msword",
										"application/vnd.ms-excel",
										"application/x-zip-compress",
										"application/lzh",
										"image/gif",
										"image/jpeg",
//										"application/octet-stream",
										"application/unknown",
										"",
										};
	/**
	 *	ファイル名
	 */
	private String m_fileName = null;
	/**
	 *	ファイルサイズ
	 */
	private int m_size;
	/**
	 *	最大ファイルサイズ
	 */
	public static final int MAX_SIZE = 3 * 1024 * 1024;		//3M
	/**
	 *	説明
	 */
	private String m_info = null;
	/**
	 *	更新者
	 */
	private int m_updateUno = 0;
	/**
	 *	更新者名
	 */
	private String m_updateUname;
	/**
	 *	更新日時
	 */
	private Date m_updateDate;
	/**
	 * Log
	 */
	private Log log = LogFactory.getLog(this.getClass().getName());
//=====================================
// DB用項目定義
//=====================================
	/**
	 * 排他制御
	 */
	private static final boolean EXCLUSION = true;	//あり
	/**
	 * AutoIncrement
	 */
	private static final boolean ATOINCREMENT = true;	//なし
	/**
	 * PK 
	 */
	private static final String[] PK = {"ano"};
	/**
	 * 更新項目名
	 */
	private static final String[] DB_ITEMS = {
									"bno","fileType",
									"mimeType","fileName","info","size",
									"updateUno" };
//===========================================================================
// methods
//===========================================================================
	/**
	 *	デフォルトコンストラクタ
	 *
	 */
	public Attachment()
	{
		
	}
//======================================
// db access methods
//======================================
	/**
	 *	insertDB
	 *
	 * @return	処理結果
	 */
	public void insert(int updateUno)
	{
		setUpdateUno(updateUno);
		setUpdateDate(new Date());
		int ano = DAO.insert(this);
		setAno(ano);
	}
	/**
	 *	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 Attachment());
	}
	/**
	 *	Attachmentの取得（バグ番号指定）
	 *
	 * @return	処理結果
	 */
	public static Attachment getAttachment(int ano)
	{
		String sql = 
		"SELECT" +
		" A.ano as ano," +
		" A.bno as bno," +
		" A.fileType as fileType," +
		" A.fileName as fileName," +
		" A.mimeType as mimeType," +
		" A.info as info," +
		" A.size as size," +
		" A.updateUno as updateUno," +
		" A.updateDate as updateDate," +
		" B.nickname as updateUname" +
		" FROM Attachment AS A" +
		" LEFT JOIN UserInfo AS B ON A.updateUno = B.uno" +
		" WHERE A.ano = ?";
		
		ArrayList params = new ArrayList();
		params.add(new Integer(ano));
		
		Attachment at = null;
		Collection list = DAO.find(new Attachment(), sql, params);
		if ((list != null) && (list.size() != 0)) {
			at = (Attachment)list.iterator().next();
		}
		
		return at;
	}
	/**
	 *	Attachmentの取得（バグ番号指定）
	 *
	 * @return	処理結果
	 */
	public static Collection getAttachmentByBno(int bno)
	{
		String sql = 
		"SELECT" +
		" A.ano as ano," +
		" A.bno as bno," +
		" A.fileType as fileType," +
		" A.fileName as fileName," +
		" A.mimeType as mimeType," +
		" A.info as info," +
		" A.size as size," +
		" A.updateUno as updateUno," +
		" A.updateDate as updateDate," +
		" B.nickname as updateUname" +
		" FROM Attachment AS A" +
		" LEFT JOIN UserInfo AS B ON A.updateUno = B.uno" +
		" WHERE A.bno = ?" +
		" ORDER BY A.ano";
		
		ArrayList params = new ArrayList();
		params.add(new Integer(bno));
		
		return( DAO.find(new Attachment(), sql, params));
	}
	/**
	 *	Attachmentの生成
	 *
	 * @return	処理結果
	 */
/*-----------------------------------------
	public static Attachment createAttachment(int bno, int uno)
	{
		Attachment cc = new Attachment();
		cc.setBno(bno);
		cc.setUno(uno);
		UserInfo user = UserInfo.getUser(uno);
		cc.setNickname(user.getNickname());
		cc.setEmail(user.getEmail());
		
		return cc;
		
	}
-----------------------------------------*/
//======================================
// 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("ano", new Integer(m_ano));
		return map;
	}
//======================================
// Property
//======================================
	/**
	 * アタッチメント番号の取得
	 * 
	 * @return アタッチメント番号
	 */
	public int getAno()
	{
		return m_ano;
	}
	/**
	 * アタッチメント番号の取得(文字列)
	 * 
	 * @return アタッチメント番号
	 */
	public String getAnoString()
	{
		return Converter.getNumberString(m_ano, "0000");
	}
	/**
	 * アタッチメント番号のセット
	 * 
	 * @param ano アタッチメント番号
	 */
	public void setAno(int ano)
	{
		m_ano = ano;
	}
	/**
	 * バグ番号の取得
	 * 
	 * @return バグ番号
	 */
	public int getBno()
	{
		return m_bno;
	}
	/**
	 * バグ番号のセット
	 * 
	 * @param bno バグ番号
	 */
	public void setBno(int bno)
	{
		m_bno = bno;
	}
	/**
	 * ファイルタイプの取得
	 * 
	 * @return ファイルタイプ
	 */
	public byte getFileType()
	{
		return m_fileType;
	}
	/**
	 * ファイルタイプの取得(文字列)
	 * 
	 * @return ファイルタイプ
	 */
	public String getFileTypeString()
	{
		return TYPE_NAMES[m_fileType];
	}
	/**
	 * ファイルタイプのセット
	 * 
	 * @param fileType ファイルタイプ
	 */
	public void setFileType(byte fileType)
	{
		m_fileType = fileType;
		//このタイミングでMIME-TYPEを設定する
		m_mimeType = MIME_TYPES[m_fileType];
	}
	/**
	 * MIMEタイプの取得
	 * 
	 * @return MIMEタイプ
	 */
	public String getMimeType()
	{
		return m_mimeType;
	}
	/**
	 * MIMEタイプのセット
	 * 
	 * @param mimeType MIMEタイプ
	 */
	public void setMimeType(String mimeType)
	{
		m_mimeType = mimeType;
	}
	/**
	 * ファイル名の取得
	 * 
	 * @return ファイル名
	 */
	public String getFileName()
	{
		return m_fileName;
	}
	/**
	 * ファイル名のセット
	 * 
	 * @param fileName ファイル名
	 */
	public void setFileName(String fileName)
	{
		m_fileName = fileName;
	}
	/**
	 * ファイルサイズの取得
	 * 
	 * @return ファイルサイズ
	 */
	public int getSize()
	{
		return m_size;
	}
	/**
	 * ファイルサイズの取得(文字列)
	 * 
	 * @return ファイルサイズ
	 */
	public String getSizeString()
	{
		int Mbytes = 1024 * 1024;
		int Kbytes = 1024;
		
		String s = null;
		if (m_size > Mbytes) {
			s = (m_size / Mbytes) + "M";
		} else if (m_size > Kbytes) {
			s = (m_size / Kbytes) + "K";
		} else {
			s = m_size + "";
		}
		return s;
	}
	/**
	 * ファイルサイズのセット
	 * 
	 * @param size ファイルサイズ
	 */
	public void setSize(int size)
	{
		m_size = size;
	}
	/**
	 * 説明の取得
	 * 
	 * @return 説明
	 */
	public String getInfo()
	{
		return m_info;
	}
	/**
	 * 説明のセット
	 * 
	 * @param info 説明
	 */
	public void setInfo(String info)
	{
		m_info = info;
	}
	/**
	 * 更新者の取得
	 * 
	 * @return 更新者
	 */
	public int getUpdateUno()
	{
		return m_updateUno;
	}
	/**
	 * 更新者名の取得
	 * 
	 * @return 更新者名
	 */
	public String getUpdateUname()
	{
		return m_updateUname;
	}
	/**
	 * 更新者名のセット
	 * 
	 * @param updateUname 更新者名
	 */
	public void setUpdateUname(String updateUname)
	{
		m_updateUname = updateUname;
	}
	/**
	 * 更新者のセット
	 * 
	 * @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.MMDDHHMM);
	}
	/**
	 *	更新日のセット
	 *
	 * @return	update		更新日文字列
	 */
	public void setUpdateDate(Date date)
	{
		m_updateDate = date;
	}
//===========================================================================
// methods
//===========================================================================
	/**
	 *	クラス情報
	 */
	public String toString()
	{
		StringBuffer sb = new StringBuffer();
		sb.append("--- [Attachment] --- \n");
		sb.append("ano       : " + m_ano + "\n");
		sb.append("bno       : " + m_bno + "\n");
		sb.append("fileType  : " + m_fileType + "\n");
		sb.append("mimeType  : " + m_mimeType + "\n");
		sb.append("fileName  : " + m_fileName + "\n");
		sb.append("size      : " + m_size + "\n");
		sb.append("info      : " + m_info + "\n");
		sb.append("updateUno : " + m_updateUno + "\n");
		sb.append("updateUname : " + m_updateUname + "\n");
		sb.append("updateDate: " + getUpdateDateString() + "\n");
		sb.append("--- [Attachment] --- \n");
		return sb.toString();
	}
//===========================================================================
// test code
//===========================================================================
	/**
	 *	テストメイン
	 */
	public static void main(String[] args)
	{
		System.out.println("------- << Attachment Test Start >> -----------");
		unitTest1();	//新規作成テスト
		unitTest2();	//削除テスト
		unitTest3();	//コード指定コンストラクトテスト
		
		System.out.println("------- << Attachment Test End >> -----------");
	}
	
	/**
	 *	unitTest1
	 *
	 * 新規作成テスト
	 *
	 */
	public static void unitTest1()
	{
		System.out.println("------- unitTest1 -----------");
		
		//値のセット
		Attachment at = new Attachment();
		
		for (int i = 1; i < 10; i++) {
			at.setBno(1);
			at.setFileType((byte)i);
			at.setFileName(at.getFileTypeString() + " file" );
			at.setInfo(at.getFileTypeString() + " Info" );
			at.insert(1);					//追加
		}
		//表示
		display(Attachment.getAttachmentByBno(1));
		
	}
	/**
	 *	unitTest2
	 *
	 * 削除テスト
	 *
	 */
	public static void unitTest2()
	{
		System.out.println("------- unitTest2 -----------");
		
		//存在チェック
		Attachment at = Attachment.getAttachment(2);
		if (at == null) {
			//存在していなかったらテスト中止
			throw new Error("target is nothing");
		}
		
		at.delete(2);		//削除
		
		//存在チェック
		at = Attachment.getAttachment(2);
		if (at != null) {
			//存在していなかったらテスト中止
			throw new Error("delete failer");
		}
	}
	/**
	 *	unitTest3
	 *
	 * ファイル番号指定
	 *
	 */
	public static void unitTest3()
	{
		System.out.println("------- unitTest3 -----------");
		
		Attachment at = Attachment.getAttachment(1);
		
		System.out.println(at.toString());
		
		
	}
	/**
	 * リストの表示
	 *
	 */
	private static void display(Collection list)
	{
		Iterator ite = list.iterator();
		
		while(ite.hasNext()) {
			Attachment at = (Attachment)ite.next();
			
			System.out.println(at.toString());
		}
	}
}