/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
// ユーザ更新処理　入力画面表示用ScreenAction
// 
//
//	変更履歴
//	2004.01.08 新規作成 M.Seko 
//
package jp.co.ntt.lms.xms.people;

import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import jp.co.ntt.lms.xmo.Groups.GroupsClient;
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.DebugLog;
import jp.co.ntt.lms.xms.common.mail.InputFrameErrorBean;
import jp.co.ntt.lms.xms.common.mail.MailTemplateConstant;
import jp.co.ntt.lms.xms.common.user.User;
import jp.co.ntt.lms.xms.common.util.CommonUtil;
import jp.co.ntt.lms.xms.framework.Constant;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsInnerException;
import jp.co.ntt.lms.xms.framework.XmsRequest;
import jp.co.ntt.lms.xms.framework.XmsResponse;
import jp.co.ntt.lms.xms.framework.XmsScreenAction;
import jp.co.ntt.lms.xms.framework.XmsSystemException;

/**
 * ユーザ更新画面表示用情報取得クラス。<br>
 */
public class PeopleUpdateInputScreenAction extends XmsScreenAction {

	/**
	 * @see jp.co.ntt.lms.xms.framework.XmsScreenAction#initProcessRequest(XmsRequest, XmsResponse)
	 */
	protected void initProcessRequest(XmsRequest xmsRequest, XmsResponse xmsResponse)
		throws XmsException {
	}

