/*
 * Struts Actionのベースとなるクラス。
 * ※このクラスはblancoStrutsの自動生成の対象ではありません。
 * @since 2005/03/21
 */
package blanco.struts.action;

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

import org.apache.log4j.Logger;
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 blanco.struts.exception.ValidateException;

/**
 * blancoStruts <br>
 * Struts Actionのベースとなるクラス。 <br>
 * ※このクラスはblancoStrutsの自動生成の対象ではありません。
 * 
 * @since 2005/03/21
 * @author HiromuUchibayashi
 */
public abstract class AbstractBaseAction extends Action {

    public abstract ActionForward executeAction(ActionMapping mapping,
            ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception;

    public final ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        ActionForward forward = null;
        HttpSession session = request.getSession(false);

        // SessionTimeOutのチェックをする
        if (session == null) {
            // TODO: Sessionを取得してSystemError画面へ
            // TODO: t.iga 2005.05.16 タイムアウト時の実装をここで行う必要があります。
        }

        try {
            // TODO: ここでConnectionを取得する
            Logger.getLogger(getClass()).info(
                    "start: " + getMyClassName(getClass().getName())
                            + " EventId[" + request.getParameter("eventId")
                            + "]");
            forward = executeAction(mapping, form, request, response);
        } catch (ValidateException e) {
            saveErrors(request, e.getActionErrors());
            return mapping.findForward("validate.error");
        } catch (Exception e) {
            e.printStackTrace();
            // TODO: Logを出力
            // TODO: SystemError画面へ
            // TODO: 現時点ではログイン画面へ
            return mapping.findForward("logout");
        } catch (Error e) {
            e.printStackTrace();
            // TODO: Logを出力
            // TODO: SystemError画面へ
            // TODO: 現時点ではログイン画面へ
            return mapping.findForward("logout");
        } finally {
            Logger.getLogger(getClass()).info(
                    "end  : " + getMyClassName(getClass().getName())
                            + " EventId[" + request.getParameter("eventId")
                            + "]");
        }
        return forward;
    }

    private String getMyClassName(String fullClassName) {
        String[] split = fullClassName.split("\\.");
        if (split == null || split.length == 0) {
            return "No Class[" + fullClassName + "]";
        } else {
            return split[split.length - 1];
        }
    }

}