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

//===========================================================================
// import
//===========================================================================
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.*;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.ValidatorForm;
import java.io.UnsupportedEncodingException;

import java.util.*;

import jp.gr.java_conf.bugslife.util.*;
import jp.gr.java_conf.bugslife.bug.*;
/**
 *<PRE>
 * SerchFormクラス
 *
 *</PRE>
 * @author 鰐川　正寛
 * @version 1.0.0
 */

public class SerchForm extends ValidatorForm {
//===========================================================================
// attributes
//===========================================================================
	/**
	 * action
	 */
	private String m_action;
	/**
	 * choiceBno
	 */
	private String m_choiceBno;
	/**
	 * ステータス
	 */
	private String[] m_status;
	/**
	 * 対処方法
	 */
	private String[] m_resolution;
	/**
	 * 優先度
	 */
	private String[] m_priority;
	/**
	 * 故障度
	 */
	private String[] m_severity;
	/**
	 * マイルストーン
	 */
	private String[] m_milestone;
	/**
	 * サブシステム
	 */
	private String[] m_subsystem;
	/**
	 * 機能
	 */
	private String[] m_function;
	/**
	 * 最終更新日from
	 */
	private String m_updateFromDate;
	/**
	 * 最終更新日to
	 */
	private String m_updateToDate;
	/**
	 * 期間
	 */
	private String m_pastDate;
	/**
	 * 発行日
	 */
	private boolean m_issuDate;
	/**
	 * 承認日
	 */
	private boolean m_authDate;
	/**
	 * 解析日
	 */
	private boolean m_analizeDate;
	/**
	 * 更新日
	 */
	private boolean m_bugUpdateDate;
	/**
	 * 確認日
	 */
	private boolean m_confirmDate;
	/**
	 * 担当者
	 */
	private String m_assigne;
	/**
	 * 発行者
	 */
	private boolean m_issuer;
	/**
	 * 承認者
	 */
	private boolean m_auther;
	/**
	 * 解析者
	 */
	private boolean m_analyst;
	/**
	 * 更新者
	 */
	private boolean m_bugUpdater;
	/**
	 * 確認者
	 */
	private boolean m_confirmer;
	/**
	 * タイトル
	 */
	private String m_title;
	/**
	 * 故障内容
	 */
	private String m_troubleText;
	/**
	 * 連絡事項
	 */
	private String m_principalText;
	/**
	 * 解析内容
	 */
	private String m_causelText;
	/**
	 * 処置内容
	 */
	private String m_updateText;
	/**
	 * 確認内容
	 */
	private String m_confirmText;
	/**
	 * 修正ソース名
	 */
	private String m_updateSrc;
	/**
	 * 修正ドキュメント名
	 */
	private String m_updateDoc;
	/**
	 * キーワード１
	 */
	private String m_keyword1;
	/**
	 * キーワード２
	 */
	private String m_keyword2;
	/**
	 * キーワード３
	 */
	private String m_keyword3;
	/**
	 * Log
	 */
	private Log log = LogFactory.getLog(this.getClass().getName());
//======================================
// other
//======================================
	/**
	 * where句
	 */
	private StringBuffer m_where = new StringBuffer();
	/**
	 * params
	 */
	private ArrayList m_params = new ArrayList();
	/**
	 * ヒット件数
	 */
	private int m_count;
	/**
	 * デフォルトステータス
	 * （未確認・新規／再開）
	 */
	private static final String[] DEFAULT_STATUS = {"0", "1", "6" };
//===========================================================================
// methods
//===========================================================================
	/**
	 * アクションの取得
	 * 
	 * @return アクション
	 */
	public String getAction()
	{
		return m_action;
	}
	/**
	 * アクションのセット
	 * 
	 * @param action アクション
	 */
	public void setAction(String action)
	{
		m_action = action;
	}
	/**
	 * 故障番号の取得
	 * 
	 * @return 故障番号
	 */
	public String getChoiceBno()
	{
		return m_choiceBno;
	}
	/**
	 * 故障番号のセット
	 * 
	 * @param bno 故障番号
	 */
	public void setChoiceBno(String choiceBno)
	{
		m_choiceBno = choiceBno;
	}
	/**
	 * ステータスの取得
	 * 
	 * @return ステータス
	 */
	public String[] getStatus()
	{
		return m_status;
	}
	/**
	 * ステータスのセット
	 * 
	 * @param status ステータス
	 */
	public void setStatus(String[] status)
	{
		m_status = status;
	}
	/**
	 * 対処方法の取得
	 * 
	 * @return 対処方法
	 */
	public String[] getResolution()
	{
		return m_resolution;
	}
	/**
	 * 対処方法のセット
	 * 
	 * @param resolution 対処方法
	 */
	public void setResolution(String[] resolution)
	{
		m_resolution = resolution;
	}
	/**
	 * 優先度の取得
	 * 
	 * @return 優先度
	 */
	public String[] getPriority()
	{
		return m_priority;
	}
	/**
	 * 優先度のセット
	 * 
	 * @param priority 優先度
	 */
	public void setPriority(String[] priority)
	{
		m_priority = priority;
	}
	/**
	 * 故障度の取得
	 * 
	 * @return 故障度
	 */
	public String[] getSeverity()
	{
		return m_severity;
	}
	/**
	 * 故障度のセット
	 * 
	 * @param severity 故障度
	 */
	public void setSeverity(String[] severity)
	{
		m_severity = severity;
	}
	/**
	 * マイルストーンの取得
	 * 
	 * @return マイルストーン
	 */
	public String[] getMilestone()
	{
		return m_milestone;
	}
	/**
	 * マイルストーンのセット
	 * 
	 * @param milestone マイルストーン
	 */
	public void setMilestone(String[] milestone)
	{
		m_milestone = milestone;
	}

