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

//
//	Roles 管理XMO クライアントクラス
//			変更履歴
//				2004.01.08	新規作成	二條智文

package jp.co.ntt.lms.xmo.Roles;

import java.rmi.RemoteException;
import java.util.*;

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.xmo.*;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.Environment;

//ADD 2005/02/02 START MASUDA [LO一覧(履修済み/中)対応]
import jp.co.ntt.lms.xmo.RoleAssignments.RoleAssignmentsClient;
import jp.co.ntt.lms.xmo.RoleAssignments.RoleAssignmentsData;
//ADD 2005/02/02 END MASUDA [LO一覧(履修済み/中)対応]

/**
 * Roles 管理XMO クライアントクラスです。<BR>
 * このクラスはRoles XMO サーバクラスとの接続および、
 * 登録、更新、削除、検索処理に必要なパラメータの設定、検索後の
 * 検索結果の取得メソッドを提供します。<BR>
 * @author T.Nijou
 * @version 0.0.0.1 2004.01.08
 */
public class RolesClient extends XMOBasicClient
	implements RolesTable
{

	// メソッド名定義
	private static final String METHOD_INSERTXMO  = "insertXmoRelation";
	private static final String METHOD_UPDATEXMO  = "updateXmoRelation";
	private static final String METHOD_DELETEXMO  = "deleteXmoRelation";
	private static final String METHOD_SELECTXMO  = "selectXmoRelation";
	private static final String METHOD_SELECTFUNC = "selectFunction";
//	ADD 2005/02/02 START MASUDA [LO一覧(履修済み/中)対応]
	private static final String METHOD_SELECTROLEFUNC = "selectRolesFunction";
//	ADD 2005/02/02 END MASUDA

	/** 接続先サーバクラス名です */
	private static final String CLASS_NAME = "jp.co.ntt.lms.xmo.Roles.Roles";
	
	/** FunctionからRoleIdを検索した結果格納用変数 */
	private String[] mobjRoleIdList = null;

	/**
	 * コンストラクタです。<BR>
	 * 親クラスのコンストラクタを呼び出し、接続先サーバクラス名を
	 * 設定します。
	 */
	public RolesClient() throws Exception {
		super( CLASS_NAME );
	}

	/**
	 * パラメータにロールIDをセットします
	 */
	public void setRoleID( String strData ) {
		putData( ROLEID, strData );
	}

	/**
	 * 検索結果の現在のインデックスのロールIDを取得します
	 */
	public String getRoleID() {
		RolesData objData = (RolesData)getResult();
		return objData.getRoleID();
	}

	/**
	 * パラメータにロール名をセットします
	 */
	public void setRoleName( String strData ) {
		putData( ROLENAME, strData );
	}

	/**
	 * 検索結果の現在のインデックスのロール名を取得します
	 */
	public String getRoleName() {
		RolesData objData = (RolesData)getResult();
		return objData.getRoleName();
	}

	/**
	 * パラメータにXmoIDをセットします
	 */
	public void setXmoID( String strData ) {
		putData( XMOID, strData );
	}

	/**
	 * 検索結果の現在のインデックスのロールIDを取得します
	 */
	public String getXmoID() {
		RolesData objData = (RolesData)getResult();
		return objData.getXmoID();
	}

	/**
	 * パラメータに関連XMOIDをセットします
	 */
	public void addRelatedID( String strRelatedID ) {

		Vector vecRelatedIDList = (Vector)htParams.get( RELATEDID );
		if( vecRelatedIDList == null ) {
			vecRelatedIDList = new Vector();
			htParams.put( RELATEDID, vecRelatedIDList );
		}
		vecRelatedIDList.add( setChar( strRelatedID ) );
	}

	/**
	 * 関連XMOIDを取得します
	 * @return String 関連XMOID
	 */
	public String getRelatedID( int index ) {
		RolesData objData = (RolesData)getResult();
		return objData.getRelatedID(index);
	}

	/**
	 * 関連XMOID数を取得します
	 * @return int 関連XMOID数
	 */
	public int getRelatedIDCount() {
		RolesData objData = (RolesData)getResult();
		return objData.getRelatedIDCount();
	}

	/**
	 * パラメータに隠しフラグをセットします
	 */
	public void setDeleted( String strData ) {
		putData( DELETED, strData );
	}

	/**
	 * 検索結果の現在のインデックスの隠しフラグを取得します
	 */
	public String getDeleted() {
		RolesData objData = (RolesData)getResult();
		return objData.getDeleted();
	}

	/**
	 * パラメータに機能(XMOID)をセットします
	 */
	public void addFunction( String strFunction ) {

		Vector vecFunctionList = new Vector();
		try{
			// 環境ファイルからDB種別情報取得
			Environment objEnv = new Environment();
			//DB種別情報が "0" の時　MS SQLServer
			//DB種別情報が "1" の時　Oracle
			//DB種別情報が "2" の時　PostgreSQL
			//SQLServerの場合
			if ( objEnv.getDBType().equals(objEnv.DB_SQLSERVER) ) {
				vecFunctionList = (Vector)htParams.get(FUNCTION);
			//Oracleの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
				vecFunctionList = (Vector)htParams.get(ORACLE_FUNCTION);
			//PostgreSQLの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				vecFunctionList = (Vector)htParams.get(POSTGRE_FUNCTION);
			}
		}
		catch( Exception e )
		{
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
		}
		if( vecFunctionList == null ) {
			vecFunctionList = new Vector();
			try{
				// 環境ファイルからDB種別情報取得
				Environment objEnv = new Environment();
				//DB種別情報が "0" の時　MS SQLServer
				//DB種別情報が "1" の時　Oracle
				//DB種別情報が "2" の時　PostgreSQL
				//SQLServerの場合
				if ( objEnv.getDBType().equals(objEnv.DB_SQLSERVER) ) {
					htParams.put( FUNCTION, vecFunctionList );
				//Oracleの場合
				}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
					htParams.put( ORACLE_FUNCTION, vecFunctionList );
				//PostgreSQLの場合
				}else if(objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
					htParams.put( POSTGRE_FUNCTION, vecFunctionList );
				}
			}
			catch( Exception e )
			{
				DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			}
		}

		vecFunctionList.add( setChar( strFunction ) );
	}

	/**
	 * 機能(XMOID)を取得します
	 * @return Function	Function
	 */
	public String getFunction( int index ) {
		RolesData objData = (RolesData)getResult();
		return objData.getFunction(index);
	}

	/**
	 * 機能(XMOID)を取得します
	 * @return FunctionCount	Function数
	 */
	public int getFunctionCount() {
		RolesData objData = (RolesData)getResult();
		return objData.getFunctionCount();
	}

	/**
	 * RoleIDを検索条件に付与します
	 * デフォルトで"="条件をつけます
	 * @param strRoleID	RoleID
	 */
	public void setWhereRoleID( String strRoleID ) {
		String strCondition = ROLEID + SEARCH_EQUALS + "'" + StringEscapeUtils.escapeSql(strRoleID) + "' ";
		setCondition( strCondition );
	}

	/**
	 * RoleIDを検索条件に付与します
	 * @param strRoleID	RoleID
	 * @param strSearchCondition 検索条件
	 */
	public void setWhereRoleID( String strRoleID, String strSearchCondition ) {
		String strCondition = ROLEID + strSearchCondition + "'" + StringEscapeUtils.escapeSql(strRoleID) + "' ";
		setCondition( strCondition );
	}

	/**
	 * 権限IDを削除条件に付与します
	 * デフォルトで"="条件をつけます
	 * @param strRoleID	権限ID
	 */
	public void setWhereDelRoleID( String strRoleID ) {
		String strCondition = ROLEID + SEARCH_EQUALS + "'" + StringEscapeUtils.escapeSql(strRoleID) + "' ";
		setCondition( strCondition );
		//パラメータに権限IDをセット(RoleAssigunmentsの削除条件として保持)
		setRoleID(strRoleID);
	}
	
	/**
	 * XmoIDを検索条件に付与します
	 * デフォルトで"="条件をつけます
	 * @param String XMOID
	 */
	public void setWhereXmoID( String strXmoID ) {
		String strCondition = XMOID + SEARCH_EQUALS + "'" + StringEscapeUtils.escapeSql(strXmoID) + "' ";
		setCondition( strCondition );
	}

	/**
	 * XmoIDを検索条件に付与します
	 * @param String XmoID
	 * @param String 検索条件
	 */
	public void setWhereXmoID( String strXmoID, String strSearchCondition ) {
		String strCondition = XMOID + strSearchCondition + "'" + StringEscapeUtils.escapeSql(strXmoID) + "' ";
		setCondition( strCondition );
	}

	/**
	 * XmoIDを削除条件に付与します
	 * デフォルトで"="条件をつけます
	 * @param strRoleID	権限ID
	 */
	public void setWhereDelXmoID( String strXmoID ) {
		String strCondition = XMOID + SEARCH_EQUALS + "'" + StringEscapeUtils.escapeSql(strXmoID) + "' ";
		setCondition( strCondition );
		//パラメータにXmoIDをセット
		setXmoID(strXmoID);
	}

	/**
	 * ロール名称を検索条件に付与します
	 * デフォルトで"="条件をつけます
	 * @param strRoleName	権限名称
	 */
	public void setWhereRoleName( String strRoleName ) {
		String strCondition = ROLENAME + SEARCH_EQUALS + "'" + StringEscapeUtils.escapeSql(strRoleName) + "' ";
		setCondition( strCondition );
	}
	
	/**
	 * XmoRelation登録処理
	 * @return boolean 正常時はtrue　エラー時はfalse
	 * @exception Exception RMI接続に失敗した場合
	 */
	public boolean insertXmoRelation()
		throws Exception
	{
		return execute_m( METHOD_INSERTXMO );
	}

	/**
	 * XmoRelation更新処理
	 * @return boolean 正常時はtrue　エラー時はfalse
	 * @exception Exception RMI接続に失敗した場合
	 */
	public boolean updateXmoRelation()
		throws Exception
	{
		return execute_m( METHOD_UPDATEXMO );
	}

	/**
	 * XmoRelation削除処理
	 * @return boolean 正常時はtrue　エラー時はfalse
	 * @exception Exception RMI接続に失敗した場合
	 */
	public boolean deleteXmoRelation()
		throws Exception
	{
		return execute_m( METHOD_DELETEXMO );
	}

	/**
	 * 検索処理
	 * @return boolean 正常時はtrue　エラー時はfalse
	 * @exception Exception RMI接続に失敗した場合
	 */
	public boolean selectXmoRelation()
		throws Exception
	{
		return select_m( METHOD_SELECTXMO );
	}
	/**
	 * Functionを元にRoleIDリストを検索します。<BR>
	 * @param vecFuncID FunctionID格納リスト
	 * @exception Exception RMI接続エラー
	 */
	public boolean searchRoleIdFromFunc( Vector vecFuncID )
		throws Exception
	{
		// FunctionIDの設定
		if( vecFuncID != null ) {
			htParams.put( TARGET_ID, vecFuncID );
		}

		// 結果取得
		Vector vecXmoList = (Vector)super.execute( METHOD_SELECTFUNC, htParams );

		// メッセージデータを取得します
		MessageData objMessage = (MessageData)vecXmoList.get(0);

		mobjMessage = objMessage;
		if( mobjMessage != null ) {
			return false;
		}

		// 内部変数に結果を格納
		if( vecXmoList.size() > 0 ) {
			mobjRoleIdList = (String[])vecXmoList.get(1);
		}

		return true;
	}

	/**
	 * RoleIDを取得します
	 * @return 	RoleID
	 */
	public String[] getRoleIdList() {
		return mobjRoleIdList;
	}

