/*
 * 強制中断要求クラス
 * 
 * 作成日: 2006/05/10
 */
package jp.co.ntt.lms.imode.lo.scorm.engine;

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

import jp.co.ntt.lms.lo.scorm.engine.Engine;
import jp.co.ntt.lms.lo.scorm.util.Debug;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xms.framework.XmsRequest;


/**
 * 強制中断要求クラス
 * 
 * @author ntc-sakai
 */
public class ForceSuspendLearn {

	/** エンジンキー */
	private String engineKeyName;

	/** 処理結果ステータス */
	private boolean Status;

	/**
	 * コンストラクタ<br>
	 * 
	 * @param engineKeyName エンジンキー
	 */
	public ForceSuspendLearn(String engineKeyName) {

		this.engineKeyName = engineKeyName;
	}

	/**
	 * リクエスト要求<br>
	 * SCORMエンジンに中断要求処理を行ないます。
	 * 
	 * @param xmsRequest リクエスト
	 * @throws XmsException
	 */
	public void request(XmsRequest xmsRequest) {
		// ＬＯＧ出力
		DebugLog.write(getClass(), "[request]:HEAD", DebugLog.ROW);

		HttpServletRequest request = xmsRequest.getRequest();
		HttpSession session = request.getSession();
		ServletContext application = session.getServletContext();

		// エンジンをapplicationから取得する
		Engine engine = (Engine)application.getAttribute(engineKeyName);

		// 正常に取得できた場合
		if (engine != null) {
			// 中断情報をXMSⅡへ送信する
			Exception error = null;

			synchronized (engine) {
				try {
					// 中断処理を行う
					engine.discontinue("SUSPEND", true);
				}
				catch (Exception ex) {
					Debug.write(ex);

					error = ex;
				}

				// applicationからエンジンを削除する
				application.removeAttribute(engineKeyName);
			}
			// 中断処理中に例外が発生した場合
			if (error != null) {
				// 処理結果にエラーを設定
				Status = false;
			}
		}

		// 処理結果に正常を設定
		Status = true;

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

	}

	/**
	 * 中断要求処理結果を戻します。
	 * 
	 * @return 正常終了ならば true 異常終了なら false
	 */
	public boolean isStatus() {
		return Status;
	}
}
