/*
このファイルの中身は、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) ______________________________________.
*/

//
//	User ログインユーザ情報管理クラス
//			変更履歴
//				2004/01/08	新規作成		柴田宗近
//
package jp.co.ntt.lms.xms.common.user;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.Vector;

import jp.co.ntt.lms.xmo.XMOPropertyDef;
import jp.co.ntt.lms.xmo.Ad.ADCorpClient;
import jp.co.ntt.lms.xmo.People.PeopleClient;
import jp.co.ntt.lms.xmo.RoleAssignments.RoleAssignmentsClient;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsInnerException;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.login.base.Role;
import jp.co.ntt.lms.xms.login.base.ViewAuthorityInfo;
import jp.co.ntt.lms.xms.login.base.XMO;

/**
 * ログインユーザ情報管理クラス。<BR>
 * 
 * ログイン、権限取得の共通クライアント部品です。<BR>
 * 
 */
public class User {

	/**
	 * ユーザID<BR>
	 */
	private String userID = null;

	/**
	 * ログインID<BR>
	 */
	private String loginID = null;

	/**
	 * パスワード<BR>
	 */
	private String password = null;

	/**
	 * 存在フラグ<BR>
	 * ture : 存在した<BR>
	 * false: 存在しない<BR>
	 */
	private boolean checkResultExist = false;

	/**
	 * 削除済みフラグ<BR>
	 * ture : 削除済み<BR>
	 * false: 削除されていない<BR>
	 */
	private boolean checkResultDeleted = true;

	/**
	 * パスワード一致フラグ<BR>
	 * ture : パスワード一致した<BR>
	 * false: パスワード一致していない<BR>
	 */
	private boolean checkResultAgreePassword = false;

	/**
	 * ADログインフラグ<BR>
	 * ture : ADにログインIDが存在した<BR>
	 * false: ADにログインIDが存在しない<BR>
	 */
	private boolean checkResultADLogin = false;

	/**
	 * 削除フラグ（削除済み）<BR>
	 */
	private final String FLAG_DELETED = "1";

	/**
	 * グループのツリータイプを表します<BR>
	 */
	private final String GROUP_TYPE = "1";

	/**
	 * Encode指定<BR>
	 */
	private final String AD_ENC = "Windows-31J";
	/**
	 * デフォルトコンストラクタ
	 */
	public User() {}

	/**
	 * ユーザIDを取得します。<BR>
	 * @return String ユーザID
	 */
	public String getUserID() {
		return this.userID;
	}

	/**
	 * ログインIDを取得します。<BR>
	 * @return String ログインID
	 */
	public String getLoginID() {
		return this.loginID;
	}

	/**
	 * パスワードを取得します。<BR>
	 * @return String パスワード
	 */
	public String getPassword() {
		return this.password;
	}

	/**
	 * 存在フラグを取得します。<BR>
	 * @return boolean true: 存在している false: 存在していない
	 */
	public boolean isExist() {
		return this.checkResultExist;
	}

	/**
	 * 削除済みフラグを取得します。<BR>
	 * @return boolean true: 削除済み false: 未削除
	 */
	public boolean isDeleted() {
		return this.checkResultDeleted;
	}

	/**
	 * パスワード一致フラグを取得します。<BR>
	 * @return boolean true: パスワード一致 false: パスワード不一致
	 */
	public boolean isAgreePassword() {
			return this.checkResultAgreePassword;
	}

	/**
	 * ADログインフラグを取得します。<BR>
	 * @return boolean true: ADにログインIDが存在した false: ADにログインIDが存在しない
	 */
	public boolean isADLogin() {
			return this.checkResultADLogin;
	}

	/**
	 * 権限割当フラグを取得します。<BR>
	 * ログインユーザに割り当てられている役割のリストを取得し、
	 * そのリストの数から判断します。<BR>
	 * @return boolean true: 権限割り当て済み false: 権限未割り当て
	 * @exception XmsException  システムエラー
	 */
	public boolean isRolesAssignment() 
		throws XmsException {

		// 役割リストを取得
		Vector roleTempList = this.getRoleList();

		// ログインユーザに対する役割が存在していたかどうか
		if( roleTempList.size() > 0 ){
			// 存在していた場合

			// true返却
			return true;
		}

		// 存在していない場合はfalseを返却
		return false;
	}

