/*
 * 作成日: 2005/02/09
 *
 * TODO この生成されたファイルのテンプレートを変更するには次へジャンプ:
 * ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
 */
package jp.co.ntt.lms.xmf.actions;

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

import jp.co.ntt.lms.xms.framework.Constant;
import jp.co.ntt.lms.xms.framework.XmsBusinessAction;
import jp.co.ntt.lms.xms.framework.XmsBusinessBean;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsInnerException;
import jp.co.ntt.lms.xms.framework.XmsRequest;
import jp.co.ntt.lms.xms.framework.XmsResponse;
import jp.co.ntt.lms.xms.framework.XmsScreenAction;
import jp.co.ntt.lms.xms.framework.XmsScreenBean;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.XmsWarningException;

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

/**
 * @author Administrator
 *
 * TODO この生成された型コメントのテンプレートを変更するには次へジャンプ:
 * ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
 */
public class XmsAction extends Action {

	/**
	 * アクションクラスの実行
	 * @param map
	 * @param request
	 * @param response
	 * @param bizAction
	 * @param scrAction
	 * @return
	 */
	protected ActionForward performXmsAction(ActionMapping map, HttpServletRequest request, HttpServletResponse response, XmsBusinessAction bizAction, XmsScreenAction scrAction) {

		// レスポンスオブジェクトの生成
		XmsResponse xmsResponse = new XmsResponse();
		try {
			// リクエストオブジェクトの生成
			XmsRequest xmsRequest = new XmsRequest(request, response);
			
			// BusinessAction実行
			if ( bizAction != null ) {
				performXmsBusinessAction(bizAction, xmsRequest, xmsResponse);
			}
			
			// ScreenAction実行
			if ( scrAction != null ) {
				performXmsScreenAction(scrAction, xmsRequest, xmsResponse);
			}

		} catch (XmsWarningException e) {
			request.setAttribute(Constant.KEY_ERROR, e);
			return map.findForward("warning");
		} catch (XmsInnerException e) {
			request.setAttribute(Constant.KEY_ERROR, e);
			return map.findForward("inner");
		} catch (XmsSystemException e) {
			request.setAttribute(Constant.KEY_ERROR, e);
			return map.findForward("system");
		} catch (Throwable th) {
			request.setAttribute(Constant.KEY_ERROR, th);
			return map.findForward("throwable");
		}

		String businessStatus = xmsResponse.getBusinessStatus();
		return map.findForward(businessStatus);
	}
	
	/**
	 * XmsBusinessActionの実行
	 * @param action
	 * @param xmsRequest
	 * @param xmsResponse
	 * @throws XmsException
	 */
	protected void performXmsBusinessAction(XmsBusinessAction action, XmsRequest xmsRequest, XmsResponse xmsResponse) throws XmsException {
		// 処理を実行
		action.perform(xmsRequest, xmsResponse);
		
		// 返却値オブジェクトから画面情報を取り出す。
		XmsBusinessBean bean = xmsResponse.getBusinessBean();

		// スコープによる画面情報オブジェクトの設定
		if( bean != null ) {
			HttpServletRequest request = xmsRequest.getRequest();
			// スコープがセッションの場合
			if( xmsResponse.getScope() == XmsResponse.SESSION ) {
				
				HttpSession session = request.getSession();
				session.setAttribute(xmsResponse.getBusinessBeanName(), bean);
			}
			// スコープがリクエストの場合
			else if( xmsResponse.getScope() == XmsResponse.REQUEST ) {
				request.setAttribute(xmsResponse.getBusinessBeanName(), bean);
			}
		}
	}
	
	/**
	 * XmsScreenActionの実行
	 * @param action
	 * @param xmsRequest
	 * @param xmsResponse
	 * @throws XmsException
	 */
	protected void performXmsScreenAction(XmsScreenAction action,
			XmsRequest xmsRequest, XmsResponse xmsResponse) throws XmsException {
		// 処理を実行
		action.perform(xmsRequest, xmsResponse);

		// 返却値オブジェクトから画面情報を取り出す。
		XmsScreenBean bean = xmsResponse.getScreenBean();

		// スコープによる画面情報オブジェクトの設定
		if (bean != null) {
			HttpServletRequest request = xmsRequest.getRequest();
			// スコープがセッションの場合
			if (xmsResponse.getScope() == XmsResponse.SESSION) {
				HttpSession session = request.getSession();
				session.setAttribute(xmsResponse.getScreenBeanName(), bean);
			}
			// スコープがリクエストの場合
			else if (xmsResponse.getScope() == XmsResponse.REQUEST) {
				request.setAttribute(xmsResponse.getScreenBeanName(), bean);
			}
		}
	}
	
}
