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

//xmo API
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.util.Locale;
import java.util.StringTokenizer;
import java.util.Vector;

import jp.co.ntt.lms.Common.RDF.RDFNode;
import jp.co.ntt.lms.lo.LoTopClient;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.XMOException;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.util.DebugLog;

/**
 * Offline個別ログ共通ストアデータクラス<BR>
 * Offline個別ログの業務系ストアデータクラスの継承元<BR>
 * @author H.Takishima
 * @version 2.0.4.0.0 2004/01/08
 */
public class IndividualLogStoreData implements IndividualLogPropertyDef {

	/**
	 * ストアデータ
	 **/
	private Vector mvecStoreData;

	/**
	 * 教材構造ストアデータ
	 **/
	private IndividualLogRDFNode mobjRDFNode;

	/**
	 * コンストラクタ
	 **/
	public IndividualLogStoreData( ) {

		mvecStoreData = new Vector();
	}

	/**
	 * ストアデータにデータをセットする
	 * @param Vector vecDataObj セットするデータオブジェクト
	 */
	public void setStoreDataObj(Vector vecDataObj) {

		this.mvecStoreData = vecDataObj;
	}

	/**
	 * ストアデータのMAX件数(行)を取得
	 * @return int ストアデータの件数
	 */
	public int getMaxData( ) {

		if( mvecStoreData != null ){
			return mvecStoreData.size();
		}else{
			return 0;
		}
	}

	/**
	 * ストアデータの指定されたインデックスの要素を返却<BR>
	 * @param int intIndex 指定インデックス
	 * @return Vector ストアデータの１行分を返却
	 */
	public Vector getStoreData(int intIndex) {
	
		Vector vecRet = new Vector();
		if(mvecStoreData != null){
			vecRet = (Vector)mvecStoreData.get(intIndex);
		}else{
			vecRet =  null;
		}
			return vecRet;
	}

	/**
	 * 指定されたSQLを発行してデータを取得する<BR>
	 * @param String strLoType 教材TYPE
	 * @param String strSqlId SQLのID
	 * @param Vector vecPara SQLに挿入する条件
	 * @return String[][] 取得したレコード
	 */
	public String[][] execute(String strLoType,String strSqlId,Vector vecPara){

		String[][]  objResult = null;
		try{
			// クライアントオブジェクト生成
			Environment objEnv = new Environment();
			String strServerName = objEnv.getLoServerName();
			LoTopClient objLoTop = new LoTopClient(strServerName, strLoType);

			// 検索条件の設定
			for(int i = 0 ; i < vecPara.size() ; i++){
				objLoTop.addLoLogCondition((String)vecPara.elementAt(i));
			}

			//個別ログデータの取得
			String strMessage = null;
			if(!objLoTop.getIndividualLog(strSqlId)){
				String errorMsg = objLoTop.getMessageData().getMessage();
				return objResult;
			}

			//検索結果
			objResult = objLoTop.getIndividualLogResult();

		}catch(Exception e){
			return objResult;
		}
		return objResult;
	}

	/**
	 * 指定されたRDFNodeから教材構造データをストアする<BR>
	 * @param RDFNode objNode 指定RDFNode
	 */
	public void createRDFStoreData(RDFNode objNode) {

		mobjRDFNode = new IndividualLogRDFNode(objNode);

	}

	/**
	 * RDFストアデータのインデックス指定でTypeを返します。
	 * @param int intIndex 指定インデックス
	 * @return String STATUS_S or STATUS_A
	 */
	public String getRDFType( int intIndex ){

		return mobjRDFNode.getType( intIndex );
	}

	/**
	 * RDFストアデータのインデックス指定でAU（UID）を返します。
	 * @param int intIndex 指定インデックス
	 * @return String AU（UID）
	 */
	public String getRDFAUID( int intIndex ){

		return mobjRDFNode.getAUID( intIndex );
	}

	/**
	 * RDFストアデータのインデックス指定でTitleを返します。<BR>
	 * TypeがSTATUS_Sの場合はトップセクションから連結された名称が返却されます<BR>
	 * Topセクション>セクション1>セクション1-1<BR>
	 * @param int intIndex 指定インデックス
	 * @return String セクション名 or ＡＵ名
	 */
	public String getRDFTitle( int intIndex ){

		return mobjRDFNode.getTitle( intIndex );
	}

