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

//
//	（SmartForce個別ログ取得サーブレット）クラス
//			変更履歴
//				2003.01.08	新規作成	五木田　泰史
//
package jp.co.ntt.lms.lo.SmartForce;

import jp.co.ntt.lms.lo.*;
import jp.co.ntt.lms.xmo.*;
import jp.co.ntt.lms.xmo.GroupAndPeople.*;
import jp.co.ntt.lms.xmo.LoRelation.*;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.Lo.LoClient;

import java.util.Hashtable;
import java.util.Vector;
import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import javax.servlet.RequestDispatcher;

public class SmartForceLogServlet extends HttpServlet
{
	/**
	 * コンストラクタ
	 */
	public SmartForceLogServlet() {}
	
	/**
	 * ＧＥＴ要求を処理するメソッド<BR>
	 * @param HttpServletRequest	ＨＴＴＰリクエスト
	 * @param HttpServletResponse	ＨＴＴＰレスポンス
	 * @return void
	 * @exception javax.servlet.ServletException	サーブレット例外
	 * @exception java.io.IOException				入出力例外
	 */
	public void doGet(
		HttpServletRequest request,HttpServletResponse response)
			throws ServletException, IOException
	{
		// リクエスト処理を呼び出します
		this.doRequest(request, response);
	}
	
	/**
	 * ＰＯＳＴ要求を処理するメソッド<BR>
	 * @param HttpServletRequest	ＨＴＴＰリクエスト
	 * @param HttpServletResponse	ＨＴＴＰレスポンス
	 * @return void
	 * @exception javax.servlet.ServletException	サーブレット例外
	 * @exception java.io.IOException				入出力例外
	 */
	public void doPost(
		HttpServletRequest request,HttpServletResponse response)
			throws ServletException, IOException
	{
		// リクエスト処理を呼び出します
		this.doRequest(request, response);
	}
	
