/**
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.kinako.action;

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

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;
import org.logical_paradox.kinako.constant.ApConstant;
import org.logical_paradox.kinako.object.FailureTransitionException;

/**
 * 基底アクション
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.4 $
 */
public abstract class KinakoBaseAction extends Action {
	/**
	 * ロジックを実行する
	 * @param form アクションフォーム
	 * @param mapping マッピング
	 * @param resource メッセージリソース
	 * @return フォワード
	 */
	public abstract ActionForward executeLogic(ActionForm form, ActionMapping mapping, MessageResources resource) throws Exception;
	/**
	 * 事前処理
	 * アクションが実行される前に何かしたい場合，このメソッドをオーバーライドすること
	 * @param baseForm フォーム
	 * @return true:成功 / false:失敗
	 * @throws Exception 処理中に発生した例外
	 */
	public boolean preProcess(ActionForm baseForm) throws Exception {
		return true;
	}
	/**
	 * 事後処理
	 * アクション実行後に何かしたい場合，このメソッドをオーバーライドすること
	 * @param baseForm フォーム
	 * @return true:成功 / false:失敗
	 * @throws Exception 処理中に発生した例外
	 */
	public boolean postProcess(ActionForm baseForm) throws Exception {
		return true;
	}
	/**
	 * アクションを実行する
	 * 事前処理の呼び出し，ロジックの呼び出し，事後処理の呼び出しの順に処理する
	 */
	@Override
	public final ActionForward execute(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response)
		throws Exception {

		// ロジック
		ActionForward forward = null;
		try {
			// 事前処理
			if(preProcess(form) == false) {
				throw new FailureTransitionException();
			}
			forward = executeLogic(form, mapping, getResources(request));
			// 事後処理
			if(postProcess(form) == false) {
				throw new FailureTransitionException();
			}
		} catch(FailureTransitionException e) {
			// エラー遷移
			forward = mapping.findForward(ApConstant.FORWARD_FAILURE);
		}

		return forward;
	}
}
