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

//
// 個別ログ進捗状況一覧CSV出力用・ロジッククラス。<br>
//
//  変更履歴
//  2004.01.08 新規作成  S.Takahashi
//
package jp.co.ntt.lms.xms.logsumup;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Hashtable;

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.Common.RDF.RDFNode;
import jp.co.ntt.lms.xmo.util.ChangeEncode;
import jp.co.ntt.lms.lo.WBT.WbtLoPropertyDef;
import jp.co.ntt.lms.lo.WBT.IndividualLog.IndividualLogRDFNode;
import jp.co.ntt.lms.lo.WBT.IndividualLog.IndividualLogStoreData;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.DataAccess;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsInnerException;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.base.Logic;
import jp.co.ntt.lms.xms.framework.base.LogicResult;
import jp.co.ntt.lms.xmo.util.DebugLog;

/**
 * ログ集計グループ比較集計ロジック・クラス。<br>
 *
 * @author S.Takahashi
 */
public class IndividualLogGroupProgressLogic implements Logic {

    /**
     * リスエストされたグループID
     */
    private String GroupID;
    /**
     * リスエストされたLOID
     */
    private String LOID;
    /**
     * リスエストされたLoType
     */
    private String LOType;
    /**
     * リクエストされた配下フラグ
     */
    private String Reflex;
    /**
     * セッションより取り出された教材構造
     */
    private RDFNode CurrentRDFNode;

    /**
     * 集計結果格納クラス
     */
    IndividualLogGroupProgressResult result = new IndividualLogGroupProgressResult();

    /**
     * コンストラクタ。<br>
     */
    public IndividualLogGroupProgressLogic() {
    }

    /**
     * コンストラクタ。<br>
     *
     * @param GroupID 画面で選択したグループID
     * @param LOID 画面で選択したLOID
     * @param LOType LOタイプ（WBT教材かオフライン教材か判定に使用）
     * @param Reflex 配下・直下フラグ
     * @param CurrentRDFNode 画面で選択したノードオブジェクト
     */
    public IndividualLogGroupProgressLogic(
        String GroupID,
        String LOID,
        String LOType,
        String Reflex,
        RDFNode CurrentRDFNode)
        throws XmsException {

        // パラメータチェック
        if (LOID.equals("")
            || GroupID.equals("")
            || LOType.equals("")
            || CurrentRDFNode == null){
            throw new XmsInnerException("parameter is null.");
        }

        this.LOID = LOID;
        this.GroupID = GroupID;
        this.LOType = LOType;
        this.Reflex = Reflex;
        this.CurrentRDFNode = CurrentRDFNode;
    }

