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

// 
//	機能名称	
//		CMI データモデルlaunch クラス
//
//		変更履歴	
//			2003.12.01 gxl 新規作成
//

package jp.co.ntt.lms.lo.scorm.cbtcom;

/**
 * CMI データモデルlaunch クラス <br>
 * @author gxl
 */
public class CMILaunch extends CMIObjBase {
	
	/**	
	* CMILaunchクラスの初期処理.<br>
	*/
	public CMILaunch() {
		// オープン状態フラグを初期化(未オープンに)する
		m_isOpen = false;
		// プロトタイプデータをセットする
		m_proto = CMIElementProto.g_launchProto;
		// 子データモデルを生成する
		makeChildren(CMIElementProto.g_launchProto);		
	}

	/**		
	* CMILaunchクラスの初期処理.<br>	
	* @param cbt CBTオブジェクト	
	*/	
	public CMILaunch(CMICBT cbt) {
		// オープン状態フラグを(未オープンに)初期化する
		m_isOpen = false;
		// プロトタイプデータをセットする
		m_proto = CMIElementProto.g_launchProto;
		// CBTオブジェクトをセットする
		m_CBT = cbt;						
		// 上記は、makeChildren より前にセットする必要がある。
		
		// 子データモデルを生成する
		makeChildren(CMIElementProto.g_launchProto);
	}
	
	/**		
	* CMILaunchクラスの終了処理<br>	
	*/
	public void finalize() {
	}
	
	/**		
	* セッションを開始処理<br>	
	* @return String　CBT起動URL	
	*/	
	public String open() {
		// CBTオブジェクトのオープンをコールする
		return m_CBT.open();			
	}

	/**			
	* セッションを終了処理<br>		
	*/	
	public void close() {
		// CBTオブジェクトのクローズをコールする
		m_CBT.close();	
	}
	
	/**		
	* (LocalValueに)値を設定処理<br>	
	* @param name　エレメントパス	
	* @param value　値	
	*/
	public void setValue(String name, String value) {

		// エラー情報をクリアする
		m_CBT.clearError();

		if (!m_isOpen) {
			// オープン状態ならば、指定パスのエレメントに値をセットする
			CMIParameterPath param = new CMIParameterPath(name);
			String strDataModelName = param.popFirstElement();
			String strCategory = param.getNthElement(1);

			localSetValue(param.getPath(), value);
		} else {
			// 未オープン状態ならば、初期化エラーをセットする
			setError(CMIError.ERR_NOT_INITALIZED);
			setVendorError(getVendorData("CMILaunch.setValue", this));
		}
	}

	/**		
	* (LessonValueの)値を取得処理<br>	
	* @param name　エレメントパス	
	* @return String  パラメータの値（文字列）	
	*/	
	public String getValue(String name) {

		// エラー情報をクリアする
		m_CBT.clearError();

		// 指定パスのエレメントの値を取得する
		String strRet = null;
		CMIParameterPath param = new CMIParameterPath(name);
		String strDataModelName = param.popFirstElement();
		String strCategory = param.getNthElement(1);

		strRet = localGetValue(param.getPath());
		// 取得した値を返す
		return strRet;
	}


	/**		
	* 保存データを設定処理<br>	
	* @param valueStr　保存データ	
	*/	
	public void setAllValue(String valueStr) {
		// 保存データにより、値保持の対象になっているエレメントの値を復帰する
		// CBTオブジェクトのsetAllValue をコールする
		m_CBT.setAllValue(valueStr);
	}
	
	/**			
	* 保存データを取得処理<br>		
	* @return String  保存データ（文字列）		
	*/		
	public String getAllValue() {
		// 値保持の対象になっているエレメントから保存データを取得し返す。
		// CBTオブジェクトのgetAllValue をコールする
		return m_CBT.getAllValue();	
	}
	
	/**			
	* 自オブジェクトのオープン処理を実行処理<br>		
	*/		
	public void myOpen() {
		// オープン状態フラグをオープン済みにする
		m_isOpen = true;	
	}
	