	/**
	 * 学習者フラグを取得します。<BR>
	 * 権限情報保持クラスリストを取得し、<BR>
	 * 学習者の権限があるかどうか判定します<BR>
	 * @return boolean true: 学習者 false: 学習者以外
	 * @exception XmsException  システムエラー
	 */
	public boolean isLearner() 
		throws XmsException {

		//-------------------------------------------------------------------------------
		// 学習者とは？
		//   ユーザに割り当てられている権限（XMOEntry）のうち、
		//      学習のみを持つ場合
		//      ログ管理のみを持つ場合
		//      学習とログ管理のみを持つ場合
		//   のいずれか。  
		//-------------------------------------------------------------------------------

		// 返却用学習者フラグ
		boolean learnerReturnFlag = true;

		// 権限情報保持クラスリストを取得
		Vector XMOList = this.getXMOList();

		// 権限情報保持クラスの数を取得
		int XMOListCount = XMOList.size();
		
		// 権限情報保持クラスの数分繰り返し
		for( int i = 0; i < XMOListCount; i++ ){

			// 権限情報保持クラスを取得
			XMO XMOObject = ( XMO ) XMOList.get( i );

			// クラス名称を取得
			String className = XMOObject.getClassName();

			//----------------------------------------------------------------------------
			// 学習権限でない権限がひとつでもあった場合はこのユーザは学習者ではなくなる
			// クラス名称が「learn」である　または「log」であるかどうか
			// この真偽値が学習者フラグに設定される
			//----------------------------------------------------------------------------
			// 2005.03.22 Modified by N.Umehara メソッド学習者を追加。
			learnerReturnFlag = (className.equals( XMOPropertyDef.LEARN_XMO ) 
									|| className.equals( XMOPropertyDef.LOG_XMO )
										|| className.equals( XMOPropertyDef.METHOD_LEARN_XMO ));

			// 学習者じゃなくなったかどうか
			if( learnerReturnFlag == false ){
				// 学習者じゃなくなった場合
				// 調べる必要がないのでループ終了
				break;
			}
		}

		// 学習者フラグを返却
		return learnerReturnFlag;
	}

	/**
	 * 初期ツリータイプを取得します。<BR>
	 * 画面表示制御情報保持クラスリストを取得し、<BR>
	 * 優先度が高い（数字が一番小さい）画面表示制御情報のツリータイプを<BR>
	 * 初期ツリータイプとします<BR>
	 * @return String 初期ツリータイプ
	 * @exception XmsException  システムエラー
	 */
	public String getDefaultTreeType() 
		throws XmsException {

		// 画面表示制御情報保持クラスリストを取得
		Vector viewAuthorityInfoList = this.getViewAuthorityInfoList();

		// 優先度の高い画面表示制御情報クラスを取得する
		ViewAuthorityInfo viewAuthorityInfoObject = (ViewAuthorityInfo) viewAuthorityInfoList.get( 0 );

		// ツリータイプを取得する
		String defaultTreeType = viewAuthorityInfoObject.getTreeViewType();

		// そのツリータイプを返却する
		return defaultTreeType;
	}

	/**
	 * ユーザが持っているグループツリーの値を取得します。<BR>
	 * 権限情報保持クラスリストを取得し、<BR>
	 * グループツリーの権限を持っていればその値（ "1" ）を返却します<BR>
	 * 持っていなければ空文字「""」を返却します<BR>
	 * @return String グループツリータイプ
	 * @exception XmsException  システムエラー
	 */
	public String getGroupTreeType() 
		throws XmsException {

		// 返却用グループツリータイプ
		String groupTreeTypeReturn = "";

		// 権限情報保持クラスリストを取得
		Vector XMOList = this.getXMOList();

		// 権限情報保持クラスの数を取得
		int XMOListCount = XMOList.size();

		// 権限情報保持クラスの数分繰り返し
		for( int i = 0; i < XMOListCount; i++ ){

			// 権限情報保持クラスを取得
			XMO XMOObject = ( XMO ) XMOList.get( i );
			// ツリー表示タイプを取得
			String groupTreeTypeTemp = XMOObject.getTreeViewType();

			// 返却用グループツリータイプがから文字の時のみ比較を行う
			// ツリー表示タイプが"グループ"のものが１つでもあれば返却したい値は決まるから
			if( groupTreeTypeReturn.equals( "" ) == true ) {

				// ツリー表示タイプがグループツリー表示かどうか
				if( groupTreeTypeTemp.equals( GROUP_TYPE ) == true ){
					// グループツリー表示だった場合

					// グループツリーにその値を設定
					groupTreeTypeReturn = GROUP_TYPE;

					// 設定したらもう調べる必要はないのでループ終了
					break;
				}
			}
		}

		// グループツリータイプを返却
		return groupTreeTypeReturn;
	}

