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

import java.net.URLEncoder;
import java.util.Vector;

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

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 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 RoleAssignmentsframe_assignAction 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	親ＩＤ	必須
		// 	・selectID	子ＩＤ	必須
		// 	・returnURL	戻りページ		必須
		///////////////////////////////////////////
		String strParentID = request.getParameter("parentID");
		String strSelectID = request.getParameter("selectID");
		String strReturnURL = request.getParameter("returnURL");		// 戻りページ

		// メッセージリソース取得
		MessageResources resources = getResources(request, "msg.xmf.xmo.RoleAssignments.MessageResources");
		
		String strLoginUserID_o = (String)request.getSession().getAttribute(RoleAssignmentsConstants.USER_ID);	// ログインユーザーID
		
		// ログインユーザがスーパーユーザか普通の管理者かでルートのIDを切り分けます。
		String strTreeRoot_o = null;
		
		if(strLoginUserID_o == null){
			// セッションが切れている場合はログイン画面にリダイレクト
			request.setAttribute("message", "");
			request.setAttribute("detail", "");
			request.setAttribute("close", "on");
			request.setAttribute("errorurl", "../Base/LoginRedirector.vm");
			return mapping.findForward("error");
		}
		else{
			if(strLoginUserID_o.equals(RoleAssignmentsConstants.SUPER_USER)){
				strTreeRoot_o = RoleAssignmentsConstants.GROUP_ROOT_o;
			}else{
				strTreeRoot_o = RoleAssignmentsConstants.GROUP_TREE_ROOT;
			}
		}


		///////////////////////////////////////////
		// パラメータチェック
		///////////////////////////////////////////
		if( strParentID == null || strParentID.equals( "" ) ) {
			Exception e = new Exception();
			e.printStackTrace();
			String strMessage = resources.getMessage("M092001");
			String strDetail = resources.getMessage("D092001");
			request.setAttribute("message", strMessage);
			request.setAttribute("detail", strDetail);
			request.setAttribute("close", "on");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}
		if( strSelectID == null || strSelectID.equals( "" ) ) {
			Exception e = new Exception();
			e.printStackTrace();
			String strMessage = resources.getMessage("M092002");
			String strDetail = resources.getMessage("D092002");
			request.setAttribute("message", strMessage);
			request.setAttribute("detail", strDetail);
			request.setAttribute("close", "on");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}
		if( strReturnURL == null || strReturnURL.equals( "" ) ) {
			Exception e = new Exception();
			e.printStackTrace();
			request.setAttribute("message", "");
			request.setAttribute("detail", "");
			request.setAttribute("close", "on");
			request.setAttribute("errorurl", "../Com/ComSystemErr.vm");
			return mapping.findForward("error");
		}

		strReturnURL = URLEncoder.encode( strReturnURL, "UTF-8" );

		String strUserName_o = "";
		String strGroupName_o = "";

		//////////////////////////////////
		// 人またはグループの存在チェック
		//////////////////////////////////
		// グループデータ取得
		if( strSelectID.substring( 0,2 ).equals( "GR" ) )
		{
			// グループオブジェクト作成

			GroupsClient objGroups = new GroupsClient();

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

			// データ存在チェック
			if( !objGroups.next() )
			{
				//グループ名が存在しない場合エラーを出力する
				String strMessage = resources.getMessage("M092007");
				String strDetail = resources.getMessage("D092007");
				request.setAttribute("message", strMessage);
				request.setAttribute("detail", strDetail);
				request.setAttribute("close", "on");
				request.setAttribute("errorurl", "");
				return mapping.findForward("error");
			}
			//グループ名名
			strGroupName_o = objGroups.getGroupName();

		}
		// ユーザデータ取得
		else if( strSelectID.substring( 0,2 ).equals( "PE" ) )
		{
			// 人オブジェクト作成

			PeopleClient objPeople = new PeopleClient();

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

			// データ存在チェック
			if( !objPeople.next() )
			{
				//ユーザー名が存在しない場合エラーを出力する
				String strMessage = resources.getMessage("M092004");
				String strDetail = resources.getMessage("D092004");
				request.setAttribute("message", strMessage);
				request.setAttribute("detail", strDetail);
				request.setAttribute("close", "on");
				request.setAttribute("errorurl", "");
				return mapping.findForward("error");
			}
			//ユーザー名
			strUserName_o = objPeople.getUserName();

			
		}

		// セッションから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", "on");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}
		XMSBaseClient objXms = new XMSBaseClient();
		
		// ルートGroupリスト検索処理(アサイン管理(LO)が割当たっているものを取得)
		if(!objXms.searchRootGroupList(strLoginUserID_o, strXmoID)){
			String strMessage = resources.getMessage("M093001");
			String strDetail = resources.getMessage("D093001");
			request.setAttribute("message", strMessage);
			request.setAttribute("detail", strDetail);
			request.setAttribute("close", "on");
			request.setAttribute("errorurl", "");
			return mapping.findForward("error");
		}
		
		// 検索がうまくいった場合
		GroupsData[] objGroupsList = objXms.getRootGroupList();


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

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

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

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

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

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

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

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

			String strFullPath = "";
			if ( strLoginUserID_o.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);
////////////////////////////////////////////////////////////////////////////////////	//

		}

		//ロール情報リストをベクターから配列にコピーします。
		String[][] strRolesCopy_o = new String[vecRolesList.size()][5];
		vecRolesList.copyInto( strRolesCopy_o );
		
		
		// リクエストに変数をセット
		request.setAttribute("strSelectID", strSelectID);
		request.setAttribute("strGroupName_o", strGroupName_o);
		request.setAttribute("strUserName_o", strUserName_o);
		// データリスト
		request.setAttribute("strRolesCopy_o", strRolesCopy_o);
		
		return mapping.findForward("success");
	}
}
