/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//CSVダウンロード画面(個別ログ)
//
//		変更履歴
//			2005.01.31  新規作成  OGA
//
//	機能
//
//この画面は、CSVダウンロード用の画面です。
//
/////////////////////////////////////////////////////////////////
/*
 * 作成日: 2005/02/14
 *
 * TODO この生成されたファイルのテンプレートを変更するには次へジャンプ:
 * ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
 */
package jp.co.ntt.lms.xmf.lo.scorm.individuallog;

import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.ArrayList;
import jp.co.ntt.lms.lo.LoTopClient;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xms.logsumup.scorm.*;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jp.co.ntt.lms.xmf.lo.scorm.individuallog.inc.*;
import jp.co.ntt.lms.xmf.xmo.Com.*;


/**
 * @author Administrator
 * 
 * TODO この生成された型コメントのテンプレートを変更するには次へジャンプ: ウィンドウ - 設定 - Java - コード・スタイル -
 * コード・テンプレート
 */
public class CsvOut extends HttpServlet {

	private IndividualLogCommon_inc IndividualLogCommon_inc = new IndividualLogCommon_inc();
	private ComFunction ComFunction = new ComFunction();

	/*
	 * (非 Javadoc)
	 * 
	 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
	 *      javax.servlet.http.HttpServletResponse)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO 自動生成されたメソッド・スタブ
		this.execute(request, response);
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest,
	 *      javax.servlet.http.HttpServletResponse)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO 自動生成されたメソッド・スタブ
		this.execute(request, response);
	}

private void execute(HttpServletRequest request, HttpServletResponse response) {
	
	
		//-------------------------------------------------------------------------
		//パラメータ取得
		//-------------------------------------------------------------------------
		// LoID
		String strLoID = request.getParameter("LoID");
		// ユーザID
		String strUserId = request.getParameter("userId");
		// LOタイプ
		String strLoType = request.getParameter("LoType");
		// UID
		String strUID = request.getParameter("UID");
		// CsvId
		String strCsvId = request.getParameter("CsvId");

		if ( strLoID == null) {
			strLoID = "";
		}
		if ( strUserId == null) {
			strUserId = "";
		}
		if ( strLoType == null) {
			strLoType = "";
		}
		if ( strUID == null) {
			strUID = "";
		}
		if ( strCsvId == null) {
			strCsvId = "";
		}

		// LoTopClientの生成
		Environment objEnv;
		try {
			objEnv = new Environment();
		} catch( Exception e ) {
			e.printStackTrace();
			try {
				response.sendRedirect( ComFunction.getParamErrURL( IndividualLogCommon_inc.MSG_FILE_ACCESS_ERR, null, true ) );
			} catch (IOException e1) {
				// TODO 自動生成された catch ブロック
				e1.printStackTrace();
			}
			return;
		}

		String strServerName;
		try {
			strServerName = objEnv.getLoServerName();
		} catch( Exception e ) {
			e.printStackTrace();
			try {
				response.sendRedirect(ComFunction.getParamErrURL(IndividualLogCommon_inc.MSG_ENV_ERR, null, true));
			} catch (IOException e1) {
				// TODO 自動生成された catch ブロック
				e1.printStackTrace();
			}
			return;
		}
		LoTopClient objLoTop;
		try {
			objLoTop = new LoTopClient(strServerName, strLoType);
		} catch (Exception e1) {
			// TODO 自動生成された catch ブロック
			e1.printStackTrace();
			return;
		}
		//クエリーIDの選択
		String strQueryID;
		// クエリーのIN句($USER_LIST$)で用いるカラム名
		String inGroupColumn;
		// クエリーのIN句($UID_LIST$)で用いるカラム名
		String inUIDColumn;

		if ( strCsvId.equals("1") || strCsvId.equals("2") ){
			strQueryID = IndividualLogCommon_inc.LOG6001;
			inGroupColumn = IndividualLogCommon_inc.GROUPANDPEOPLE_PARENTID;
			inUIDColumn = IndividualLogCommon_inc.SCORMATTEMPT_ACTIVITYID;
		}
		else {
			strQueryID = IndividualLogCommon_inc.LOG6002;
			inGroupColumn = IndividualLogCommon_inc.GROUPANDPEOPLE_PARENTID;
			inUIDColumn = IndividualLogCommon_inc.SCORMINTERACTION_ACTIVITYID;
		}

		ScormDocument scormDocument = ( ScormDocument )request.getSession().getAttribute( strLoID );
		ScormItemList itemList = new ScormItemList( scormDocument, strUID );

		// UIDリストの取得
		String[] strUIDList = getCsvAuidList( itemList );
		// ユーザIDリストの取得
		String[] strUserIDList;
		try {
			strUserIDList = getCsvUserList( strCsvId, strUserId );
		} catch (Exception e2) {
			// TODO 自動生成された catch ブロック
			e2.printStackTrace();
			return;
		}
		// RealLoIDからの検索からLOIDからの検索に修正
		objLoTop.addLoLogCondition( strLoID );
		if ( !objLoTop.getIndividualLogCSV( strQueryID, strUserIDList, strUIDList, inGroupColumn, inUIDColumn ) ) {
			String errorMsg = objLoTop.getMessageData().getMessage();
			try {
				response.sendRedirect( ComFunction.getParamErrURL( errorMsg, null, true ) );
			} catch (IOException e3) {
				// TODO 自動生成された catch ブロック
				e3.printStackTrace();
			}
			return;
		}
		String[][] logResult = objLoTop.getIndividualLogCSVResult();
		if ( logResult.length == 0 ) {
			try {
				alertEnd( IndividualLogCommon_inc.MSG_LOG_NOT_FOUND, response );
			} catch (IOException e3) {
				// TODO 自動生成された catch ブロック
				e3.printStackTrace();
			} catch (Exception e3) {
				// TODO 自動生成された catch ブロック
				e3.printStackTrace();
			}
			return;
		}
		String strAUsystemID = null;
		StringBuffer strBufOutData = new StringBuffer();

		strBufOutData.append( "\"" ).append( IndividualLogCommon_inc.STR_CSV_USERID_o ).append( "\"" );
		strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_USER_FORIGNID_o ).append( "\"" );
		strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_COURSEID_o ).append( "\"" );
		strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_LO_FORIGNID_o ).append( "\"" );
		strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_START_DATE_o ).append( "\"" );
		strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_START_TIME_o ).append( "\"" );
		strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_STUDYSESSIONCOUNT_o ).append( "\"" );
		strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_ACTIVITYID_o ).append( "\"" );
		strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_ATTEMPTCOUNT_o ).append( "\"" );
		strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_LEARNSESSIONCOUNT_o ).append( "\"" );
		strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_SESSIONID_o ).append( "\"" );

		if ( strQueryID.equals( IndividualLogCommon_inc.LOG6001 ) ) {
			//	Attempt
			// タイトル行
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_COMPLETION_STATUS_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_SCALEDSCORE_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_RAWSCORE_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_MAXSCORE_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_MINSCORE_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_ATTEMPT_SESSION_TIME_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_SUCCESS_STATUS_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_LOCATION_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_EXIT_o ).append( "\"" );
			strBufOutData.append( "\n" );
			// データ行
			for( int i = 0; i < logResult.length; i++ ) {
				strBufOutData.append( "\"" ).append( logResult[i][0] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][1] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][2] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][3] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][4] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][5] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][6] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][7] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][8] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][9] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][10] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][11] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][12] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][13] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][14] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][15] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][16] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][17] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][18] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][19] ).append( "\"" );
				strBufOutData.append( "\n" );
			}
		}
		else {
			//	Interaction
			// タイトル行
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_INTERACTIONCOUNT_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_INTERACTIONID_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_INTERACTIONTYPE_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_OBJECTIVEID_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_TIMESTAMP_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_CORRECTRESPONSE1_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_CORRECTRESPONSE2_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_CORRECTRESPONSE3_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_CORRECTRESPONSE4_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_CORRECTRESPONSE5_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_WEIGHTING_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_LEARNERRESPONSE_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_LEARNER_RESULT_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_LATENCY_o ).append( "\"" );
			strBufOutData.append( ",\"" ).append( IndividualLogCommon_inc.STR_CSV_DESCRIPTION_o ).append( "\"" );
			strBufOutData.append( "\n" );
			// データ行
			for( int i = 0; i < logResult.length; i++ ) {
				strBufOutData.append( "\"" ).append( logResult[i][0] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][1] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][2] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][3] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][4] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][5] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][6] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][7] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][8] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][9] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][10] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][11] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][12] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][13] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][14] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][15] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][16] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][17] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][18] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][19] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][20] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][21] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][22] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][23] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][24] ).append( "\"" );
				strBufOutData.append( ",\"" ).append( logResult[i][25] ).append( "\"" );
				strBufOutData.append( "\n" );
			}
		}

		PrintWriter printWriter = null;
		BufferedOutputStream bos = null;
		OutputStreamWriter osw = null;

		try {
			// CSVデータ取得
			String strOutData = strBufOutData.toString();
			// 初期化
			String lsCsvEncode = objEnv.getCsvEncode();
			bos = new BufferedOutputStream( response.getOutputStream() );
			osw = new OutputStreamWriter( bos,lsCsvEncode );
			printWriter = new PrintWriter( osw );
			// ログインID取得
			// ログインID
			String strLoginID = ( String ) request.getSession().getAttribute( "loginId" );
			// 日本語対応
			strLoginID = java.net.URLEncoder.encode(strLoginID, "UTF-8");

			if( strLoginID == null ) {
				strLoginID = "";
			}
			// 出力処理
			String filename = makeFileName( strLoginID );
			response.setContentType( "text/csv; charset=Shift-JIS" );
			response.setHeader( "Content-Disposition", "attachment; filename=" + filename );
			printWriter.print( strOutData );
			printWriter.flush();

		} catch ( Exception ex ) {
			//例外処理
			ex.printStackTrace();
			return;
		} finally {
			if( printWriter != null ) {
				printWriter.close();
			}
		}
	}



	/**
	 * パラメータのメッセージをalert出力し処理を終了します。
	 */
	private void alertEnd ( String strMsg , HttpServletResponse response )
		throws Exception {
		response.setContentType("text/html; charset=Windows-31J");
		PrintWriter jwOut = response.getWriter(); 
		jwOut.write( "<script language=JavaScript>" );
		jwOut.write( "alert(\"" + strMsg + "\");" );
		jwOut.write( "</script>" );

		return;
	}