	/**
	 * 画面からのログイン処理を実行する。<BR>
	 * 以下の処理を行う。
	 * <PRE>
	 * 1. ログインIDの存在チェック
	 * 2. 削除フラグのチェック
	 * 3. パスワードのチェック
	 * </PRE>
	 * @param loginID ログインID
	 * @param password パスワード
	 * @return boolean true: ログイン成功 false: ログイン失敗
	 * @exception XmsException  システムエラー
	 */
	public boolean checkLogin( String loginID, String password ) 
		throws XmsException {

		// パラメータチェック（nullチェック）
		if( loginID == null || password == null ) {
			throw new XmsInnerException( "パラメータエラー" );
		}
		
		try {
			// ログインIDの存在チェック
			// 人管理XMOの取得
			PeopleClient peopleObject = null;
			
	
			peopleObject = new PeopleClient();
	
			// ログインIDを検索条件とする
			peopleObject.setWhereLoginID( loginID );
	
			// Peopleテーブルを検索
			if( peopleObject.select() == false ) {
				// XMOアクセス時で処理が失敗した場合
				// 例外をスロー
				throw new XmsSystemException( peopleObject.getMessage() );
			}
	
			// ログインIDが存在したかどうか
			if( peopleObject.next() == false ) {
				// 指定されたログインIDが存在しなかった場合の処理
				return false;
			}
	
	
			// ログインIDに対応するレコードが存在する場合
	
			// ログインユーザ存在した
			this.checkResultExist = true;
	
			// 削除フラグチェック
			String deletedTemp = peopleObject.getDeleteFlag();
	
			// 削除状態になっていたかどうか
			//-----------------------------------------------------------------------------
			// 削除状態とは
			//   ログインIDのレコードは存在するが、削除フラグが「1」になっていること。
			//   AD同期処理によって作られたユーザを削除した場合（未所属となる）が削除状態。
			//-----------------------------------------------------------------------------
			if( deletedTemp.equals( FLAG_DELETED ) == true ) {
				// 削除されていた場合
				return false;
			}
	
			// 削除済みではない
			this.checkResultDeleted = false;
	
			// パスワードが一致しなかった場合はSendMail.jspでユーザIDを使用することがあるので、
			// この時点でプロパティにユーザIDを設定する
			this.userID = peopleObject.getUserID();
	
			// パスワードチェック
			String passwordTemp = peopleObject.getEncryptPassword();
	
			// パスワードが一致しているかどうか
			if( passwordTemp.equals( password ) == false ) {
				// パスワードが一致していなかった場合
				return false;
			}
	
			// パスワード一致した
			this.checkResultAgreePassword = true;
	
			// ここまで来ればログインIDとパスワードは妥当である
	
			// プロパティに設定
			//　ログインID
			this.loginID = loginID;
			// パスワード
			this.password = password;
		}
		catch( XmsException ex ) {
			throw ex;	
		}
		catch( Exception ex ) {
			throw new XmsSystemException( ex );	
		}
		
		// ここまでくればログイン処理は正常
		return true;
	}