	/**
	 * @see jp.co.ntt.lms.xms.framework.XmsScreenAction#processRequest(XmsRequest, XmsResponse)
	 */
	protected void processRequest(XmsRequest xmsRequest, XmsResponse xmsResponse)
		throws XmsException {
		// HTTPセッション取得用
		HttpServletRequest request = null;
		// HTTPセッション
		HttpSession session = null;
		//ユーザ更新入力画面用ScreenBean
		PeopleUpdateInputScreenBean peopleUpdateInputScreenBean = null;
		//ユーザ更新処理時にユーザの操作によって変化しない情報を格納
		PeopleUpdateNonChangeInfoBean peopleUpdateNonChangeInfoBean = null;
		//エラー情報伝播用Bean
		InputFrameErrorBean inputFrameErrorBean = null;

		//更新対象ユーザの親グループID
		String parentGroupID = null;
		//検索対象用UserID
		String targetUserID = null;

		//ユーザ更新機能を呼び出したユーザのログインID
		String userIDOfCallPeopleUpdate = null;

		try {
			request = xmsRequest.getRequest();
			session = request.getSession(false);
			if (session == null) {
				//sessionが無効である場合、処理が続行できないので例外を投げる。
				throw new XmsSystemException("This session is invalid.");
			}

			//リクエストからの情報取得
			//更新対象のユーザIDを取得する
			targetUserID = request.getParameter("selectID");

			//更新対象のグループIDを取得する
			parentGroupID = request.getParameter("parentID");

			//ユーザ更新機能を呼び出したユーザのログインIDを取得する
			User user = (User) session.getAttribute(Constant.KEY_USER);
			userIDOfCallPeopleUpdate = user.getUserID();

			//XMOアクセス用クラスの生成
			PeopleClient objPeople = null;
			try {
				objPeople = new PeopleClient();
			} catch (Exception e) {
				//あっては困る状態なので、システム例外を投げる
				throw new XmsSystemException(e);
			}

			//ユーザIDをキーとして、ユーザ情報を検索する。
			objPeople.setWhereUserID(targetUserID);
			try {
				if (objPeople.select() == false) {
					// 検索が失敗した場合は、エラー画面に遷移する

					inputFrameErrorBean = new InputFrameErrorBean();
					inputFrameErrorBean.setErrorMessage(objPeople.getMessage());

					//エラー画面に表示するボタンを「閉じる」に設定する。
					//ここでエラーが起きる場合、原因はユーザ操作ミス以外のため、
					//戻ってもユーザ更新を続行できない。
					inputFrameErrorBean.setButtonType(InputFrameErrorBean.BUTTON_TYPE_CLOSE);

					//エラー情報をセッションに登録する
					session.setAttribute(MailTemplateConstant.KEY_ERROR_INFO, inputFrameErrorBean);

					//エラー画面に遷移するステータスをセット
					xmsResponse.setBusinessStatus("error");

					//エラー状態であり処理の続行が不可能なので、メソッドを終了する。			
					return;
				}
			} catch (Exception e) {
				//あっては困る状態なので、システム例外を投げる
				throw new XmsSystemException(e);
			}

			//検索に成功したので、ユーザ情報を取得できるようにする。
			if (objPeople.next() == false) {
				inputFrameErrorBean = new InputFrameErrorBean();
				inputFrameErrorBean.setErrorMessage(PeopleConst.M032010);

				//エラー画面に表示するボタンを「閉じる」に設定する。
				//ここでエラーが起きる場合、原因はユーザ操作ミス以外のため、
				//戻ってもユーザ更新を続行できない。
				inputFrameErrorBean.setButtonType(InputFrameErrorBean.BUTTON_TYPE_CLOSE);

				//エラー状態であり処理の続行が不可能なので、メソッドを終了する。			
				return;
			}

			//-------------------------------------------------------
			//ユーザ更新時に変化しない情報を格納するBeanを生成する
			peopleUpdateNonChangeInfoBean = new PeopleUpdateNonChangeInfoBean();

			//ユーザID
			peopleUpdateNonChangeInfoBean.setUserIDString(targetUserID);

			//ユーザ種別
			String userTypeString = null;
			userTypeString = objPeople.getUserType();
			peopleUpdateNonChangeInfoBean.setUserTypeString(userTypeString);

			//-------------------------------------------------------
			//ユーザ情報の検索に成功したので、画面に表示するユーザ情報を取得する。
			peopleUpdateInputScreenBean =
				createPeopleUpdateInputScreenBean(
					objPeople,
					userIDOfCallPeopleUpdate,
					parentGroupID,
					targetUserID,
					inputFrameErrorBean);
			//ユーザ情報を取得処理のエラーチェック
			if (peopleUpdateInputScreenBean == null) {
				//peopleUpdateInputScreenBeanの生成に失敗したので、エラー画面へ遷移する

				if (inputFrameErrorBean == null) {
					//ロジックのミスがあった場合なので、内部例外を投げる。
					throw new XmsInnerException("create peopleUpdateInputScreenBean failed!");
				}

				//エラー情報をセッションに登録する
				session.setAttribute(MailTemplateConstant.KEY_ERROR_INFO, inputFrameErrorBean);
				//エラー画面に遷移するステータスをセット
				xmsResponse.setBusinessStatus("error");
				return;
			}

			PeopleFormInfoBean peopleFormInfoBean = null;
			peopleFormInfoBean = peopleUpdateInputScreenBean.getPeopleFormInfoBean();
			if (CommonUtil.checkMailAuthority(xmsRequest) == true) {
				//ログインユーザは、メール使用可能である
				//ユーザ登録画面JSPのために、メールテンプレート使用可能を表す値をセットする
				peopleFormInfoBean.setIsUsableMailTemplate(true);
			} else {
				//ログインユーザは、メール使用不可能である。
				//ユーザ登録画面JSPのために、メールテンプレート使用不可能を表す値をセット
				peopleFormInfoBean.setIsUsableMailTemplate(false);

			}

			//-------------------------------------------------------
			//情報のセッションへの登録

			//ユーザによって、変更されない情報をセッションに登録する
			session.setAttribute(
				PeopleConst.PeopleUpdateNonChangeInfoSessionKey,
				peopleUpdateNonChangeInfoBean);

			//画面表示に必要な情報を取得できたので、ScreenBeanをセッションに登録する
			xmsResponse.setScope(XmsResponse.SESSION);
			xmsResponse.setScreenBean(peopleUpdateInputScreenBean);

			//セッションキー保持クラスのセッションからの取得試行及び、セッションへの登録用
			SKeyKeep skeyKeep = null;

			skeyKeep = (SKeyKeep) session.getAttribute(PeopleConst.SKeyKeepSessionKey);
			if (skeyKeep == null) {
				//まだ、セッションキー保持クラスのインスタンスがセッションに存在していない
				//新たに生成する
				skeyKeep = new SKeyKeep();
			}

			//「ユーザによって変更されない情報」のキーを追加
			skeyKeep.addSKey(Constant.KEY_SCREEN_BEAN);

			//ScreenBeanのスコープをセッションにしたので、消すセッションデータとして登録
			skeyKeep.addSKey(PeopleConst.PeopleUpdateNonChangeInfoSessionKey);

			//セッションキー保持クラスのインスタンスをセッションに登録
			session.setAttribute(PeopleConst.SKeyKeepSessionKey, skeyKeep);

		} catch (XmsException xmsException) {
			throw xmsException;
		} catch (Exception e) {
			DebugLog.write(this.getClass(), e, DebugLog.HIGHT);
			throw new XmsInnerException(e);
		}
	}

