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

//
// 学習状況(共通[ユーザ一覧/LO一覧])アクションクラス
// 
//
//	変更履歴
//	2004.01.08 新規作成		ishizaki 
//

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

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.LoRelation.LoRelationClient;
import jp.co.ntt.lms.xms.framework.Constant;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsRequest;
import jp.co.ntt.lms.xms.framework.XmsResponse;
import jp.co.ntt.lms.xms.framework.XmsScreenBean;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.XmsWarningException;
import jp.co.ntt.lms.xms.framework.base.AbstractRmiAction;
import jp.co.ntt.lms.xms.framework.base.ActionResultBean;
import jp.co.ntt.lms.xms.framework.base.Logic;

/**
 * 学習状況(共通[ユーザ一覧/LO一覧])アクションクラス
 * 
 * 
 * @author ishizaki
 * 
 */
public abstract class LoLogLearnStatusAction extends AbstractRmiAction {
	/** 検索条件パラメータ **/
	private  LoLogLearnStatusParam refer;
	/** グループIDリスト */
	private List groupIdList;	
	/** アクション */
	protected int action;
	/** LoId */
	private String loId;
	/** ヘッダ情報 */
	protected LoLogSearchResult head;
	/** ユーザID */
	private String userId;
	/** LOIDリスト*/
	private List loIdList;
	/** 総LO数 */
	private int loCount;
	/** 総ユーザ数 */
	private int userCount;
	