	/**
	 * 要求を処理するメソッド<BR>
	 * @param HttpServletRequest	ＨＴＴＰリクエスト
	 * @param HttpServletResponse	ＨＴＴＰレスポンス
	 * @return void
	 */
	private void doRequest(
		HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException
	{
		/////////////////////////////////////////////////////////////
		// 各パラメータ取得処理
		/////////////////////////////////////////////////////////////
		String strUserID  = (String)request.getParameter( "userId" );
		String strLoID    = (String)request.getParameter( "LoID" );
		String strLoType  = (String)request.getParameter( "LoType" );
		String strLogType = (String)request.getParameter( "LogType" );
		
		// パラメータチェック
		String strErrorMessage = "";
		if(strLoID == null)
		{
			// エラーページを出力
			strErrorMessage = "LOIDのパラメータ不正 : " + strLoID;
			goErrorPage(request, response, strErrorMessage);
			return;
		}
		if(strUserID == null)
		{
			// エラーページを出力
			strErrorMessage  = "UserIDのパラメータ不正 : " + strUserID;
			goErrorPage(request, response, strErrorMessage);
			return;
		}
		if(strLoType == null)
		{
			// エラーページを出力
			strErrorMessage = "LoTypeのパラメータ不正 : " + strLoType;
			goErrorPage(request, response, strErrorMessage);
			return;
		}
		if(strLogType == null)
		{
			// エラーページを出力
			strErrorMessage = "LogTypeのパラメータ不正 : " + strLogType;
			goErrorPage(request, response, strErrorMessage);
			return;
		}
		
		try
		{
			Environment objEnv = new Environment();
			String strLoServerName = objEnv.getLoServerName();
			LoTopClient objLoTop = new LoTopClient(strLoServerName, strLoType);
			// 結果データ初期化
			CourseUnitLogRecord[] objCurList = null;
			// リスト作成処理
			String[] strUserIDList = expandGroup(strUserID);
			String[] strLoIDList   = expandLo(strLoID);
			// LOID→RealLOIDへ変換
			String[] strRealLOIDList = expandRealLOID(strLoIDList);
			if(objLoTop.getIndividualLog(strUserIDList, strRealLOIDList))
			{
				objCurList = (CourseUnitLogRecord[])objLoTop.getIndividualLog();
				goLogPage(request, response, objCurList, strLogType);
				return;
			}
			else
			{
				MessageData objMd = objLoTop.getMessageData();
				strErrorMessage = objMd.getMessage();
				goErrorPage(request, response, strErrorMessage);
				return;
			}
		}
		catch(Exception e)
		{
			strErrorMessage = e.getMessage();
			goErrorPage(request, response, strErrorMessage);
			return;
		}
	}
	
	/**
	 * エラーページ画面へフォワードするメソッド<BR>
	 * @param HttpServletRequest	ＨＴＴＰリクエスト
	 * @param HttpServletResponse	ＨＴＴＰレスポンス
	 * @param HttpServletResponse	エラーメッセージ
	 * @return void
	 */
	private void goErrorPage(
		HttpServletRequest request, HttpServletResponse response,
		String strErrorMessage)
			throws ServletException, IOException
	{
		request.setAttribute("ErrorMessage", strErrorMessage);
		ServletContext objSc    = getServletContext();

		RequestDispatcher objRd = objSc.getRequestDispatcher("/view/lo/SmartForce/SmartForceError.vm");

		objRd.forward(request, response);
	}
	
	/**
	 * ログ表示画面へフォワードするメソッド<BR>
	 * @param HttpServletRequest ＨＴＴＰリクエスト
	 * @param HttpServletResponse ＨＴＴＰレスポンス
	 * @param CourseUnitLogRecord[] 個別ログリスト
	 * @param String ログ種別
	 * @return void
	 */
	private void goLogPage(
		HttpServletRequest request, HttpServletResponse response,
		CourseUnitLogRecord[] objRecordList, String strLogType)
			throws ServletException, IOException
	{
		// 表示URL指定
		String strURL = "";
		if(strLogType.equals("1"))
		{
			// 個人別一覧
//MOD start NTTR-an SMTF-vm未対応のためJSPへ戻す
//			strURL = "/view/lo/SmartForce/SmartForceMatRep_PersonalList.vm";
			strURL = "/jsp/lo/SmartForce/SmartForceMatRep_PersonalList.jsp";

		}
		else
		{
			// 受講者一覧
//			strURL = "/view/lo/SmartForce/SmartForceMatRep_LearnerList.vm";
			strURL = "/jsp/lo/SmartForce/SmartForceMatRep_LearnerList.jsp";
//			MOD end
		}
		request.setAttribute("RECORD_LIST", objRecordList);
		ServletContext objSc    = getServletContext();
		RequestDispatcher objRd = objSc.getRequestDispatcher(strURL);
		objRd.forward(request, response);
	}
	
	/**
	 * ユーザIDリスト取得処理
	 *
	 * @param String ユーザIDかグループID
	 * @return String[] ユーザIDリスト
	 */
	private String[] expandGroup(String strUserID)
		throws Exception
	{
		String[] strRet  = null;
		// １件目がユーザIDならば即戻す
		if(strUserID.indexOf("GR") == -1)
		{
			strRet    = new String[1];
			strRet[0] = strUserID;
			return strRet;
		}
		// グループならば再帰呼出し処理
		Vector vecList = new Vector();
		getUserIDList(strUserID, vecList);
		
		// VectorをString[]に変換
		strRet = new String[vecList.size()];
		for(int i = 0; i < vecList.size(); i++)
		{
			strRet[i] = (String)vecList.get(i);
		}
		return strRet;
	}
	
	/**
	 * LoIDリスト取得処理
	 *
	 * @param String LoID
	 * @return String[] LoIDリスト
	 */
	private String[] expandLo(String strLoID)
		throws Exception
	{
		String[] strRet = null;
		Vector vecList = new Vector();
		getLoIDList(strLoID, vecList);
		strRet = new String[vecList.size()];
		for(int i = 0; i < vecList.size(); i++)
		{
			strRet[i] = (String)vecList.get(i);
		}
		return strRet;
	}

	/**
	 * LoIDリストからRealLOIDリストに変換処理
	 *
	 * @param String LoID
	 * @return String[] LoIDリスト
	 */
	private String[] expandRealLOID(String[] strLoID)
		throws Exception
	{
		Vector vecRet = new Vector();
		String strRealLOID = "";
		for(int i = 0; i < strLoID.length; i++)
		{
			// LOIDをRealLOIDに変換する
			LoClient objLoClient = new LoClient();
			if(objLoClient.getRealLOIDFromLOID(strLoID[i])){
				strRealLOID = objLoClient.getRealLOIDResult();
				// 重複するRealLOIDはリストから除く
				if(vecRet.indexOf(strRealLOID) < 0){
					vecRet.add(strRealLOID);
				}else{
				}
			}
			else{
				throw new LOException("リストの変換に失敗しました。");
			}
		}
		String[] strRet = new String[ vecRet.size() ];
		// 配列コピー
		vecRet.copyInto( strRet );
		
		return strRet;
	}
	
	/**
	 * ユーザIDリスト取得再帰処理
	 *
	 * @param String ユーザID
	 * @param Vector ユーザIDリスト
	 * @return void
	 */
	private void getUserIDList(String strUserID, Vector vecList)
		throws Exception
	{
		GroupAndPeopleClient objGapc = new GroupAndPeopleClient();
		objGapc.setWhereParentID(strUserID);
		if(!objGapc.select())
		{
			DebugLog.write(this.getClass(), "グループ・人取得失敗", DebugLog.ROW);
		}
		while(objGapc.next())
		{
			strUserID = objGapc.getChildID();
			if(objGapc.isGroup())
			{
				getUserIDList(strUserID, vecList);
			}
			else
			{
				vecList.add(strUserID);
			}
		}
	}
	
	/**
	 * LoIDリスト取得再帰処理
	 *
	 * @param String LoID
	 * @param Vector LoIDリスト
	 * @return void
	 */
	private void getLoIDList(String strLoID, Vector vecList)
		throws Exception
	{
		LoRelationClient objLrc = new LoRelationClient();
		objLrc.setWhereParentID(strLoID);
		if(!objLrc.select())
		{
			DebugLog.write(this.getClass(), "Lo関連取得失敗", DebugLog.ROW);;
		}
		while(objLrc.next())
		{
			String strLoChildID = objLrc.getChildID();
			getLoIDList(strLoChildID, vecList);
		}

		vecList.add(strLoID);
	}
}
