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

//
// 学習状況(共通)LogResultクラス
// 
//
//	変更履歴
//	2004.01.08 新規作成		ishizaki
//

package jp.co.ntt.lms.xms.logsumup;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.base.LogResult;

/**
 *  学習状況(共通)LogResultクラス
 * @author ishizaki
 *
 */
public class LoLogLearnStatusResult extends LogResult {

	/** 学習開始日リスト */
	private List dateStartList;
	/** 最終アクセス日時リスト */
	private List dateLastList;
	/** 総アクセス回数リスト */
	private List totalAccessList;
	/** 累積滞在時間リスト */
	private List totalLearnTimeList;
	/** 完了LO数リスト */
	private List matCompleteList;
	/** 合格ＬＯ数リスト */
	private List matPassList;
	/** 最新得点リスト */
	private List matNewestScoreList;
	/** 最高得点リスト */
	private List matHighScoreList;
	/** 完了リスト */
	private List completeConditionList;
	/** 合格リスト */
	private List passConditionList;
	/** 完了者数リスト */
	private List userCompleteConditionList;
	/** 合格者数リスト */
	private List userPassList;
	/** IDリスト */
	private List idList;
	/** 名称のリスト */
	private List nameList;
	/** 所属グループ*/
	private List affiliationGroupList;
	/** 所属外部グループID*/
	private List groupForeinIdList;
	/** 外部ＩＤ */
	private List foreinIdList;
	/** 総得点 */
	private List fullScoreList;
	/** 完了LOパーセント */
	private List matCompletePercentList;
	/** 合格LOパーセント */
	private List matPassPercentList;
	/** 完了者数パーセント */
	private List userCompleteConditionPercentList;
	/** 合格者数パーセント */
	private List userPassPercentList;
	/** 総LO数*/
	private List totalLoCountList;
	/** 総人数*/
	private List totalUserCountList;
	/** 最新得点パーセント */
	private List newScorePercentList;
	/** 最高得点パーセント */
	private List highScorePercentList;
	/** アサイン */
	private List assainList;
	/** グループＩＤ */
	private List groupIdList;

	/** 完了LO数(平均算出用) */
	private List matCompleteAvgList;
	/** 合格LO数(平均算出用) */
	private List matPassAvgList;
	/** 最新得点(平均算出用) */
	private List newScoreAvgList;
	/** 最高得点(平均算出用) */
	private List highScoreAvgList;	
	/** 完了者数(平均算出用) */
	private List userCompleteConditionAvgList;
	/** 合格者数(平均算出用) */
	private List userPassAvgList;


	/**
	 * コンストラクタ 	
	 */
	public LoLogLearnStatusResult() {
		initialize();
	}

