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

// Java API
import java.util.Vector;

import jp.co.ntt.lms.Common.RDF.RDFNode;

/**
 * 進捗状況一覧ユーザのデータストア<BR>
 * 
 * @author H.Takishima
 * @version 2.0.4.0.0 2004.01.08
 */
public class IndividualLogUserProgressStatusStoreData extends IndividualLogStoreData {

	/** LOID */
	private String mstrLOID;
	
	/** UserID */
	private String mstrUserID;
	
	/** LoType */
	private String mstrLoType;
	
	/** 教材構造 */
	private RDFNode mobjNode;

	/**　SQL取得データ格納領域　*/
	private String mstrWrkData[ ][ ];
	
	/** 進捗状況一覧ユーザデータ（全件）*/
	private Vector mvecStoreData;
	
	
	/**
	 * コンストラクタ
	 * @param LOID
	 * @param UserID
	 * @param LoType
	 * @param objNode
	 **/
	public IndividualLogUserProgressStatusStoreData(String strLOID,String strUserID,String strLoType,RDFNode objNode ) {
		this.mstrLOID = strLOID;
		this.mstrUserID = strUserID;
		this.mstrLoType = strLoType;
		this.mobjNode = objNode;
	}

	/**
	 * 進捗状況一覧ユーザデータオブジェクト作成
	 * @return 正常、異常
	 **/
	public boolean makeStoreData() {
	
		try{
			//SQLを発行してテーブルデータを取得(RecordSet)
			makeResultSql();
			
			//データが存在した場合
				//RecordSet→データObj
				setStoreData();

				//IndividualLogStoreDataに作成した一覧表Objをセット
				setStoreDataObj(mvecStoreData);

			return true;

		}catch(Exception e){
			return false;
		}
	}
	
	/**
	 * SQLを発行し、DBからデータ取得
	 **/
	private void makeResultSql() throws Exception{
	
		Vector vecParam = new Vector();		//条件格納領域
		
		// リアルLOIDを取得。
		String strRealLoID = new IndividualLogStoreData().getRealLoID(mstrLOID);

		//SQL作成
		//条件セット
		vecParam.addElement(strRealLoID);
		vecParam.addElement(mstrUserID);

		//SQL発行
		mstrWrkData = execute( mstrLoType, SQLID_PROGRESS_USER,  vecParam);

	}

