/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
//	Perception教材　学習終了サーブレット
//			変更履歴
// 2004.01.08 新規作成 suzuki
//
package jp.co.ntt.lms.lo.Perception;

// Java API
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.Hashtable;

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

import jp.co.ntt.lms.lo.LOException;
import jp.co.ntt.lms.lo.LearnSession;
import jp.co.ntt.lms.lo.LoTopClient;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.People.PeopleClient;

/**
 * Perception教材　学習終了サーブレット
 * @version 0.0.0.1 2004.01.08
 * @author T.Suzuki
 */
public class PerceptionLoEndLearnServlet extends HttpServlet
	implements PerceptionPropertyDef
{

	// 読み込みバイト数
	private static final int BYTE_SIZE = 8*1024;

	// 戻りコード定義
	// 正常時コード
	private static final String RES_OK = "00";
	// リトライ要求(01〜09)　現在使用するのは01のみ
	private static final String RES_RETRY = "01";
	// 異常時コード(10〜)　現在使用するのは10のみ
	private static final String RES_NG = "10";

	// 戻りURL定義
	// 正常時戻りURL
	private static final String WBT_CLOSE_URL = "/view/lo/Perception/PerceptionClose.vm";
	// ログ書き込みエラー時戻りURL
	private static final String LOG_ERR_URL = "/view/xmo/Com/ComErr.vm";

	/**
	 * 端末からのＧＥＴ要求を処理するメソッド<br>
	 * @param HttpServletRequest	ＨＴＴＰリクエスト
	 * @param HttpServletResponse	ＨＴＴＰレスポンス
	 * @return void
	 * @exception javax.servlet.ServletException	サーブレット例外
	 * @exception java.io.IOException				入出力例外
	 */
	protected void doGet(HttpServletRequest req, HttpServletResponse res)
		throws ServletException, IOException
	{
		this.doRequest( req, res );
	}
	/**
	 * 端末からのＰＯＳＴ要求を処理するメソッド<br>
	 * @param HttpServletRequest	ＨＴＴＰリクエスト
	 * @param HttpServletResponse	ＨＴＴＰレスポンス
	 * @return void
	 * @exception javax.servlet.ServletException	サーブレット例外
	 * @exception java.io.IOException				入出力例外
	 */
	protected void doPost(HttpServletRequest req, HttpServletResponse res)
		throws ServletException, IOException
	{
		this.doRequest( req, res );
	}

	/**
	 * 端末からの要求を処理するメソッド<br>
	 * @param HttpServletRequest	ＨＴＴＰリクエスト
	 * @param HttpServletResponse	ＨＴＴＰレスポンス
	 * @return void
	 */
	protected void doRequest(HttpServletRequest req, HttpServletResponse res)
		throws ServletException, IOException
	{
DebugLog.write( this.getClass(), "--------------------------------", DebugLog.ROW);
DebugLog.write( this.getClass(), "PerceptionLo学習終了サーブレット", DebugLog.HIGHT);
DebugLog.write( this.getClass(), "--------------------------------", DebugLog.ROW);

		// request要求から共通ログ情報を取得します。
		String strUserID = req.getParameter( USER_ID );						// UserID
		String strAssessmentID = req.getParameter( TEST_ID );				// アセスメントID
		String strTestMax = req.getParameter( TEST_MAX );					// 最大点
		String strLessonTime = req.getParameter( LESSON_TIME );				// 試験終了時刻
		String strLessonDate = req.getParameter( LESSON_DATE );				// 試験年月日
		String strLessonScoreband = req.getParameter( LESSON_SCOREBAND );	// AssessmentOutcom
		// ISO-8859-1 → Shift_JIS に変換する
	
		strLessonScoreband = new String( strLessonScoreband.getBytes("ISO-8859-1" ), "Windows-31J" );
		
		String strTestTimeElasped = req.getParameter( TEST_TIME_ELASPED );	// 滞在時間
		String strTestScore = req.getParameter( TEST_SCORE );				// 得点
DebugLog.write( this.getClass(), "strUserID = " + strUserID, DebugLog.ROW);
DebugLog.write( this.getClass(), "strAssessmentID = " + strAssessmentID, DebugLog.ROW);
DebugLog.write( this.getClass(), "strTestMax = " + strTestMax, DebugLog.ROW);
DebugLog.write( this.getClass(), "strLessonTime = " + strLessonTime, DebugLog.ROW);
DebugLog.write( this.getClass(), "strLessonDate = " + strLessonDate, DebugLog.ROW);
DebugLog.write( this.getClass(), "strLessonScoreband = " + strLessonScoreband, DebugLog.ROW);
DebugLog.write( this.getClass(), "strTestTimeElasped = " + strTestTimeElasped, DebugLog.ROW);
DebugLog.write( this.getClass(), "strTestScore = " + strTestScore, DebugLog.ROW);

		try {
			// パラメータ設定
			Hashtable htbParam = new Hashtable();

			// UserID設定
			if(strUserID == null || strUserID.equals("")){
				strUserID = req.getParameter( TEST_USER );						// UserID
				if(strUserID == null || strUserID.equals("")){
					
					DebugLog.write( this.getClass(), "学習終了確認 = エラー", DebugLog.ROW );
					
					return;
				}
			}else{
				htbParam.put(USER_ID, strUserID);
			}

			// strAssessmentID設定
			if(strAssessmentID == null || strAssessmentID.equals("")){
					
					DebugLog.write( this.getClass(), "学習終了確認 = エラー", DebugLog.ROW );
					
					return;
			}else{
				htbParam.put(TEST_ID, strAssessmentID);
			}

			// TestMax設定
			if(strTestMax == null || strTestMax.equals("")){
				htbParam.put(TEST_MAX, "0");
			}else{
				htbParam.put(TEST_MAX, strTestMax);
			}

			// LessonTime設定
			if(strLessonTime == null || strLessonTime.equals("")){
				htbParam.put(LESSON_TIME, "0");
			}else{
				htbParam.put(LESSON_TIME, strLessonTime);
			}

			// LessonDate設定
			if(strLessonDate == null){
				htbParam.put(LESSON_DATE, "");
			}else{
				htbParam.put(LESSON_DATE, strLessonDate);
			}

			// LessonScoreband設定
			if(strLessonScoreband == null){
				htbParam.put(LESSON_SCOREBAND, "");
			}else{
				htbParam.put(LESSON_SCOREBAND, strLessonScoreband);
			}

			// TestTimeElasped設定
			if(strTestTimeElasped == null || strTestTimeElasped.equals("")){
				htbParam.put(TEST_TIME_ELASPED, "0");
			}else{
				htbParam.put(TEST_TIME_ELASPED, strTestTimeElasped);
			}

			// TestScore設定
			if(strTestScore == null || strTestScore.equals("")){
				htbParam.put(TEST_SCORE, "0");
			}else{
				htbParam.put(TEST_SCORE, strTestScore);
			}

			// PerceptionLOへログを送信します
			sendPerceptionLog( strUserID, strAssessmentID, htbParam );
		}
		catch( LOException le ) {
			// ログ送信時のエラー処理
			DebugLog.write( this.getClass(), le, DebugLog.HIGHT );
			return;
		}
		catch( RemoteException re ) {
			// RMIエラー処理
			DebugLog.write( this.getClass(), re, DebugLog.HIGHT );
			return;
		}

		return;
	}

	/**
	 * PerceptionLOへログを送信します
	 * @param htbParam 共通ログ情報
	 */
	private void sendPerceptionLog( String strUserID, String strAssessmentID, Hashtable htbParam )
		throws LOException, RemoteException
	{

		try {
			// strUserID(外部ID)から内部IDを取得して擦りかえる。			
			PeopleClient objPeople = new PeopleClient();
			objPeople.setWhereForeignID(strUserID); // このstrUserIDは外部ユーザID
			if( !objPeople.select() ) {
				// 検索がうまくいかなかった場合
				DebugLog.write(this.getClass(), "学習者内部ID検索失敗", DebugLog.HIGHT);
			}
			else{
				while(objPeople.next())
				{
					strUserID = objPeople.getUserID(); // 外部ID=>内部ID擦りかえ
				}
			}

			String strLoType = "";

			// 学習セッションファイルが存在した場合のみロード実施
			if(LearnSession.isExitSession(strUserID, strAssessmentID)){
				LearnSession objLs = new LearnSession();
				objLs.setUserID(strUserID);
				objLs.setSessionID(strAssessmentID);
				objLs.setLoType(strLoType);
				objLs.load();
				// リアルLOID(LOID)とLOID(TARGETLOID)を取得し、ハッシュに設定する。
				String strLoID = objLs.getLoID();
				String strTargetLOID = objLs.getTargetLOID();
				htbParam.put( LOID, strLoID );
				htbParam.put( TARGETLOID, strTargetLOID );
				objLs.delete();
			}

			// サーバ名称の取得
			Environment objEnv = new Environment();
			String strServerName = objEnv.getLoServerName();
			// Loクライアントのインスタンスを生成します
			LoTopClient objLoCli = new LoTopClient(strServerName, LO_TYPE_PERCEPTION);

			// Loクライアントの学習終了メソッドを実行します。
			// 　   正否（true：正常、false：異常）
			// パラメータの設定
			objLoCli.setParam( htbParam );

			if ( !objLoCli.endLearn() )
			{
				
				DebugLog.write( this.getClass(), "学習終了確認 = エラー", DebugLog.ROW );
				
				// 学習終了処理でエラーが生じた場合は例外を投げる
				throw new LOException(objLoCli.getMessageData());
			}
			else
			{
				
				DebugLog.write( this.getClass(), "学習終了確認 = OK", DebugLog.ROW );
				
			}
		}
		catch( LOException le ) {
			throw le;
		}
		catch( RemoteException re ) {
			throw re;
		}
		catch( Exception e ) {
			throw new LOException(e.getMessage());
		}
	}

}

