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

//
// CopyRight (C) 2003, NTT All rights reserved.
//
//	学習セッションクラス
//			変更履歴
//				2004.01.08	新規作成	五木田 泰史
//

package jp.co.ntt.lms.lo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

import jp.co.ntt.lms.lo.util.UserIDFolder;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.util.DebugLog;

/**
 * 学習セッションクラス
 *
 * <PRE>
 *   学習開始時に学習開始セッション情報を設定し、
 *   学習セッションファイルに書く。
 *   学習終了時に学習セッションファイルを読み、
 *   学習開始セッション情報を取得し、学習セッション
 *   ファイルを削除する。
 * </PRE>
 *
 */
public class LearnSession {

	//////////////////////////////////////////////////////////////////
	// メンバ変数
	//////////////////////////////////////////////////////////////////

	/*** パスセパレータ ***/
	private static final String PATH_SEPARATOR    = System.getProperty("path.separator");
	/*** ファイルセパレータ ***/
	private static final String FILE_SEPARATOR    = System.getProperty("file.separator");
	/*** 学習セッションディレクトリパス ***/
	private static final String LEARN_SESSION_DIR = "C" + PATH_SEPARATOR;
	/*** 学習セッションファイル名 ***/
	private static final String SESSION_FILE_NAME = "LearnSession.txt";
	/*** WBTLO学習セッションファイルディレクトリ名 ***/
	private static final String WBT_DIR_NAME = "wbtlo";
	/*** 学習セッションファイル拡張子 ***/
	/*** セッションID ***/
	private static final String HTTP_SESSIONID_KEY    = "httpsessionid";
	/*** LoIDキー ***/
	private static final String LOID_KEY          = "loid";
	/*** 学習対象LOIDキー ***/
	private static final String TARGETLOID_KEY    = "targetloid";
	/*** Lo種別キー ***/
	private static final String LOTYPE_KEY        = "lotype";
	/*** 教材URLキー ***/
	private static final String MATURL_KEY        = "materialurl";
	/*** 戻りURLキー ***/
	private static final String RETURL_KEY        = "returnurl";
	/*** Server番号キー ***/
	private static final String SERVERNO_KEY      = "serverno";
	/*** HTTPセッションID ***/
	private static final String HTTP_SESSIONID_KEY_EQ  = "httpsessionid=";
	/*** LoIDキー + "=" ***/
	private static final String LOID_KEY_EQ       = "loid=";
   /*** 学習対象LoIDキー + "=" ***/
	private static final String TARGETLOID_KEY_EQ = "targetloid=";
	/*** Lo種別キー + "=" ***/
	private static final String LOTYPE_KEY_EQ     = "lotype=";
	/*** 教材URLキー + "=" ***/
	private static final String MATURL_KEY_EQ     = "materialurl=";
	/*** 戻りURLキー + "=" ***/
	private static final String RETURL_KEY_EQ     = "returnurl=";
	/*** Server番号キー + "=" ***/
	private static final String SERVERNO_KEY_EQ = "serverno=";

	/*** HTTPセッションID ***/
	String mstrHttpSessionID;
	/*** ユーザID ***/
	String mstrUserID;
	/*** セッションID ***/
	String mstrSessionID;
	/*** LoID ***/
	String mstrLoID;
   /*** 学習対象LOID ***/
   String mstrTargetLOID;
	/*** LoType ***/
	String mstrLoType;
	/*** 教材URL ***/
	String mstrMaterialURL;
	/*** 戻りURL ***/
	String mstrReturnURL;
	/*** 前回使用Server番号 ***/
	String mstrServerNo;

	//////////////////////////////////////////////////////////////////
	// メンバ関数
	//////////////////////////////////////////////////////////////////

	/**
	 * コンストラクタ
	 *
	 */
	public LearnSession()
	{
		;
	}

	/**
	 * コンストラクタ2
	 *
	 * @param String strUserID
	 * @param String strMaterialID
	 */
	public LearnSession(String strUserID, String strMaterialID)
	{
		mstrUserID     = strUserID;
		mstrSessionID = strMaterialID;
	}

	/**
	 * 初期化
	 *
	 * <PRE>
	 *   メンバ変数を初期化する。
	 * </PRE>
	 *
	 * @return void
	 */
	public void initialize()
	{
		mstrHttpSessionID   = "";
		mstrUserID      = "";
		mstrSessionID  = "";
		mstrLoID        = "";
		// 学習対象LOID
		mstrTargetLOID = "";
		mstrLoType      = "";
		mstrMaterialURL = "";
		mstrReturnURL   = "";
		mstrServerNo	= "";
	}