	/**
	 * CSVファイルのパスを作成します。
	 * 
	 * @param strFileData
	 *            CSV形式に編集されたデータ
	 * @return boolean CSVファイル作成の結果を返します。
	 * @exception IOException
	 *                CSVファイル作成に失敗した場合
	 */
	private String makeFileName( String strLoginID ) {

		StringBuffer sbFileName = null;

		sbFileName = new StringBuffer();

		//日付作成
		Date currentDate = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat( "yyyyMMddhhmmss" );
		String strDate = formatter.format(currentDate);

		//出力ファイル名を追加します
		sbFileName.append( strLoginID );
		sbFileName.append( strDate );
		sbFileName.append( ".csv" );

		return( sbFileName.toString() );
	}

	/**
	 * AUIDリストを取得します。
	 * 
	 * @param itemList
	 *            教材構造リスト
	 * @return strAuIDList AUIDリスト
	 */
	private String[] getCsvAuidList( ScormItemList itemList ) {

		List auList = new ArrayList();

		for( int i = 0 ; i < itemList.getMaxRow() ; i++ ) {
			// ＣＳＶ出力用に最初のノード名を取得する

			// ASSET又はSCOのタイプのみ条件文に追加
			if( itemList.getAuType(i) == ScormNodeConst.ASSET_NODE ||
				itemList.getAuType(i) == ScormNodeConst.SCO_NODE) {

				// ＳＱＬ発行する為の集計対象ActivityIDをリストへ設定
				String auID = itemList.getAuID(i);
				auList.add( auID );
			}
		}
		return ( String[] )auList.toArray(new String[auList.size()]);
	}

	/**
	 * ユーザの一覧を取得します。
	 * 
	 * @param strMode
	 *            グループ直下選択時 = 1 or 3 グループ配下選択時 = 2 or 4
	 * @param strGroupID
	 *            グループID
	 * @return strUserList ユーザリスト
	 * @exception Exception
	 */
	private String[] getCsvUserList( String strMode, String strGroupID )
		throws Exception {

		String[] strUserList = null;

		if ( strMode == null || strGroupID == null ) {
			return strUserList;
		}

		Vector vecUserList = new Vector();

		GroupAndPeopleClient objGap = new GroupAndPeopleClient();

		//指定モードがグループ直下のユーザのみの場合
		if ( strMode.equals( "1" ) == true || strMode.equals( "3" ) == true ) {
			vecUserList.add( strGroupID );
		}
		//指定モードがグループ以下のユーザ全ての場合
		else{
			// GroupId配下のグループIDを取得
			vecUserList = ( Vector )objGap.getGroupIdList( strGroupID, vecUserList );
		}

		strUserList = new String[ vecUserList.size() ];
		vecUserList.copyInto( strUserList );
		return strUserList;
	}
		
}