	//----------------------- ログ共通インターフェース ---------------------------------------------
	/** 
	 * 実行するLogicクラスを返却する .
	 * <br>
	 *
	 * <pre>
	 * 引数 actionの種類を下記に記す
	 *
	 *		グループ/教材		LoLogConstant.LOG_SELECT_G_M
	 *		グループ/コンテナ	LoLogConstant.LOG_SELECT_G_C
	 *		ユーザ/教材			LoLogConstant.LOG_SELECT_U_M
	 *		ユーザ/コンテナ		LoLogConstant.LOG_SELECT_U_C
	 *
	 * 
	 * </pre>
	 * 
	 * @param action 		選択の仕方(グループ/コンテナ,グループ/教材,ユーザ/コンテナ,ユーザ/教材)
	 * @param loId 			LOID	
	 * @param loIdList 		LOIDのリスト(コンテナ指定の場合そのLOIDのリスト
	 * @param userId 		ユーザＩＤ
	 * @param geroupIdList	グループIDのリスト(グループが選ばれた場合グループの下のリスト)
	 * @param userCount 	グループの下にいるユーザの人数
	 * @param loCount  	 	コンテナの下にあるLOの数
	 *
	 * @return Logic実行クラス
	 * @exception XmsException
	 *
	 */
	protected Logic[] getLogics(XmsRequest xmsRequest) throws XmsException {
		//LoLogLearnStatusLogicインスタンスの生成	
		Logic[] logic = getLearnStatusLogic(refer,action,loId,loIdList,userId,groupIdList,userCount,loCount);
		return logic;
	}

	
	/**
	 * 初期処理.<br>
	 * 
	 * HttpServlerRequestから必要なパラメータを取得する
	 *
	 * 
	 * @param xmsRequest XmsRequest
	 * @param xmsResponse XmsResponse
	 * @exception XmsException 
	 * @see jp.co.ntt.lms.xms.framework.XmsScreenAction#initProcessRequest(XmsRequest, XmsResponse)
	 */
	protected void initProcessRequest(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse)
		throws XmsException {
		try{
			//HttpRequestの取得
			HttpServletRequest request = xmsRequest.getRequest();
			//検索条件のセット
			setReferenceConditions(request);
						
			//ユーザID/グループIDを取得
			this.userId = request.getParameter("userId");						//ユーザ/グループID				
			String subordinateflg = request.getParameter("subordinate_flg");	//配下直下フラグ
			this.loId = request.getParameter("LoID");							//loId
	
	
			//配下、直下フラグ、グループまたはユーザＩＤ、ＬＯＩＤを引数にヘッダ情報オブジェクト(LoLogResultCommon)を取得
			LoLogResultCommon serchCommon = new LoLogResultCommon(subordinateflg,this.userId,loId);
			this.head = serchCommon.getLoLogSearchResult();
	
	
			///////////////////////////////////////////////////////////////
			//選択されたタイプを設定する
			///////////////////////////////////////////////////////////////	
			//グループ/コンテナである
			if(head.isGroup() && head.isContainer()){
				this.action = LoLogConstant.LOG_SELECT_G_C;

			//グループ/教材である
			}else if(head.isGroup() && !head.isContainer()){
				this.action = LoLogConstant.LOG_SELECT_G_M;

			//ユーザ/コンテナである
			}else if(!head.isGroup() && head.isContainer()){
				this.action = LoLogConstant.LOG_SELECT_U_C;
			
			//ユーザ/教材である	
			}else{
				this.action = LoLogConstant.LOG_SELECT_U_M;

			}		
	
			///////////////////////////////////////////////////////////////
			// グループリストの取得,ユーザカウントの設定
			///////////////////////////////////////////////////////////////
			//グループから来た場合はグループリストを取得
			if(head.isGroup()){
				this.groupIdList = getGroupIds(this.userId, subordinateflg);
				//ユーザ総件数の設定
				this.userCount =  Integer.parseInt(head.getUserCount());
	
			//ユーザから来た場合は空
			}else{
				this.groupIdList = new ArrayList();
				this.userCount = 1;
			}
			///////////////////////////////////////////////////////////////
			// コンテナの下のLOIDリストの取得,LOカウントの設定
			///////////////////////////////////////////////////////////////
			//コンテナか教材か
			if(head.isContainer()){
				//loIdリスト取得
				this.loIdList = getLoIds(loId);
				//LO総件数を設定
				this.loCount = loIdList.size();

			}else{
				this.loIdList = new ArrayList();
				this.loCount = 1;
			}
	
			//リクエストへヘッダ情報を格納
			request.setAttribute("HEADER",head);
	
		} catch(XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
			
	}


	/**
	 * CSV出力用文字列を取得する.
	 * 
	 * @param bean XmsScreenBean
	 * @return CSVファイル格納用文字列
	 * @exception XmsException
	 * 
	 */
	public String convertToCSV(XmsScreenBean bean) throws XmsException {
		// 戻り値作成用バッファ
		StringBuffer buffer = new StringBuffer();
		ActionResultBean resultBean = (ActionResultBean)bean;;

		try {
			// グループログ集計結果専用クラス
			LoLogLearnStatusResult log = (LoLogLearnStatusResult)resultBean.getFirstLogResult();
	
			//レポート部分作成（全画面共通)
			buffer.append(getHeaderCsv());
			//検索条件部分作成
			buffer.append(getReferenceConditionsCsv(this.refer));	
			//改行
			buffer.append(Constant.LINE_SEPARATOR);

			//ログヘッダ部分作成
			buffer.append(getLogHeaderCsv());			
			//ログの部分作成
			buffer.append(getLogCsv(log));
	

		return buffer.toString();

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


	//---- 学習状況共通インターフェース -------------------------------------------------
	/** 
	 * 実行するLogicクラスを返却する 
	 * 
	 * @param param 学習状況検索条件の設定されたオブジェクト
	 * @param IdList グループＩＤリスト
	 * @param realLoId realLoId
	 * @param userId userId　
	 *
	 * @return Logic実行クラス
	 * @exception XmsException
	 *
	 */
	public abstract Logic[] getLearnStatusLogic(
		LoLogLearnStatusParam param,
		int action,
		String realLoId,
		List loIdList,
		String userId,
		List groupIdList,
		int userCount,
		int loCount) throws XmsException;

	/**
	 * 画面名称タイトルの取得
	 * 
	 * @return 画面タイトル
	 * @exception XmsException
	 * 
	 */
	public abstract String getTitle()throws XmsException ;

	/**
	 * 検索条件用CSV用文字列の取得.
	 * 
	 * 検索条件設定画面で設定された検索条件をCSV文字列にします<br>
	 * 
	 * 
	 * @param param 学習状況検索条件の設定されたオブジェクトLoLogLearnStatusParam
	 * @return 検索条件の設定されたCSV用文字列
	 * @exceptiion XmsException
	 * 
	 */
	public abstract String getReferenceConditionsCsv(LoLogLearnStatusParam refer) throws XmsException;

	/**
	 * ログ取得結果ヘッダCSV文字列の取得
	 * 
	 * @return ログ取得結果ヘッダCSV文字列
	 * @exception XmsException
	 * 
	 * 
	 */
	public abstract String getLogHeaderCsv() throws XmsException;

	/**
	 * ログ取得結果CSV文字列の取得
	 * 
	 * @return ログ取得結果CSV文字列
	 * @exception XmsException
	 * 
	 * 
	 */
	public abstract String getLogCsv(LoLogLearnStatusResult log) throws XmsException;


	//---------- 以下その他-------------------------------------------------------



	/**
	 * GruoupID一覧を取得する.
	 * 
	 * @param paerntID paerntID(ルートになってるグループID)
	 * @param flg 配下、直下フラグ(onの場合は配下のグループ、offの場合は直下のグループ)を取得
	 * @return グループＩＤリスト
	 * @exception XmsException
	 * 
	 */
	private List getGroupIds(String paerntID,String flg)throws XmsException {
		ArrayList list = new ArrayList();
		try {
			GroupAndPeopleClient cliant = new GroupAndPeopleClient();
			//直下の場合
			if(flg.equals("off")){				
				list.add(paerntID);
				return list;

			//配下の場合
			}else{
				return cliant.getGroupIdList(paerntID,list);				
			}
		} catch(XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
			

	}

	/***
	 * LOリストを取得する.
	 * 
	 * @param loId LOID(コンテナのLOID)
	 * @Exception XmsException
	 * @return コンテナの直下にあるLOIDリスト
	 * 
	 */
	private List getLoIds(String loId)throws XmsException{
		ArrayList list = new ArrayList();
		try {
			LoRelationClient client = new LoRelationClient();
			client.setParentID(loId);

			if (client.select()) {
				while (client.next()) {
					list.add(client.getChildID());

				}
			} else {

				//検索がうまくいかなかった
				if (client.isErr()) {
					//エラーの場合
					throw new XmsSystemException(client.getMessage());
				} else {
					//警告の場合
					throw new XmsWarningException(client.getMessage());
				}
			}

			client = null;
		} catch (XmsException e) {
			throw e;

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

		}		
		return list;
	}
	
	/**
	 * ＣＳＶレポート部分文字列の取得.
	 * (例)<br>
	 * #レポート:学習状況（ユーザ一覧） ＬＯ:8191byte(8191byte) グループ/ユーザ:テスト３(テスト３): 集計対象:直下のユーザ1人 
	 * 
	 * 
	 * 
	 * @return CSVレポート部文字列
	 * @exception XmsException
	 * 
	 */
	private String getHeaderCsv()throws XmsException {
		try{
			StringBuffer buffer = new StringBuffer();
	
			// =================================================================
			// レポート部
			// #レポート
			buffer.append(LoLogConstant.STR_REPORT_o + ":");
			// タイトルの取得
			buffer.append(getTitle());
			buffer.append(",");
			// ＬＯ
			buffer.append(LoLogConstant.STR_LO_o + ":");
			// LO名
			buffer.append(head.getLoName());
			// LO外部ID
			buffer.append("(" + head.getLoForeignId() + ")");
			buffer.append(",");
			// グループ:
			if(head.isGroup()){
				buffer.append(LoLogConstant.STR_GROUP_o + ":");
			// ユーザ:
			} else {
				buffer.append(LoLogConstant.STR_USER_HEADER + ":");
			}
			// グループ名/ユーザ名
			buffer.append(head.getGroupOrUserName());
			// グループ外部ID
			buffer.append("(" + head.getForeignId() + ")");
			buffer.append(",");
	
			//集計対象者数(グループの場合しかださない)
			if(head.isGroup()){
				buffer.append(LoLogConstant.STR_CANDIDATE_TOTAL_COUNT_o + ":");
				buffer.append(head.getCondidateTotalMassage());
				buffer.append(head.getUserCount());
				buffer.append(LoLogConstant.STR_USER_UNIT_o);
				buffer.append(",");
			}
		
			return buffer.toString();
		} catch(XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}		
	}
	
	/**
	 * 検索条件のセットHttpServletRequestをLoLogLearnStatusParamオブジェクトに格納する
	 * 
	 * @param req HttpServletRequest
	 * @exception XmsException	 
	 */
	private void setReferenceConditions(HttpServletRequest req)throws XmsException {
		try{
			LoLogLearnStatusParam vo = new LoLogLearnStatusParam();	
	
			//学習開始日(date_start)
			vo.setDateStartCondition(req.getParameter("date_start_condition"));
			vo.setDateStart(req.getParameter("date_start"));
			//最終アクセス日時(date_last)
			vo.setDateLastCondition(req.getParameter("date_last_condition"));	//select以上/以下
			vo.setDateLast(req.getParameter("date_last"));
	
			//総アクセス回数(total_access)
			vo.setTotalAccessCondition(req.getParameter("total_access_condition"));
			vo.setTotalAccess(req.getParameter("total_access"));
	
			//累積滞在時間(total_learn_time)					
			vo.setTotalLearnTimeCondition(req.getParameter("total_learn_time_condition"));
			vo.setTotalLearnTime(req.getParameter("total_learn_time"));
			//完了LO数(mat_complete)
			vo.setMatCompleteCondition(req.getParameter("mat_complete_condition"));
			vo.setMatComplete(req.getParameter("mat_complete"));
			//合格ＬＯ数(mat_pass)					
			vo.setMatPassCondition(req.getParameter("mat_pass_condition"));
			vo.setMatPass(req.getParameter("mat_pass"));	
			//最新得点(mat_newest_score)					
			vo.setMatNewestScoreCondition(req.getParameter("mat_newest_score_condition"));
			vo.setMatNewestScore(req.getParameter("mat_newest_score"));
			//最高得点(mat_high_score)					
			vo.setMatHighScoreCondition(req.getParameter("mat_high_score_condition"));
			vo.setMatHighScore(req.getParameter("mat_high_score"));
			//完了者数(user_complete_condition)							
			vo.setUserCompleteCondition(req.getParameter("user_complete_condition"));
			vo.setUserComplete(req.getParameter("user_complete"));
			//合格者数(user_pass)							
			vo.setUserPassCondition(req.getParameter("user_pass_condition"));
			vo.setUserPass(req.getParameter("user_pass"));
			//完了(complete_condition)
			vo.setCompleteCondition(req.getParameter("complete_condition"));
			//合格(pass_condition)					
			vo.setPassCondition(req.getParameter("pass_condition"));
			//menuから来た
			vo.setMenu(req.getParameter("menu"));
			//所属グループID
			vo.setBelonggroupid(req.getParameter("belonggroupid"));
			//配下直下フラグ
			vo.setSubordinateFlg(req.getParameter("subordinate_flg"));
			//検索条件をプロパティにセット
			this.refer = vo;		
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}		

	}

	/**
	 * 日本語文字列以上、以下を返す.
	 * 
	 * @param val 以上、以下をつける文字列
	 * @param flg 0の場合は以上、1の場合は以下
	 * @return val + 以上またはval+以下の文字列 valまたはflgがnull,空文字列の場合は
	 * 			空文字列を返却
	 * @exception XmsException
	 * 
	 */
	public String getAboveString(String val, String flg)throws XmsException {
		try{
			if(val == null || val.equals("")  || flg ==null || flg.equals("")){
				return LoLogConstant.STR_EMPTY_FIELD;
			}
			if(flg.equals("0")){
				//以上
				return val + LoLogConstant.STR_OVER_o;
			}else{
				//以下
				return val + LoLogConstant.STR_UNDER_o;
			}
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}		
		
	}

	/**
	 * 日本語文字列以降、以前を返す
	 * 
	 * 
	 * @param val 以降、以前をつける文字列
	 * @param flg 0の場合は以上、1の場合は以下
	 * @return val + 以降またはval+以前の文字列 valまたはflgがnull,空文字列の場合は
	 * 			空文字列を返却
	 * @exception XmsException
	 * 
	 */
	public String getHenceforth(String val, String flg)throws XmsException {
		try{
			if(val == null || val.equals("")  || flg ==null || flg.equals("")){
				return LoLogConstant.STR_EMPTY_FIELD;
			}
			if(flg.equals("0")){
				//以降
				return val + LoLogConstant.STR_AFTER_o;
			}else{
				//以前
				return val + LoLogConstant.STR_BEFORE_o;
			}
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}		
				
	}
	


	/**
	 * 完了、未完了日本語文字列を返す.
	 *
	 *
	 * @param flg 完了をあらわすフラグ
	 * @return flgであればLoLogConstant.DEF_COMPLETE_PASS_oであれば完了を返すそれ以外は未完了
	 *
	 *
	 */
	public String getCompletion(String flg)throws XmsException {
		try{
			if(flg ==null || flg.equals("")){
				return LoLogConstant.STR_EMPTY_FIELD;
			}
			if(flg.equals(LoLogConstant.DEF_COMPLETE_PASS_RES_o)){
				//完了
				return LoLogConstant.STR_COMPLETE_o;
			}else{
				//未完了
				return LoLogConstant.STR_INCOMPLETE_o;
			}
				
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}		

	}

	/**
	 * 合格、未合格日本語文字列を返す.
	 * 
	 * @param flg 完了をあらわすフラグ
	 * @return flgであればLoLogConstant.DEF_COMPLETE_PASS_oであれば完了を返すそれ以外は未完了
	 */
	public String getPass(String flg)throws XmsException {
		try{
			if(flg ==null || flg.equals("")){
				return LoLogConstant.STR_EMPTY_FIELD;
			}
			if(flg.equals(LoLogConstant.DEF_COMPLETE_PASS_RES_o)){
				//合格
				return LoLogConstant.STR_PASS_o;
			}else{
				//未合格
				return LoLogConstant.STR_FAIL_o;
			}
				
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}		
	}
		
	/**
	 * nullの場合は空文字列を返す.
	 * 
	 * @param val チェックする文字列
	 * @return nullの場合は空文字そうでなければvalを返す
	 * 
	 */
	public String getEmptyStr(String val){
		if(val == null){
			return "";
		}else{
			return val;
		}
	}

	/**
	 * nullまたは空文字列の時に---を返す.
	 * 
	 * @param val チェックする文字列
	 * @return nullまたは空文字列の場合は---そうでなければvalを返す
	 * 
	 */
	public String getLineStr(String val){
		if(val == null || val.equals("")){
			return LoLogConstant.STR_EMPTY_FIELD;
		}else{
			return val;
		}
	}

}