	/**
	 * DBから取得したデータを編集し、表示するAU順にデータObjに格納
	 */
	private void setStoreData(){
		int intRowCnt;									//件数（行）
		String strNodeUID = new String();				//目次から取得したUID
		String strUID = new String();					//DBから取得したUID
		String strStoreUID = new String();				//ストアするUID
		String strStoreStudyStartDateNew = new String();//ストアする学習開始日
		String strStoreStudyStartDateOld = new String();//ストアする最終アクセス日
		int intStoreUIDCount;							//ストアするアクセス回数
		String strStoreTotalLearnTime;					//ストアする累積学習時間
		String strStoreMaxScore = new String();			//ストアする得点（最新）
		String strStoreRawScore = new String();			//ストアする得点（最高）
		String strStoreComplete = new String();			//ストアする完了AU
		String strStorePass = new String();				//ストアする合格AU
		String strStoreAURow = new String();			//ストアするAU_ROW
		String strStoreSectionRow = new String();		//ストアするSECTION_ROW

		//件数（行）
		intRowCnt = mstrWrkData.length;
		
		//教材構造一覧作成
		createRDFStoreData(mobjNode);

		//ストアデータ作成
		mvecStoreData = new Vector();

		//ＤＢ検索結果１件もログが存在しない場合、教材ＡＵの空データストアを作成
		if(intRowCnt == 0){
			createEmptyStoreData();
			return;
		}

		//ＡＵ順にループ
		for(int i = 0; i < getRDFMaxRow(); i++){
			
			//セクション判定
			if(getRDFType(i).equals(IndividualLogRDFNode.STATUS_S)){
				//セクションROW(index)を保持
				strStoreSectionRow = new Integer(i).toString();
				continue;
			}

			//目次からのUID
			strNodeUID = getRDFAUID(i);

			//AU単位のデータ保持領域初期化
			strStoreUID = "";
			strStoreStudyStartDateNew = "";
			strStoreStudyStartDateOld = "";
			intStoreUIDCount = 0;
			strStoreTotalLearnTime = "";
			strStoreMaxScore = "";
			strStoreRawScore = "";
			strStoreComplete = "0";
			strStorePass = "0";
			strStoreAURow = "";

			//目次順のAUで、SQLから取得したデータを検索
			int j;
			for(j = 0; j < intRowCnt; j++){							//目次のRow数Loop
				//UID取得
				strUID = mstrWrkData[ j ][ PROGRESS_REC_UID_COL ];

				//UIDが目次と同一になるまで進める(一度も一致していない間)
				if(!strNodeUID.equals(strUID) && intStoreUIDCount == 0){
					continue;
				}

				//一度はUIDが一致していてUIDが異なった場合
				if(!strNodeUID.equals(strUID) && intStoreUIDCount > 0){
					//集計
					Vector vecAuStoreData = setAuStoreData(strStoreUID,
															strStoreStudyStartDateNew,
															strStoreStudyStartDateOld,
															intStoreUIDCount,
															strStoreTotalLearnTime,
															strStoreMaxScore,
															strStoreRawScore,
															strStoreComplete,
															strStorePass,
															strStoreAURow,
															strStoreSectionRow);
					//データストア行追加
					mvecStoreData.addElement( vecAuStoreData );
					intStoreUIDCount = 0;
					break;
				}

				//一致UID数
				intStoreUIDCount++;

				//初めて一致
				if(intStoreUIDCount == 1){
					//UID保持
					strStoreUID = strUID;
					//学習開始日を保持
					strStoreStudyStartDateNew = mstrWrkData[ j ][ PROGRESS_REC_STUDYDATE_COL ];
					//得点（最高）を保持
					strStoreRawScore = mstrWrkData[ j ][ PROGRESS_REC_MAXSCORE_COL ];
					//AU Rawを保持
					strStoreAURow = new Integer(i).toString();
				}
				//得点（最高）を保持
				if(!mstrWrkData[ j ][ PROGRESS_REC_MAXSCORE_COL ].equals("")){
					if(strStoreRawScore.equals("")){
						strStoreRawScore = mstrWrkData[ j ][ PROGRESS_REC_MAXSCORE_COL ];
					}else{
						if(new Float(strStoreRawScore).floatValue() < 
							new Float(mstrWrkData[ j ][ PROGRESS_REC_MAXSCORE_COL ]).floatValue()){
							strStoreRawScore = mstrWrkData[ j ][ PROGRESS_REC_MAXSCORE_COL ];
						}
					}
				}
				//累積学習時間
				if(!mstrWrkData[ j ][ PROGRESS_REC_TIME_COL ].equals("")){
					strStoreTotalLearnTime = sumTotal(strStoreTotalLearnTime,mstrWrkData[ j ][ PROGRESS_REC_TIME_COL ]);
				}
				//最終アクセスを保持
				strStoreStudyStartDateOld = mstrWrkData[ j ][ PROGRESS_REC_STUDYDATE_COL ];
				//得点（最新）
				if(!mstrWrkData[ j ][ PROGRESS_REC_RAWSCORE_COL ].equals("")){
					strStoreMaxScore = mstrWrkData[ j ][ PROGRESS_REC_RAWSCORE_COL ];
				}
				//完了を保持
				if(judgeCompletedResult(mstrWrkData[ j ][ PROGRESS_REC_LESSONSTATUS_COL ])){
					strStoreComplete = DEF_AU_COMPLETE;
				}
				//合格を保持
				if(judgePassResult(mstrWrkData[ j ][ PROGRESS_REC_LESSONSTATUS_COL ])){
					strStorePass = DEF_AU_PASS;
				}
			}
			if(intStoreUIDCount > 0 ){
				//集計
				Vector vecAuStoreData = setAuStoreData(strStoreUID,
														strStoreStudyStartDateNew,
														strStoreStudyStartDateOld,
														intStoreUIDCount,
														strStoreTotalLearnTime,
														strStoreMaxScore,
														strStoreRawScore,
														strStoreComplete,
														strStorePass,
														strStoreAURow,
														strStoreSectionRow);
				//データストア行追加
				mvecStoreData.addElement( vecAuStoreData );
			}
			//教材構造のＡＵがＤＢ検索結果と１件もマッチしなかった場合
			//空ストアデータを構築する
			else if(intStoreUIDCount == 0 && j == intRowCnt){
				//AU単位のデータ保持領域初期化
				strStoreStudyStartDateNew = "";
				strStoreStudyStartDateOld = "";
				intStoreUIDCount = -1;
				strStoreTotalLearnTime = "";
				strStoreMaxScore = "";
				strStoreRawScore = "";
				strStoreComplete = "0";
				strStorePass = "0";
				strStoreAURow = new Integer(i).toString();
				//集計
				Vector vecAuStoreData = setAuStoreData(strNodeUID,
														strStoreStudyStartDateNew,
														strStoreStudyStartDateOld,
														intStoreUIDCount,
														strStoreTotalLearnTime,
														strStoreMaxScore,
														strStoreRawScore,
														strStoreComplete,
														strStorePass,
														strStoreAURow,
														strStoreSectionRow);
				//データストア行追加
				mvecStoreData.addElement( vecAuStoreData );
			}
		}
	}

