/*
 * 学習開始受付クラス
 * 学習開始を受け付けるサーブレットクラスです。
 * 
 * 作成日: 2006/10/23
 */
package jp.co.ntt.lms.imode.xms.servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jp.co.ntt.lms.imode.common.MobConst;
import jp.co.ntt.lms.imode.lo.scorm.engine.StartEngine;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsRequest;
import jp.co.ntt.lms.xms.framework.XmsSystemException;

/**
 * 学習開始を受け付けるサーブレットクラスです。
 * 
 * @author ntc-sakai
 */
public class MobStartLean extends HttpServlet {

	/**
	 * GETリクエスト
	 * 
	 * @param request
	 * @param response
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doRequest(request, response);
	}

	/**
	 * POSTリクエスト
	 * 
	 * @param request
	 * @param response
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doRequest(request, response);
	}

	/**
	 * 学習開始リクエスト
	 * 
	 * @param request
	 * @param response
	 */
	private void doRequest(HttpServletRequest request,
			HttpServletResponse response) {

		// ＬＯＧ出力
		DebugLog.write(getClass(), "[doRequest]HEAD", DebugLog.ROW);
		response.setContentType("text/html; charset=shift_jis");
		//20070707 ADD Start ntc higuchi キャッシュを無効にする処理を追加
		response.setHeader("Expires", "Sat, 01 Jan 2005 01:00:00 GMT");
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		//20070707 ADD End

		try {
			request.setCharacterEncoding("shift_jis");
		} catch (UnsupportedEncodingException e1) {
		}

		// フレームワーク戻り値。
		XmsRequest xmsRequest = null;
		try {
			// リクエスト・レスポンスオブジェクトの生成
			xmsRequest = new XmsRequest(request, response);

			// ＳＣＯＲＭエンジン開始処理
			StartEngine startengine = new StartEngine();
			startengine.request(xmsRequest);

			// ＳＣＯＲＭエンジン開始処理結果
			if (startengine.isStatus()) {
				// ＳＣＯＲＭエンジン開始処理正常終了
				// ナビゲート要求処理へ遷移
				naviStartForward(xmsRequest);
			} else {
				// ２重起動チェック
				if (startengine.isDuplication()) {
					dupliForward(xmsRequest);
				// 戻るボタン押下チェック
				} else if (startengine.isPageSeq()) {
					// 戻るボタンエラー
					pageErrForward(xmsRequest);
				} else {
					// その他エラー
					// ＳＣＯＲＭエンジン開始処理エラー
					DebugLog.write(getClass(), "[doRequest]SCORM Engne status Error", DebugLog.ROW);
					errorForwad(xmsRequest);
				}
			}
			// 
		} catch (XmsException e) {
			// ＳＣＯＲＭエンジン開始処理エラー
			DebugLog.write(getClass(), "[doRequest]SCORM Start XmsException Error", DebugLog.ROW);
			errorForwad(xmsRequest);
		}

		// ＬＯＧ出力
		DebugLog.write(getClass(), "[doRequest]TAIL", DebugLog.ROW);

	}

	/**
	 * 携帯用ＳＣＯＲＭエントリフォワード処理
	 * 携帯用ＳＣＯＲＭエントリに開始ナビゲーションを要求します。
	 * @param xmsRequest
	 */
	private void naviStartForward(XmsRequest xmsRequest) {

		try {
			String comd = xmsRequest.getParameter("COMD");
			String command; 
			if (comd != null && comd.equals("CONT")) {
				command = "ResumeAll";
			} else {
				command = "Start";
			}

			String Url = MobConst.C_START_LEARN.replaceAll("COMD", command);

			forward(xmsRequest, Url);
		} catch (XmsException e) {
			errorForwad(xmsRequest);
		}

	}

	/**
	 * システムエラーフォワード処理
	 * @param xmsRequest
	 */
	private void errorForwad(XmsRequest xmsRequest) {

		try {
			forward(xmsRequest, MobConst.C_SYS_ERR_URI);
		} catch (XmsException e) {
			DebugLog.write(getClass(), e, DebugLog.HIGHT);
		}

	}

	/**
	 * ２重起動エラー画面遷移処理
	 * 
	 * @param xmsRequest
	 */
	private void dupliForward(XmsRequest xmsRequest) {

		try {
			forward(xmsRequest, MobConst.C_DUP_ERR_URI);
		} catch (XmsException e) {
			DebugLog.write(getClass(), e, DebugLog.HIGHT);
		}

	}

	/**
	 * 頁ＳＥＱエラー画面遷移処理
	 * 
	 * @param xmsRequest
	 */
	private void pageErrForward(XmsRequest xmsRequest) {

		try {
			forward(xmsRequest, MobConst.C_SEQERR_URI);
		} catch (XmsException e) {
			DebugLog.write(getClass(), e, DebugLog.HIGHT);
		}

	}
	
	/**
	 * フォワード処理
	 * 
	 * @param xmsRequest
	 * @param uri
	 * @throws XmsException
	 */
	private void forward(XmsRequest xmsRequest, String uri) throws XmsException {

		// HTTP リクエスト
		HttpServletRequest request = null;
		// HTTPレスポンス
		HttpServletResponse response = null;
		RequestDispatcher dispatcher = null;
		try {
			request = xmsRequest.getRequest();
			response = xmsRequest.getResponse();
			dispatcher = request.getRequestDispatcher(uri);
			dispatcher.forward(request, response);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}

	}
}