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

// 
//	機能名称	
//		グローバルCBT管理     
//
//		変更履歴	
//			2003.12.01 gxl 新規作成
//

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

import java.util.HashMap;
import java.util.Iterator;

/**
 * グローバルCBT管理. <br>
 * @author gxl
 */
public class CMIGlobalCBT extends CMIObjBase {

	/**  
	 * CMIGlobalCBT オブジェクト
	 */
	public static CMIGlobalCBT theGlobalCBT = null;

	/**  
	 * CMIElement オブジェクト
	 */
	private HashMap m_elementlist = new HashMap();

	/**  
	 * CMIValueBuffer オブジェクト
	 */
	private HashMap m_valuebufferlist = new HashMap();

	/**  
	 * ElementPathMap オブジェクト
	 */
	private HashMap m_elementpathMap = new HashMap();
	
	/**
	 * CMIGlobalCBTクラスの初期処理。<br>
	 */
	private CMIGlobalCBT() {
		setGCBT(this);
		m_proto	= CMIElementProto.g_g_cbtProto;
		makeGlobalChildren(CMIElementProto.g_g_cbtProto);
		CMIUtil.putLog("CMIGlobalCBT created");
	}
	
	/**
 	 * CMIGlobalCBT クラスの終了処理。<br>
 	 */	
	public void finalize() {

		m_elementlist.clear();	

		m_valuebufferlist.clear();
		
		CMIUtil.putLog("CMIGlobalCBT deleted");
	}
	
	/**
 	 * グローバルCBT取得処理。<br>
 	 * @return CMIGlobalCBT インスタンスされたオブジェクト
 	 */
	public static CMIGlobalCBT getGlobalCBT() {
		if (theGlobalCBT == null)  {
			theGlobalCBT = new CMIGlobalCBT();
		}
		return theGlobalCBT;
	}
	
	/**
 	 *グローバルCBT削除処理。<br>
 	 */
	public static void deleteGlobalCBT() {
		theGlobalCBT = null;
	}
	
	/**
 	 * バリューバッファの追加。<br>
 	 * @param name　指定された要素インスタンス
	 * @param valueBuffer　指定された要素
 	 * @return CMIValueBuffer
 	 */
	public CMIValueBuffer addElementValueBuffer(String name, CMIValueBuffer valueBuffer) {
		m_valuebufferlist.put(name, valueBuffer);
		return valueBuffer;
	}
	
	/**
 	 * バリューバッファの取得。<br>
 	 * @param name　指定された要素インスタンス
	 * @return CMIValueBuffer
 	 */
	public CMIValueBuffer getElementValueBuffer(String name) {

		CMIValueBuffer valueBuffer = null;
		Iterator iterator = m_valuebufferlist.keySet().iterator();
		Object strValue = null;
		while (iterator.hasNext()) {
			strValue = iterator.next();
			if ( name != null && name.equals(strValue) ) {
				valueBuffer = (CMIValueBuffer)m_valuebufferlist.get(strValue);
				break;
			}			
		}
		return valueBuffer;
	}
	
	/**
 	 * グローバル要素の追加. <br>
     * <p> 指定された要素が無ければ追加する
 	 * @param name　指定された要素インスタンス
	 * @param element　指定された要素
	 * @return CMIElement
 	 */
	public CMIElement addElement(String name, CMIElement element) {		
		
		m_elementlist.put(name, element);
		return element;
	}
	
	/**
 	 * グローバルCBT取得。<br>
 	 * @param name　指定された要素インスタンス
	 * @return CMIElement
 	 */
	public CMIElement getElement(String name) {

		CMIElement element = null;
		Iterator iterator = m_elementlist.keySet().iterator();
		Object strValue = null;
		while (iterator.hasNext()) {
			strValue = iterator.next();
			if ( name != null && name.equals(strValue) ) {
				element = (CMIElement)m_elementlist.get(strValue);
				break;
			}
		}
		return element;
	}
	
	/**
 	 * 発生したエラーコードをセットする.<br>
 	 * @param error　指定された要素インスタンス
 	 */
	public void setError(int error) {
		m_CBT.setError(error);
	}

	/**
 	 * 発生したエラーコードを取得する.<br>
	 * @return int エラーコード
 	 */
	public int getError() {
		return m_CBT.getError();
	}
	
	/**
 	 * 発生したベンダー情報をセットする.<br>
 	 * @param msg 発生したベンダー情報
 	 */
	public void setVendorError(String msg) {
		if (m_CBT != null) {
			m_CBT.setVendorError(msg);
		}
	}
	
	/**
 	 * キーパスに該当するエレメントを取得する.<br>
	 * <p>リンクエレメントを取得する.
 	 * @param key キーパス
	 * @return CMIElement
 	 */
	public CMIElement getPath2Element(String key) {
		CMIElement element = null;
		Iterator iterator = m_elementpathMap.keySet().iterator();
		Object strValue = null;
		while (iterator.hasNext()) {
			strValue = iterator.next();
			if ( key != null && key.equals(strValue) ) {
				element = (CMIElement)m_elementpathMap.get(strValue);
				break;
			}
		}
		return element;

	}
	
	/**
 	 * パスに相当するエレメントを登録する.<br>
 	 * @param key キーパス
	 * @param element エレメント
	 * @return CMIElement
 	 */
	public CMIElement addPathElement(String key, CMIElement element) {
		m_elementpathMap.put(key, element);
		return element;
	}
}