	/**
	 * ADのログイン処理を実行する。<BR>
	 * 以下の処理を行う。
	 * <PRE>
	 * 1. ADの認証チェック
	 * 2. ログインIDの存在チェック
	 * 3. 削除フラグのチェック
	 * </PRE>
	 * @param loginID ログインユーザ名称
	 * @param password ドメイン名
	 * @return boolean true: ADログイン成功 false: ADログイン失敗
	 * @exception XmsException 予期しない例外(RMI例外など)
	 */
	public boolean checkADLogin( String logonUser, String domainName ) 
		throws XmsException {

		// パラメータチェック
		if( logonUser == null || domainName == null ) {
			throw new XmsInnerException( "パラメータエラー" );
		}

		// パラメータチェック（空文字チェック）
		if( logonUser.equals( "" ) || domainName.equals( "" ) ) {
			throw new XmsInnerException( "パラメータエラー" );
		}
		
		try {
			// 認証/登録処理
			ADCorpClient ADObject = new ADCorpClient();
	
			//--------------------------------------------------------------------------
			//  ADの認証処理とは
			//    AD同期処理が行われていることが前提。
			//    ログオンユーザ名とはAD内でのユーザIDのこと。
			//    以下、チェック内容
			//      AD同期処理が行われていない場合はNG。
			//        AD同期処理が行われているかどうかの判断基準：
			//          ADcorp.iniに設定されている最初（_01となっている）のADが存在するかどうか
			//      ドメイン名のAD内にログオンユーザ名が存在するかどうかをチェックし、
			//      存在する場合は、XMS2内のPeopleテーブル内に存在するかチェックする。
			//      AD内にログオンユーザ名が存在しない場合はNG。
			//      AD内にログオンユーザ名が存在するが、Peopleテーブル内に存在しない場合は
			//      ユーザ情報を作成する。
			//        →理由：管理者の手間を省く親切機能。
			//--------------------------------------------------------------------------
	
			// Active Directoryによる認証処理
			// 正常な場合はXMS2のログインIDが返ってくる
			String loginIDTemp = ADObject.certify( logonUser, domainName );
	
			// ログインIDを取得できた（AD認証ＯＫ）かどうか
			if( loginIDTemp == null ){
				// ADログイン処理失敗
				return false;
			}
	
			// 取得できた場合
	
			// ADにログインIDが存在した
			this.checkResultADLogin = true;
	
			// ログインIDを元にユーザー情報を検索し、ログオン状態にする
	
			// Peopleオブジェクト生成
			PeopleClient peopleObject = new PeopleClient();
	
			// エンコードをWindows-31Jで設定する
			peopleObject.setEncode( AD_ENC );
	
			// 検索条件にログインIDを設定
			peopleObject.setWhereLoginID( loginIDTemp );
	
			// 検索でエラーが発生したかどうか
			if( peopleObject.select() == false ){
	
				// 検索がうまくいかなかった場合
				throw new XmsSystemException( peopleObject.getMessage() );
			}
	
			// ログインIDが存在したかどうか
			if( peopleObject.next() == false ){
				// ログインIDが存在しなかった場合
				return false;
			}
	
			// ログインユーザ存在した
			this.checkResultExist = true;
	
			// 削除フラグチェック
			String deletedTemp = peopleObject.getDeleteFlag();
	
			// 削除状態になっていたかどうか
			//-----------------------------------------------------------------------------
			// 削除状態とは
			//   ログインIDのレコードは存在するが、削除フラグが「1」になっていること。
			//   AD同期処理によって作られたユーザを削除した場合（未所属となる）が削除状態。
			//-----------------------------------------------------------------------------
			if( ( deletedTemp != null ) && ( deletedTemp.equals( FLAG_DELETED ) == true ) ) {
				// 削除されていた場合
				return false;
			}
	
			// 削除済みではない
			this.checkResultDeleted = false;
	
			// プロパティに設定
			// ユーザID
			this.userID = peopleObject.getUserID();
			//　ログインID
			this.loginID = loginIDTemp;
			// パスワード
			this.password = peopleObject.getEncryptPassword();
		
		}
		catch(XmsException ex) {
			throw ex;	
		}
		catch(Exception ex) {
			throw new XmsSystemException(ex);	
		}
		
		// ここまで来たらADログイン処理は正常である
		return true;
	}

	/**
	 * 役割情報リストを取得します。<BR>
	 * <PRE>
	 * 1. ユーザIDをもとにRolesAssignmentsテーブルを検索します
	 * 2. 重複している役割は省きます
	 * 3. 役割情報をVectorに格納して返却します
	 * </PRE>
	 * @param なし
	 * @return Vector 役割情報リスト 
	 * @exception XmsException  システムエラー
	 */
	public Vector getRoleList()
		throws XmsException {
		
		// userID が取得設定されていない場合は内部エラーとする
		if( this.userID == null ) {
			throw new XmsInnerException( "userID is null!" );	
		}
		
		try {
			// 権限割当XMOクライアントのインスタンス化
			RoleAssignmentsClient roleAssignmentsObject = new RoleAssignmentsClient();
	
			// ユーザIDを検索条件とする
			roleAssignmentsObject.setWhereUserID( this.userID );
	
			// RolesAssignmentsテーブルを検索する
			// エラーが発生しているかどうか
			if( roleAssignmentsObject.select() == false ) {
				// ＸＭＯアクセス時で処理が失敗した場合
				// 例外をスロー
				throw new XmsSystemException( roleAssignmentsObject.getMessage() );
			}
	
			// マージ用ロールIDリスト
			Vector roleIDMargeList = new Vector();
	
			// 返却用のベクター
			Vector roleReturnList = new Vector();
	
			// ログインユーザが持っている役割の数分だけ繰り返し
			while( roleAssignmentsObject.next() == true ) {
	
				// ロールID取得
				String roleID = roleAssignmentsObject.getRoleID();
	
				// ロールIDが重複しているかどうか
				if( roleIDMargeList.contains( roleID ) == true ){
					// 重複している場合は省く
					continue;
				}
	
				// 次の重複チェックのためにマージ用リストに今のロールIDを格納
				roleIDMargeList.add( roleID );
	
				// 役割情報保持クラスを生成する
				// ロールIDを設定する
				Role roleObject = new Role( roleID );
	
				// 役割情報保持クラス初期化
				roleObject.load();
	
				// ベクターに格納
				roleReturnList.add( roleObject );
			}

			// 役割情報保持クラスリストを返却する
			return roleReturnList;
		}
		catch(XmsException ex) {
			throw ex;	
		}
		catch(Exception ex) {
			throw new XmsSystemException(ex);
		}	
	}