	/**
	 * HttpSessionID設定
	 *
	 * @param String HttpSessionID
	 * @return void
	 */
	public void setHttpSessionID(String strHttpSessionID)
	{
		mstrHttpSessionID = strHttpSessionID;
	}
	/**
	 * HttpSessionID取得
	 *
	 * @return String HttpSessionID
	 */
	public String getHttpSessionID()
	{
		return mstrHttpSessionID;
	}

	/**
	 * ユーザID設定
	 *
	 * @param String ユーザID
	 * @return void
	 */
	public void setUserID(String strUserID)
	{
		mstrUserID = strUserID;
	}

	/**
	 * ユーザID取得
	 *
	 * @return String ユーザID
	 */
	public String getUserID()
	{
		return mstrUserID;
	}

	/**
	 * セッションID設定
	 *
	 * @param String セッションID
	 * @return void
	 */
	public void setSessionID(String strSessioinID)
	{
		mstrSessionID = strSessioinID;
	}

	/**
	 * セッションID取得
	 *
	 * @return String セッションID
	 */
	public String getSessionID()
	{
		return mstrSessionID;
	}

	/**
	 * LoID設定
	 *
	 * @param String LoID
	 * @return void
	 */
	public void setLoID(String strLoID)
	{
		mstrLoID = strLoID;
	}

	/**
	 * LoID取得
	 *
	 * @return String LoID
	 */
	public String getLoID()
	{
		return mstrLoID;
	}

	/**
	 * 学習対象LOID設定
	 *
	 * @param String targetLOID
	 * @return void
	 */
	public void setTargetLOID(String strTargetLOID) {
		mstrTargetLOID = strTargetLOID;
	}

	/**
	 * 学習対象LOID取得
	 *
	 * @return String targetLOID
	 */
	public String getTargetLOID() {
		return mstrTargetLOID;
	}

	/**
	 * Lo種別設定
	 *
	 * @param String Lo種別
	 * @return void
	 */
	public void setLoType(String strLoType)
	{
		mstrLoType = strLoType;
	}

	/**
	 * Lo種別取得
	 *
	 * @return String Lo種別
	 */
	public String getLoType()
	{
		return mstrLoType;
	}

	/**
	 * 教材URL設定
	 *
	 * @param String 教材URL
	 * @return void
	 */
	public void setMaterialURL(String strMaterialURL)
	{
		mstrMaterialURL = strMaterialURL;
	}

	/**
	 * 教材URL取得
	 *
	 * @return String 教材URL
	 */
	public String getMaterialURL()
	{
		return mstrMaterialURL;
	}

	/**
	 * 戻りURL設定
	 *
	 * @param String 戻りURL
	 * @return void
	 */
	public void setReturnURL(String strReturnURL)
	{
		mstrReturnURL = strReturnURL;
	}

	/**
	 * 戻りURL取得
	 *
	 * @return String 戻りURL
	 */
	public String getReturnURL()
	{
		return mstrReturnURL;
	}

	/**
	 * 前回使用ServerNo設定
	 *
	 * @param String 前回使用Server番号
	 * @return void
	 */
	public void setServerNo(String strServerNo)
	{
		mstrServerNo = strServerNo;
	}

	/**
	 * 前回使用ServerNo取得
	 *
	 * @return String 前回使用Server番号
	 */
	public String getServerNo()
	{
		return mstrServerNo;
	}

	/**
	 * 学習セッションファイル読込
	 *
	 * <PRE>
	 *   学習セッションファイルを読み込む。
	 * </PRE>
	 *
	 * @return void
	 * @exception LOException LO独自の例外エラー
	 */
	public void load() throws LOException
	{
		FileInputStream objFis = null;
		try
		{
			String strFilePath = getFilePath(false);
			File objFile       = new File(strFilePath);

			// ファイルは必ず存在しているため読み込み可能チェック
			objFis = new FileInputStream(objFile);
			Properties objProperty = new Properties();
			objProperty.load(objFis);
			mstrHttpSessionID = objProperty.getProperty(HTTP_SESSIONID_KEY);
			mstrLoID          = objProperty.getProperty(LOID_KEY);
			// 学習対象ＬＯのLOIDを取得
			mstrTargetLOID    = objProperty.getProperty(TARGETLOID_KEY);
			mstrLoType        = objProperty.getProperty(LOTYPE_KEY);
			mstrMaterialURL   = objProperty.getProperty(MATURL_KEY);
			mstrReturnURL     = objProperty.getProperty(RETURL_KEY);
			mstrServerNo      = objProperty.getProperty(SERVERNO_KEY);
		}
		catch(IOException ex)
		{
			DebugLog.write( this.getClass(), ex, DebugLog.HIGHT );
			throw new LOException(ex.getMessage());
		}
		finally
		{
			try{ objFis.close(); } catch(Exception ex) {}
		}
	}