	/**
	 * RDFストアデータのインデックス指定でTitleを返します。<BR>
	 * TypeがSTATUS_Sの場合はトップセクションから連結された名称が返却されます<BR>
	 * Topセクション>セクション1>セクション1-1<BR>
	 * @param String strIndex 指定インデックス(String)
	 * @return String セクション名 or ＡＵ名
	 */
	public String getRDFTitle( String strIndex ){
		return getRDFTitle(new Integer(strIndex).intValue());
	}

	/**
	 * RDFストアデータのMax行数を返します。
	 * @return int Max数
	 */
	public int getRDFMaxRow( ){

		return mobjRDFNode.getMaxRow();
	}

	/**
	 * 指定UIDが存在するかを検索する
	 * @param String strUID 指定UID
	 * @return boolean true:見つかった、false:見つからなかった
	 */
	public boolean serchUID( String strUID ){
		for(int i = 0 ; i < getRDFMaxRow() ; i++){
			if(getRDFAUID(i).equals(strUID)){
				return true;
			}
		}
		return false;
	}

	/**
	 * 成績判定
	 * AiccInteraction.resultに左1文字に"C"or"c"or1以上の数字が入っていたら正解とする
	 * @param DBから取得したresult（回答の結果）
	 * @return 正解：DEF_CORREC、不正解：DEF_NO_ANSWER、未回答：DEF_WRONG
	 */
	public String judgeResult(String strParamResult) {
		double dbltResult;
		String strResult;
		
		try{
			dbltResult = Double.parseDouble(strParamResult);
			// resultがDecimal値の場合
			strResult = strParamResult;
		} catch (NumberFormatException e){	
			// resultがDecimal値以外の場合
			strResult = "0" ;
		}
		
		if ( strParamResult.equals("") ){
			// 未回答
			return DEF_NO_ANSWER;
		}else if(!strResult.equals("0")){
			// resultがDecimal値の場合、result数値を返却します。
			return strParamResult;
		}else if ( strParamResult.substring( 0,1 ).equalsIgnoreCase("C") ){
			// 正解
			return DEF_CORREC;
		}else{
			// 不正解
			return DEF_WRONG;
		}
	}

	/**
	 * 完了判定
	 * 左1文字に"C"or"c" または"P"or"p"が入っていたら完了とする
	 * @param DBから取得したLesson_Status
	 * @return boolean true=完了,false=以外
	 */
	public boolean judgeCompletedResult(String strParamResult) {
		
		if( strParamResult.equals( "" ) ){
			return false;
		}else if(strParamResult.substring( 0,1 ).equalsIgnoreCase("C") || judgePassResult(strParamResult)){
			return true;
		}else{
			return false;
		}
	}

	/**
	 * 合格判定
	 * 左1文字に"P"or"p"が入っていたら完了とする
	 * @param DBから取得したLesson_Status
	 * @return boolean true=合格,false=以外
	 */
	public boolean judgePassResult(String strParamResult) {
		
		if( strParamResult.equals( "" ) ){
			return false;
		}else if(strParamResult.substring( 0,1 ).equalsIgnoreCase("P")){
			return true;
		}else{
			return false;
		}
	}

	/**
	 * 学習時間累計
	 *
	 * @param String strTotal 現在までの累計時間(String型の秒数)
	 * @param String strTime 累計する時間(String型の[HH:MM:SS])
	 * @return 累計時間(String型の秒数)
	 */
	public String sumTotal(String strTotal,String strTime){
		String strRet = "";
		long longTotal = 0;
		if( strTime.equals("") ){
			return strTotal;
		}
		if( strTotal.equals("") ){
			strRet = new Long(parseTime(strTime)).toString();
		}else{
			longTotal = new Long(strTotal).longValue() + parseTime(strTime);
			strRet = new Long(longTotal).toString();

		}
		return strRet;

	}
	/**
	 * 文字列[HH:MM:SS]をlong秒で返却する<BR>
	 * 
	 * @param String strTime 変換する時間(String型の[HH:MM:SS])
	 * @return long 秒数
	 */
	public long parseTime(String strTime){
		if( strTime.equals("") ){
			return 0;
		}

		try
		{

			String strHours = "";
			String strMinutes = "";
			String strSeconds = "";

			StringTokenizer objStTime = new StringTokenizer(strTime, ":");
			if(objStTime.countTokens() == 0 )
			{
				strHours = "0";
				strMinutes = "0";
				strSeconds = "0";
			}
			else
			{
				strHours = objStTime.nextToken().trim();
				strMinutes = objStTime.nextToken().trim();
				strSeconds = objStTime.nextToken().trim();

				if (strSeconds.indexOf(".") != -1)
				{
					strSeconds = strSeconds.substring(0,strSeconds.indexOf("."));
				}

				if(strHours.equals(""))
				{
					strHours = "0";
				}
				if(strMinutes.equals(""))
				{
					strMinutes = "0";
				}
				if(strSeconds.equals(""))
				{
					strSeconds = "0";
				}
			}

			long longTimeSec = ((new Long(strHours).longValue()) * 60 * 60) +
								((new Long(strMinutes).longValue()) * 60) + 
								(new Long(strSeconds).longValue());

			return longTimeSec;
		}
		catch(Exception e)
		{
			DebugLog.write( this.getClass(), "Convert Faile !! strTime=" + strTime, DebugLog.HIGHT );
			return 0;
		}
	}