	/**
	 * 画面表示制御情報保持クラスリストを取得する。<BR>
	 * 画面表示制御情報保持クラスリストを重複を省いて<BR>
	 * 優先度でソートして返却する<BR>
	 * @param なし
	 * @return Vector 画面表示制御情報保持クラスリスト
	 * @exception Exception 予期しない例外(RMI例外など)
	 * @exception XmsSystemException  システムエラー
	 */
	public Vector getViewAuthorityInfoList()
		throws XmsException {

		// 返却用画面表示制御情報保持クラスリスト
		Vector viewAuthorityInfoReturnList = new Vector();		

		// マージ用画面表示制御情報保持クラスリスト
		Vector viewAuthorityInfoMargeList = new Vector();

		// ソート用画面表示制御情報保持クラスリスト
		Vector viewAuthorityInfoSortList = new Vector();

		// ソート用優先度リスト
		Vector sortPriorityList = new Vector();

		// 重複を省いた権限リストを取得
		Vector XMOList = this.getXMOList();

		// 権限リストの数を取得
		int XMOCount = XMOList.size();

		// 権限リストの数分繰り返し
		for( int i = 0; i < XMOCount; i++ ){

			// 権限クラスを取得
			XMO XMOObject = (XMO) XMOList.get( i );

			// 初期メニュー名称を取得
			String iniMenu = XMOObject.getIniMenu();

			// 初期メニュー名称が空（""）かどうか
			if( iniMenu.equals( "" ) == true ) {
				// 空の場合は対象外
				continue;
			}

			// 初期メニュー名称が重複しているかどうか
			if( viewAuthorityInfoMargeList.contains( iniMenu ) == true ) {

				// 重複している場合

				// ソート用リストの数を取得
				int viewAuthorityInfoSortListCount = viewAuthorityInfoSortList.size();

				// ソート用リストの数分だけ繰り返し
				for( int j = 0; j < viewAuthorityInfoSortListCount; j++ ){

					// 重複した初期メニュー名称を持つオブジェクトに
					// 権限リストを追加する

					// ソート用リストからオブジェクトを取り出す
					ViewAuthorityInfo iniMenuObject = ( ViewAuthorityInfo ) viewAuthorityInfoSortList.get( j );

					// 返却用リストから初期メニューが重複したオブジェクトを探す
					if( iniMenuObject.getIniMenu().equals( iniMenu ) == true ){
						// 一致した場合

						// 返却用リストの権限リストに追加
						iniMenuObject.addXMOList( XMOObject );

						// 追加後は探す必要がないのでループ終了
						break;
					}
				}

				// 初期メニュー名称の重複は省く
				continue;
			}

			// ここまでくれば初期メニュー名称で絞り込まれている

			// マージ用リストに初期メニュー名称を追加
			viewAuthorityInfoMargeList.add( iniMenu );

			// ソート用ベクターに優先度を格納
			sortPriorityList.add( new Integer( XMOObject.getPriority() ) );

			// コンストラクタに設定する権限情報保持クラスリストを生成
			Vector XMOTempList = new Vector();

			// そのクラスリストに権限情報保持クラスを追加
			XMOTempList.add( XMOObject );

			// 画面表示制御情報保持クラスを生成
			// コンストラクタでプロパティ設定
			ViewAuthorityInfo viewAuthorityInfoObject = new ViewAuthorityInfo( iniMenu,
																				XMOObject.getTreeViewType(),
																				XMOObject.getPriority(),
																				XMOTempList );

			// ソート用リストに追加
			viewAuthorityInfoSortList.add( viewAuthorityInfoObject );
		}

		// ソート用リストから優先度の昇順で返却用リストへ移し替える

		// 優先度のソート
		// パラメータのベクターが昇順でソートされる
		Collections.sort( sortPriorityList );

		// ソート対象の数を取得（優先度）
		int sortPriorityListCount = sortPriorityList.size();

		// ソート対象の数分だけ繰り返し
		for( int i = 0; i < sortPriorityListCount; i++ ){

			// 優先度を取得
			Integer priority = (Integer) sortPriorityList.get( i );

			// ソート対象の数分だけ繰り返し（優先度の数と同じ数だけ並び替えたいオブジェクトがあるから）
			// 同じ優先度を持っているクラスを探して返却用リストに追加する
			for( int j = 0; j < sortPriorityListCount; j++ ){

				// ソートの対象となる画面表示制御情報保持クラスを取得
				ViewAuthorityInfo viewAuthorityInfoTempObject = ( ViewAuthorityInfo ) viewAuthorityInfoSortList.get( j );

				// 画面表示制御情報保持クラスの優先度を取得
				Integer priorityTarget = new Integer( viewAuthorityInfoTempObject.getPriority() );

				// 優先度が一致しているかどうか
				if( priorityTarget.equals( priority ) == true ){
					// 一致している場合

					// ソート対象の画面表示制御情報クラスを返却用リストに追加
					viewAuthorityInfoReturnList.add( viewAuthorityInfoTempObject );

					// 追加後は探す必要がないのでループ終了
					break;
				}
			}
		}

		// 画面表示制御情報保持クラスリストを返却する
		return viewAuthorityInfoReturnList;
	}

	
	/**
	 * 保持している権限のID集合を取得する。<br>
	 * 
	 * @return Set 権限のID(String)を要素とするSet。<br>
	 *              権限を保持していない場合は空要素のSetを戻す。
	 * 
	 * @throws XmsException 処理中に例外が発生した場合。
	 */
	public Set getXMOIds() throws XmsException {
		
		// このメソッドの戻り値
		Set XMOIds = null;
		// 保持しているＸＭＯリスト
		Vector XMOList = null;
		// 保持している1ＸＭＯ
		XMO xmo = null;
		// 保持しているＸＭＯのＩＤ
		String xmoId = null;
		try {
			XMOIds = new HashSet();
			XMOList = this.getXMOList();
			for ( int i=0; i < XMOList.size() ; i++ ) {
				xmo = (XMO)XMOList.get(i);
				xmoId = xmo.getXMOID();
				if ( xmoId != null ) {
					XMOIds.add(xmoId);
				}
			}
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsInnerException( e );
		}
		
		return XMOIds;
	}

