/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	ロール管理処理　ロールの削除画面表示Actionクラス
//
//		変更履歴
//			2005.02.16  新規作成  氏名 石崎賢太郎
//
//	機能
//
//	ロール削除画面表示Actionクラスです。
//
/////////////////////////////////////////////////////////////////
package jp.co.ntt.lms.xmf.actions.xmo.Roles;

import java.util.StringTokenizer;
import java.util.Vector;

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

import jp.co.ntt.lms.xmf.xmo.Com.ComFunction;
import jp.co.ntt.lms.xmo.Base.XMSBaseClient;
import jp.co.ntt.lms.xmo.Roles.RolesClient;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;

/**
 * ロール削除画面表示Actionクラスです。
 * 
 * @author Kentaro Ishizaki (UNITEC)
 * @version 1.0
 */
public class RolesDeleteAction extends Action
{
	/**
	 * 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
	{
		///////////////////////////////////////////
		// パラメータ取得
		// 	・roleId	ロールID		必須
		// 	・RoleName	ロール名称		必須
		// 	・returnURL	戻りページ		必須
		// 	・act		アクションフラグ
		///////////////////////////////////////////
		String strReturnURL_o = request.getParameter("returnURL"); 		// 戻りページ
		String strRoleID_o = request.getParameter("roleId");				// ロールID
		String strRoleName_o = request.getParameter("roleName");			// ロール名称
		String strAction = request.getParameter("act");					// アクションフラグ

		// メッセージリソース取得
		MessageResources resources = getResources(request, "msg.xmf.xmo.Roles.MessageResources");

		///////////////////////////////////////////
		// パラメータチェック
		///////////////////////////////////////////
		if( strRoleID_o == null || strRoleID_o.equals( "" ) ) {
			String strMessage = resources.getMessage("M052001");
			String strDetail = resources.getMessage("D052001");
			request.setAttribute("message", strMessage);
			request.setAttribute("detail", strDetail);
			request.setAttribute("close", "on");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}
		if( strRoleName_o == null || strRoleName_o.equals( "" ) ) {
			String strMessage = resources.getMessage("M052003");
			String strDetail = resources.getMessage("D052003");
			request.setAttribute("message", strMessage);
			request.setAttribute("detail", strDetail);
			request.setAttribute("close", "on");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}
		if( strReturnURL_o == null || strReturnURL_o.equals( "" ) ) {
			String strMessage = resources.getMessage("M052002");
			String strDetail = resources.getMessage("D052002");
			request.setAttribute("message", strMessage);
			request.setAttribute("detail", strDetail);
			request.setAttribute("close", "on");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}

		if(strAction != null && strAction.equals("on")){
			// キャッシュ無効処理
			response.setHeader( "cache-control", "no-cache" );
		}

		//strRoleName_o = new String( strRoleName_o.getBytes( "8859_1" ), "Windows-31J" );

		//ユーザー権限リスト
		Vector vecXmoNameList = new Vector();
		StringBuffer strXmoNameLine = new StringBuffer();
		String strXmoNameInfo_o = "";
		String[] strXmoNameCopy_o = null;

		///////////////////////////////////////////////
		//アクションフラグがonの場合、削除処理をします。
		///////////////////////////////////////////////
		if(strAction != null && strAction.equals("on")){
			//送信データ情報の取得
			strRoleName_o = request.getParameter("roleName"); 			// 権限名
			strXmoNameInfo_o = request.getParameter("xmo_name_info"); 	// 権限リスト

			// ロールXMOクライアントのインスタンス化
			RolesClient objRoles = new RolesClient();

			// 削除条件の設定
			objRoles.setWhereRoleID( strRoleID_o );

			// 削除メソッド実行
			if( !objRoles.delete() ) {
				// 削除がうまくいかなかった場合
				if( objRoles.isErr() ) {
					// エラーの場合
					request.setAttribute("message", "");
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", objRoles.getURL());
					return mapping.findForward("error");
				}
				else {
					String strMessage =  objRoles.getMessage();
					request.setAttribute("message", strMessage);
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", "");
					return mapping.findForward("error");
				}
			}

			// エンコード変換処理
			//strRoleName_o = ComFunction.encodeSJIS( strRoleName_o );
			//strXmoNameInfo_o = ComFunction.encodeSJIS( strXmoNameInfo_o );

			//権限名のリストをベクターに格納します
			StringTokenizer objToken = new StringTokenizer( strXmoNameInfo_o, "/" );
			while( objToken.hasMoreTokens() ) {
				vecXmoNameList.add( objToken.nextToken() );
			}
			strXmoNameCopy_o = new String[vecXmoNameList.size()];
			vecXmoNameList.copyInto( strXmoNameCopy_o );
		}else{
			///////////////////////////////////////////
			//XMO詳細情報を取得する
			///////////////////////////////////////////

			// XmoIDを保持する
			Vector vecXmoIDList = new Vector();
			try {
					// RolesのXMO取得
					RolesClient objRoles = new RolesClient();

					// XMSBaseの取得
					XMSBaseClient objXMSBase = new XMSBaseClient();


					// XmoIDの取得
					objRoles.setWhereRoleID( strRoleID_o );

					if( !objRoles.select() ) {
						// 検索がうまくいかなかった場合
						if( objRoles.isErr() ) {
							// エラーの場合
							request.setAttribute("message", "");
							request.setAttribute("detail", "");
							request.setAttribute("close", "on");
							request.setAttribute("errorurl", objRoles.getURL());
							return mapping.findForward("error");
						}
						else {
							String strMessage =  objRoles.getMessage();
							request.setAttribute("message", strMessage);
							request.setAttribute("detail", "");
							request.setAttribute("close", "on");
							request.setAttribute("errorurl", "");
							return mapping.findForward("error");
						}
					}

					/*XmoID,Xmo名称の取得 */
					while( objRoles.next() ) {
						int intFunctionCount = objRoles.getFunctionCount();

						for (int i=0;i<intFunctionCount;i++){
							String strFunction = objRoles.getFunction(i);

							/* XmoIDの重複Check */
							if (vecXmoIDList.indexOf(strFunction) == -1){
								vecXmoIDList.addElement(strFunction);

								//XmoIDの検索
								objXMSBase.clear();
								objXMSBase.setWhereXmoID(strFunction);

								//XmoIDがある時
								if(objXMSBase.select()){
									String[] strXmoInfo = new String[2];	//Xmo情報の一時保持
									//Xmo名称の取得
									if(objXMSBase.next()){
										strXmoInfo[0] = objXMSBase.getXmoID();
										strXmoInfo[1] = objXMSBase.getXmoName();
										strXmoNameLine.append(strXmoInfo[1] + "/");
										vecXmoNameList.addElement(strXmoInfo);
									}
								}else{
									// 検索がうまくいかなかった場合
									if( objXMSBase.isErr() ) {
										// エラーの場合
										request.setAttribute("message", "");
										request.setAttribute("detail", "");
										request.setAttribute("close", "on");
										request.setAttribute("errorurl", objXMSBase.getURL());
										return mapping.findForward("error");
									}
									else {
										String strMessage =  objXMSBase.getMessage();
										request.setAttribute("message", strMessage);
										request.setAttribute("detail", "");
										request.setAttribute("close", "on");
										request.setAttribute("errorurl", "");
										return mapping.findForward("error");
									}
								}
							}
						}
					}
					objRoles.clear();
				}
				catch( Throwable e ) {
					request.setAttribute("message", e.getMessage());
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", "");
					return mapping.findForward("error");
				}
				strXmoNameLine.deleteCharAt(strXmoNameLine.length()-1);
				strXmoNameInfo_o = strXmoNameLine.toString();

			//権限リストをベクターから配列にコピーします。
			String[][] strXmoNameCopyTemp_o = new String[vecXmoNameList.size()][2];
			vecXmoNameList.copyInto( strXmoNameCopyTemp_o );
			strXmoNameCopyTemp_o = sortArray( strXmoNameCopyTemp_o );

			strXmoNameCopy_o = new String[vecXmoNameList.size()];
			for( int i = 0; i < strXmoNameCopyTemp_o.length; i++ ) {
				strXmoNameCopy_o[i] = strXmoNameCopyTemp_o[i][1];
			}
		}
		
		
		// リクエストに変数をセット
		request.setAttribute("strAction", strAction);
		request.setAttribute("strReturnURL_o", strReturnURL_o);
		request.setAttribute("strRoleID_o", strRoleID_o);
		request.setAttribute("strRoleName_o", strRoleName_o);
		request.setAttribute("strXmoNameInfo_o", strXmoNameInfo_o);
		request.setAttribute("strXmoNameCopy_o", strXmoNameCopy_o);
		
		return mapping.findForward("success");
	}
		
		
	/**
	 * String[2]が入っているString[]を、String[0]をキーにソートします。
	 *
	 * @param srcArray ソート元。String[2]の配列で、String[0]が数値であること。
	 * @return ソート結果
	 */
	private String[][] sortArray(String[][] targetArray) throws Exception{

		String[] tmp;					// テンポラリ
		int minIndex;					// 最小データのキー値

		// 全件検索し、最小値から先頭に詰めていく
		int arrSize = targetArray.length;
		for(int i=0; i < arrSize-1; i++){
			// 先頭を最小値として先に取得
			minIndex = Integer.parseInt(targetArray[i][0]);

			// 最小データを検索
			for(int j=i+1; j < arrSize; j++){
				int nowIndex = Integer.parseInt(targetArray[j][0]);
				if(nowIndex < minIndex){
					// 最小値を入替
					tmp = targetArray[i];
					targetArray[i] = targetArray[j];
					targetArray[j] = tmp;
					minIndex = nowIndex;
				}
			}
		}

		return targetArray;
	}
}