	/**		
	* 自オブジェクトのクローズ処理を実行処理<br>	
	*/	
	public void myClose() {
		// オープン状態フラグを未オープンにする
		m_isOpen = false;		
	}
		
	/**			
	* 値を設定処理<br>		
	* @param name　エレメントパス		
	* @param value　値		
	*/	
	public void localSetValue(String name, String value, boolean doCheck) {
		// 指定パスのオブジェクトに値をセットする
		super.localSetValue(name, value, doCheck);
	}

	/**		
	* 値を取得処理<br>	
	* @param name　エレメントパス
	* @param doCheck チェック処理フラグ
	* @return String  パラメータの値（文字列）	
	*/
	public String localGetValue(String name, boolean doCheck) {
		// 指定パスのオブジェクトから値を取得し返す。
		return super.localGetValue(name, doCheck);
	}
	
	/**		
	* CBT 起動URL データを生成処理<br>	
	* @return String  CBT起動URL	
	*/	
	public String makeCbtURL() {

		StringBuffer cbtUrl = new StringBuffer("");	
		String  strLocalValue = null;
		StringBuffer strSid = new StringBuffer();

		// セッションIDを生成する
		/// データモデルからセッションIDの値を取得する。
		strLocalValue = localGetValue("cmi.launch.aicc_sid");
		if (strLocalValue == null) {
			// セッションID の値が取得できなければ、セッションIDシード＋タイムストリングでセッションIDを生成する
			// データモデルからセッションIDシードの値を取得する
			String strSeed = localGetValue("cmi.launch.aicc_sid_seed", false);
			if (strSeed == null) {
				// セッションIDシード の値が取得できなければ、学習者ID＋タイムストリングでセッションIDを生成する
				strSeed = m_CBT.localGetValue("cmi.core.student_id", false);
				if (strSeed == null) {
					// 学習者ID の値が取得できなければ、初期化エラーをセットし、終了する
					// エラー
					setError(CMIError.ERR_NOT_INITALIZED);
					setVendorError(getVendorData("CMILaunch.makeCbtURL", this));
					return cbtUrl.toString();
				}
			}
			// 現在日時からタイムストリングを生成し、ユニークとなるセッションIDを生成する
			String str = String.valueOf(System.currentTimeMillis());			
			strSid.append(strSeed).append(str);
		} else {
			// セッションID の値が取得できたならば、その値をそのまま用いる
			// cmi.launch.aicc_sid が設定済みの場合は、そのまま用いる。
			strSid.append(strLocalValue);			
		}

		// データモデルから CBT URL の値を取得し、起動URLにセットする
		strLocalValue = localGetValue("cmi.launch.cbt_url", false);
		if (strLocalValue != null) {
			cbtUrl.append(strLocalValue);
		}
		//@20040603 MOD NTTR パラメータ付加順序の変更
		// manifestにparameterがあればそちらが優先
		strLocalValue = localGetValue("cmi.launch.launch_params", false);
		
		if (strLocalValue != null) {//パラメータあり
			if (strLocalValue.startsWith("?") == true) {
				cbtUrl.append(strLocalValue);
			}
			else
			{
				cbtUrl.append("?");
				cbtUrl.append(strLocalValue);
			}
		}
		else
		{
			cbtUrl.append("?");
		}
		
		// 生成したセッションID を、起動URLに付加する
		cbtUrl.append("&AICC_SID=");
		//セッションID をURLエンコードする
		cbtUrl.append(CMIUtil.urlEncode(strSid.toString()));
		//データモデルから AICC URL の値を取得し、起動URLに付加する
		cbtUrl.append("&AICC_URL=");
		strLocalValue = localGetValue("cmi.launch.aicc_url", false);
		if (strLocalValue != null) {
			cbtUrl.append(CMIUtil.urlEncode(strLocalValue));
		}
		//@20040603 END
		// 起動URLを返す
		return cbtUrl.toString();
	}
}