/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	ロールアサイン更新処理Actionクラス。
//
//		変更履歴
//			2005.02.16  新規作成  氏名 石崎賢太郎
//
//	機能
//
//	ロールアサイン更新処理（実際の処理）のActionクラスです。
//
/////////////////////////////////////////////////////////////////
package jp.co.ntt.lms.xmf.actions.xmo.RoleAssignments;

import java.util.Vector;

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

import jp.co.ntt.lms.xmf.xmo.Com.ConstTree;
import jp.co.ntt.lms.xmf.xmo.RoleAssignments.RoleAssignmentsConstants;
import jp.co.ntt.lms.xmo.Base.XMSBaseClient;
import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.Groups.GroupsData;
import jp.co.ntt.lms.xmo.People.PeopleClient;
import jp.co.ntt.lms.xmo.RoleAssignments.RoleAssignmentsClient;
import jp.co.ntt.lms.xmo.Roles.RolesClient;
import jp.co.ntt.lms.xmo.util.HtmlEscape;

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 RoleAssignmentsUpdateActionAction 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
	{
		///////////////////////////////////////////
		// パラメータ取得
		// 	・parentID			親グループのID	必須
		// 	・selectID			人のID			必須
		// 	・strRolesID		権限ID			必須
		// 	・strParentGroupID	親グループID	必須
		// 	・strGroupID		グループID		必須
		///////////////////////////////////////////
		String strMode = request.getParameter("Mode");						// 処理モード("insert"/"delete")
		String strParentID = request.getParameter("ParentID");				// 親グループのID
		String strSelectID = request.getParameter("SelectID");				// 選択されたグループor人のID
		String strRolesID = request.getParameter("RoleID");					// 権限ID
		String strParentGroupID = request.getParameter("ParentGruopID");	// 親GroupID
		String strGroupID = request.getParameter("GruopID");				// GroupID

		// メッセージリソース取得
		MessageResources resources = getResources(request, "msg.xmf.xmo.RoleAssignments.MessageResources");
		
		///////////////////////////////////////////
		// パラメータチェック
		///////////////////////////////////////////
		if( strMode == null || strMode.equals( "" ) ) {
			String strMessage = resources.getMessage("M092005");
			String strDetail = resources.getMessage("D092005");
			request.setAttribute("message", strMessage);
			request.setAttribute("detail", strDetail);
			request.setAttribute("close", "");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}
		if( strParentID == null || strParentID.equals( "" ) ) {
			String strMessage = resources.getMessage("M092001");
			String strDetail = resources.getMessage("D092001");
			request.setAttribute("message", strMessage);
			request.setAttribute("detail", strDetail);
			request.setAttribute("close", "");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}
		if( strSelectID == null || strSelectID.equals( "" ) ) {
			String strMessage = resources.getMessage("M092002");
			String strDetail = resources.getMessage("D092002");
			request.setAttribute("message", strMessage);
			request.setAttribute("detail", strDetail);
			request.setAttribute("close", "");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}
		if( strParentGroupID == null || strParentGroupID.equals( "" ) ) {
			String strMessage = resources.getMessage("M092001");
			String strDetail = resources.getMessage("D092001");
			request.setAttribute("message", strMessage);
			request.setAttribute("detail", strDetail);
			request.setAttribute("close", "");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}
		if( strGroupID == null || strGroupID.equals( "" ) ) {
			String strMessage = resources.getMessage("M092006");
			String strDetail = resources.getMessage("D092006");
			request.setAttribute("message", strMessage);
			request.setAttribute("detail", strDetail);
			request.setAttribute("close", "");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}

		String strMemberShipID = strParentID + strSelectID; // メンバーシップID
		String strSetUserID = strSelectID; 				// ユーザID
		String strSetRoleID = strRolesID;				// 権限ID
		String strSetGroupID = strGroupID;				// グループID

		
		if( strMode.equals( "insert" ) ) {
			////////////////////////////////////
			// 登録処理
			////////////////////////////////////
			RoleAssignmentsClient objRoleAssignments = new RoleAssignmentsClient();

			// パラメータ設定
			objRoleAssignments.setMemberShipID( strMemberShipID );			// メンバーシップID
			objRoleAssignments.setUserID( strSetUserID );				// ユーザID
			objRoleAssignments.setRoleID( strSetRoleID );				// 権限
			objRoleAssignments.setGroupID( strSetGroupID );				// グループID

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

			// 削除条件設定
			objRoleAssignments.setWhereUserID( strSetUserID );
			objRoleAssignments.setWhereRoleID( strSetRoleID );
			objRoleAssignments.setWhereGroupID( strSetGroupID );
			objRoleAssignments.setUserID( strSetUserID );
			objRoleAssignments.setRoleID( strSetRoleID );
			objRoleAssignments.setGroupID( strSetGroupID );

			objRoleAssignments.setMemberShipID( strMemberShipID );		// メンバーシップID

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

		
		///////////////////////////////////////////
		//
		// アサインフレームに表示する内容を取得・編集する
		//
		///////////////////////////////////////////
		try {
			// ユーザデータ取得
			// Peopleテーブル取得
			PeopleClient objPeople = new PeopleClient();


			// ログインユーザIDの取得
			String strUserID = (String)request.getSession().getAttribute(RoleAssignmentsConstants.USER_ID);
			if(strUserID == null){
				String strMessage = resources.getMessage("M092009");
				String strDetail = resources.getMessage("D092009");
				request.setAttribute("message", strMessage);
				request.setAttribute("detail", strDetail);
				request.setAttribute("close", "");
				request.setAttribute("errorurl", "");
				return mapping.findForward("error");
			}

			// セッションからXMOIDを取得する
			String strXmoID = (String)request.getSession().getAttribute(RoleAssignmentsConstants.ASSIGN_XMO_ID);
			if(strXmoID == null){
				String strMessage = resources.getMessage("M092009");
				String strDetail = resources.getMessage("D092009");
				request.setAttribute("message", strMessage);
				request.setAttribute("detail", strDetail);
				request.setAttribute("close", "");
				request.setAttribute("errorurl", "");
				return mapping.findForward("error");
			}
			XMSBaseClient objXms = new XMSBaseClient();

			// ルートGroupリスト検索処理(アサイン管理(LO)が割当たっているものを取得)
			if(!objXms.searchRootGroupList(strUserID, strXmoID)){
				String strMessage = resources.getMessage("M093001");
				String strDetail = resources.getMessage("D093001");
				request.setAttribute("message", strMessage);
				request.setAttribute("detail", strDetail);
				request.setAttribute("close", "");
				request.setAttribute("errorurl", "");
				return mapping.findForward("error");
			}

			// 検索がうまくいった場合
			GroupsData[] objGroupsList = objXms.getRootGroupList();


			String strUserName_o = "";

			// リストデータ取得部
			// Assignmentsテーブル取得
			RoleAssignmentsClient objRoleAssignmentsXMO = null;
			RolesClient objRolesXMO = null;

			// RoleAssignmentsのRoleIdの取得
			objRoleAssignmentsXMO = new RoleAssignmentsClient();
			objRoleAssignmentsXMO.setWhereUserID( strSelectID );
			if( !objRoleAssignmentsXMO.select() ) {
				// 検索がうまくいかなかった場合
				if( objRoleAssignmentsXMO.isErr() ) {
					// エラーの場合
					response.sendRedirect( objRoleAssignmentsXMO.getURL() );
				}
				else {
					String strMessage =  objRoleAssignmentsXMO.getMessage();
					request.setAttribute("message", strMessage);
					request.setAttribute("detail", "");
					request.setAttribute("close", "");
					request.setAttribute("errorurl", "");
					return mapping.findForward("error");
				}
			}

			Vector vecRolesList = new Vector();
			while( objRoleAssignmentsXMO.next() ) {
				// ロールＩＤの取得
				String strRoleID = objRoleAssignmentsXMO.getRoleID();
				// グループＩＤの取得
				strGroupID = objRoleAssignmentsXMO.getGroupID();


				// グループ名取得
				GroupsClient objGroupsXMO = new GroupsClient();
				// 検索条件の設定
				objGroupsXMO.setWhereGroupID( strGroupID );
				if( !objGroupsXMO.select() ) {
					// 検索がうまくいかなかった場合
					if( objGroupsXMO.isErr() ) {
						// エラーの場合
						response.sendRedirect( objGroupsXMO.getURL() );
					}
					else {
						String strMessage =  objGroupsXMO.getMessage();
						request.setAttribute("message", strMessage);
						request.setAttribute("detail", "");
						request.setAttribute("close", "");
						request.setAttribute("errorurl", "");
						return mapping.findForward("error");
					}
				}
				// グループ名の取得
				String strGroupName = "";
				if( objGroupsXMO.next() ) {
					strGroupName = objGroupsXMO.getGroupName();
				}
				else {
					request.setAttribute("message", "");
					request.setAttribute("detail", "");
					request.setAttribute("close", "");
					request.setAttribute("errorurl", objGroupsXMO.getURL());
					return mapping.findForward("error");
				}

				// ロール情報取得
				objRolesXMO = new RolesClient();
				// 検索条件の設定
				objRolesXMO.setWhereRoleID( strRoleID );
				if( !objRolesXMO.select() ) {
					// 検索がうまくいかなかった場合
					if( objRolesXMO.isErr() ) {
						// エラーの場合
						response.sendRedirect( objRolesXMO.getURL() );
					}
					else {
						String strMessage =  objRolesXMO.getMessage();
						request.setAttribute("message", strMessage);
						request.setAttribute("detail", "");
						request.setAttribute("close", "");
						request.setAttribute("errorurl", "");
						return mapping.findForward("error");
					}
				}
				// ロール名称取得
				String strRoleName = "";
				if( objRolesXMO.next() ) {
					String[] strRolesInfo = new String[5];
					strRolesInfo[0] = objRolesXMO.getRoleID();			// 権限ＩＤ
					strRolesInfo[1] = objRolesXMO.getRoleName();		// 権限名称
					strRolesInfo[2] = strGroupID;						// グループＩＤ
					strRolesInfo[3] = strGroupName;						// グループ名称

////////////////////////////////////////////////////////////////////////////////////	//
					// グループと人管理XMOクライアントのインスタンス化
					GroupAndPeopleClient objGroupAndPeople = new GroupAndPeopleClient();

					// 検索グループＩＤ
					String strID = strGroupID;

					// パスの取得
					objGroupAndPeople.searchPath(strID);

					String strFullPath = "";
					if ( strUserID.equals(RoleAssignmentsConstants.SUPER_USER) ){
						// パスの取得がうまくいった場合
						if( objGroupAndPeople.next() ) {
							String[] strPath = objGroupAndPeople.getPath();
							for( int j = 0; j < strPath.length; j++ ) {
								strFullPath += "/" + strPath[j];
							}
							strRolesInfo[4] = strFullPath;
						}
					}
					else{
						strFullPath = "/" + RoleAssignmentsConstants.GROUP_TREE_ROOT;
						// パスの取得がうまくいった場合
						if( objGroupAndPeople.next() ) {
							String[] strPath = objGroupAndPeople.getPath();
							boolean bflg = false;

							for( int j = 0; j < strPath.length; j++ ) {
								for( int i=0; i<objGroupsList.length; i++ ){
									if ( objGroupsList[i].getGroupID().equals(strPath[j]) ){
										bflg = true;
									}
								}
								if ( bflg ){
									strFullPath += "/" + strPath[j];
								}
							}
							strRolesInfo[4] = strFullPath;

							//権限用リストに対象のグループIDが含まれているかチェックする。
							boolean bcontainflg = false;
							for( int i=0; i<objGroupsList.length; i++ ){
								if ( strFullPath.indexOf(objGroupsList[i].getGroupID()) != -1 ){
									bcontainflg = true;
									break;
								}
							}
							//含まれていない場合はスキップ
							if ( bcontainflg != true ){
								continue;
							}
						}
					}
					// 検索条件のクリア
					objGroupAndPeople.clear();
////////////////////////////////////////////////////////////////////////////////////	//
					vecRolesList.add(strRolesInfo);
				}else{
					//ロール名が存在しない場合エラーを出力する
					String strMessage =  "ロール名が存在しません。";
					request.setAttribute("message", strMessage);
					request.setAttribute("detail", "");
					request.setAttribute("close", "");
					request.setAttribute("errorurl", "");
					return mapping.findForward("error");
				}
			}

			//ロール情報リストをベクターから配列にコピーします。
			String[][] strRolesCopy_o = new String[vecRolesList.size()][5];
			vecRolesList.copyInto( strRolesCopy_o );

			StringBuffer strGetHtmlLine = new StringBuffer();

			//strGetHtmlLine.append( "<table border=\"0\">" );

			for(int i=0; i<strRolesCopy_o.length; i++) {
				strGetHtmlLine.append( "<TR>" );
				strGetHtmlLine.append( "<td align='left' nowrap id=\"GID/" );
				strGetHtmlLine.append( strRolesCopy_o[i][0] );
				strGetHtmlLine.append( "/" );
				strGetHtmlLine.append( strRolesCopy_o[i][2] );
				strGetHtmlLine.append( "\"  onclick=\"select_func(escape('" + strRolesCopy_o[i][3] + "'),'" );
				strGetHtmlLine.append( strRolesCopy_o[i][0] );
				strGetHtmlLine.append( "', '" );
				strGetHtmlLine.append( strRolesCopy_o[i][2] );
				strGetHtmlLine.append( "', '" );
				strGetHtmlLine.append( strRolesCopy_o[i][4] );
				strGetHtmlLine.append( "', 'GID/" );
				strGetHtmlLine.append( strRolesCopy_o[i][0] );
				strGetHtmlLine.append( "/" );
				strGetHtmlLine.append( strRolesCopy_o[i][2] );
				strGetHtmlLine.append( "' )\" class=\"hand\">" );
				strGetHtmlLine.append( "<font size=\"" );
				strGetHtmlLine.append( ConstTree.DISPLAY_FONT_SIZE );
				strGetHtmlLine.append( "\">" );
				strGetHtmlLine.append( HtmlEscape.escape(strRolesCopy_o[i][3]) );
				strGetHtmlLine.append( "</font>" );
				strGetHtmlLine.append( "</td>" );
				strGetHtmlLine.append( "<td nowrap id=\"RID/" );
				strGetHtmlLine.append( strRolesCopy_o[i][0] );
				strGetHtmlLine.append( "/" );
				strGetHtmlLine.append( strRolesCopy_o[i][2] );
				strGetHtmlLine.append( "\"  onclick=\"select_func(escape('" + strRolesCopy_o[i][1] + "'),'" );
				strGetHtmlLine.append( strRolesCopy_o[i][0] );
				strGetHtmlLine.append( "', '" );
				strGetHtmlLine.append( strRolesCopy_o[i][2] );
				strGetHtmlLine.append( "', '" );
				strGetHtmlLine.append( strRolesCopy_o[i][4] );
				strGetHtmlLine.append( "', 'RID/" );
				strGetHtmlLine.append( strRolesCopy_o[i][0] );
				strGetHtmlLine.append( "/" );
				strGetHtmlLine.append( strRolesCopy_o[i][2] );
				strGetHtmlLine.append( "' )\" class=\"hand\">" );
				strGetHtmlLine.append( "<font size=\"" );
				strGetHtmlLine.append( ConstTree.DISPLAY_FONT_SIZE );
				strGetHtmlLine.append( "\">" );
				strGetHtmlLine.append( HtmlEscape.escape(strRolesCopy_o[i][1]) );
				strGetHtmlLine.append( "</font>" );
				strGetHtmlLine.append( "</td>" );
				strGetHtmlLine.append( "</TR>" );
			}
			//strGetHtmlLine.append("</table>");
			//strGetHtmlLine.append("</td>");
			//strGetHtmlLine.append("</tr>");
			//strGetHtmlLine.append("</table>");
			
			request.setAttribute("strUpdateAction", strGetHtmlLine.toString());
			return mapping.findForward("success");
		}

		catch( Exception e ) {
			e.printStackTrace();
			request.setAttribute("message", "err");
			request.setAttribute("detail", e.getMessage());
			request.setAttribute("close", "on");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}
	}
}