	/**
	 * PeopleClientの情報を元に、PeopleFormInfoBeanを生成する。<br>
	 * よって、リクエストから取得する情報はセットされない。
	 * @param objPeople ユーザIDの検索（selectメソッド）の実行に成功している状態のPeopleClientのインスタンス。
	 * @param parentGroupID 今回更新対象となるユーザの親グループID
	 * @param userID 今回更新対象となるユーザID
	 * @param inputFrameErrorBean このメソッド内部でエラーが生じた場合に、エラー情報が格納される。正常終了時はnullが格納される。 
	 * @return objPeopleの情報を元に生成された、PeopleUpdateInputScreenBeanである。生成に失敗した場合はnullを返す。
	 */
	private PeopleUpdateInputScreenBean createPeopleUpdateInputScreenBean(
		PeopleClient objPeople,
		String userIDOfCallPeopleUpdate,
		String parentGroupID,
		String userID,
		InputFrameErrorBean inputFrameErrorBean)
		throws XmsException {
		//ユーザ更新入力画面用ScreenBean
		PeopleUpdateInputScreenBean peopleUpdateInputScreenBean = null;
		//フォーム内容兼表示内容への参照
		PeopleFormInfoBean peopleFormInfoBean = null;

		try {
			//ScreenBeanを生成する
			peopleUpdateInputScreenBean = new PeopleUpdateInputScreenBean();
			//フォーム内容兼表示内容への参照を取得
			peopleFormInfoBean = peopleUpdateInputScreenBean.getPeopleFormInfoBean();

			///----------------------------------------------------------
			//ユーザが更新するかもしれない情報の取得・生成
			peopleFormInfoBean = createPeopleFormInfoBean(objPeople, inputFrameErrorBean);
			if (peopleFormInfoBean == null) {
				//エラー状態であり処理の続行が不可能なので、メソッドを終了する。
				//このメソッドの呼び出し元で、エラー画面への遷移に必要な設定を行う			
				return null;
			}
			peopleUpdateInputScreenBean.setPeopleFormInfoBean(peopleFormInfoBean);

			///----------------------------------------------------------
			//ユーザが更新しないが、画面に表示される情報の取得


			//ユーザ参照リストの検索

			//ReferenceList取得用XMOアクセス用クラスの生成
			PeopleClient peopleClinentForSearchReferenceList = null;
			try {
				peopleClinentForSearchReferenceList = new PeopleClient();
			} catch (Exception e) {
				//あっては困る状態なので、システム例外を投げる
				throw new XmsSystemException(e);
			}

			//ユーザ参照リストを格納するために使用
			String[][] userReferenceArray = null;
			try {
				String userName = peopleFormInfoBean.getUsernameString();
				if (peopleClinentForSearchReferenceList
					.searchReferenceList(userID, userName, userIDOfCallPeopleUpdate)
					== false) {
					// 検索に失敗した場合
					inputFrameErrorBean = new InputFrameErrorBean();
					inputFrameErrorBean.setErrorMessage(PeopleConst.M032010);

					//エラー画面に表示するボタンを「閉じる」に設定する。
					//ここでエラーが起きる場合、原因はユーザ操作ミス以外のため、
					//戻ってもユーザ更新を続行できない。
					inputFrameErrorBean.setButtonType(InputFrameErrorBean.BUTTON_TYPE_CLOSE);

					//エラー状態であり処理の続行が不可能なので、メソッドを終了する。			
					//このメソッドの呼び出し元で、エラー画面への遷移に必要な設定を行う			
					return null;
				}
			} catch (Exception e) {
				//あっては困る状態なので、システム例外を投げる
				throw new XmsSystemException(e);
			}
			//検索結果を格納
			userReferenceArray = peopleClinentForSearchReferenceList.getReferenceList();

			//ユーザIDパスの配列の生成
			String[] serveConcurrentlyIDArray = null;
			serveConcurrentlyIDArray = createIDPathArray(parentGroupID, userReferenceArray);

			String[][] roleArray = null;
			roleArray = crateRoleArray(userID, inputFrameErrorBean);
			if (roleArray == null) {
				//エラー状態であり処理の続行が不可能なので、メソッドを終了する。			
				return null;
			}

			//Beanに値を設定
			peopleUpdateInputScreenBean.setUserReferenceArray(userReferenceArray);
			peopleUpdateInputScreenBean.setRoleArray(roleArray);
			peopleUpdateInputScreenBean.setServeConcurrentlyIDArray(serveConcurrentlyIDArray);

			//正常終了
			return peopleUpdateInputScreenBean;
		} catch (XmsException xmsException) {
			throw xmsException;
		} catch (Exception e) {
			throw new XmsInnerException(e);
		}

	}