	/**
	 * 学習セッションファイル書込み
	 *
	 * <PRE>
	 *   学習セッションファイルを書き込む。
	 * </PRE>
	 *
	 * @return void
	 * @exception LOException LO独自の例外エラー
	 */
	public void save() throws LOException
	{
		try
		{
			String strFilePath = getFilePath(true);
			File objFile       = new File(strFilePath);

			FileOutputStream objFos = new FileOutputStream(objFile);
			PrintWriter objPw       = new PrintWriter(objFos);

			SimpleDateFormat objFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
			Date objNow = new Date();
			String strDate = objFormat.format(objNow);
			objPw.println(strDate);
			objPw.print(HTTP_SESSIONID_KEY_EQ);
			objPw.println(mstrHttpSessionID);
			objPw.print(LOID_KEY_EQ);
			objPw.println(mstrLoID);
			objPw.print(TARGETLOID_KEY_EQ);
			objPw.println(mstrTargetLOID);
			objPw.print(LOTYPE_KEY_EQ);
			objPw.println(mstrLoType);
			objPw.print(MATURL_KEY_EQ);
			objPw.println(mstrMaterialURL);
			objPw.print(RETURL_KEY_EQ);
			objPw.println(mstrReturnURL);
			objPw.print(SERVERNO_KEY_EQ);
			objPw.println(mstrServerNo);
			objPw.close();
			objFos.close();
		}
		catch(IOException ex)
		{
			DebugLog.write( this.getClass(), ex, DebugLog.HIGHT );
			throw new LOException(ex.getMessage());
		}
	}

	/**
	 * 学習セッションファイル削除
	 *
	 * <PRE>
	 *   学習セッションファイルを削除。
	 * </PRE>
	 *
	 * @return void
	 * @exception LOException LO独自の例外エラー
	 */
	public void delete() throws LOException
	{
		try
		{
			String strFilePath = getFilePath(false);
			File objFile       = new File(strFilePath);
			objFile.delete();
		}
		catch(Exception ex)
		{
			DebugLog.write( this.getClass(), ex, DebugLog.HIGHT );
			throw new LOException(ex.getMessage());
		}
	}

	/**
	 * WBTLO学習セッションファイル(ディレクトリごと)削除
	 *
	 * <PRE>
	 *   学習セッションファイルを削除。
	 * </PRE>
	 *
	 * @return void
	 * @exception LOException LO独自の例外エラー
	 */
	public void delete2() throws LOException
	{
		try
		{
			 Environment objEnv = new Environment();
			 String strDirPath    = objEnv.getSessionDir();

			 StringBuffer strBuf = new StringBuffer();
			 // ディレクトリパス作成(ユーザIDと教材IDは必ず入力済みとする)
			 strBuf.append(userIDPath(strDirPath, mstrUserID));
			 strBuf.append(FILE_SEPARATOR);
			 strBuf.append(WBT_DIR_NAME);

			 // WBTディレクトリごと削除
			 delWbtDir(strBuf.toString());
		}
		catch(Exception ex)
		{
			DebugLog.write( this.getClass(), ex, DebugLog.HIGHT );
			throw new LOException(ex.getMessage());
		}
	}

	/**
	 * 学習セッションファイルパス取得
	 * 引数がtrueの場合ファイルの作成も行います。
	 *
	 * <PRE>
	 *   学習セッションファイルパスを取得する。
	 *   セッションディレクトリが存在しない場合、
	 *   セッションディレクトリを作成する。
	 *   セッションファイルが存在しない場合、
	 *   セッションファイルを作成する。
	 * </PRE>
	 *
	 * @param isMakeFile true: ファイルも作成　false: ファイルは作成しない
	 * @return String 学習セッションファイルパス
	 * @exception LOException LO独自の例外エラー
	 */
	private String getFilePath(boolean isMakeFile) throws LOException
	{
		String strRet = "";
		StringBuffer strBuf = new StringBuffer();
		try
		{
			// 環境ファイルから学習セッションディレクトリ取得
			Environment objEnv = new Environment();
			String strDirPath    = objEnv.getSessionDir();

			// 学習セッションディレクトリが不正ならば初期値を設定
			if(strDirPath == null || strDirPath.equals(""))
			{
				strDirPath = LEARN_SESSION_DIR;
			}

			// ディレクトリパス作成(ユーザIDと教材IDは必ず入力済みとする)
			strBuf.append(userIDPath(strDirPath, mstrUserID));
			if ( mstrLoType.equals("1") ){
				strBuf.append(FILE_SEPARATOR);
				strBuf.append(WBT_DIR_NAME);
			}
			strBuf.append(FILE_SEPARATOR);
			strBuf.append(mstrSessionID);

			// ディレクトリの有無を判定
			File objFile = new File(strBuf.toString());
			if(isMakeFile && !objFile.exists())
			{
				// ディレクトリが存在しないため作成
				if(!objFile.mkdirs())
				{
					throw new LOException("セッションディレクトリ作成失敗");
				}
			}

			// ファイルパス作成
			strBuf.append(FILE_SEPARATOR);
			strBuf.append(SESSION_FILE_NAME);

			// ファイルの有無を判定
			objFile = new File(strBuf.toString());
			if(isMakeFile && !objFile.exists())
			{
				// ファイルが存在しないため作成
				if(!objFile.createNewFile())
				{
					throw new LOException("セッションファイル作成失敗");
				}
			}

			strRet = strBuf.toString();
		}
		catch(LOException le)
		{
			DebugLog.write( this.getClass(), le, DebugLog.HIGHT );
			throw le;
		}
		catch(IOException ie)
		{
			DebugLog.write( this.getClass(), ie, DebugLog.HIGHT );
			throw new LOException(ie.getMessage());
		}
		catch(Exception e)
		{
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			throw new LOException(e.getMessage());
		}

		return strRet;
	}