	/**
	 * 初期処理
	 * 
	 * プロパティListのインスタンスを生成する
	 * 
	 * 
	 * 
	 */
	public void initialize() {
		super.initialize();
		//学習開始日リスト
		dateStartList = new ArrayList();
		// 最終アクセス日時リスト												
		dateLastList = new ArrayList();
		// 総アクセス回数リスト
		totalAccessList = new ArrayList();
		// 累積滞在時間リスト												
		totalLearnTimeList = new ArrayList();
		// 完了LO数リスト												
		matCompleteList = new ArrayList();
		// 合格ＬＯ数リスト												
		matPassList = new ArrayList();
		// 最新得点リスト												
		matNewestScoreList = new ArrayList();
		// 最高得点リスト												
		matHighScoreList = new ArrayList();
		// 完了リスト									
		completeConditionList = new ArrayList();
		// 合格リスト									
		passConditionList = new ArrayList();
		// 完了者数リスト													
		userCompleteConditionList = new ArrayList();
		// 合格者数リスト													
		userPassList = new ArrayList();
		// IDリスト
		idList = new ArrayList();
		// 名のリスト 
		nameList = new ArrayList();
		//所属グループのリスト
		affiliationGroupList = new ArrayList();
		//所属外部グループＩＤ
		groupForeinIdList = new ArrayList();
		//外部ＩＤ
		foreinIdList = new ArrayList();
		//総得点
		fullScoreList = new ArrayList();
		// 完了LOパーセント 												
		matCompletePercentList = new ArrayList();
		// 合格LOパーセント 												
		matPassPercentList = new ArrayList();
		// 完了者数パーセント 													
		userCompleteConditionPercentList = new ArrayList();
		// 合格者数パーセント 													
		userPassPercentList = new ArrayList();
		// 総LO数
		totalLoCountList = new ArrayList();
		// 総人数
		totalUserCountList = new ArrayList();
		/** 最新得点パーセント */
		newScorePercentList = new ArrayList();
		/** 最高得点パーセント */
		highScorePercentList = new ArrayList();
		/** アサイン */
		assainList = new ArrayList();
		//グループリスト
		groupIdList = new ArrayList();
		// 完了LO数(平均算出用)
		matCompleteAvgList = new ArrayList();
		// 合格LO数(平均算出用)
		matPassAvgList = new ArrayList();
		// 最新得点(平均算出用)
		newScoreAvgList = new ArrayList();
		// 最高得点(平均算出用)
		highScoreAvgList = new ArrayList();
		// 完了者数(平均算出用)
		userCompleteConditionAvgList = new ArrayList();
		// 合格者数(平均算出用)
		userPassAvgList = new ArrayList();
	}
	/**
	 * LogResultのサイズを返す
	 * 
	 * @see jp.co.ntt.lms.xms.framework.base.LogResult#size()
	 */
	public int size() {
		return dateStartList.size();
	}