	/**
	 * 変更される可能性のあるユーザ情報を取得、生成する。
	 * @param objPeople ユーザIDの検索（selectメソッド）の実行に成功している状態のPeopleClientのインスタンス。
	 * @param inputFrameErrorBean このメソッド内部でエラーが生じた場合に、エラー情報が格納される。正常終了時はnullが格納される。 
	 * @return objPeopleの情報を元に生成された、PeopleFormInfoBeanである。生成に失敗した場合はnullを返す。
	 */
	private PeopleFormInfoBean createPeopleFormInfoBean(
		PeopleClient objPeople,
		InputFrameErrorBean inputFrameErrorBean)
		throws XmsException {

		PeopleFormInfoBean peopleFormInfoBean = null;

		/**エラー情報格納用Beanを初期化しておく*/
		inputFrameErrorBean = null;

		//ユーザ名
		String userNameString = null;
		//ログインID
		String loginIDString = null;
		//外部ID
		String foreignIDString = null;
		//パスワード
		String passwordString = null;
		//読み方
		String readingNameString = null;
		//生年月日
		String birthdayString = null;
		//性別
		String sexString = null;
		//住所
		String userAddressString = null;
		//メールアドレス1
		String emailString = null;
		//メールアドレス２
		String email2String = null;
		//電話番号
		String contactTelString = null;
		//コメント
		String customMsgDirString = null;

		try {
			if (objPeople == null) {
				//ありえない値なので、内部例外を投げる。
				throw new XmsInnerException("PeopleClient is null.");
			}

			peopleFormInfoBean = new PeopleFormInfoBean();

			userNameString = objPeople.getUserName();
			loginIDString = objPeople.getLoginID();
			foreignIDString = objPeople.getForeignID();
			passwordString = objPeople.getEncryptPassword();
			readingNameString = objPeople.getReadingName();
			birthdayString = objPeople.getBirthday();
			sexString = objPeople.getSex();
			userAddressString = objPeople.getContactAddress();
			emailString = objPeople.getContactEmail();
			email2String = objPeople.getContactEmail2();
			contactTelString = objPeople.getContactTel();
			customMsgDirString = objPeople.getCustomMsgDir();

			//Beanにセットする
			peopleFormInfoBean.setUsernameString(userNameString);
			peopleFormInfoBean.setLoginIDString(loginIDString);
			peopleFormInfoBean.setForeignIDString(foreignIDString);
			peopleFormInfoBean.setPasswordString(passwordString);
			//確認用パスワード
			peopleFormInfoBean.setPasswordSureString(passwordString);
			peopleFormInfoBean.setReading_nameString(readingNameString);
			peopleFormInfoBean.setBirthdayString(birthdayString);
			peopleFormInfoBean.setSexString(sexString);
			peopleFormInfoBean.setUseraddressString(userAddressString);
			peopleFormInfoBean.setEmailString(emailString);
			peopleFormInfoBean.setEmail2String(email2String);
			peopleFormInfoBean.setContact_telString(contactTelString);
			peopleFormInfoBean.setTxtDescriptionString(customMsgDirString);

			//正常終了			
			return peopleFormInfoBean;
		} catch (XmsException xmsException) {
			throw xmsException;
		} catch (Exception e) {
			throw new XmsInnerException(e);
		}
	}

