package jp.ossc.petstore.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import jp.ossc.petstore.dto.peerdto.LoginPeerDTO;
import jp.ossc.petstore.OpenstandiaConst;
import jp.ossc.petstore.peer.IPeer;

/**
 * ログインアクション
 * @author ossc
 * @version $Revision: 1.2 $
 */
public class LoginAction extends BaseAction {

	/**
	 * ログインPeer
	 */
	private IPeer loginPeer;

	/**
	 * ログインPeer設定
	 * @param loginPeer ログインPeer
	 */
	public void setLoginPeer(IPeer loginPeer) {
		this.loginPeer = loginPeer;
	}

	/**
	 * ログインアクション実行。<br>
	 * Login業務処理を呼び出し、実行結果に応じて遷移先を決定する。
	 * <ul>
	 * <li>正常終了した場合、顧客情報をセッションに格納し「success」に遷移する。
	 * <li>正常終了以外の場合、エラーメッセージを保存し「failure」に遷移する。
	 * </ul>
	 * @param mapping ActionMapping
	 * @param form ActionForm
	 * @param request HTTPリクエスト
	 * @param response HTTPレスポンス
	 * @return 画面遷移先
	 * @throws Exception Action実行時エラー
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		// DTO生成
		LoginPeerDTO dto = new LoginPeerDTO();
		dto.setActionForm(form);
		
		// ログイン業務処理実行
		loginPeer.execute(dto);
		
		// ステータスチェック
		if (dto.getStatus() != OpenstandiaConst.ENV_STATUS_NORMAL_END) {
			saveMessages(request, dto.getActionMessages());
			return mapping.findForward(OpenstandiaConst.ENV_FORWARD_FAILURE);
		}
		
		// Session作成
		HttpServletRequest httpRequest = (HttpServletRequest)request;
		HttpSession session = httpRequest.getSession(true);

		// Sessionの顧客情報を削除
		session.removeAttribute(OpenstandiaConst.ENV_SES_ATRBT_CUSTOMER);

		// Sessionに顧客情報を保持
		session.setAttribute(OpenstandiaConst.ENV_SES_ATRBT_CUSTOMER, dto.getCustomer());

		return mapping.findForward(OpenstandiaConst.ENV_FORWARD_SUCCESS);
	}
}