	/**
	 * 教材構造ＡＵ分の空データストアを作成
	 */
	private void createEmptyStoreData(){
		int intRowCnt;									//件数（行）
		String strNodeUID = new String();				//目次から取得したUID
		String strStoreStudyStartDateNew = new String();//ストアする学習開始日
		String strStoreStudyStartDateOld = new String();//ストアする最終アクセス日
		int intStoreUIDCount;							//ストアするアクセス回数
		String strStoreTotalLearnTime;					//ストアする累積学習時間
		String strStoreMaxScore = new String();			//ストアする得点（最新）
		String strStoreRawScore = new String();			//ストアする得点（最高）
		String strStoreComplete = new String();			//ストアする完了AU
		String strStorePass = new String();				//ストアする合格AU
		String strStoreAURow = new String();			//ストアするAU_ROW
		String strStoreSectionRow = new String();		//ストアするSECTION_ROW

		//教材構造件数分ループ
		for(int i = 0; i < getRDFMaxRow(); i++){

			//AU単位のデータ保持領域初期化
			strStoreStudyStartDateNew = "";
			strStoreStudyStartDateOld = "";
			intStoreUIDCount = -1;
			strStoreTotalLearnTime = "";
			strStoreMaxScore = "";
			strStoreRawScore = "";
			strStoreComplete = "0";
			strStorePass = "0";
			strStoreAURow = new Integer(i).toString();

			//セクション判定
			if(getRDFType(i).equals(IndividualLogRDFNode.STATUS_S)){
				//セクションROW(index)を保持
				strStoreSectionRow = new Integer(i).toString();
				continue;
			}

			//教材構造からのUID取得
			strNodeUID = getRDFAUID(i);

			//集計
			Vector vecAuStoreData = setAuStoreData(strNodeUID,
													strStoreStudyStartDateNew,
													strStoreStudyStartDateOld,
													intStoreUIDCount,
													strStoreTotalLearnTime,
													strStoreMaxScore,
													strStoreRawScore,
													strStoreComplete,
													strStorePass,
													strStoreAURow,
													strStoreSectionRow);
			//データストア行追加
			mvecStoreData.addElement( vecAuStoreData );
		}
	}

	/**
	 * 学習者AU単位集計
	 * @param String strStoreUID UID
	 * @param String strStoreStudyStartDateNew 学習開始日
	 * @param String strStoreStudyStartDateOld 最終アクセス日
	 * @param int intStoreUIDCount アクセス回数
	 * @param String strStoreTotalLearnTime 累積学習時間
	 * @param String strStoreMaxScore 得点（最新）
	 * @param String strStoreRawScore 得点（最高）
	 * @param String strStoreComplete 完了AU
	 * @param String strStorePass 合格AU
	 * @param String strStoreAURow AU_ROW
	 * @param String strStoreSectionRow SECTION_ROW
	 * @return Vector 集計結果
	 */
	private Vector setAuStoreData(String strStoreUID,
									String strStoreStudyStartDateNew,
									String strStoreStudyStartDateOld,
									int intStoreUIDCount,
									String strStoreTotalLearnTime,
									String strStoreMaxScore,
									String strStoreRawScore,
									String strStoreComplete,
									String strStorePass,
									String strStoreAURow,
									String strStoreSectionRow){

		Vector vecAuWrk = new Vector();
		//UID
		vecAuWrk.addElement(strStoreUID);
		//学習開始日
		vecAuWrk.addElement(strStoreStudyStartDateNew);
		//最終アクセス日
		vecAuWrk.addElement(strStoreStudyStartDateOld);
		//アクセス回数
		if(intStoreUIDCount == -1){
			vecAuWrk.addElement("");
		}else{
			vecAuWrk.addElement(new Integer(intStoreUIDCount).toString());
		}
		//累積学習時間
		vecAuWrk.addElement(convertSecToHour(strStoreTotalLearnTime));
		//得点（最新）
		vecAuWrk.addElement(strStoreMaxScore);
		//得点（最高）
		vecAuWrk.addElement(strStoreRawScore);
		//完了AU
		vecAuWrk.addElement(strStoreComplete);
		//合格AU
		vecAuWrk.addElement(strStorePass);
		//AU_ROW
		vecAuWrk.addElement(strStoreAURow);
		//SECTION_ROW
		vecAuWrk.addElement(strStoreSectionRow);

		return vecAuWrk;
	}

}