	/**
	 * 兼務の項目のURLに含めるユーザIDパスの配列を生成する。<br>
	 * ユーザ参照リストを、URLに含められる形式に変換する。 
	 * @param parentGroupID ユーザの親グループID。
	 * @param userReferenceArray ユーザ参照リスト。 
	 * @return 兼務の項目のURLに含めるユーザIDパスの配列。
	 * */
	private String[] createIDPathArray(String parentGroupID, String[][] userReferenceArray)
		throws XmsException {
		String[] idPathArray = null;

		try {
			idPathArray = new String[userReferenceArray[0].length];
			for (int i = 0; i < userReferenceArray[0].length; i++) {
				String idPath = "";
				String firstPath = "";
				String lastPath = "";

				idPath = userReferenceArray[0][i];

				int intPos = idPath.lastIndexOf('/');
				String strPathParentID =
					idPath.substring(idPath.lastIndexOf('/', intPos - 1) + 1, intPos);
				if (strPathParentID.equals(parentGroupID)) {
					// ツリー画面で選択したグループIDと、同じグループID下の
					// ユーザへの参照は、更新画面に表示しないため、IDパスもnullを格納する。
					idPathArray[i] = null;
					//IDパスを生成する必要は無いので、continueする。
					continue;
				}

				//URLに含める形式に、IDパスを編集する。
				firstPath = idPath.substring(0, idPath.lastIndexOf('/'));
				lastPath = idPath.substring(idPath.lastIndexOf('/') + 1, idPath.length());
				idPath = firstPath + "," + lastPath;
				idPathArray[i] = idPath;
			}

			return idPathArray;
		} catch (Exception e) {
			throw new XmsInnerException(e);
		}
	}