	/**
	 * セッションファイルが存在するか確認します
	 * @param str
	 */
	public static boolean isExitSession( String strUserID, String strSessionID ) {
		try {
			// 環境ファイルから学習セッションディレクトリ取得
			Environment objEnv = new Environment();
			String strDirPath    = objEnv.getSessionDir();

			StringBuffer strBuf = new StringBuffer();
			// ディレクトリパス作成(ユーザIDと教材IDは必ず入力済みとする)
			strBuf.append(userIDPath(strDirPath, strUserID));
			strBuf.append(FILE_SEPARATOR);
			strBuf.append(strSessionID);
			// ファイルパス作成
			strBuf.append(FILE_SEPARATOR);
			strBuf.append(SESSION_FILE_NAME);

			// ファイルの有無を判定
			File objFile = new File(strBuf.toString());
			return objFile.exists();
		}
		catch( IOException ie ) {
			return false;
		}
		catch( Exception e ) {
			return false;
		}
	}

	/**
	 * WBTLOディレクトリ配下にセッションファイルが存在するか確認します
	 * @param str
	 */
	public static boolean isExitSession2( String strUserID, String strSessionID ) {
		try {
			// 環境ファイルから学習セッションディレクトリ取得
			Environment objEnv = new Environment();
			String strDirPath    = objEnv.getSessionDir();

			StringBuffer strBuf = new StringBuffer();
			// ディレクトリパス作成(ユーザIDと教材IDは必ず入力済みとする)
			strBuf.append(userIDPath(strDirPath, strUserID));
			strBuf.append(FILE_SEPARATOR);
			strBuf.append(WBT_DIR_NAME);
			strBuf.append(FILE_SEPARATOR);
			strBuf.append(strSessionID);
			// ファイルパス作成
			strBuf.append(FILE_SEPARATOR);
			strBuf.append(SESSION_FILE_NAME);

			// ファイルの有無を判定
			File objFile = new File(strBuf.toString());
			return objFile.exists();
		}
		catch( IOException ie ) {
			return false;
		}
		catch( Exception e ) {
			return false;
		}
	}

	/**
	 * 指定UserID配下のWBTLOの学習セッションディレクトリのリストを取得します
	 * @param list
	 */
	public String[] getFileList( String strUserID )
		throws LOException
	{
		try {
			// 環境ファイルから学習セッションディレクトリ取得
			Environment objEnv = new Environment();
			String strDirPath    = objEnv.getSessionDir();

			StringBuffer strBuf = new StringBuffer();
			// ディレクトリパス作成(ユーザIDは必ず入力済みとする)
			strBuf.append(userIDPath(strDirPath, strUserID));
			strBuf.append(FILE_SEPARATOR);
			strBuf.append(WBT_DIR_NAME);
			
			File fSession = new File(strBuf.toString());
			String[] Session_list = fSession.list(); 

			return Session_list;
		}
		catch(Exception ex)
		{
			DebugLog.write( this.getClass(), ex, DebugLog.HIGHT );
			throw new LOException(ex.getMessage());
		}
	}

	/**
	 * パスで指定されたディレクトリ配下のディレクトリをすべて削除します
	 * @param セッションファイルのPath
	 * WBTLO学習終了時にしか使用されません。
	 */
	private void delWbtDir( String strPath )
	{
		String[] list = new File( strPath ).list();

		for ( int i = 0 ; i < list.length ; i++ ) {
			File file = new File( strPath + FILE_SEPARATOR + list[i] );
			if ( file.isFile() ) {
				// ファイル削除
				file.delete();
			} else {
				// ディレクトリの場合、再帰する
				delWbtDir( strPath + FILE_SEPARATOR + list[i] );
				file.delete();
			}
		}
	}

	private static String userIDPath(String strDirPath, String strUserID)
	{
		return UserIDFolder.getPath(strDirPath, strUserID);
	}
}
