/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	PerceptionLo登録画面表示Actionクラス
//
//		変更履歴
//			2005.02.16  新規作成  氏名 石崎賢太郎
//
//	機能
//
//	PerceptionLo登録画面表示Actionクラスです。
//
/////////////////////////////////////////////////////////////////
package jp.co.ntt.lms.xmf.actions.lo.Perception;

import java.util.Vector;

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

import jp.co.ntt.lms.lo.LoTopClient;
import jp.co.ntt.lms.lo.Perception.PerceptionLoEnv;
import jp.co.ntt.lms.lo.Perception.PerceptionPropertyDef;
import jp.co.ntt.lms.lo.Perception.PerceptionResponseAssessmentData;
import jp.co.ntt.lms.xmf.common.CommonFunction;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.MessageData;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.Lo.LoMessage;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
//ADD 2005/02/13 START Katsuhiko Kagami(UNITEC) [LO購入項目追加]
import jp.co.ntt.lms.xmo.Lo.LoExtend.LoExtendTable;
//ADD 2005/02/13 END Katsuhiko Kagami(UNITEC) [LO購入項目追加] 

/**
 * PerceptionLo登録画面Actionクラスです。
 * 
 * @author Kentaro Ishizaki (UNITEC)
 * @version 1.0
 */
public class PerceptionLoInsertAction extends Action
{
//ADD 2005/02/23 START Tsuboi(UNITEC) [キーワードリスト数]
	private final int NUM_LOSEARCH_KEYWORD_COUNT = 5;
//ADD 2005/02/23 END Tsuboi(UNITEC) [キーワードリスト数] 