    /**
     * 集計ロジック・メソッド。<br>
     * 検索画面より選択されたグループ数回分、<br>、
     * 配下のログデータを取得し集計します。<br>
     *
     * @param dataAccess DataAccessオブジェクト
     * @return LogicResult 集計結果
     * @exception XmsException
     * @see IndividualLogGroupProgressResult
     */
    public LogicResult doLogic(DataAccess dataAccess) throws XmsException {

        // パラメータチェック
        if (dataAccess == null) {
            throw new XmsInnerException("parameter is null.");
        }

        ResultSet rs = null;

        try {
            // ログ共通用Commonクラスの生成
            LoLogCommon_inc cominc = new LoLogCommon_inc();

            // アサイン情報取得
            AssignmentsClient asclient = new AssignmentsClient();
            String strGroupFlag = null;
            if ( Reflex.equals("") ) {
                // グループ直下
                strGroupFlag = "off";
            }
            else {
                // グループ配下全てのユーザー
                strGroupFlag = "on";
            }
            // アサイン情報生成
            asclient.getAssignInfo(null,GroupID,LOID,0,strGroupFlag);

            // CSVヘッダ情報生成
            // LO情報取得
            LoClient loclient = new LoClient();
            loclient.setWhereLoID(LOID);
            loclient.select();
            loclient.next();
			// リアルLOIDを取得。
			String strRealLoID = new IndividualLogStoreData().getRealLoID(LOID);
            // ＬＯタイトル設定
            result.setLOName(loclient.getLoTytle());
			// 外部ＬＯＩＤ設定
			result.setForeignLOID(loclient.getForeignID());
            // セクション情報取得
            result.setSectionName(CurrentRDFNode.getTitle());
            // グループ情報取得
            String[] strHeadGroupDetails = new String[2];
            strHeadGroupDetails = cominc.getGroupDetails(GroupID);
            // グループ名設定
            result.setGroupName(strHeadGroupDetails[0]);
            // グループ外部ID設定
            result.setGroupForeignId(strHeadGroupDetails[1]);

            // 個別リスト情報生成
            try {              	
                // 検索条件取得
                // 配下グループ一覧or直下グループを取得
                List groupIdList = new ArrayList();
                List groupSqlList = new ArrayList();
                if ( Reflex.equals("") ) {
                    groupIdList.add(GroupID);
                } else {
                    GroupAndPeopleClient GapClient = new GroupAndPeopleClient();
                    // GroupId配下のグループIDを取得
                    groupIdList = GapClient.getGroupIdList(GroupID, groupIdList);
                }
                // グループSQL条件文発行回数を取得
                groupSqlList = commaParseForSQL( groupIdList );


                // AUリスト生成
                List AUList = new ArrayList();
                List AUSqlList = new ArrayList();
                IndividualLogRDFNode mobjRDFNode = new IndividualLogRDFNode(CurrentRDFNode);

                for(int i = 0 ; i < mobjRDFNode.getMaxRow() ; i++){
                    AUList.add(mobjRDFNode.getAUID(i));
                }
                // AUSQL条件文発行回数を取得
                AUSqlList = commaParseForSQL( AUList );

                // SQL文生成
                StringBuffer sbSQL = new StringBuffer();
                sbSQL.append("SELECT  GROUP_ID, ");
                sbSQL.append("        USER_ID, ");
                sbSQL.append("        USER_NAME, ");
                sbSQL.append("        FOREIGNID, ");
                sbSQL.append("        MIN(STUDY_START_DATE) AS STUDY_START_DATE, ");
                sbSQL.append("        MAX(STUDY_LAST_DATE) AS STUDY_LAST_DATE, ");
                sbSQL.append("        SUM(ACCESSCOUNT) AS ACCESSCOUNT, ");
                sbSQL.append("        SUM(RESIDANCETIME) AS RESIDANCETIME, ");
                sbSQL.append("        SUM(NEWESTSCORE) AS NEWESTSCORE, ");
                sbSQL.append("        SUM(MAXSCORE) AS MAXSCORE, ");
                sbSQL.append("        SUM(COMPCOUNT) AS COMPCOUNT, ");
                sbSQL.append("        SUM(PASSCOUNT) AS PASSCOUNT, ");
                sbSQL.append("        SUM(AUCOUNT) AS AUCOUNT, ");
                sbSQL.append("        SUM(CASE WHEN NEWESTSCORE IS NULL AND MAXSCORE IS NULL THEN 0 ELSE 1 END) AS AUSCORECOUNT ");
                sbSQL.append("FROM    ( ");
                sbSQL.append("        SELECT  U.GROUP_ID, ");
                sbSQL.append("                U.USER_ID, ");
                sbSQL.append("                U.FOREIGNID, ");
                sbSQL.append("                U.USER_NAME, ");
                sbSQL.append("                L.LOID, ");
                sbSQL.append("                L.AUID, ");
                sbSQL.append("                L.STUDY_START_DATE, ");
                sbSQL.append("                L.STUDY_LAST_DATE, ");
                sbSQL.append("                L.ACCESSCOUNT, ");
                sbSQL.append("                L.RESIDANCETIME, ");
                sbSQL.append("                L.NEWESTSCORE, ");
                sbSQL.append("                L.MAXSCORE, ");
                sbSQL.append("                L.COMPCOUNT, ");
                sbSQL.append("                L.PASSCOUNT, ");
                sbSQL.append("                L.AUCOUNT ");
                sbSQL.append("        FROM    ( ");
                sbSQL.append("                SELECT  GAP.PARENTID AS GROUP_ID, ");
                sbSQL.append("                        P.USER_ID, ");
                sbSQL.append("                        P.FOREIGNID, ");
                sbSQL.append("                        P.USER_NAME ");
                sbSQL.append("                FROM    PEOPLE P  ");
                sbSQL.append("                INNER JOIN ");
                sbSQL.append("                        GROUPANDPEOPLE GAP ");
                sbSQL.append("                ON      P.USER_ID = GAP.CHILDID ");
                sbSQL.append("                WHERE ");
                for (int i=0;i<groupSqlList.size() ;i++) {
                    if ( i == 0 ) {
                        sbSQL.append("                GAP.PARENTID IN (" + groupSqlList.get(i) + ") ");
                    }
                    else {
                        sbSQL.append("                OR GAP.PARENTID IN (" + groupSqlList.get(i) + ") ");
                    }
                }
                sbSQL.append("                ) U ");
                sbSQL.append("        LEFT OUTER JOIN ");
                sbSQL.append("                ( ");
                sbSQL.append("                SELECT  GRP.USERID, ");
                sbSQL.append("                        GRP.LOID, ");
                sbSQL.append("                        GRP.AUID, ");
                sbSQL.append("                        GRP.STUDY_START_DATE, ");

		//XMS.iniファイルロードクラスのインスタンス          		
            	Environment objEnv=new Environment();

		// PostgreSQL  
		if ( objEnv.getDBType().equals(Environment.DB_POSTGRE) ){ 
			sbSQL.append("                        TEMP.STUDY_LAST_DATE, ");
	        }
	        // Oracle OR SQLserver  
	        else if (objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
        		sbSQL.append("                        NEW.STUDY_LAST_DATE, ");
        	}

                sbSQL.append("                        GRP.ACCESSCOUNT, ");
                sbSQL.append("                        GRP.RESIDANCETIME, ");

		// PostgreSQL  
		if ( objEnv.getDBType().equals(Environment.DB_POSTGRE) ){ 
			sbSQL.append("                        TEMP.NEWESTSCORE, ");
	        }
	        // Oracle OR SQLserver 
	        else if (objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){          
                	sbSQL.append("                        NEW.NEWESTSCORE, ");
        	}

                sbSQL.append("                        GRP.MAXSCORE, ");
                sbSQL.append("                        GRP.COMPCOUNT, ");
                sbSQL.append("                        GRP.PASSCOUNT, ");
                sbSQL.append("                        1 AS AUCOUNT ");
                sbSQL.append("                FROM ");
                sbSQL.append("                        ( ");
                sbSQL.append("                        SELECT  LLS.USERID, ");
                sbSQL.append("                                LLS.LOID, ");
                sbSQL.append("                                AC.\"UID\" AS AUID, ");
                sbSQL.append("                                MIN(LLS.STUDY_START_DATE) AS STUDY_START_DATE, ");
                sbSQL.append("                                COUNT(LLS.SESSIONID) AS ACCESSCOUNT, ");
                
                if ( objEnv.getDBType().equals(Environment.DB_SQLSERVER) ) {
                    // SQL_SERVER
                    sbSQL.append("                            SUM(CASE SUBSTRING(AC.TIME,3,1) ");
                    sbSQL.append("                                 WHEN ':' THEN CONVERT(FLOAT,SUBSTRING(AC.TIME,1,2))*60*60*1000+CONVERT(FLOAT,SUBSTRING(TIME,4,2))*60*1000+CONVERT(FLOAT,SUBSTRING(TIME,7,2))*1000 ");
                    sbSQL.append("                                 ELSE CONVERT(FLOAT,SUBSTRING(AC.TIME,1,4))*60*60*1000+CONVERT(FLOAT,SUBSTRING(TIME,6,2))*60*1000+CONVERT(FLOAT,RTRIM(SUBSTRING(TIME,9,5)))*1000 END) AS RESIDANCETIME, ");
                    sbSQL.append("                            MAX(CASE LOWER(SUBSTRING(AC.LESSON_STATUS,1,1)) WHEN 'C' THEN 1 WHEN 'P' THEN 1 ELSE 0 END) AS COMPCOUNT, ");
                    sbSQL.append("                            MAX(CASE LOWER(SUBSTRING(AC.LESSON_STATUS,1,1)) WHEN 'P' THEN 1 ELSE 0 END) AS PASSCOUNT, ");
                }else if ( objEnv.getDBType().equals(Environment.DB_ORACLE) ){
                    // ORACLE
                    sbSQL.append("                            SUM(CASE SUBSTR(AC.TIME,3,1) ");
                    sbSQL.append("                                 WHEN ':' THEN TO_NUMBER(SUBSTR(AC.TIME,1,2))*60*60*1000+TO_NUMBER(SUBSTR(TIME,4,2))*60*1000+TO_NUMBER(SUBSTR(TIME,7,2))*1000 ");
                    sbSQL.append("                                 ELSE TO_NUMBER(SUBSTR(AC.TIME,1,4))*60*60*1000+TO_NUMBER(SUBSTR(TIME,6,2))*60*1000+TO_NUMBER(TRIM(SUBSTR(TIME,9,5)))*1000 END) AS RESIDANCETIME, ");
                    sbSQL.append("                            MAX(CASE LOWER(SUBSTR(AC.LESSON_STATUS,1,1)) WHEN 'C' THEN 1 WHEN 'P' THEN 1 WHEN 'c' THEN 1 WHEN 'p' THEN 1 ELSE 0 END) AS COMPCOUNT, ");
                 	sbSQL.append("                            MAX(CASE LOWER(SUBSTR(AC.LESSON_STATUS,1,1)) WHEN 'P' THEN 1 WHEN 'p' THEN 1 ELSE 0 END) AS PASSCOUNT, ");
                }else if ( objEnv.getDBType().equals(Environment.DB_POSTGRE) ){
                    // PostgreSQL
                    sbSQL.append("                            SUM(CASE SUBSTR(AC.TIME,3,1) ");
                    sbSQL.append("                                 WHEN ':' THEN TO_NUMBER(SUBSTR(AC.TIME,1,2),'9999999999999999')*60*60*1000+TO_NUMBER(SUBSTR(TIME,4,2),'9999999999999999')*60*1000+TO_NUMBER(SUBSTR(TIME,7,2),'9999999999999999')*1000  ");
                    sbSQL.append("                                 ELSE TO_NUMBER(SUBSTR(AC.TIME,1,4),'9999999999999999')*60*60*1000+TO_NUMBER(SUBSTR(TIME,6,2),'9999999999999999')*60*1000+TO_NUMBER(RTRIM(SUBSTR(TIME,9,5)),'9999999999999999')*1000  END) AS RESIDANCETIME, ");
                    sbSQL.append("                            MAX(CASE LOWER(SUBSTR(AC.LESSON_STATUS,1,1)) WHEN 'C' THEN 1 WHEN 'P' THEN 1 WHEN 'c' THEN 1 WHEN 'p' THEN 1 ELSE 0 END) AS COMPCOUNT, ");
                    sbSQL.append("                            MAX(CASE LOWER(SUBSTR(AC.LESSON_STATUS,1,1)) WHEN 'P' THEN 1 WHEN 'p' THEN 1 ELSE 0 END) AS PASSCOUNT, ");
                }

                sbSQL.append("                                MAX(AC.MAXSCORE) AS MAXSCORE ");
                sbSQL.append("                        FROM    LOLOGSESSION LLS ");
                sbSQL.append("                        INNER JOIN ");
                // WBT or オフラインテーブル情報設定
                if ( LOType.equals(WbtLoPropertyDef.LO_TYPE_WBT ) ) {
                    sbSQL.append("                            AICCCORE AC ");
                }
                else {
                    sbSQL.append("                            OL_AICCCORE AC ");
                }
                sbSQL.append("                        ON      LLS.USERID = AC.USERID ");
                sbSQL.append("                        AND     LLS.LOID = AC.LOID ");
                sbSQL.append("                        AND     LLS.SESSIONID = AC.SESSIONID ");
                sbSQL.append("                        GROUP BY LLS.USERID,LLS.LOID,AC.\"UID\" ");
                sbSQL.append("                        ) GRP ");
                sbSQL.append("                INNER JOIN  ");
                sbSQL.append("                        ( ");
                sbSQL.append("                        SELECT ");
                sbSQL.append("                            LLS.USERID, ");
                sbSQL.append("                            LLS.LOID, ");
                sbSQL.append("                            LLS.AUID, ");
                sbSQL.append("                            SLD.STUDY_LAST_DATE AS STUDY_LAST_DATE, ");
                sbSQL.append("                            LLS.RAWSCORE AS NEWESTSCORE ");
                sbSQL.append("                        FROM    ( ");
                sbSQL.append("                                SELECT  LLS.USERID, ");
                sbSQL.append("                                        LLS.LOID, ");
                sbSQL.append("                                        AC.\"UID\" AS AUID, ");
                sbSQL.append("                                        AC.RAWSCORE, ");
                sbSQL.append("                                        LLS.STUDY_START_DATE ");
                sbSQL.append("                                FROM    LOLOGSESSION LLS ");
                sbSQL.append("                                INNER JOIN ");
                // WBTorオフラインテーブル情報設定
                if ( LOType.equals(WbtLoPropertyDef.LO_TYPE_WBT ) ) {
                    sbSQL.append("                                    AICCCORE AC ");
                }
                else {
                    sbSQL.append("                                    OL_AICCCORE AC ");
                }
                sbSQL.append("                                ON      LLS.USERID = AC.USERID ");
                sbSQL.append("                                AND     LLS.LOID = AC.LOID ");
                sbSQL.append("                                AND LLS.SESSIONID = AC.SESSIONID ");
                sbSQL.append("                                ) LLS ");
                sbSQL.append("                        INNER JOIN ");
                sbSQL.append("                                ( ");
                sbSQL.append("                                SELECT ");
                sbSQL.append("                                    LLS.USERID, ");
                sbSQL.append("                                    LLS.LOID, ");
                sbSQL.append("                                    AC.\"UID\" AS AUID, ");
                sbSQL.append("                                    MAX( LLS.STUDY_START_DATE ) AS STUDY_LAST_DATE ");
                sbSQL.append("                                FROM ");
                sbSQL.append("                                    LOLOGSESSION LLS ");
                sbSQL.append("                                INNER JOIN ");
                // WBTorオフラインテーブル情報設定
                if ( LOType.equals(WbtLoPropertyDef.LO_TYPE_WBT ) ) {
                    sbSQL.append("                                AICCCORE AC ");
                }
                else {
                    sbSQL.append("                                OL_AICCCORE AC ");
                }
                sbSQL.append("                                ON LLS.USERID = AC.USERID AND LLS.LOID = AC.LOID AND LLS.SESSIONID = AC.SESSIONID ");
                sbSQL.append("                                GROUP BY ");
                sbSQL.append("                                    LLS.USERID, ");
                sbSQL.append("                                    LLS.LOID, ");
                sbSQL.append("                                    AC.\"UID\" ");
                sbSQL.append("                                ) SLD ");
                sbSQL.append("                        ON LLS.USERID = SLD.USERID ");
                sbSQL.append("                        AND LLS.LOID = SLD.LOID ");
                sbSQL.append("                        AND LLS.AUID = SLD.AUID ");
                sbSQL.append("                        AND LLS.STUDY_START_DATE = SLD.STUDY_LAST_DATE ");
                
		// PostgreSQL  
		if ( objEnv.getDBType().equals(Environment.DB_POSTGRE) ){ 
			sbSQL.append("                        ) TEMP ");
			sbSQL.append("                ON      GRP.USERID = temp.USERID ");
			sbSQL.append("                AND     GRP.LOID = temp.LOID ");
			sbSQL.append("                AND     GRP.AUID = temp.AUID ");
		// Oracle OR SQLserver  
		} else if (objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
			sbSQL.append("                        ) NEW ");          
			sbSQL.append("                ON      GRP.USERID = NEW.USERID ");
			sbSQL.append("                AND     GRP.LOID = NEW.LOID ");
			sbSQL.append("                AND     GRP.AUID = NEW.AUID ");
		}
                // グループID条件設定
                sbSQL.append("                WHERE   GRP.LOID = ('" + StringEscapeUtils.escapeSql(strRealLoID) + "') ");
                sbSQL.append("                AND ");
                // AU条件設定ループ
                for ( int i=0;i<AUSqlList.size();i++ ) {
                    if (i != 0) {
                        sbSQL.append("    OR ");
                    }
                    sbSQL.append(" GRP.AUID IN (" + AUSqlList.get(i) + ") ");
                }
                sbSQL.append("                ) L ");
                sbSQL.append("        ON      U.USER_ID = L.USERID ");
                sbSQL.append("        ) GRP ");
                sbSQL.append("GROUP BY GROUP_ID, ");
                sbSQL.append("        USER_ID, ");
                sbSQL.append("        FOREIGNID, ");
                sbSQL.append("        USER_NAME, ");
                sbSQL.append("        LOID ");
                sbSQL.append("ORDER BY FOREIGNID ");

		DebugLog.write( this.getClass(), sbSQL.toString(), DebugLog.ROW );
                // クエリーの実行
                rs = dataAccess.executeQuery(sbSQL.toString());

				Hashtable htbGPath = new Hashtable();
				Hashtable htbGFid = new Hashtable();

                // 取得したレコード数ループ
                while (rs.next()) {
                    // ユーザ別集計結果格納データクラス生成
                    IndividualLogGroupProgressUser user = new IndividualLogGroupProgressUser();
                    // 学習者名設定
                    user.setUser(ChangeEncode.setChar(rs.getString("USER_NAME")));
                    // 学習者外部ID設定
                    user.setUserForeign(ChangeEncode.setChar(rs.getString("FOREIGNID")));
                    // 取得したグループIDからグループ情報を取得
                    String strGroupID = ChangeEncode.setChar(rs.getString("GROUP_ID"));
                    String strGroupPath = null;
                    // グループパスのハッシュを検索
                    if((String)htbGPath.get(strGroupID) != null){
                        strGroupPath = (String)htbGPath.get(strGroupID);
                    } else {
                        // グループパス設定
                        strGroupPath = cominc.getGroupNamePath(strGroupID);
						// グループパスのハッシュに格納
						if(strGroupID != null && strGroupPath != null){
							htbGPath.put( strGroupID, strGroupPath );
						}
					}
					user.setGroupPath(strGroupPath);
					
					String[] strGroupDetails = new String[2];
					// グループ外部IDのハッシュを検索
					if((String)htbGFid.get(strGroupID) != null){
						strGroupDetails[1] = (String)htbGFid.get(strGroupID);
					} else {
                        // グループ外部ID設定
                        strGroupDetails = cominc.getGroupDetails(strGroupID);
						// グループ外部IDのハッシュに格納
						if(strGroupID != null && strGroupDetails[1] != null){
							htbGFid.put( strGroupID, strGroupDetails[1] );
						}
					}
					user.setGroupForeignId(strGroupDetails[1]);
                    // 学習開始日設定
                    user.setStartDate(rs.getTimestamp("STUDY_START_DATE"));
                    // 最終アクセス日設定
                    user.setEndDate(rs.getTimestamp("STUDY_LAST_DATE"));
                    // アクセス回数設定
                    user.setAccessCount(rs.getLong("ACCESSCOUNT"));
                    // 累積滞在時間設定
                    user.setResidanceTime(rs.getLong("RESIDANCETIME"));
                    // 得点（最新）設定
                    user.setNewestScore(ChangeEncode.setChar(rs.getString("NEWESTSCORE")));
                    // 得点（最高）設定
                    user.setHighScore(ChangeEncode.setChar(rs.getString("MAXSCORE")));
                    // 完了ユニット設定
                    user.setUnitComplete(rs.getLong("COMPCOUNT"));
                    // 合格ユニット設定
                    user.setUnitPass(rs.getLong("PASSCOUNT"));
                    // AU数設定
                    user.setAUCount(rs.getLong("AUCOUNT"));
                    // 得点AU数設定
                    user.setAUScoreCount(rs.getLong("AUSCORECOUNT"));
                    // アサイン情報設定
                    if ( asclient.isAssign(ChangeEncode.setChar(rs.getString("USER_ID")),LOID)) {
                        user.setAssign("1");
                    }
                    else {
                        user.setAssign("0");
                    }
                    // 取得したレコードをセット
                    result.addLog(user);
                }
            } catch (XmsException e) {
                throw e;
            } catch (Exception e) {
                throw new XmsSystemException(e);
            } finally {
                // 終期処理
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (Exception e) {
                        throw new XmsSystemException(e);
                    }
                    rs = null;
                }
            }
        } catch (XmsException e) {
            throw e;
        } catch (Exception e) {
            throw new XmsSystemException(e);
        }
        return result;
    }

    /**
     * リスト中の文字列を'Param1','Param2',・・・型の文字列にしてリストで戻す。<br>
     * リストが1000を超える場合には複数の文字列を作成しリストにして戻す。<br>
     * @param prmList 文字列リスト
     * @return List シングルクォーテーションで囲った後カンマ区切りした文字列リスト。
     */
    private List commaParseForSQL( List prmList ) {

        // ログ共通用Commonクラスの生成
        LoLogCommon_inc cominc = new LoLogCommon_inc();
        // ループ数の取得
        int roupCount = cominc.getSqlCount( prmList );
        // 返却用リスト
        List retList = new ArrayList();
        // リストが1000以上の場合は複数回ループ
        // 最低１度はループする。
        for (int j = 0; j < roupCount; j++) {
            // リスト配下のログ集計
            // ループ開始カウント
            int intStart = j * 1000;
            // ループ終了カウント
            int intEnd = intStart + 1000;
            // ループ終了カウントよりリストサイズの方が小さい場合
            if (prmList.size() < intEnd) {
                intEnd = prmList.size() - intStart;
            }
            StringBuffer stbTempSQL = new StringBuffer();
            //  ｢,｣ 区切りの文字列にする
            for (int i = intStart; i < intEnd; i++) {
                String strTemp = (String) prmList.get(i);
                if (i == 0) {
                    stbTempSQL.append("'" + StringEscapeUtils.escapeSql(strTemp) + "'");
                } else {
                    stbTempSQL.append(",'" + StringEscapeUtils.escapeSql(strTemp) + "'");
                }
            }
            retList.add(stbTempSQL.toString());
        }
        return retList;
    }
}