	/**
	 * 文字列[秒]を[#######0.0]時間で返却する<BR>
	 * 
	 * @param String strSec 変換する秒
	 * @return String 時間
	 */
	public String convertSecToHour(String strSec){
		String strRet = "";
		if(strSec.equals("")){
			return strRet;
		}
		long longSec = new Long(strSec).longValue();

		if(longSec == 0){
			strRet = "0.0";
		}else{
			double doubleHour = (double)longSec / 60;
			DecimalFormat objFormat = new DecimalFormat( DEF_TOTAL_LEARN_TIME_FORMAT );
			try{
				strRet = objFormat.format(doubleHour);
			}catch(Exception e ){
				strRet = "";
			}
		}
		return strRet;
	}

	/**
	 * 数値変換処理。
	 *
	 * @param learnTime 数字文字列
	 * @return 数値(引数がnullの場合0を返す。)
	 */
	public long parseLong(String num){
		if( num == null ) {
			return 0;
		}
		String strTemp = "";
		DecimalFormat objFormat = new DecimalFormat( "#" );
		try{
			strTemp = objFormat.format(Double.parseDouble( num ) );
		}catch(Exception e ){
			strTemp = num;
		}
		long ltmp;

		try{
			ltmp = Long.parseLong(strTemp);
		}catch(Exception e){
			ltmp = 0;
		}

		return ltmp;
	}
	
	/**
	* 日付時間比較(dtime_fromがdtime_toより以前かどうか)
	* dtime_fromがdtime_toより以前だったら、Trueを返す
	* @param 日付文字列FROM（YYYY/MM/DD HH:MM:SS）
	* @param 日付文字列TO（YYYY/MM/DD HH:MM:SS）
	* @return DEF_EQUAL：dtime_fromがdtime_to等しい
	* @return DEF_PAST：dtime_fromがdtime_toより過去
	* @return DEF_FUTURE：dtime_fromがdtime_toより未来
	* @return DEF_DATECOMP_ERR：比較不可能
	*/
	 public int compareDateTime(String dtime_from, String dtime_to){
		Locale loc = new Locale("ja","JP");
		DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM,loc);
		try{
			java.util.Date date_from = df.parse(dtime_from);
			java.util.Date date_to = df.parse(dtime_to);
			int modori = date_from.compareTo(date_to);
			//dtime_fromがdtime_to等しい
			if(modori == 0){
				return DEF_EQUAL;
			//dtime_fromがdtime_toより未来
			}else if(modori > 0){
				return DEF_FUTURE;
			//dtime_fromがdtime_toより過去
			}else{
				return DEF_PAST;
			}
		}catch(Exception e){
			return DEF_DATECOMP_ERR;
		}
	}

	 /**
	  * リアルLOID取得メソッド。<BR>
	  * 指定されたLOIDよりリアルLOIDを取得します。
	  * 
	  * @param     strLoID     LOID
	  * @return    strRealLoID リアルLOID
	  * @exception XMOException
	  */
	 public String getRealLoID(String strLoID) throws Exception {

		 String strRealLoID = null;
		 LoClient objLo = new LoClient();

		 if (objLo.getRealLOIDFromLOID(strLoID)) {
			 strRealLoID = objLo.getRealLOIDResult();
		 } else {
			 //検索がうまくいかなかった
			 new XMOException(objLo.getMessageData());

		 }
		 objLo = null;
		 return strRealLoID;

	 }

}
