/*
このファイルの中身は、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 データモデル　エラー クラス
//変更履歴
//			  2003.11.24	zcj  新規作成		
//
package jp.co.ntt.lms.lo.scorm.cbtcom;

import java.util.HashMap;

/**
 * CMI データモデル　エラー クラス <BR>
 * @author zhaicj
 * 
 */
public class CMIError {
		
	/**
	 * Successful
	 */
	public static final int ERR_NO_ERROR = 0;
	/**
	 * 100 General errors 一般的な例外
	 */
	public static final int ERR_GENERAL_EXCEPTION = 101;

	/**
	 * AICC3.5対応 サーバビジー
	 */
	public static final int ERR_SERVER_BUSY = 102;
	
	/**
	 * 引数エラー
	 */
	public static final int ERR_INVALID_AURGUMENT_ERROR = 201;

	/**
	 * エレメントは、子を持たない
	 */
	public static final int ERR_ELEMENT_CANNAT_HAVE_A_CHILDREN = 202;

	/**
	 * エレメントは、配列を持たない
	 */
	public static final int ERR_ELEMENT_NOT_AN_ARRAY = 203;

	/**
	 * エレメントは値を持つことができない
	 */
	public static final int ERR_ELEMENT_CANNAT_HAVE_A_VALUE = 204;
	
	/**
	 * 300 LMS errors 初期化されていない 
	 */
	public static final int ERR_NOT_INITALIZED = 301;
	
	/**
	 * 400 Data model errors 実装されていない
	 */
	public static final int ERR_NOT_INPLEMENTED_ERROR = 401;

	/**
	 * ElementがCMI Keyword
	 */
	public static final int ERR_INVALID_SETVALUE_CMI_KEYWORD = 402;

	/**
	 * ElementはReadonly
	 */
	public static final int ERR_ELEMENT_IS_READ_ONLY = 403;	
	
	/**
	 * ElementはWriteonly
	 */
	public static final int ERR_ELEMENT_IS_WRITE_ONLY = 404;
	
	/**
	 * データ型が不正
	 */
	public static final int ERR_INCORRECT_DATA_TYPE	= 405;	

	/**
	 * 正しいデータ型ではない（SCORM1.3）
	 */
	public static final int ERR_ELEMENT_TYPE_MISMATCH	= 406;

	/**
	 * GroupNameが不十分
	 */
	public static final int WARNING_INSUFFICIENT_GROUPNAME = 801; 
	
	/**
	 * DataNameが不十分
	 */
	public static final int WARNING_INSUFFICIENT_DATANAME = 802;
	
	/**
	 * GroupNameが無効
	 */
	public static final int WARNING_INVALID_GROUPNAME = 811; 

	/**
	 * DataNameが無効
	 */
	public static final int WARNING_INVALID_DATANAME = 812;

	/**
	 * 無視された操作
	 */
	public static final int ERR_IGNORED_OPERATION = 901;	
	
	/**
	 * プログラムエラー
	 */
	public static final int ERR_PROGRAM_ERROR = 999;

	public static final int VERR_NO_ERROR = 0;
	public static final int VERR_GETVALUE = 101;
	public static final int VERR_SETVALUE = 102;
	public static final int VERR_OPEN = 103;
	public static final int VERR_CLOSE = 104;
	public static final int VERR_PROGRAM = 999;

	/**
	 * プロトデータ取得
	 */
	public static final int VERR_DEBUG_PROTO = 900;			
	/**
	 * CMIデータ取得
	 */				
	public static final int VERR_DEBUG_CMIDATA = 901;	
	
	/**
	 * setValue のターゲットVALUEを切り替える(トグル)
	 */
	public static final int VERR_DEBUG_CHANGE_TARGETVALUE = 911;	
	
	/**
	 * デバッグNO ターミネーター(使用不可)
	 */
	public static final int VERR_DEBUG_END = 950;

	private int m_ErrorCode;
	private int m_VendorErrorCode;
	
	private static HashMap m_ErrorMessageMap = new HashMap();
	private static HashMap m_VendorErrorMessageMap = new HashMap();

	/**
	 * string m_message;
	 */
	private String m_VendorMessage;
	
	/**
	 * コンストラクタ<br>
	 */
	public CMIError() {
		initMessageMap();
		m_ErrorCode = ERR_NO_ERROR;
		m_VendorErrorCode = VERR_NO_ERROR;
	}	
	
	/**
	 * コンストラクタ<br>
	 * @param errCode int
	 */
	public CMIError(int errCode) {
		int iScormError = CMIS13ModelUtil.changeScormErrorCode(errCode);
		m_ErrorCode = iScormError;
		initMessageMap();	
		initVendorMessageMap();
	}	
	
	/**
	 * finalize デストラクタ
	 */
	public void finalize() {
	}	

	/**
	 * エラーコードを設定する。<br>
	 * @param errCode int
	 */
	public void setErrorNumber(int errCode) {
		int iScormError = CMIS13ModelUtil.changeScormErrorCode(errCode);
		m_ErrorCode = iScormError;
	}	

	/**
	 * エラーコードを取得する<br>
	 * @return エラーコード int
	 */
	public int getErrorNumber() {
		return m_ErrorCode;
	}	

	/**
	 * エラーメッセージを取得する<br>
	 * @param errCode int
	 * @return エラーメッセージ String
	 */
	public String getErrorString(int errCode) {
		return (String)m_ErrorMessageMap.get(new Integer(errCode));
	}