	/**
	 * サブシステムの取得
	 * 
	 * @return サブシステム
	 */
	public String[] getSubsystem()
	{
		return m_subsystem;
	}
	/**
	 * サブシステムのセット
	 * 
	 * @param Subsystem サブシステム
	 */
	public void setSubsystem(String[] subsystem)
	{
		m_subsystem = subsystem;
	}
	/**
	 * 機能の取得
	 * 
	 * @return 機能
	 */
	public String[] getFunction()
	{
		return m_function;
	}
	/**
	 * 機能のセット
	 * 
	 * @param Function 機能
	 */
	public void setFunction(String[] function)
	{
		m_function = function;
	}
	/**
	 * 最終更新日fromの取得
	 * 
	 * @return 最終更新日from
	 */
	public String getUpdateFromDate()
	{
		return m_updateFromDate;
	}
	/**
	 * 最終更新日fromのセット
	 * 
	 * @param updateFromDate 最終更新日from
	 */
	public void setUpdateFromDate(String updateFromDate)
	{
		m_updateFromDate = updateFromDate;
	}
	/**
	 * 最終更新日toの取得
	 * 
	 * @return 最終更新日to
	 */
	public String getUpdateToDate()
	{
		return m_updateToDate;
	}
	/**
	 * 最終更新日toのセット
	 * 
	 * @param updateToDate 最終更新日to
	 */
	public void setUpdateToDate(String updateToDate)
	{
		m_updateToDate = updateToDate;
	}
	/**
	 * 期間の取得
	 * 
	 * @return 期間
	 */
	public String getPastDate()
	{
		return m_pastDate;
	}
	/**
	 * 期間のセット
	 * 
	 * @param pastDate 期間
	 */
	public void setPastDate(String pastDate)
	{
		m_pastDate = pastDate;
	}
	/**
	 * 発行日の取得
	 * 
	 * @return 発行日
	 */
	public boolean getIssuDate()
	{
		return m_issuDate;
	}
	/**
	 * 発行日のセット
	 * 
	 * @param issuDate 発行日
	 */
	public void setIssuDate(boolean issuDate)
	{
		m_issuDate = issuDate;
	}
	/**
	 * 承認日の取得
	 * 
	 * @return 承認日
	 */
	public boolean getAuthDate()
	{
		return m_authDate;
	}
	/**
	 * 承認日のセット
	 * 
	 * @param authDate 承認日
	 */
	public void setAuthDate(boolean authDate)
	{
		m_authDate = authDate;
	}
	/**
	 * 解析日の取得
	 * 
	 * @return 解析日
	 */
	public boolean getAnalizeDate()
	{
		return m_analizeDate;
	}
	/**
	 * 解析日のセット
	 * 
	 * @param analizeDate 解析日
	 */
	public void setAnalizeDate(boolean analizeDate)
	{
		m_analizeDate = analizeDate;
	}
	/**
	 * 更新日の取得
	 * 
	 * @return 更新日
	 */
	public boolean getBugUpdateDate()
	{
		return m_bugUpdateDate;
	}
	/**
	 * 更新日のセット
	 * 
	 * @param bugUpdateDate 更新日
	 */
	public void setBugUpdateDate(boolean bugUpdateDate)
	{
		m_bugUpdateDate = bugUpdateDate;
	}
	/**
	 * 確認日の取得
	 * 
	 * @return 確認日
	 */
	public boolean getConfirmDate()
	{
		return m_confirmDate;
	}
	/**
	 * 確認日のセット
	 * 
	 * @param confirmDate 確認日
	 */
	public void setConfirmDate(boolean confirmDate)
	{
		m_confirmDate = confirmDate;
	}
	/**
	 * 担当者の取得
	 * 
	 * @return 担当者
	 */
	public String getAssigne()
	{
		return m_assigne;
	}
	/**
	 * 担当者のセット
	 * 
	 * @param assigne 担当者
	 */
	public void setAssigne(String assigne)
	{
		m_assigne = assigne;
	}
	/**
	 * 発行者の取得
	 * 
	 * @return 発行者
	 */
	public boolean getIssuer()
	{
		return m_issuer;
	}
	/**
	 * 発行者のセット
	 * 
	 * @param issuer 発行者
	 */
	public void setIssuer(boolean issuer)
	{
		m_issuer = issuer;
	}
	/**
	 * 承認者の取得
	 * 
	 * @return 承認者
	 */
	public boolean getAuther()
	{
		return m_auther;
	}
	/**
	 * 承認者のセット
	 * 
	 * @param auther 承認者
	 */
	public void setAuther(boolean auther)
	{
		m_auther = auther;
	}
	/**
	 * 解析者の取得
	 * 
	 * @return 解析者
	 */
	public boolean getAnalyst()
	{
		return m_analyst;
	}
	/**
	 * 解析者のセット
	 * 
	 * @param analyst 解析者
	 */
	public void setAnalyst(boolean analyst)
	{
		m_analyst = analyst;
	}
	/**
	 * 更新者の取得
	 * 
	 * @return 更新者
	 */
	public boolean getBugUpdater()
	{
		return m_bugUpdater;
	}
	/**
	 * 更新者のセット
	 * 
	 * @param bugUpdater 更新者
	 */
	public void setBugUpdater(boolean bugUpdater)
	{
		m_bugUpdater = bugUpdater;
	}
	/**
	 * 確認者の取得
	 * 
	 * @return 確認者
	 */
	public boolean getConfirmer()
	{
		return m_confirmer;
	}
	/**
	 * 確認者のセット
	 * 
	 * @param confirmer 確認者
	 */
	public void setConfirmer(boolean confirmer)
	{
		m_confirmer = confirmer;
	}
	/**
	 * タイトルの取得
	 * 
	 * @return タイトル
	 */
	public String getTitle()
	{
		return m_title;
	}
	/**
	 * タイトルのセット
	 * 
	 * @param title タイトル
	 */
	public void setTitle(String title)
	{
		m_title = title;
	}
	/**
	 * 故障内容の取得
	 * 
	 * @return 故障内容
	 */
	public String getTroubleText()
	{
		return m_troubleText;
	}
	/**
	 * 故障内容のセット
	 * 
	 * @param troubleText 故障内容
	 */
	public void setTroubleText(String troubleText)
	{
		m_troubleText = troubleText;
	}
	/**
	 * 連絡事項の取得
	 * 
	 * @return 連絡事項
	 */
	public String getPrincipalText()
	{
		return m_principalText;
	}
	/**
	 * 連絡事項のセット
	 * 
	 * @param principalText 連絡事項
	 */
	public void setPrincipalText(String principalText)
	{
		m_principalText = principalText;
	}
	/**
	 * 解析内容の取得
	 * 
	 * @return 解析内容
	 */
	public String getCauselText()
	{
		return m_causelText;
	}
	/**
	 * 解析内容のセット
	 * 
	 * @param causelText 解析内容
	 */
	public void setCauselText(String causelText)
	{
		m_causelText = causelText;
	}
	/**
	 * 処置内容の取得
	 * 
	 * @return 処置内容
	 */
	public String getUpdateText()
	{
		return m_updateText;
	}
	/**
	 * 処置内容のセット
	 * 
	 * @param updateText 処置内容
	 */
	public void setUpdateText(String updateText)
	{
		m_updateText = updateText;
	}
	/**
	 * 確認内容の取得
	 * 
	 * @return 確認内容
	 */
	public String getConfirmText()
	{
		return m_confirmText;
	}
	/**
	 * 確認内容のセット
	 * 
	 * @param confirmText 確認内容
	 */
	public void setConfirmText(String confirmText)
	{
		m_confirmText = confirmText;
	}
	/**
	 * 修正ソース名の取得
	 * 
	 * @return 修正ソース名
	 */
	public String getUpdateSrc()
	{
		return m_updateSrc;
	}
	/**
	 * 修正ソース名のセット
	 * 
	 * @param updateSrc 修正ソース名
	 */
	public void setUpdateSrc(String updateSrc)
	{
		m_updateSrc = updateSrc;
	}
	/**
	 * 修正ドキュメント名の取得
	 * 
	 * @return 修正ドキュメント名
	 */
	public String getUpdateDoc()
	{
		return m_updateDoc;
	}
	/**
	 * 修正ドキュメント名のセット
	 * 
	 * @param updateDoc 修正ドキュメント名
	 */
	public void setUpdateDoc(String updateDoc)
	{
		m_updateDoc = updateDoc;
	}
	/**
	 * キーワード１の取得
	 * 
	 * @return キーワード１
	 */
	public String getKeyword1()
	{
		return m_keyword1;
	}
	/**
	 * キーワード１のセット
	 * 
	 * @param keyword1 キーワード１
	 */
	public void setKeyword1(String keyword1)
	{
		m_keyword1 = keyword1;
	}
	/**
	 * キーワード２の取得
	 * 
	 * @return キーワード２
	 */
	public String getKeyword2()
	{
		return m_keyword2;
	}
	/**
	 * キーワード２のセット
	 * 
	 * @param keyword2 キーワード２
	 */
	public void setKeyword2(String keyword2)
	{
		m_keyword2 = keyword2;
	}
	/**
	 * キーワード３の取得
	 * 
	 * @return キーワード３
	 */
	public String getKeyword3()
	{
		return m_keyword3;
	}
	/**
	 * キーワード３のセット
	 * 
	 * @param keyword3 キーワード３
	 */
	public void setKeyword3(String keyword3)
	{
		m_keyword3 = keyword3;
	}
//======================================
// other
//======================================
	/**
	 * where句の取得
	 * 
	 * @return where句
	 */
	public StringBuffer getWhere()
	{
		return m_where;
	}
	/**
	 * where句のセット
	 * 
	 * @param where where句
	 */
	public void setWhere(StringBuffer where)
	{
		m_where = where;
	}
	/**
	 * 検索パラメータ群の取得
	 * 
	 * @return 検索パラメータ群
	 */
	public ArrayList getParams()
	{
		return m_params;
	}
	/**
	 * 検索パラメータ群のセット
	 * 
	 * @param params 検索パラメータ群
	 */
	public void setParams(ArrayList params)
	{
		m_params = params;
	}
	/**
	 * 検索ヒット件数の取得
	 * 
	 * @return 検索ヒット件数
	 */
	public int getCount()
	{
		return m_count;
	}
	/**
	 * 検索ヒット件数のセット
	 * 
	 * @param count 検索ヒット件数
	 */
	public void setCount(int count)
	{
		m_count = count;
	}
//===========================================================================
// Public Methods
//===========================================================================
	/**
	* Reset all properties to their default values.
	*
	* @param mapping The mapping used to select this instance
	* @param request The servlet request we are processing
	*/
	public void reset(ActionMapping mapping, HttpServletRequest request) {
	
		//debug
		debug("reset");
		//encodeing セット
		try {
			request.setCharacterEncoding("SJIS");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		m_action = null;
		m_choiceBno = null;
		//selectでデフォルト指定をすると、指定なしの時デフォルトが使われるらしい。
		//見た目と違う動作をするのでデフォルトを与えるのはやめる
/*--------------------------------------------------
		m_status = DEFAULT_STATUS;
--------------------------------------------------*/
		m_status = null;
		m_resolution = null;
		m_priority = null;
		m_severity = null;
		m_milestone = null;
		m_subsystem = null;
		m_function = null;
		m_updateFromDate = null;
		m_updateToDate = null;
		m_pastDate = null;
		m_issuDate = false;
		m_authDate = false;
		m_analizeDate = false;
		m_bugUpdateDate = false;
		m_confirmDate = false;
		m_assigne = null;
		m_issuer = false;
		m_auther = false;
		m_analyst = false;
		m_bugUpdater = false;
		m_confirmer = false;
		m_title = null;
		m_troubleText = null;
		m_principalText = null;
		m_causelText = null;
		m_updateText = null;
		m_confirmText = null;
		m_updateSrc = null;
		m_updateDoc = null;
		m_keyword1 = null;
		m_keyword2 = null;
		m_keyword3 = null;
		//other 
		m_where = new StringBuffer();
		m_params = new ArrayList();
	}
	/**
	* Validate the properties that have been set from this HTTP request,
	* and return an <code>ActionErrors</code> object that encapsulates any
	* validation errors that have been found.  If no errors are found, return
	* <code>null</code> or an <code>ActionErrors</code> object with no
	* recorded error messages.
	*
	* @param mapping The mapping used to select this instance
	* @param request The servlet request we are processing
	*/
	public ActionErrors validate(ActionMapping mapping,
								 HttpServletRequest request) {
		ActionErrors errors = new ActionErrors();
		//debug
		debug("validate");
		
		//アクション
		if (Varidater.checkRequired(m_action, "action", errors)) {
			
			//quickか？
			if (m_action.equals("quick")) {
				//選択バグ番号
				if (Varidater.checkRequired(m_choiceBno, "choiceBno", errors)) {
					parseChoiceBno("choiceBno", errors);
				}
			//通常の検索
			} else {
				//status
				parseSelection(m_status, "status", errors);
				//resolution
				parseSelection(m_resolution, "resolution", errors);
				//priority
				parseSelection(m_priority, "priority", errors);
				//severity
				parseSelection(m_severity, "severity", errors);
				//milestone
				parseSelection(m_milestone, "milestone", errors);
				//subsystem
				parseSelection(m_subsystem, "subsystem", errors);
				//fuction
				parseSelection(m_function, "functionName", errors);
				//updateFromDate/updateToDate
				//どちらか指定されているか？
				if ((Varidater.isInput(m_updateFromDate)) || (Varidater.isInput(m_updateToDate))) {
					//指定あり
					parseDateSpan(m_updateFromDate, m_updateToDate, "updateDate", errors);
				}
				//選択バグ番号
				if (Varidater.isInput(m_choiceBno)) {
					parseChoiceBno("choiceBno", errors);
				}
				//pastDate
				parsePastDate(errors);
				//assign
				parseAssign(errors);
				//title
				parseText(m_title, "title", errors);
				
				//troubleText
				parseAddText(m_troubleText, "content", AddText.TYPE_TROUBLE, errors);
				//principalText
				parseAddText(m_principalText, "content", AddText.TYPE_PRINCIPAL, errors);
				//causelText
				parseAddText(m_causelText, "content", AddText.TYPE_CAUSE, errors);
				//updateText
				parseAddText(m_updateText, "content", AddText.TYPE_UPDATE, errors);
				//confirmText
				parseAddText(m_confirmText, "content", AddText.TYPE_CONFIRM, errors);
				
				//updateSrc
				parseText(m_updateSrc, "updateSrc", errors);
				//updateDoc
				parseText(m_updateDoc, "updateDoc", errors);
				//keyword1
				parseText(m_keyword1, "keyword1", errors);
				//keyword2
				parseText(m_keyword2, "keyword2", errors);
				//keyword3
				parseText(m_keyword3, "keyword3", errors);
				
				//なにも指定されいなければエラーとする
				if (m_where.length() == 0) {
					Varidater.addErrors(Varidater.REQUIRED_MSG, "serchParam", errors);
				}
				
				
			}
		}
		
		return errors;
	}
//===========================================================================
// debug Methods
//===========================================================================
	/**
	 * デバッグ文字出力
	 *
	 * @param s 出力文字列
	 */
	private void debug(String s) {
		System.out.println("[SerchForm]" + s);
	}
//===========================================================================
// parser Methods
//===========================================================================
	/**
	 * 故障番号の解析
	 * 
	 * @return 故障番号
	 */
	private void parseChoiceBno(String name, ActionErrors errors) {
		
		StringBuffer where = new StringBuffer();
		
		//カンマで分解しながら、中を解析していく
		StringTokenizer st = new StringTokenizer(m_choiceBno, ",");
		while (st.hasMoreTokens()) {
			String token = st.nextToken();
			//tokenは空か？
			if ((token != null) && (token.length() > 0)) {
				//空でなければ
				
				//範囲指定チェック
				int offset = token.indexOf("-");
				//範囲指定ではない
				if (offset == -1) {
					//数値チェック
					if (Varidater.checkNumeric(token, name, errors)) {
						//where句の生成
						appendOR(where, "A.bno = ?");
						m_params.add(new Integer(token));
					}
				//範囲指定である
				} else {
					String from = token.substring(0,offset).trim();
					String to = token.substring(offset+1).trim();
					//from指定/to指定あり
					if ((from.length() > 0) && ((to.length() > 0))) {
						
						//where句の生成
						appendOR(where, "(A.bno >= ? AND A.bno <= ?)");
						if (Varidater.checkNumeric(from, name, errors)) {
							m_params.add(new Integer(from));
						}
						if (Varidater.checkNumeric(to, name, errors)) {
							m_params.add(new Integer(to));
						}
					//from指定のみ
					} else if (from.length() > 0) {
						appendOR(where, "A.bno >= ? ");
						
						if (Varidater.checkNumeric(from, name, errors)) {
							m_params.add(new Integer(from));
						}
					//to指定のみ
					} else {
						appendOR(where, "A.bno <= ? ");
						if (Varidater.checkNumeric(to, name, errors)) {
							m_params.add(new Integer(to));
						}
					}
				}
			}
		}
		
		//検索条件の括弧を閉じる
		termWhere(where);
		
		//debug
		debug("parseChoiceBno:where = " + where);
		
		//他の条件とANDで結ぶ
		appendAND(m_where, where);
		
	}
	/**
	 * 選択項目の解析
	 * 
	 */
	private void parseSelection(String[] target, String name, ActionErrors errors) {
		
		//指定無しの場合はなにもしない
		if ((target == null) || (target.length == 0)) {
			return;
		}
		
		StringBuffer where = new StringBuffer();
		
		for(int i = 0; i < target.length; i++) {
			//ダミーを選択していなければ
			if (! target.equals("00")) {
				//where句に追加
				if (name.equals("status")) {
					//ステータスだけは数値なのでIntegerに変換する必要がある。
					appendOR(where, "A." + name + " = ?");
					m_params.add(new Integer(target[i]));
				} else {
					appendOR(where, "A." + name + " = ?");
					m_params.add(target[i]);
				}
			}
		}
		
		//検索条件の括弧を閉じる
		termWhere(where);
		
		//debug
		debug("parseSelection:where = " + where);
		
		//他の条件とANDで結ぶ
		appendAND(m_where, where);
		
	}
	/**
	 * 日付間隔の解析
	 * 
	 */
	private void parseDateSpan(String from, String to, String name, ActionErrors errors) {
		
		StringBuffer where = new StringBuffer();
		boolean err = false;
		Date fromDate = null;
		Date toDate = null;
		
		//fromのチェック
		if (Varidater.isInput(from)) {	//指定あり
			if (Varidater.checkDate(from, name+"From", Converter.SHORT_DATE_PATTAN, errors)) {
				//エラーでなければ
				fromDate = Varidater.parseDate(from, Converter.SHORT_DATE_PATTAN);
			} else {
				err = true;		//エラーあり
			}
		}
		//toの解析
		if (Varidater.isInput(from)) {	//指定あり
			if (Varidater.checkDate(from, name+"To", Converter.SHORT_DATE_PATTAN, errors)) {
				//エラーでなければ
				toDate = Varidater.parseDate(to, Converter.SHORT_DATE_PATTAN);
			} else {
				err = true;		//エラーあり
			}
		}
		
		//ここまででエラーがあれば進めない
		if (err) {
			return;
		}
		
		//比較
		if ((fromDate != null) && (toDate != null)) {		//両方指定
			//fromはtoより前か？
			if (! fromDate.before(toDate)) {
				//でなければ、エラー
				Varidater.addErrors(Varidater.INVALID_DATE_MSG, name+"From", errors);
				return;	//ここまで
				
			} else {
				//where句の生成
				where.append("(? <= A." + name + " AND A." + name + " <= ?)");
				m_params.add(fromDate);
				m_params.add(toDate);
			}
		} else if (fromDate != null) {
			//from指定の生成
			where.append("(? <= A." + name + ")");
			m_params.add(fromDate);
		} else {
			//to指定の生成
			where.append("(A." + name + " <= ?)");
			m_params.add(toDate);
		}
		//debug
		debug("parseDateSpan:where = " + where);
		
		//他の条件とANDで結ぶ
		appendAND(m_where, where);
		
	}
	/**
	 * 日付指定の解析
	 * 
	 */
	private void parsePastDate(ActionErrors errors) {
		
		StringBuffer where = new StringBuffer();
		
		//どれかが指定されているか？
		if ((m_issuDate) || (m_authDate) || (m_analizeDate) || (m_bugUpdateDate) ||(m_confirmDate)) {
			//日数の指定があるか
			if (Varidater.isInput(m_pastDate)) {
				//あれば、pastDateのチェック
				if (Varidater.checkNumeric(m_pastDate, "pastDate", errors)) {
					//エラーでなければ日付を作る
					
					//過去日付をマイナスにして日付指定でaddし、日付を得る
					Calendar now = Calendar.getInstance();	//カレンダの取得
					
					now.set(Calendar.HOUR_OF_DAY, 0);	//時間を最小にする
					now.set(Calendar.MINUTE , 0);		//分を最大にする
					now.set(Calendar.SECOND , 0);		//秒を最大にする
					int amount = Integer.parseInt(m_pastDate) * -1;
					now.add(Calendar.DATE, amount);
					Date pastDate = now.getTime();
					
					//debug
					log.debug("pastDate = " + pastDate);
					
					//発行日指定
					if (m_issuDate) {
						appendOR(where, "A.issuDate >= ?");
						m_params.add(pastDate);
					}
					//承認日指定
					if (m_authDate) {
						appendOR(where, "A.authDate >= ?");
						m_params.add(pastDate);
					}
					//解析日指定
					if (m_analizeDate) {
						appendOR(where, "A.analizeDate >= ?");
						m_params.add(pastDate);
					}
					//修正日指定
					if (m_bugUpdateDate) {
						appendOR(where, "A.bugUpdateDate >= ?");
						m_params.add(pastDate);
					}
					//確認日指定
					if (m_confirmDate) {
						appendOR(where, "A.comfirmDate >= ?");
						m_params.add(pastDate);
					}
					
					/**
					 * 検索条件の出力
					 */
					
					//検索条件の括弧を閉じる
					termWhere(where);
					
					//debug
					debug("parsePasrDate:where = " + where);
					
					//他の条件とANDで結ぶ
					appendAND(m_where, where);
					
				}
			}
		}
		
		
	}
	/**
	 * 担当者指定の解析
	 * 
	 */
	private void parseAssign(ActionErrors errors) {
		
		StringBuffer where = new StringBuffer();
		
		//どれかが指定されているか？
		if ((m_issuer) || (m_auther) || (m_analyst) || (m_bugUpdater) ||(m_confirmer)) {
			//担当者の指定があるか
			if (Varidater.isInput(m_assigne)) {
				//unoは数値型なので、Integerに変換しておく
				Integer assigne = new Integer(m_assigne);
				
				//指定があれば、where句を作る
				//発行者指定
				if (m_issuer) {
					appendOR(where, "A.issuer = ?");
					m_params.add(assigne);
				}
				//承認者指定
				if (m_auther) {
					appendOR(where, "A.auther = ?");
					m_params.add(assigne);
				}
				//解析者指定
				if (m_analyst) {
					appendOR(where, "A.analyst = ?");
					m_params.add(assigne);
				}
				//修正者指定
				if (m_bugUpdater) {
					appendOR(where, "A.updater = ?");
					m_params.add(assigne);
				}
				//確認者指定
				if (m_confirmer) {
					appendOR(where, "A.comfirmer = ?");
					m_params.add(assigne);
				}
				
				/**
				 * 検索条件の出力
				 */
				//検索条件の括弧を閉じる
				termWhere(where);
				
				//debug
				debug("parseAssign:where = " + where);
				
				//他の条件とANDで結ぶ
				appendAND(m_where, where);
				
			}
		}
	}
	/**
	 * テキストの解析
	 * 
	 */
	private void parseText(String text, String name, ActionErrors errors) {
		
		//指定無しの場合はなにもしない
		if ((text == null) || (text.length() == 0)) {
			return;
		}
		
		StringBuffer where = new StringBuffer();
		
		where.append("(A." + name + " LIKE ?)");
		//プリぺアードで埋めるときは埋め込み文字列の前後が''で囲まれるので
		//文字列自体に%を付加しなければならない。
		m_params.add("%" + text + "%");
		
		//debug
		debug("parseText:where = " + where);
		
		//他の条件とANDで結ぶ
		appendAND(m_where, where);
		
	}
	/**
	 * 追加テキストの解析
	 * 
	 */
	private void parseAddText(String text, String name, byte textType, ActionErrors errors) {
		
		//指定無しの場合はなにもしない
		if ((text == null) || (text.length() == 0)) {
			return;
		}
		
		StringBuffer where = new StringBuffer();
		
		where.append("(B.textType = ? AND");
		where.append(" B." + name + " LIKE ?)");
		m_params.add(new Byte(textType));
		m_params.add("%" + text + "%");
		
		//debug
		debug("parseAddText:where = " + where);
		
		//他の条件とANDで結ぶ
		appendAND(m_where, where);
		
	}
//===========================================================================
// private Methods
//===========================================================================
	/**
	 * OR条件の追加処理
	 */
	private void appendOR(StringBuffer where, String s) {
		
		if (where.length() == 0) {
			//最初のwhere句ならば、括弧で始める
			where.append("(");
		} else {
			//最初のwhere句でなければorで結ぶ
			where.append(" OR ");
		}
		where.append(s);
	}
	/**
	 * where句追加処理（条件の終了）
	 */
	private void termWhere(StringBuffer where) {
		
		if (where.length() != 0) {
			//条件があれば括弧を閉じる
			where.append(")");
		}
	}
	/**
	 * AND条件の追加処理
	 */
	private void appendAND(StringBuffer where, StringBuffer s) {
		
		//最初のwhere句でなければandで結ぶ
		if (s.length() > 0) {
			if (where.length() > 0) {
				where.append(" AND ");
			}
			where.append(s);
		}
	}
}