	/**
	 * 権限の配列を生成する。
	 * @param userID ユーザのID。
	 * @param inputFrameErrorBean エラー情報格納用Bean。 
	 * @return 権限が格納された配列。[n][0]：ロールID、[n][1]：ロール名、[n][2]：グループID、[n][3]：グループ名が格納される。（nは権限の数-1を最大値とする整数）
	 * */
	private String[][] crateRoleArray(String userID, InputFrameErrorBean inputFrameErrorBean)
		throws XmsException {
		// ユーザ権限リストの検索処理
		RoleAssignmentsClient objRoleAssignmentsXMO = null;
		RolesClient objRolesXMO = null;
		Vector vecRolesList = null;
		objRoleAssignmentsXMO = null;
		try {
			try {
				vecRolesList = new Vector();
				objRoleAssignmentsXMO = new RoleAssignmentsClient();
				objRoleAssignmentsXMO.setWhereUserID(userID);
				if (objRoleAssignmentsXMO.select() == false) {
					//検索に失敗したとき

					inputFrameErrorBean = new InputFrameErrorBean();
					String errorMessage = objRoleAssignmentsXMO.getMessage();
					inputFrameErrorBean.setErrorMessage(errorMessage);

					//エラー画面に表示するボタンを「閉じる」に設定する。
					//ここでエラーが起きる場合、原因はユーザ操作ミス以外のため、
					//戻ってもユーザ更新を続行できない。
					inputFrameErrorBean.setButtonType(InputFrameErrorBean.BUTTON_TYPE_CLOSE);

					//エラー状態であり処理の続行が不可能なので、メソッドを終了する。			
					return null;
				}
			} catch (Exception e) {
				//あっては困る状態なので、システム例外を投げる
				throw new XmsSystemException(e);
			}

			while (objRoleAssignmentsXMO.next()) {
				String strRoleID = objRoleAssignmentsXMO.getRoleID();
				String strGroupID = objRoleAssignmentsXMO.getGroupID();

				// グループ名取得
				GroupsClient objGroupsXMO = null;
				try {
					objGroupsXMO = new GroupsClient();
					// 検索条件の設定
					objGroupsXMO.setWhereGroupID(strGroupID);
					if (objGroupsXMO.select() == false) {
						inputFrameErrorBean = new InputFrameErrorBean();
						String errorMessage = objGroupsXMO.getMessage();
						inputFrameErrorBean.setErrorMessage(errorMessage);

						//エラー画面に表示するボタンを「閉じる」に設定する。
						//ここでエラーが起きる場合、原因はユーザ操作ミス以外のため、
						//戻ってもユーザ更新を続行できない。
						inputFrameErrorBean.setButtonType(InputFrameErrorBean.BUTTON_TYPE_CLOSE);

						//エラー状態であり処理の続行が不可能なので、メソッドを終了する。			
						return null;
					}
				} catch (Exception e) {
					//あっては困る状態なので、システム例外を投げる
					throw new XmsSystemException(e);
				}
				// グループ名の取得
				String strGroupName = "";
				if (objGroupsXMO.next() == true) {
					strGroupName = objGroupsXMO.getGroupName();
				} else {
					inputFrameErrorBean = new InputFrameErrorBean();
					String errorMessage = objGroupsXMO.getMessage();
					inputFrameErrorBean.setErrorMessage(errorMessage);

					//エラー画面に表示するボタンを「閉じる」に設定する。
					//ここでエラーが起きる場合、原因はユーザ操作ミス以外のため、
					//戻ってもユーザ更新を続行できない。
					inputFrameErrorBean.setButtonType(InputFrameErrorBean.BUTTON_TYPE_CLOSE);

					//エラー状態であり処理の続行が不可能なので、メソッドを終了する。			
					return null;
				}

				// ロール情報取得
				objRolesXMO = null;
				try {
					objRolesXMO = new RolesClient();
					// 検索条件の設定
					objRolesXMO.setWhereRoleID(strRoleID);
					if (!objRolesXMO.select()) {
						// 検索がうまくいかなかった場合

						inputFrameErrorBean = new InputFrameErrorBean();
						String errorMessage = objRolesXMO.getMessage();
						inputFrameErrorBean.setErrorMessage(errorMessage);

						//エラー画面に表示するボタンを「閉じる」に設定する。
						//ここでエラーが起きる場合、原因はユーザ操作ミス以外のため、
						//戻ってもユーザ更新を続行できない。
						inputFrameErrorBean.setButtonType(InputFrameErrorBean.BUTTON_TYPE_CLOSE);

						//エラー状態であり処理の続行が不可能なので、メソッドを終了する。			
						return null;
					}
				} catch (Exception e) {
					//あっては困る状態なので、システム例外を投げる
					throw new XmsSystemException(e);

				}
				// ロール名称取得
				if (objRolesXMO.next()) {
					String[] strRolesInfo = new String[4];
					strRolesInfo[0] = objRolesXMO.getRoleID();
					strRolesInfo[1] = objRolesXMO.getRoleName();
					strRolesInfo[2] = strGroupID;
					strRolesInfo[3] = strGroupName;
					vecRolesList.add(strRolesInfo);
				} else {
					//ロール名が存在しない場合エラーを出力する
					inputFrameErrorBean = new InputFrameErrorBean();
					String errorMessage = "ロール名が存在しません。";
					inputFrameErrorBean.setErrorMessage(errorMessage);

					//エラー画面に表示するボタンを「閉じる」に設定する。
					//ここでエラーが起きる場合、原因はユーザ操作ミス以外のため、
					//戻ってもユーザ更新を続行できない。
					inputFrameErrorBean.setButtonType(InputFrameErrorBean.BUTTON_TYPE_CLOSE);

					//エラー状態であり処理の続行が不可能なので、メソッドを終了する。			
					return null;
				}
			}

			//権限リストをベクターから配列にコピーする。
			String[][] strRolesCopy = new String[vecRolesList.size()][4];
			vecRolesList.copyInto(strRolesCopy);

			return strRolesCopy;
		} catch (XmsException xmsException) {
			throw xmsException;
		} catch (Exception e) {
			throw new XmsInnerException(e);
		}

	}
}