	/**
	 * 権限情報保持クラスリストを取得する。<BR>
	 * 権限情報保持クラスリストを重複を省いて返却する<BR>
	 * @param なし
	 * @return Vector 権限情報保持クラスリスト
	 * @exception Exception 予期しない例外(RMI例外など)
	 * @exception XmsSystemException  システムエラー
	 */
	public Vector getXMOList()
		throws XmsException {

		// 役割情報保持クラスリストを取得
		Vector roleTempList = this.getRoleList();

		// 返却用権限リスト
		Vector XMOReturnList = new Vector();

		// マージ用権限リスト
		Vector XMOMargeList = new Vector();

		// 役割情報保持クラス数を取得
		int roleCount = roleTempList.size();

		// 役割情報保持クラス数分繰り返し
		for( int i = 0; i < roleCount; i++ ){

			// 役割情報保持クラスリストから役割情報保持クラスリストを取得
			Role roleTempObject = ( Role ) roleTempList.get( i );

			// 役割情報保持クラスから権限リストを取得する
			Vector XMOTempList = roleTempObject.getXMOList();

			// 権限リストの数を取得
			int XMOListCount = XMOTempList.size();

			// 権限リスト数分繰り返し
			for( int j = 0; j < XMOListCount; j++ ){

				// 権限クラスを取得
				XMO XMOTempObject = ( XMO ) XMOTempList.get( j );

				// XMOIDが重複しているかどうか
				if( XMOMargeList.contains( XMOTempObject.getXMOID() ) == true ){
					// 重複している場合
					continue;
				}

				// マージ用権限リストに追加
				XMOMargeList.add( XMOTempObject.getXMOID() );

				// 返却用権限リストに追加
				XMOReturnList.add( XMOTempObject );
			}
		}

		// XMOIDリストを返却する
		return XMOReturnList;
	}
}