	/**
	 * strutsフレームワークから呼ばれるメソッドです。
	 * 
	 * @param mapping マッピングオブジェクト。
	 * @param form アクションフォームオブジェクト。
	 * @param request リクエストオブジェクト。
	 * @param response レスポンスオブジェクト。
	 * @return ActionForward アクションフォワードオブジェクト。
	 * @throws Exception
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		// アセスメントID、セッション名称、Descriptionをスラッシュで
		// 連結した文字列でやり取りを廃止し、他のパラメータを新規追加する。
		// 追加するパラメータ名称を定義する。
		final String KEY_ASSESSMENT_ID = "assessmentID";
		final String KEY_SESSION_NAME  = "sessionName";
		final String KEY_DESCRIPTION   = "Loexplanation";


		// URLパラメータの取得
		String strParentID = request.getParameter( "parentID" );
		String strLoType = request.getParameter( "LoType" );
		String strReturnURL = request.getParameter( "returnURL" );
		String strAction = request.getParameter( "action" );

		String strLogin_UserID = (String)request.getSession().getAttribute( "userId" );		// ログインユーザID
		String strMessage = null;		//サーバエラーメッセージ
		String strForeignID = "";		//外部ID初期化
		String strMessageID = null;		//メッセージID初期化
		String strForeignMessageID = null;	//外部メッセージID初期化

		//XMsS.iniファイルからユーザPrefix情報を取得する
		Environment ObjEnv = new Environment();
		String StrPrefix=(String)ObjEnv.getLoPrefix();

		// 入力項目
		String strLoTytle 		= CommonFunction.null2blank( request.getParameter( "LoTytle" ) );			// LOタイトル


		//XMS.iniファイルにユーザPrefixが設定されていない場合
		if ( StrPrefix == null ){
			strForeignID 	= CommonFunction.null2blank( request.getParameter( "ForeignID" ) );		// 外部ID
		}
		//	 アセスメントID、セッション名称、Descriptionをスラッシュで
		//	 連結した文字列でやり取りを禁止する。

		String strKeyWord 		= CommonFunction.null2blank( request.getParameter( "KeyWord" ) );			// キーワード
		String strLoExplanation = CommonFunction.null2blank( request.getParameter( "Loexplanation" ) );	// 説明
		String strVersion 		= CommonFunction.null2blank( request.getParameter( "Version" ) );			// バージョン
		String strCreateDate 	= CommonFunction.null2blank( request.getParameter( "LocreateDate" ) );		// 作成日
		String strConclusion 	= CommonFunction.null2blank( request.getParameter( "hdnConclusion" ) );	// 完結要件
		//	 教材リストはリクエストパラメータから取得しないようにする。

		//	 リストで選択した順番をパラメータでやり取りしないようにする。

		String strWinHeight	 	= CommonFunction.null2blank( request.getParameter( "txtWinHeight" ) );		// Windowサイズ(縦)
		String strWinWidth	 	= CommonFunction.null2blank( request.getParameter( "txtWinWidth" ) );		// Windowサイズ(横)
		String strPrere		 	= CommonFunction.null2blank( request.getParameter( "hdnPrere" ) );			// 前提条件
		//	 アセスメントID、セッション名称、Descriptionをスラッシュで
		//	 連結した文字列でやり取りを廃止し、別々パラメータで受け渡すようにする。
		// アセスメントID
		String strAssessmentID = CommonFunction.null2blank( request.getParameter( KEY_ASSESSMENT_ID ) );
		// セッション名称
		String strSessionName  = CommonFunction.null2blank( request.getParameter( KEY_SESSION_NAME ) );
		//	 アセスメントID、セッション名称、Descriptionをスラッシュで
		//	 連結した文字列でやり取りを廃止するため、そこから生成する配列を廃止する。

		Vector vecAssessmentList = new Vector();											// アセスメントリスト格納用

		String strAsInfoList = "";
		int intAsInfoList = 0;
		String strID = "";
		String strName = "";
		String strDescription = "";

		Vector vctID = new Vector();
		Vector vctName = new Vector();
		Vector vctDescription = new Vector();

		//	 教材リストはリクエストパラメータから取得しないようにする。

		String[] strIDTable = new String[vctID.size()];
		String[] strNameTable = new String[vctName.size()];
		String[] strDescriptionTable  = new String[vctDescription.size()];

		vctID.copyInto(strIDTable);
		vctName.copyInto(strNameTable);
		vctDescription.copyInto(strDescriptionTable);
// ADD 2005/02/23 START NaotoIto [LO購入項目追加]
		String strBuyStatus 	= CommonFunction.null2blank( request.getParameter( "BuyStatus" ) );		// 購入ステータス
// ADD 2005/02/23 END NaotoIto [LO購入項目追加]
// ADD 2005/02/23 START NaotoIto [推奨LO検索キーワード追加]
		String[] strLoSearchKeyWord = new String[NUM_LOSEARCH_KEYWORD_COUNT];
		for(int k = 0; k < NUM_LOSEARCH_KEYWORD_COUNT; k++){
			strLoSearchKeyWord[k] = CommonFunction.null2blank(request.getParameter("LoSearchKeyWord_" + k));
		}
// ADD 2005/02/23 END NaotoIto [推奨LO検索キーワード追加]
// ADD 2005/02/23 START NaotoIto [属性追加対応]
		String strLomDetail 	= CommonFunction.null2blank( request.getParameter( "LomDetail" ) );
// ADD 2005/02/23 END NaotoIto [属性追加対応]
		

		// アクションフラグが設定されていた場合は登録処理を行います
		if( strAction != null && strAction.equals( "on" ) ) {
			//	 アセスメントID、セッション名称、Descriptionをスラッシュで
			//	 連結した文字列でやり取りを廃止するため、そこから生成する配列を廃止する。

			LoClient objLo = new LoClient();
			
			// LOテーブルの設定
			objLo.setParentID( strParentID );			// 親ID
			objLo.setLoType( strLoType );				// LOタイプ
			objLo.setLoTytle( strLoTytle );				// LOタイトル
			objLo.setLoExplanation( strLoExplanation );		// LO説明

			//XMS.iniファイルにユーザPrefixが設定されていない場合
			if ( StrPrefix == null ){
				objLo.setForeignID( strForeignID );		// 外部ID
			}

			objLo.setKeyWord( strKeyWord );				// キーワード
			objLo.setDeleteFlag( "0" );					// 隠しフラグ

			// PerceptionLO個別テーブルの設定
			//	 アセスメントID、セッション名称、Descriptionをスラッシュで
			//	 連結した文字列でやり取りを廃止するため、
			//	 他のパラメータから生成された値を利用する。
			// アセスメントID
			objLo.setValue( PerceptionPropertyDef.ASSESSMENTID, strAssessmentID );
			// セッション名称
			objLo.setValue( PerceptionPropertyDef.SESSIONNAME, strSessionName );
			objLo.setValue( PerceptionPropertyDef.LOVERSION, strVersion );			// バージョン
			objLo.setValue( PerceptionPropertyDef.LOCREATEDATE, strCreateDate );	// 作成日付

			objLo.setValue( PerceptionPropertyDef.LOGIN_USER_ID, strLogin_UserID );	// ログインユーザID

			objLo.setValue( PerceptionPropertyDef.WINHEIGHT, strWinHeight );			// Windowサイズ(縦)
			objLo.setValue( PerceptionPropertyDef.WINWIDTH, strWinWidth );			// Windowサイズ(横)

			objLo.setValue( PerceptionPropertyDef.PRERE, strPrere );					// 前提条件

			// 登録処理の実行
			if( !objLo.insert() ) {
				// 検索がうまくいかなかった場合
				if( objLo.isErr() ) {
					// エラーの場合
					request.setAttribute("message", "");
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", objLo.getURL());
					return mapping.findForward("error");
				}
				else {
					strMessage =  objLo.getMessage();
					//メッセージIDを取得する
					strMessageID = objLo.getMessageID();
					strForeignMessageID = LoMessage.EXIT_FOREIGNID_WAR;
				}
// ADD 2005/02/23 START NaotoIto [LO購入項目追加][推奨LOキーワード追加]
//			}
			} else {
				if (objLo.next()) {
					// Loの登録に成功した場合は、LoExtendの登録を行う。
					String strRegLoID = objLo.getLoID();
					String strRegBuyStatus = null;
					if (strBuyStatus.equals("")) {
						// 購入ステータスの選択が無かった場合は初期値は購入不要
						strRegBuyStatus = LoExtendTable.LOEXTEND_NOREQUIRE_BUY;
					} else {
						strRegBuyStatus = strBuyStatus;
					}

// ADD 2005/02/23 START NaotoIto [推奨LO検索キーワード追加]
					//for(int k = 0; k < NUM_LOSEARCH_KEYWORD_COUNT; k++){
					//	if(!strLoSearchKeyWord[k].equals("")){
					//		strLoSearchKeyWord[k] = CommonFunction.encodeSJIS(strLoSearchKeyWord[k]);
					//	}
					//}
// ADD 2005/02/23 END NaotoIto [推奨LO検索キーワード追加]
					
					if (!objLo.insertLoExtend(strRegLoID, strRegBuyStatus, strLoSearchKeyWord[0], strLoSearchKeyWord[1], strLoSearchKeyWord[2], strLoSearchKeyWord[3], strLoSearchKeyWord[4])) {
						// LoExtendの登録の失敗
// ADD 2005/02/23 START NaotoIto [エラーURLを返却]
						request.setAttribute("errorurl", objLo.getURL());
						return mapping.findForward("error");						
// ADD 2005/02/23 END NaotoIto [エラーURLを返却]
					}

// ADD 2005/02/23 START NaotoIto [属性追加対応]
					if (!strLomDetail.trim().equals("")) {
						//改行変換
						for (int cnt = 0; cnt < strLomDetail.trim().length(); cnt ++) {
							strLomDetail = CommonFunction.replace(strLomDetail.trim(), "<br>", "\r\n");
						}

						Vector inDisoData = objLo.setLomDetailData(strLomDetail, strRegLoID);
						if (!objLo.updateLomData(inDisoData)) {
							// LoExtendの登録の失敗
// ADD 2005/02/23 START NaotoIto [エラーURLを返却]
							request.setAttribute("errorurl", objLo.getURL());
							return mapping.findForward("error");						
// ADD 2005/02/23 END NaotoIto [エラーURLを返却]
						}
					}
// ADD 2005/02/23 END NaotoIto [属性追加対応]
				} else {
					// Lo登録に失敗したケース。ロジック的にはここには来ないはず
// ADD 2005/02/23 START NaotoIto [エラーURLを返却]
					request.setAttribute("errorurl", objLo.getURL());
					return mapping.findForward("error");
// ADD 2005/02/23 END NaotoIto [エラーURLを返却]											
				}
			}
// ADD 2005/02/23 END NaotoIto  [LO購入項目追加][推奨LOキーワード追加]			
		}
		// アクションフラグが設定されていない場合はアセスメント一覧表示処理を行います
		else{
			// アセスメント(ID)取得
			Environment objEnv = new Environment();
			String strLoServerName = objEnv.getLoServerName();

			LoTopClient objLoTop = new LoTopClient(strLoServerName, strLoType);
			// 検索処理
			if( !objLoTop.execute( "getAssessmentList" ) ) {
				// 検索がうまくいかなかった場合
				MessageData objMessage = objLoTop.getMessageData();
				request.setAttribute("message", "");
				request.setAttribute("detail", "");
				request.setAttribute("close", "on");
				request.setAttribute("errorurl", objMessage.getURL());
				return mapping.findForward("error");
			}
		
			// 検索がうまくいった場合はデータを取得する
			vecAssessmentList = (Vector)objLoTop.getExecute();
		}
		

		//文字化け対応
		//if( strLoTytle != "" )
		//{
		//	strLoTytle = CommonFunction.encodeSJIS(strLoTytle);
		//}
		//if( strForeignID != "" )
		//{
		//	strForeignID = CommonFunction.encodeSJIS(strForeignID);
		//}
		//if( strKeyWord != "" )
		//{
		//	strKeyWord = CommonFunction.encodeSJIS(strKeyWord);
		//}
		//if( strLoExplanation != "" )
		//{
		//	strLoExplanation = CommonFunction.encodeSJIS(strLoExplanation);
		//}
		//if( strVersion != "" )
		//{
		//	strVersion = CommonFunction.encodeSJIS(strVersion);
		//}
		//if( strCreateDate != "" )
		//{
		//	strCreateDate = CommonFunction.encodeSJIS(strCreateDate);
		//}
		//	 アセスメントID、セッション名称、Descriptionをスラッシュで
		//	 連結した文字列でやり取りを廃止するため、その値に対する編集も削除する。

		strCreateDate		= CommonFunction.blank2today(strCreateDate);

		//if( strWinHeight != "" )
		//{
		//	strWinHeight = CommonFunction.encodeSJIS(strWinHeight);
		//}
		//if( strWinWidth != "" )
		//{
		//	strWinWidth = CommonFunction.encodeSJIS(strWinWidth);
		//}

		//if( strPrere != "" )
		//{
		//	strPrere = CommonFunction.encodeSJIS(strPrere);
		//}
// ADD 2005/02/23 START NaotoIto [LO購入項目追加]
	//if( strBuyStatus != "" )
	//{
	//	strBuyStatus = CommonFunction.encodeSJIS(strBuyStatus);
	//}
// ADD 2005/02/23 END NaotoIto [LO購入項目追加]

		// 改行コード"\n"を"<br>"に置換
		String strShowPrere = "";
		if ( strPrere != null && !strPrere.equals( "" ) )
		{
			strShowPrere = CommonFunction.replace( strPrere, "\n", "<br>" );
		}
		
// ADD 2005/02/23 START NaotoIto [属性追加対応]
	//if( strLomDetail != "" )
	//{
	//	strLomDetail = CommonFunction.encodeSJIS(strLomDetail);
	//}
	// 改行コード"\n"を"<br>"に置換
	String strShowLomDetail = "";
	if ( strLomDetail != null && !strLomDetail.equals( "" ) )
	{
		strShowLomDetail = CommonFunction.replace( strLomDetail, "\n", "<br>" );
	}
// ADD 2005/02/23 END NaotoIto [属性追加対応]

		// SOAPFaultの場合の処理
		
		boolean SoapErrorFlag=false;
		Vector vecFault =new Vector();
		Vector vecFaultDescription =new Vector();
		String strFault = "";
		String strFaultDescription = "";
		StringBuffer sbAssesmentList = new StringBuffer();
		for( int i = 0; i < vecAssessmentList.size(); i++ ) {
			PerceptionResponseAssessmentData objAssessment = (PerceptionResponseAssessmentData)vecAssessmentList.get(i);
			if( objAssessment.getFault() != null && !objAssessment.getFault().equals("")) {
				//SOAPFaultのエラー情報を保持する
				vecFault.add(objAssessment.getFault());
				vecFaultDescription.add(objAssessment.getFaultDescription());

				//エラーフラグ
				SoapErrorFlag=true;
			}
			// 結果が取得できた場合
			else{
				sbAssesmentList.append(objAssessment.getAssessmentID());
				sbAssesmentList.append("/");
				sbAssesmentList.append(objAssessment.getSessionName());
				sbAssesmentList.append("/");
				sbAssesmentList.append(objAssessment.getDescription());
				sbAssesmentList.append("$");
			}
		}
		
		
		PerceptionLoEnv objLoEnv = new PerceptionLoEnv();
		//画面フラグをセットする。（登録画面:"INS"、更新画面"UPD"）
		String strDisplayFlg = "INS";

//		 ADD 2005/02/23 START Tsuboi [strLoSearchKeyWordをVectorに挿入]
		Vector vecLoSearchKeyWordList = new Vector();		
		for(int k = 0; k < NUM_LOSEARCH_KEYWORD_COUNT; k++){
			vecLoSearchKeyWordList.add(strLoSearchKeyWord[k]) ;
		}
//		 ADD 2005/02/23 END Tsuboi
		
		
		// リクエストに変数をセット
		request.setAttribute("strParentID", strParentID);
		request.setAttribute("strMessage", strMessage);
		request.setAttribute("strReturnURL", strReturnURL);
		request.setAttribute("vecAssessmentList", vecAssessmentList);
		request.setAttribute("strMessageID", strMessageID);
		request.setAttribute("strForeignMessageID", strForeignMessageID);
		request.setAttribute("SoapErrorFlag", new Boolean(SoapErrorFlag));
		request.setAttribute("strAction", strAction);
		request.setAttribute("strLoType", strLoType);
		request.setAttribute("strConclusion", strConclusion);
		request.setAttribute("sbAssesmentList", sbAssesmentList);
		request.setAttribute("strCreateDate", strCreateDate);
		request.setAttribute("strPrere", strPrere);
		request.setAttribute("strLoTytle", strLoTytle);
		request.setAttribute("StrPrefix", StrPrefix);
		request.setAttribute("strAssessmentID", strAssessmentID);
		request.setAttribute("strForeignID", strForeignID);
		request.setAttribute("strKeyWord", strKeyWord);
		request.setAttribute("strLoExplanation", strLoExplanation);
		request.setAttribute("strVersion", strVersion);
		request.setAttribute("strShowPrere", strShowPrere);
		request.setAttribute("vecFault", vecFault);
		request.setAttribute("vecFaultDescription", vecFaultDescription);
		request.setAttribute("strWinHeight", strWinHeight);
		request.setAttribute("strWinWidth", strWinWidth);
		request.setAttribute("KEY_ASSESSMENT_ID", KEY_ASSESSMENT_ID);
		request.setAttribute("KEY_SESSION_NAME", KEY_SESSION_NAME);
		request.setAttribute("KEY_DESCRIPTION", KEY_DESCRIPTION);
// ADD 2005/02/23 START NaotoKIto [購入フラグ、LO詳細の為のパラメータ、推奨LO検索キーワードの引渡] 他
		request.setAttribute("LOEXTEND_REQUIRE_BUY", LoExtendTable.LOEXTEND_REQUIRE_BUY);
		request.setAttribute("LOEXTEND_NOREQUIRE_BUY", LoExtendTable.LOEXTEND_NOREQUIRE_BUY);
		request.setAttribute("strBuyStatus", strBuyStatus);
		request.setAttribute("strLomDetail", strLomDetail);
		request.setAttribute("vecLoSearchKeyWordList", vecLoSearchKeyWordList);
// ADD 2005/02/23 END NaotoKIto [購入フラグ、LO詳細の為のパラメータ、推奨LO検索キーワードの引渡] 他

		// セッションに入っているLOM属性をクリアする。
		request.getSession().setAttribute("sesLomDetail" , "");  

		return mapping.findForward("success");
	}
}
