package jp.co.y_net.amm;

import jp.co.y_net.amm.common.AppLogger;

import org.apache.wicket.protocol.http.PageExpiredException;
import org.apache.wicket.protocol.http.servlet.ResponseIOException;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.cycle.IRequestCycleListener;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.mapper.StalePageException;

/**
 * Applicationクラス（PC版はWicketApplication）で設定する為の RequestCycleListener
 * エラーログの出力などを行う。
 * 
 * @author k_inaba
 */
public class AppRequestCycleListener implements IRequestCycleListener {

    public IRequestHandler onException(RequestCycle cycle, Exception ex) {

        /* エラー詳細出力 2013/06/25 K.Inaba */
        String pageName = "";
        if (cycle.getUrlRenderer().getBaseUrl().getSegments().size() > 0) {
            pageName = cycle.getUrlRenderer().getBaseUrl().getSegments().get(0);
        }
        try {
            String type = null;
            if (ex instanceof PageExpiredException) { // 有効期限切れ
                type = "1";
            }
            
            /* 2016/08/06 追加 */
            if (ex instanceof StalePageException) { // 有効期限切れ
                type = "1";
            }
            
            if (ex instanceof ResponseIOException) {
                Throwable t = ex.getCause();
                if (t != null 
                        && "org.apache.catalina.connector.ClientAbortException".equals(t.getClass().getName())) { 
                    /* IEが発生させる既知の処理中断の例外 */
                    type = "2";
                }
            }
            if (type == null) {
                type = "3";
            }
            if ("1".equals(type)) { // 有効期限切れ
                AppLogger.debug(pageName);
                AppLogger.debug(ex.getMessage());

            } else if ("2".equals(type)) { // IEが発生させる既知の処理中断の例外(クライアントによる中断)
                AppLogger.debug(pageName);
                AppLogger.debug(ex.getMessage());

            } else { /* 未知の問題 */
                AppLogger.error(pageName);
                AppLogger.error(ex);
            }

        } catch (Exception e) {
            /* エラーハンドリングで循環が発生しないように、極力シンプルな実装にする。 */
            ex.printStackTrace();
        }
        return null;
    }
    @Override
    public void onExceptionRequestHandlerResolved(RequestCycle arg0, IRequestHandler arg1, Exception arg2) {
        /* 処理なし */
    }
//    private static long timerRequest;
//    private static String uri;
    @Override
    public void onBeginRequest(RequestCycle reqestCycle) { // RequestHandlerの解決直前に実行
        /* 処理時間測定開始 */
//        TimeRecorder.startRequest(reqestCycle.getRequest().getUrl().toString());
//        TimeRecorder.startSub("リクエスト受付");
//        timerRequest = System.currentTimeMillis();
//        uri = reqestCycle.getRequest().getUrl().toString();
//        WebOpacLogger.info("計測開始 - [" + uri + "]-----------------------------------------------------------------");

    }
    @Override
    public void onEndRequest(RequestCycle reqestCycle) {
        /* 処理時間測定終了 */
//        TimeRecorder.endRequest(reqestCycle.getRequest().getUrl().toString());
//        long time = System.currentTimeMillis() - timerRequest;
//        WebOpacLogger.info("計測終了 - " + time + "[ms] [" + uri + "]------------------------------------------------");
//        timerRequest = 0;
//        uri = "";
    }
    @Override
    public void onDetach(RequestCycle arg0) {
        /* 処理なし */
    }
    @Override
    public void onRequestHandlerExecuted(RequestCycle arg0, IRequestHandler arg1) {
        /* 処理なし */
    }
    @Override
    public void onRequestHandlerResolved(RequestCycle arg0, IRequestHandler arg1) {
        /* 処理なし */
    }
    @Override
    public void onRequestHandlerScheduled(RequestCycle arg0, IRequestHandler arg1) {
        /* 処理なし */
    }
    @Override
    public void onUrlMapped(RequestCycle arg0, IRequestHandler arg1, Url arg2) {
        /* 処理なし */
    }
}