	/**
	 * Vendorエラーコードをセットする<br>
	 * @param errCode int
	 */
	public void setVendorErrorNumber(int errCode) {
		m_VendorErrorCode = errCode;		
	}

	/**
	 * Vendorエラーコードを取得する<br>
	 * @return Vendorエラーコード int
	 */
	public int getVendorErrorNumber() {
		return m_VendorErrorCode;
	}

	/**
	 * getVendorErrorString ベンダーエラーメッセージの取得
	 * @param errCode int
	 * @return String
	 */
	public String getVendorErrorString(int errCode) {
		return (String)m_VendorErrorMessageMap.get(new Integer(errCode));	
	}	
	
	/**
	 * Vendorエラーメッセージを設定する<br>
	 * @param msg String
	 */
	public void setVendorMessage(String msg) {
		m_VendorMessage = msg;	
	}
	
	/**
	 * Vendorエラーメッセージを取得する<br>
	 * @return String Vendorエラーメッセージ
	 */
	public String getVendorMessage() {
		return m_VendorMessage;
	}
	
	/**
	 * エラーメッセージマップを初期化する<br>
	 */
	private void initMessageMap() {		
		if (m_ErrorMessageMap.size() == 0) {

			m_ErrorMessageMap.put(new Integer(ERR_NO_ERROR), "No error");
			m_ErrorMessageMap.put(new Integer(ERR_GENERAL_EXCEPTION),
													 "General exception");

			// AICC 3.5 対応 サーバビジーエラーを追加
			m_ErrorMessageMap.put(new Integer(ERR_SERVER_BUSY), "Server is busy");

			m_ErrorMessageMap.put(new Integer(ERR_INVALID_AURGUMENT_ERROR),
													 "Invalid argument error");
			m_ErrorMessageMap.put(new Integer(ERR_ELEMENT_CANNAT_HAVE_A_CHILDREN),
												 "Element cannot have children");
			m_ErrorMessageMap.put(new Integer(ERR_ELEMENT_NOT_AN_ARRAY),
									 "Element not an array - cannot have count");
			m_ErrorMessageMap.put(new Integer(ERR_ELEMENT_CANNAT_HAVE_A_VALUE),
												 "Element cannot have a value");
			m_ErrorMessageMap.put(new Integer(ERR_NOT_INITALIZED),
												 "Not initialized");

			if (CMIS13ModelUtil.isScorm13() == true){
				m_ErrorMessageMap.put(new Integer(ERR_NOT_INPLEMENTED_ERROR),
													 "Undefined Data Model Element");

				m_ErrorMessageMap.put(new Integer(ERR_INVALID_SETVALUE_CMI_KEYWORD),
										 "Unimplemented Data Model Element");
				m_ErrorMessageMap.put(new Integer(ERR_ELEMENT_IS_READ_ONLY),
													"Data Model Element Value Not Initialized");
				m_ErrorMessageMap.put(new Integer(ERR_ELEMENT_IS_WRITE_ONLY),
													"Data Model Element Is Read only");
				m_ErrorMessageMap.put(new Integer(ERR_INCORRECT_DATA_TYPE),
													"Data Model Element Is Write Only");
				m_ErrorMessageMap.put(new Integer(ERR_ELEMENT_TYPE_MISMATCH),
													"Data Model Element Type Mismatch");

			}
			else {
				m_ErrorMessageMap.put(new Integer(ERR_NOT_INPLEMENTED_ERROR),
													 "Not implemented error");

				// AICC 3.5 対応	エレメントがキーワード
				//					エレメントはリードオンリー
				//					エレメントはライトオンリー
				//					エレメントのデータ型が不正 の各エラー項目を追加
				m_ErrorMessageMap.put(new Integer(ERR_INVALID_SETVALUE_CMI_KEYWORD),
										 "Invalid set value, element is a keyword");
				m_ErrorMessageMap.put(new Integer(ERR_ELEMENT_IS_READ_ONLY),
													 "Element is read only");
				m_ErrorMessageMap.put(new Integer(ERR_ELEMENT_IS_WRITE_ONLY),
													 "Element is write only");
				m_ErrorMessageMap.put(new Integer(ERR_INCORRECT_DATA_TYPE),
													 "Incorrect Data Type");
			}

			m_ErrorMessageMap.put(new Integer(WARNING_INSUFFICIENT_GROUPNAME),
											 "Warning, Insufficient GroupName");
			m_ErrorMessageMap.put(new Integer(WARNING_INSUFFICIENT_DATANAME),
											 "Warning, Insufficient DataName");
			m_ErrorMessageMap.put(new Integer(WARNING_INVALID_GROUPNAME),
											 "Warning, Invalid GroupName");
			m_ErrorMessageMap.put(new Integer(WARNING_INVALID_DATANAME),
											 "Warning, Invalid DataName");

			m_ErrorMessageMap.put(new Integer(ERR_IGNORED_OPERATION),
										 "Superfluous Operation. Ignored");
	
			m_ErrorMessageMap.put(new Integer(ERR_PROGRAM_ERROR),
										 "Internal program error");
		}
	}	
	
	/**
	 * Vendorメッセージマップを初期化する<br>
	 */
	private void initVendorMessageMap() {
		if (m_VendorErrorMessageMap.size() == 0) {
			m_VendorErrorMessageMap.put(new Integer(VERR_NO_ERROR), "No error");
		}
	}		
}
