/*
このファイルの中身は、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) ______________________________________.
*/

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

// Java API
import java.io.IOException;
import java.io.*;
import java.util.Hashtable;
import javax.servlet.*;
import javax.servlet.http.*;
import org.xml.sax.SAXException;
import java.rmi.RemoteException;

// XMS API
import jp.co.ntt.lms.lo.Offline.Aicc.AiccParseException;
import jp.co.ntt.lms.lo.Offline.Aicc.AiccLogConverter;
import jp.co.ntt.lms.lo.Offline.Aicc.AiccLogErr;
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.*;

/**
 * Offline教材　学習終了サーブレット
 * @version 2.0.4.0.0 2004.01.08
 * @author H.Takishima
 */
public class OfflineLoEndLearnServlet extends HttpServlet
	implements OfflineLoPropertyDef
{

	// ログ書き込みエラー時戻りURL
	private static final String LOG_ERR_URL = "/jsp/xmo/Com/ComErr.jsp";

	/**
	* メッセージID
	*/
	/** 正常終了 */
	private static final String END_MS_ID = "NULL";
	/** ERRパラメータ不正 */
	private static final String ERR_PARAM_ID = "W001";
	/** ERR例外発生 */
	private static final String ERR_EXCEPTION_ID = "E001";

	/**
	* メッセージ
	*/
	/** 正常終了 */
	private static final String END_MS = "正常終了";
	/** ERRパラメータ不正 */
	private static final String ERR_PARAM = "ERRパラメータ不正";
	/** ERR例外発生 */
	private static final String ERR_EXCEPTION = "ERR例外発生";
	/** ERRGET送信不可 */
	private static final String ERR_GET = "ERRGET送信不可";

	/**
	* ログ出力メッセージ
	*/
	/** パラメータエラー */
	private static final String ERR_PARAM_LOG = "パラメータが不正です。";
	/** 処理開始メッセージ */
	private static final String START_LOG = "処理を開始します。";
	/** 処理終了メッセージ */
	private static final String END_LOG = "処理を終了しました。";
	/** システムエラー */
	private static final String SYSTEM_ERR_LOG = "システムエラーが発生しました。";
	/** ログの保存エラー */
	private static final String UP_LOG_ERR_LOG = "ログの書き込みに失敗しました。";
	/** すべてのログの先頭につける */
	private static final String PREFIX = "OfflineLO：ログアップロード処理：Servlet：";

	/** バッファサイズ */
	private static final int BUFF_SIZE = 1024 * 8;

	/**
	 * 端末からのＧＥＴ要求を処理するメソッド<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
	{
		// GET送信された場合はエラーXMLを送信します。
		MessageData objMd = new MessageData(ERR_EXCEPTION_ID,
											ERR_GET,
											MessageData.WAR_TYPE);
		outXML(objMd, 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 request, HttpServletResponse response)
		throws ServletException, IOException
	{
		// パラメータの取得

		// リクエストのメッセージボディから、アップロードログを取得します。
		StringBuffer sbLog = new StringBuffer();
		ServletInputStream in = request.getInputStream();

		// ストリームからログを取得します
		sbLog = readLog(in);
		String strOfflineLog = new String( sbLog );

		// リクエストをクエリから取得する
		String strForeignUserID = request.getParameter( "ForeignID" );		// 外部ユーザID
		String strMaterialID = request.getParameter( "MaterialID" );		// 教材ID

DebugLog.write( this.getClass(), PREFIX + START_LOG + ":" + strForeignUserID + ":" + strMaterialID, DebugLog.MID);
DebugLog.write( this.getClass(), PREFIX + strOfflineLog + ":" + strForeignUserID + ":" + strMaterialID, DebugLog.ROW);
		//-------------------
		// パラメータチェック
		//-------------------
		if( strForeignUserID == null ||
			strForeignUserID.equals("") ||
			strMaterialID == null ||
			strMaterialID.equals("") ||
			strOfflineLog == null ||
			strOfflineLog.equals("") )
		{
DebugLog.write( this.getClass(), PREFIX + ERR_PARAM_LOG + ":" + strForeignUserID + ":" + strMaterialID, DebugLog.HIGHT);
			// パラメータが不正の場合はメッセージXMLを送信します。
			MessageData objMd = new MessageData(ERR_PARAM_ID,
												ERR_PARAM,
												MessageData.WAR_TYPE);
			outXML(objMd, response);
			return;
		}

		// 出力用メッセージデータ
		MessageData objMd;
		//------------------------
		// OfflineLOの学習終了処理
		//------------------------
		try {
			// サーバ名称の取得
			Environment objEnv = new Environment();
			String strServerName = objEnv.getLoServerName();
			// Loクライアントのインスタンスを生成します
			LoTopClient objLoCli = new LoTopClient(strServerName, LO_TYPE_OFFLINE);

			// Loクライアントの学習開始メソッドを実行します。
			// 　   正否（true：正常、false：異常）
			// パラメータの設定
			Hashtable htbParam = new Hashtable();
			htbParam.put("ForeignID", strForeignUserID);
			htbParam.put("MaterialID", strMaterialID);
			htbParam.put("OfflineLog", strOfflineLog);

			objLoCli.setParam( htbParam );
			boolean bLearn = objLoCli.endLearn();
			// 学習終了処理に失敗した場合、エラーログを出力し、メッセージデータを取得します。
			if ( bLearn == false )
			{
DebugLog.write( this.getClass(), PREFIX + SYSTEM_ERR_LOG + ":" + strForeignUserID + ":" + strMaterialID, DebugLog.HIGHT);
				objMd = objLoCli.getMessageData();

				String strMessage = objMd.getMessage();
			}
			// 正常終了の場合はメッセージXMLを送信します。
			else{
				objMd = new MessageData(END_MS_ID,
													END_MS,
													MessageData.INFO_TYPE);
			}

		}
		catch( Exception e ) {
			// システムエラーメッセージXMLを送信します。
			objMd = new MessageData(ERR_EXCEPTION_ID,
												ERR_EXCEPTION,
												MessageData.WAR_TYPE);
		}

		//-------------------------------------------
		// 返却用のXML形式のメッセージ作成 & 結果送信
		//-------------------------------------------
		outXML(objMd, response);
DebugLog.write( this.getClass(), PREFIX + END_LOG + ":" + strForeignUserID + ":" + strMaterialID, DebugLog.MID);

	}

	/**
	 * メッセージデータを受け取り、ブラウザにXML形式の文字列を出力します。
	 * @param objMd メッセージデータ
	 * @param response ＨＴＴＰレスポンス
	 * @exception IOException 読み取り時に例外
	 */
	private void outXML( MessageData objMd, HttpServletResponse response)
		throws IOException
	{
		PrintWriter printWriter = null;
		BufferedOutputStream bos = null;
		OutputStreamWriter osw = null;

		//--------------------------------
		// 返却用のXML形式のメッセージ作成
		//--------------------------------
		StringBuffer sbXML = new StringBuffer();
		sbXML.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
		sbXML.append("<XMSMSG>");
		sbXML.append(objMd.getMessage());
		sbXML.append("</XMSMSG>");
		String strOutData = sbXML.toString();

		// 初期化
		bos = new BufferedOutputStream(response.getOutputStream());
		osw = new OutputStreamWriter(bos,"UTF-8");
		printWriter = new PrintWriter(osw);

		//---------
		// 結果出力
		//---------
		response.setContentType("text/xml; charset=Shift-JIS");
		printWriter.print(strOutData);
		printWriter.flush();
	}

	/**
	 * ストリームからログを取得します
	 * @param in ストリーム
	 * @return StringBuffer ログ
	 * @exception IOException 読み取り時に例外
	 */
	private StringBuffer readLog( ServletInputStream in )
		throws IOException
	{
		byte buf[] = new byte[BUFF_SIZE];

		// ログの取得を行います
		StringBuffer sbLog = new StringBuffer();
		int n;
		while((n=in.readLine(buf, 0, buf.length))!= -1) {
			sbLog.append( new String(buf, 0, n, "UTF-8") );
		}
		return sbLog;
	}


}
