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

//===========================================================================
// import
//===========================================================================
import java.io.IOException;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.logging.*;
import org.apache.struts.action.*;
import org.apache.struts.util.*;
import org.apache.commons.beanutils.*;

import jp.gr.java_conf.bugslife.form.*;
import jp.gr.java_conf.bugslife.selections.*;
import jp.gr.java_conf.bugslife.user.*;
import jp.gr.java_conf.bugslife.system.*;
/**
 *<PRE>
 * 
 * BugDetail1Actionクラス
 *
 *</PRE>
 * @version	0.0
 * @author	鰐川 正寛
 */
public abstract class BaseAction extends Action {
//===========================================================================
// attributes
//===========================================================================
	/**
	 * Log
	 */
	private Log log = LogFactory.getLog(this.getClass().getName());
//===========================================================================
// methods
//===========================================================================
	/**
	 * exevute
	 *
	 * @param mapping The ActionMapping used to select this instance
	 * @param actionForm The optional ActionForm bean for this request (if any)
	 * @param request The HTTP request we are processing
	 * @param response The HTTP response we are creating
	 *
	 * @exception Exception if business logic throws an exception
	 */
    public ActionForward execute(ActionMapping mapping,
				 ActionForm form,
				 HttpServletRequest request,
				 HttpServletResponse response)
				throws Exception {
		ActionForward forward = null;
		try {
			//debug
			log.debug("doAction start--------------------------------");
			
			forward = doAction(mapping, form, request, response);
			
			//debug
			log.debug("doAction end----------------------------------");
			
		} catch (Exception e) {
			
			e.printStackTrace();
			throw e;
		}
		return forward;
	}
	/**
	 * 
	 */
	public abstract ActionForward doAction(ActionMapping mapping,
				 ActionForm form,
				 HttpServletRequest request,
				 HttpServletResponse response)
				throws Exception;
//===========================================================================
// common methods
//===========================================================================
	/**
	 * sessionの取得
	 */
	protected HttpSession getSession(HttpServletRequest request) {
		
		return getSession(request, false);	//新規取得しない
	}
	/**
	 *  セッションの取得
	 *
	 *	セッションを取得する。新規取得フラグがtrueの場合新規にセッションを取り直し
	 *	falseの場合既存のセッションを取り出す
	 *	既存のセッションが取り出せない場合、SessionTimeoutExceptionを投げる
	 *
	 *	@param	request		HTTP要求オブジェクト
	 *	@param	newFlag		新規取得フラグ
	 */
	public HttpSession getSession(HttpServletRequest request, boolean newFlag) {
		//セッションの取得
		HttpSession session = request.getSession(newFlag);
		//セッションが取得できたか
		if (session == null) {
			//取得できない場合、ユーザがログインせずに直接アクセスしてきたか
			//タイムアウトしている。
			//セッションなし例外をthrowする。
			throw new SessionTimeoutException();
		}
		return session;
	}
	/**
	 *  アトリビュートの取得(デフォルト：必須)
	 *
	 *	@param	session		セッション
	 *	@param	keyword		アトリビュート名
	 */
	public Object getAttribute(HttpSession session, String keyword) {
		return getAttribute(session, keyword, true);
	}
	/**
	 *  アトリビュートの取得
	 *
	 *	セッションからアトリビュートを取得する。
	 *	アトリビュートが取り出せない場合、IlligalSessionExceptionを投げる
	 *
	 *	@param	session		セッション
	 *	@param	keyword		アトリビュート名
	 *
	 */
	public Object getAttribute(HttpSession session, String keyword, boolean required) {
		Object obj = null;
	 	
		obj = session.getAttribute(keyword);	//アトリビュートの取得
		//必須か？
		if (required) {
			if (obj == null) {
				//取得できない場合、バグ
				throw new SessionTimeoutException("no attribute found name = " + keyword);
			}
		}
		return obj;
	}
}