//	ADD 2005/02/02 START MASUDA [LO一覧(履修済み/中)対応]
	/**
	 * RoleIDをもとにFunctionリストを検索します。<BR>
	 * @param strRoleID 		パラメータ(RoleID)
	 * @return vecFunctionList	FunctionID格納リスト
	 * @exception Exception 	RMI接続エラー
	 */
	public Vector searchRolesFunction( String strRoleID )
		throws Exception
	{
		// FunctionIDの設定
		if( strRoleID != null ) {
			htParams.put( ROLEID, strRoleID );
		}

		// 結果取得
		Vector vecFunctionList = (Vector)super.execute( METHOD_SELECTROLEFUNC, htParams );
		return vecFunctionList;
	}

	/**
	 * 管理対象者チェック
	 *
	 * @param strUserID 		パラメータ(ログインユーザー)
	 * @param strFnctionId 		パラメータ(チェック対象ファンクション)
	 * @return intchkUser 		チェック結果(0:管理対象外 1:管理対象者 その他:ERROR)
	 * @exception Exception 	例外エラー
	 */
	public int chkUserFunction(String strUserID, String strFnctionId) 
		throws Exception
	{
		//対象ユーザー確認（ユーザー管理対象者の場合のみ、選択ID利用）
		int intchkUser = 0;			//ユーザー管理者チェックフラグ
		String strRoleID = "";
		RoleAssignmentsClient objRoAs = new RoleAssignmentsClient();
	
		if( !objRoAs.searchList( strUserID )) {
			Vector vecRet          = new Vector();
			vecRet = objRoAs.getsearchList();
			intchkUser = 2;
			
		} else {
			//ROLEASSIGN取得
			Vector vecRoAs          = new Vector();
			vecRoAs = objRoAs.getsearchList();

			// mod 2005/03/02 masuda  start
			//RoleAssignmentsData objWork = (RoleAssignmentsData)vecRoAs.get(1);
			//strRoleID = objWork.getRoleID();

			for(int j = 0; j < vecRoAs.size()-1; j++) {
				RoleAssignmentsData objWork = (RoleAssignmentsData)vecRoAs.get(j+1);
				strRoleID = objWork.getRoleID();
	
			// mod 2005/03/02 masuda  end

			//FUNCTIONID取得
			Vector vecFnId          = new Vector();
			vecFnId = this.searchRolesFunction(strRoleID);
			String strFnID[] = new String[vecFnId.size()];
			vecFnId.copyInto(strFnID);
	
			for(int i = 0; i < vecFnId.size(); i++) {
				String strFnId2 = "";
				strFnId2 = strFnID[i].trim();
				if (strFnId2.equals(strFnctionId)) {		
					intchkUser = 1;
				}
			}
			// mod 2005/03/02 masuda  start
			}
			// mod 2005/03/02 masuda  end

		}
		return intchkUser;
	}
//	ADD 2005/02/02 END MASUDA 

}