	/**
	 *  LoLogがある件数のみ返す
	 * 
	 * @return LoLogがある件数
	 * @exception XmsException
	 */
	public int recodeCount() throws XmsException {
		try {
			int count = 0;
			for (int i = 0; i < dateStartList.size(); i++) {
				String var = (String) dateStartList.get(i);
				if (var != null && !var.equals("")) {
					count += 1;
				}
			}
			return count;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}
	/**
	 * 検索するグループが1000件越えた場合の集計を行う(LO一覧のみ).
	 * 
	 * 以下の項目に対してグループが1000件をこえた場合は前の情報と比較、または合算する処理を行う
	 * @param dateStart		学習開始日時
	 * @param dateLast		最終アクセス日時
	 * @param totalAccess	総アクセス回数
	 * @param totalLearnTime	累積滞在時間
	 * @param userCompleteCondition 完了者数
	 * @param userPass 合格者数
	 * @param count LogResultオブジェクトのレコードの集計対象が何番目か
	 * @exception XmsException
	 */
	public void doSumLogResult(
		String new_dateStart,
		String new_dateLast,
		String new_totalAccess,
		String new_totalLearnTime,
		String new_userCompleteCondition,
		String new_userPass,
		int count)
		throws XmsException {

		try {

			DateFormat sdf =  new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

			//前のデータ---------------------------------
			//学習開始日
			String old_dateStart = (String) dateStartList.get(count);
			//getDateStart();
			//最終アクセス日時
			String old_dateLast = (String) dateLastList.get(count);
			//getTotalAccess();
			//総アクセス回数
			String old_totalAccess = (String) totalAccessList.get(count);
			//getTotalAccess();
			//累積滞在時間
			String old_totalLearnTime = (String) totalLearnTimeList.get(count);
			//getTotalLearnTime();
			//完了者数
			String old_userCompleteCondition =
				(String) userCompleteConditionList.get(count);
			//getUserCompleteCondition();
			//合格者数
			String old_userPass = (String) userPassList.get(count);
			//getUserPass();

			//前のデータと新しいデータの集計処理////////////////

			//学習開始日時
			// 学習開始日時のログがまだない、または
			// ログがあり、DBより取得したデータの方が古い場合
			// DBからのデータを設定する
			// (String型からDateへ変換しての比較)
			if ((new_dateStart != null || !new_dateStart.equals(""))
				|| sdf.parse(old_dateStart).after(sdf.parse(new_dateStart))) {
				dateStartList.set(count, new_dateStart);
			}

			//最終アクセス日時
			// 最終アクセス日時のログがまだない、または
			// ログがあり、DBより取得したデータの方が新しい場合は
			// DBからのデータを設定する
			// (String型からDateへ変換しての比較)
			if ((new_dateLast != null || !new_dateLast.equals(""))
				|| sdf.parse(old_dateLast).before(sdf.parse(new_dateLast))) {
				dateLastList.set(count, new_dateLast);

			}

			//総アクセス回数
			String totalAccess = null;
			// アクセス回数を合計する(結果がnullの場合は何もしない)
			// nullでない場合
			if (new_totalAccess != null || !new_totalAccess.equals("")) {
				// 今までのアクセス回数データがnullの場合
				if (old_totalAccess == null || old_totalAccess.equals("")) {
					totalAccess = new_totalAccess;
				// アクセス回数データがある場合
				} else {
					totalAccess =
						Integer.toString(
							Integer.parseInt(old_totalAccess)
								+ Integer.parseInt(new_totalAccess));
				}
				totalAccessList.set(count, totalAccess);
			}

			//累積滞在時間
			String totalLearnTime = null;
			// 累積滞在時間を合計する(結果がnullの場合は何もしない)
			if (new_totalLearnTime != null || !new_totalLearnTime.equals("")) {
				// 今までの累積滞在時間データがnullの場合
				if (old_totalLearnTime == null || old_totalLearnTime.equals("")) {
					totalLearnTime = new_totalLearnTime;
				// 累積滞在時間データがある場合
				} else {
					totalLearnTime =
						Double.toString(
							Double.parseDouble(old_totalLearnTime)
								+ Double.parseDouble(new_totalLearnTime));
				}
				totalLearnTimeList.set(count, totalLearnTime);
			}

			//完了者数
			String userCompleteCondition = null;
			// 完了者数を合計する(結果がnullの場合は何もしない)
			if (new_userCompleteCondition != null || !new_userCompleteCondition.equals("")) {
				// 今までの完了者数データがnullの場合
				if (old_userCompleteCondition == null || old_userCompleteCondition.equals("")) {
					userCompleteCondition = new_userCompleteCondition;
				// 完了者数データがある場合
				} else {
					userCompleteCondition =
						Integer.toString(
							Integer.parseInt(old_userCompleteCondition)
								+ Integer.parseInt(new_userCompleteCondition));
				}
				userCompleteConditionList.set(count, userCompleteCondition);
			}

			//合格者数
			String userPass = null;
			// 合格者数を合計する(結果がnullの場合は何もしない)
			if (new_userPass != null || !new_userPass.equals("")) {
				// 今までの合格者数データがnullの場合
				if (old_userPass == null || old_userPass.equals("")) {
					userPass = new_userPass;
				// 合格者数データがある場合
				} else {
					userPass =
						Integer.toString(
							Integer.parseInt(old_userPass)
								+ Integer.parseInt(new_userPass));
				}
				userPassList.set(count, userPass);
			}

		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}


	/**
	 * LogResultの一行分を追加する.
	 * 
	 * 
	 * 
	 * 
	 * @param dateStart				学習開始日時
	 * @param dateLast				最終アクセス日時
	 * @param totalAccess			総アクセス回数
	 * @param totalLearnTime		累積滞在時間
	 * @param matComplete			完了LO数
	 * @param matPass				合格LO数
	 * @param matNewestScore		最新得点
	 * @param matHighScore			最高得点
	 * @param completeCondition		完了
	 * @param passCondition			合格
	 * @param userCompleteCondition 完了者数
	 * @param userPass 				合格者数
	 * @param id 					ユーザまたはLOのＩＤ
	 * @param name 					ユーザまたはLOの名称
	 * @param affiliationGroup		ユーザの所属するグループのパス
	 * @param groupForeinId 		ユーザの所属するグループの外部ＩＤ
	 * @param foreinId				ユーザまたはＬＯの外部ＩＤ
	 * @param fullScore				総得点
	 * @param  matCompletePercent　	完了LO数パーセント
	 * @param  matPassPercent　		合格LO数パーセント
	 * @param  userCompleteConditionPercent　完了者数パーセント
	 * @param  userPassPercent		合格者数パーセント
	 * @param  totalLoCount 		総LO数
	 * @param  totalUserCount		総ユーザ数
	 * @param  newScorePercent		最新得点パーセント
	 * @param  highScorePercent		最高得点パーセント
	 * @param  assain				アサイン
	 * @param  groupId				グループID
	 * @exception XmsException
	 */
	public void addLog(
		String dateStart,
		String dateLast,
		String totalAccess,
		String totalLearnTime,
		String matComplete,
		String matPass,
		String matNewestScore,
		String matHighScore,
		String completeCondition,
		String passCondition,
		String userCompleteCondition,
		String userPass,
		String id,
		String name,
		String affiliationGroup,
		String groupForeinId,
		String foreinId,
		String fullScore,
		String matCompletePercent,
		String matPassPercent,
		String userCompleteConditionPercent,
		String userPassPercent,
		String totalLoCount,
		String totalUserCount,
		String newScorePercent,
		String highScorePercent,
		String assain,
		String groupId)
		throws XmsException {

		LoLogCommon_inc cominc = new LoLogCommon_inc();

		try {
			/** 学習開始日リスト */
			dateStartList.add(dateStart);
			/** 最終アクセス日時リスト */
			dateLastList.add(dateLast);
			/** 総アクセス回数リスト */
			totalAccessList.add(trim(totalAccess));
			/** 累積滞在時間リスト */
			totalLearnTimeList.add(trim(totalLearnTime));
			/** 完了LO数リスト */
			matCompleteList.add(trim(matComplete));
			/** 合格ＬＯ数リスト */
			matPassList.add(trim(matPass));
			/** 最新得点リスト */
			matNewestScoreList.add(trim(matNewestScore));
			/** 最高得点リスト */
			matHighScoreList.add(trim(matHighScore));
			/** 完了リスト */
			completeConditionList.add(trim(completeCondition));
			/** 合格リスト */
			passConditionList.add(trim(passCondition));
			/** 完了者数リスト */
			userCompleteConditionList.add(trim(userCompleteCondition));
			/** 合格者数リスト */
			userPassList.add(trim(userPass));
			/** iDリスト */
			idList.add(trim(id));
			/** 名のリスト */
			nameList.add(trim(name));
			//所属グループのリスト
			affiliationGroupList.add(trim(affiliationGroup));
			//所属外部グループＩＤ
			groupForeinIdList.add(trim(groupForeinId));
			//外部ＩＤ
			foreinIdList.add(trim(foreinId));
			//総得点
			fullScoreList.add(trim(fullScore));
			// 完了LOパーセント 												
			matCompletePercentList.add(trim(matCompletePercent));
			// 合格LOパーセント 												
			matPassPercentList.add(trim(matPassPercent));
			// 完了者数パーセント 													
			userCompleteConditionPercentList.add(
				trim(userCompleteConditionPercent));
			// 合格者数パーセント 													
			userPassPercentList.add(trim(userPassPercent));
			// 総LO数
			totalLoCountList.add(trim(totalLoCount));
			// 総人数
			totalUserCountList.add(trim(totalUserCount));

			//最新得点パーセント
			newScorePercentList.add(newScorePercent);
			//最高得点パーセント
			highScorePercentList.add(highScorePercent);
			//アサイン
			assainList.add(assain);
			//グループＩＤリスト
			groupIdList.add(groupId);

			// 完了LO数(平均算出用)
			matCompleteAvgList.add(
				new Double(cominc.divideToDouble(
					trim(matComplete), trim(totalLoCount))));
			// 合格LO数(平均算出用)
			matPassAvgList.add(
				new Double(cominc.divideToDouble(
					trim(matPass), trim(totalLoCount))));
			// 最新得点(平均算出用)
			newScoreAvgList.add(
				new Double(cominc.divideToDouble(
					trim(matNewestScore), trim(fullScore))));
			// 最高得点(平均算出用)
			highScoreAvgList.add(
				new Double(cominc.divideToDouble(
					trim(matHighScore), trim(fullScore))));
			// 完了者数(平均算出用)
			userCompleteConditionAvgList.add(
				new Double(cominc.divideToDouble(
					trim(userCompleteCondition), trim(totalUserCount))));
			// 合格者数(平均算出用)
			userPassAvgList.add(
				new Double(cominc.divideToDouble(
					trim(userPass), trim(totalUserCount))));
			
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * カーソルの位置に現在あるレコードがLoLogテーブルレコードがない状態であるかないを判定する
	 * 
	 * @return true LoLogレコードがある場合
	 * @exception XmsException
	 */
	public boolean isLoLog() throws XmsException {
		try {
			String val = (String) dateStartList.get(getCursorPos());
			if (val == null || val.equals("")) {
				return false;
			}
			return true;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 値がnullでなければ(文字列両端から空文字列を削除)trimする
	 * nullの場合はnullを返却
	 * @return 前後の空白が削除されたこの文字列
	 * @exception XmsException
	 */
	private String trim(String val) throws XmsException {
		try {
			if (val != null) {
				return val.trim();
			} else {
				return val;
			}

		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * グループＩＤ
	 * 
	 */
	public String getGroupId() {
		return (String) groupIdList.get(getCursorPos());

	}
	/**
	 * 最新得点パーセント
	 * 
	 */
	public String getNewScorePercent() {
		return (String) newScorePercentList.get(getCursorPos());
	}

	/**
	 * 最高得点パーセント
	 * 
	 */
	public String getHighScorePercent() {
		return (String) highScorePercentList.get(getCursorPos());
	}

	/**
	 * アサイン
	 * 
	 */
	public String getAssain() {
		return (String) assainList.get(getCursorPos());
	}

	/**
	 * 完了LOパーセント
	 * 
	 */
	public String getMatCompletePercent() {
		return (String) matCompletePercentList.get(getCursorPos());
	}

	/**
	 * 合格LOパーセント
	 * 
	 */
	public String getMatPassPercent() {
		// 合格LOパーセント 												
		return (String) matPassPercentList.get(getCursorPos());
	}

	/**
	 * 完了者数パーセント
	 * 
	 */
	public String getUserCompleteConditionPercent() {
		// 完了者数パーセント 													
		return (String) userCompleteConditionPercentList.get(getCursorPos());

	}

	/**
	 * 合格者数パーセント
	 * 
	 */
	public String getUserPassPercent() {
		return (String) userPassPercentList.get(getCursorPos());
	}

	/**
	 * 総LO数
	 * 
	 */
	public String getTotalLoCount() {
		return (String) totalLoCountList.get(getCursorPos());
	}
	/**
	 * 総人数
	 * 
	 */
	public String gettotalUserCount() {
		return (String) totalUserCountList.get(getCursorPos());
	}

	/**
	 * 総得点の取得
	 *
	 * @return 総得点
	 */
	public String getfullScore() {
		return (String) fullScoreList.get(getCursorPos());
	}

	/**
	 * 外部ＩＤの取得
	 * 
	 * @return 外部ＩＤ
	 * 
	 */
	public String getforeinId() {
		return (String) foreinIdList.get(getCursorPos());
	}

	/** 
	 * 所属グループの取得
	 * @return 所属グループ
	 * 
	 */
	public String getAffiliationGroup() {
		return (String) affiliationGroupList.get(getCursorPos());
	}
	/** 
	 * 所属外部グループID
	 * @return 所属外部グループID
	 * 
	 */
	public String getGroupForeinId() {
		return (String) groupForeinIdList.get(getCursorPos());
	}

	/**
	 * 完了の取得.
	 * @return String
	 */
	public String getCompleteCondition() {
		return (String) completeConditionList.get(getCursorPos());
	}

	/**
	 * 最終アクセス日時の取得.
	 * @return String
	 */
	public String getDateLast() {
		return (String) dateLastList.get(getCursorPos());
	}

	/**
	 * 学習開始日の取得.
	 * @return String
	 */
	public String getDateStart() {
		//	public Date getDateStart() {
		return (String) dateStartList.get(getCursorPos());
	}


	/**
	 * IDの取得(LOID,GROUPID,USERIDなど).
	 * @return String
	 */
	public String getId() {
		return (String) idList.get(getCursorPos());
	}

	/**
	 * 名称の取得(LO,GROUP,USERなど).
	 * @return String
	 */
	public String getName() {
		return (String) nameList.get(getCursorPos());
	}

	/**
	 * 完了LO数の取得.
	 * @return String
	 */
	public String getMatComplete() {
		return (String) matCompleteList.get(getCursorPos());
	}

	/**
	 * 最高得点の取得.
	 * @return String
	 */
	public String getMatHighScore() {
		return (String) matHighScoreList.get(getCursorPos());
	}

	/**
	 * 最新得点の取得.
	 * @return String
	 */
	public String getMatNewestScore() {
		return (String) matNewestScoreList.get(getCursorPos());
	}

	/**
	 * 合格LO数の取得.
	 * @return String
	 */
	public String getMatPass() {
		return (String) matPassList.get(getCursorPos());
	}

	/**
	 * 合格の取得.
	 * @return String
	 */
	public String getPassCondition() {
		return (String) passConditionList.get(getCursorPos());
	}

	/**
	 * 総アクセスカウントの取得.
	 * @return String
	 */
	public String getTotalAccess() {
		return (String) totalAccessList.get(getCursorPos());
	}

	/**
	 * 累積滞在材時間の取得.
	 * @return String
	 */
	public String getTotalLearnTime() throws XmsException {
		try {

			LoLogCommon_inc cominc = new LoLogCommon_inc();

			String value = (String) totalLearnTimeList.get(getCursorPos());
			if (value == null || value.equals("")) {
				return null;
			}
			long time = cominc.parseLong(value);

			return cominc.milliToMinute(time, 1);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 完了者数の取得.
	 * @return String
	 */
	public String getUserCompleteCondition() {
		return (String) userCompleteConditionList.get(getCursorPos());
	}

	/**
	 * 合格者数の取得.
	 * @return String
	 */
	public String getUserPass() {
		return (String) userPassList.get(getCursorPos());
	}

	/**
	 * アサインの設定
	 * 
	 * @param index プロパティであるAssainList(Listオブジェクトの何番目)に設定するか
	 * @param val    設定する文字列
	 * 
	 */
	public void setAssain(int index ,String val){
		this.assainList.set(index,val);
	}

	//----------------- 合計------------------------------------------------//
	/**
	 * 総アクセス回数の合計.
	 * @return String
	 */
	public String getSumTotalAccess() throws XmsException {
		try {
			if (recodeCount() == 0) {
				return null;
			}
			int count = sumTotal(totalAccessList);
			return String.valueOf(count);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 累積滞在時間の合計.
	 * @return String
	 */
	public String getSumTotalLearnTime() throws XmsException {
		
		LoLogCommon_inc cominc = new LoLogCommon_inc();

		try {
			if (recodeCount() == 0) {
				return null;
			}

			if (totalLearnTimeList == null) {
				return null;
			}

			int count = 0;

			for (int i = 0; i < totalLearnTimeList.size(); i++) {
				String val = (String) totalLearnTimeList.get(i);
				long subCount = 0;
				if (val != null && !val.equals("")) {
					try {
						subCount = cominc.parseLong(val);
					} catch (Exception e) {
						subCount = 0;
					}
				}
				count += subCount;
			}

			return cominc.milliToMinute(count, 1);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}
	/**
	 * 	完了LO数の合計 .
	 * @return 完了LO数の合計
	 */
	public String getSumComplete() throws XmsException {
		try {
			if (recodeCount() == 0) {
				return null;
			}

			int count = sumTotal(matCompleteList);
			return String.valueOf(count);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 合格LO数の合計.
	 * @return String
	 */
	public String getSumMatPass() throws XmsException {
		try {
			if (recodeCount() == 0) {
				return null;
			}

			int count = sumTotal(matPassList);
			return String.valueOf(count);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 完了者数の合計.
	 * @return List
	 */
	public String getSumCompleteCondition() throws XmsException {
		try {
			if (recodeCount() == 0) {
				return null;
			}

			int count = sumTotal(userCompleteConditionList);
			return String.valueOf(count);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 合格者数の合計.
	 * @return String
	 */
	public String getSumUserPass() throws XmsException {
		try {
			if (recodeCount() == 0) {
				return null;
			}

			int count = sumTotal(userCompleteConditionList);
			return String.valueOf(count);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 最新得点リストの合計
	 * 
	 */
	public String getSumMatNewestScore() throws XmsException {
		try {
			if (recodeCount() == 0) {
				return null;
			}

			int count = sumTotal(matNewestScoreList);
			return String.valueOf(count);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 最高得点リストの合計
	 * 
	 */
	public String getSumMatHighScore() throws XmsException {
		try {
			if (recodeCount() == 0) {
				return null;
			}

			int count = sumTotal(matHighScoreList);
			return String.valueOf(count);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 完了リストの合計
	 */
	public String getSumCompleteConditionList() throws XmsException {
		try {
			if (recodeCount() == 0) {
				return null;
			}

			int pass = 0; //完了した人数
			for (int i = 0; i < completeConditionList.size(); i++) {
				String val = (String) completeConditionList.get(i);
				//ログなし
				if (val == null) {
					continue;
				} else {
					//ログ有り総人数のカウント
					//完了した分だけカウント
					if (val.equals(LoLogConstant.DEF_COMPLETE_PASS_RES_o)) {
						pass += 1;
					}

				}

			}
			return String.valueOf(pass);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 合格リストの合計
	 * 
	 */
	public String getSumPassConditionList() throws XmsException {
		try {
			if (recodeCount() == 0) {
				return null;
			}

			int pass = 0; //合格した人数

			for (int i = 0; i < passConditionList.size(); i++) {
				String val = (String) passConditionList.get(i);
				//ログなし
				if (val == null) {
					continue;
				} else {
					//合格した分だけカウント
					if (val.equals(LoLogConstant.DEF_PASS_PASS_RES_o)) {
						pass += 1;
					}
				}

			}

			return String.valueOf(pass);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 合計を求めます 
	 * 
	 * listの中に数値に変換できない文字列がある場合は0で計算します
	 * 引数のリストがnullの場合は0を返却します
	 * @return listの要素の数値の合計
	 * @exception XmsException
	 */
	public int sumTotal(List list) throws XmsException {
		try {
			if (list == null) {
				return 0;
			}
			int count = 0;

			for (int i = 0; i < list.size(); i++) {
				String val = (String) list.get(i);
				int subCount = 0;
				if (val != null && !val.equals("")) {
					try {
						subCount = Integer.parseInt(val.trim());
					} catch (Exception e) {
						subCount = 0;
					}
				}
				count += subCount;
			}
			return count;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}
	/**
	 * 合計を求めます 
	 * 
	 * listの中に数値に変換できない文字列がある場合は0で計算します
	 * 引数のリストがnullの場合は0を返却します
	 * @return listの要素の数値の合計
	 * @exception XmsException
	 */
	public double sumDoubleTotal(List list) throws XmsException {

		double count = 0d;

		try {
			if (list == null) {
				return 0d;
			}

			for (int i = 0; i < list.size(); i++) {
				Double val = (Double) list.get(i);

				double subCount = val.doubleValue();

				count += subCount;
			}
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
		return count;

	}
	//-------------------平均 ----------------------------------------------------//
	/**
	 * 最新得点リストの平均
	 * 
	 */
	public String getAvgMatNewestScore() throws XmsException {

		return this.avgCalculation(newScoreAvgList);
	}

	/**
	 * 最高得点リストの平均
	 * 
	 */
	public String getAvgMatHighScore() throws XmsException {

		return this.avgCalculation(highScoreAvgList);
	}

	/**
	 * 	完了LO数の平均 .
	 * @return String
	 */
	public String getAvgComplete() throws XmsException {

		return this.avgCalculation(matCompleteAvgList);
	}

	/**
	 * 合格LO数の平均.
	 * @return String
	 */
	public String getAvgMatPass() throws XmsException {

		return this.avgCalculation(matPassAvgList);
	}

	/**
	 * 完了者数の平均.
	 * @return List
	 */
	public String getAvgCompleteCondition() throws XmsException {

		return this.avgCalculation(userCompleteConditionAvgList);
	}

	/**
	 * 合格者数の平均.
	 * @return String
	 */
	public String getAvgUserPass() throws XmsException {

		return this.avgCalculation(userPassAvgList);
	}

	/**
	 * 総アクセス回数の平均.
	 * @return String
	 */
	public String getAvgTotalAccess() throws XmsException {
		try {
			if (recodeCount() == 0) {
				return null;
			}

			int count = sumTotal(totalAccessList);
			return average(count, this.size(), 0, "");
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 累積滞在時間の平均 .
	 * @return String
	 */
	public String getAvgTotalLearnTime() throws XmsException {

		LoLogCommon_inc cominc = new LoLogCommon_inc();

		try {
			if (recodeCount() == 0) {
				return null;
			}

			if (totalLearnTimeList == null) {
				return null;
			}

			int count = 0;

			for (int i = 0; i < totalLearnTimeList.size(); i++) {
				String val = (String) totalLearnTimeList.get(i);
				long subCount = 0;

				if (val != null && !val.equals("")) {
					try {
						subCount = cominc.parseLong(val);

					} catch (Exception e) {
						subCount = 0;
					}
				}
				count += subCount;
			}

			long time = count / size();

			return cominc.milliToMinute(time, 1);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 完了リストの平均
	 */
	public String getAvgCompleteConditionList() throws XmsException {
		try {
			if (recodeCount() == 0) {
				return null;
			}

			return getPercent(
				String.valueOf(getSumCompleteConditionList()),
				String.valueOf(this.size()))
				+ LoLogConstant.STR_PERCENT_o;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 合格リストの平均
	 * 
	 */
	public String getAvgPassConditionList() throws XmsException {
		try {
			if (recodeCount() == 0) {
				return null;
			}

			return getPercent(
				String.valueOf(getSumPassConditionList()),
				String.valueOf(this.size()))
				+ LoLogConstant.STR_PERCENT_o;
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * リストのデータを合計後、平均を求める
	 * 
	 * 
	 */
	private String avgCalculation(List itemList)
		throws XmsException {

		String result = null;

		try {
			if (recodeCount() == 0) {
				return null;
			}

			double count = sumDoubleTotal(itemList);
			// 合格者数を表示レコード数で割り、
			// 小数点第一位を四捨五入したStringを返却する。
			result = getPercent(
				Double.toString(count), Integer.toString(this.size()))
					+ LoLogConstant.STR_PERCENT_o;


		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
		return result;

	}
	/**
	 * 平均を求める
	 * 
	 * 
	 */
	private String average(
		double dblNum,
		int intNum,
		int intDecimal,
		String strAdd)
		throws XmsException {
		try {

			return new LoLogCommon_inc().divideToString(dblNum, intNum, intDecimal, strAdd);

		} catch (Exception e) {
			throw new XmsSystemException(e);
		}

	}

	/**
	 * 分子を分母で割パーセントで返す
	 * 
	 * 
	 * @param strNumerator 分子
	 * @param strDenominator　分母
	 */
	private String getPercent(String strNumerator, String strDenominator)
		throws XmsException {
		try {
			String val = null;

			try {
				val = new LoLogCommon_inc().getPercent(strNumerator, strDenominator);
			} catch (Exception e) {
			}
			return val;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

}
