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

//
//	RoleAssignments 管理XMO データアクセスクラス
//			変更履歴
//				2004.01.08	新規作成	二條智文
//
package jp.co.ntt.lms.xmo.RoleAssignments;

import java.util.*;
import java.sql.*;

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.xmo.RoleAssignments.RoleAssignmentsClient;
import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.*;
import jp.co.ntt.lms.xmo.util.ChangeEncode;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.Message.Message;

/**
 * RoleAssignments 管理XMO データアクセスクラスです。<BR>
 * このクラスはAssignmentsテーブルへの登録、修正、削除、検索処理を実行します。<BR>
 * DataAccessクラスを使用し、登録、修正、削除、検索処理単位で
 * トランザクション管理を行います。
 * @author T.Nijou
 * @version 0.0.0.1 2004.01.08
 */
public class RoleAssignmentsDataAccess
	implements RoleAssignmentsMessage, RoleAssignmentsTable
{

	/**
	 * コンストラクタです。<BR>
	 */
	public RoleAssignmentsDataAccess() {
	}

	/**
	 * RoleAssignmentsテーブルへ登録処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * なおテーブルの主キー以外を省略した場合は省略したフィールドには
	 * Null値が格納されます。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             MEMBER_SHIP_ID          人々ID
	 *             USER_ID                 ユーザID
	 *             ROLE_ID                 権限ID
	 *             GROUP_ID                グループID
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 登録情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	synchronized public String insert( Hashtable htParam )
		throws XMOException
	{
		// 権限割当データがnullのとき
		if( htParam == null ) {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );	
			// パラメータエラーをスローする
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {
			// トランザクションを開始する
			objDataAccess.trans( htParam );

			// 存在チェックを行います
			if( isExitAssign( htParam, objDataAccess ) ) {
				// すでに存在しているエラーを返します
				throw new XMOException( getMessageData( ALREADY_ASSIGN_ERR ) );
			}

			// インサート処理実行メソッドを呼びます
			insertAction( htParam, objDataAccess );
			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック

			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException se ) {
			DebugLog.write( this.getClass(), se, DebugLog.HIGHT );

			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		// 正常時空文字返却
		return "";
	}

	/**
	 * 登録処理実行メソッドです。<BR>
	 * 自分のテーブルに登録処理を行った後、グループと人管理XMO
	 * から子グループを取得し、存在したら、子グループにも同様の
	 * 登録処理を行います。
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 登録情報
	 * @exception XMOException XMO独自例外
	 * @exception SQLException DBエラー
	 */
	private void insertAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		// 登録処理用のデータをセットします
		Hashtable htbData = setData( htbParam );

		// 存在チェックを行いすでに登録されている場合は
		// 何もせずに子の登録に行きます。

		if( !isExitAssign( htbData, objDataAccess ) ) {
			// 最大のRoleAssignID取得
			String strAssignID = getMaxRoleAssignID(objDataAccess);

			// AssignIDを登録情報にセットします
			htbData.put( ROLE_ASSIGN_ID, strAssignID );

			// 登録SQLを取得します
			String strSQL = objDataAccess.getInsertSQL( htbData );

			// 登録処理実行
			objDataAccess.execute( strSQL );
		}
		//処理モードを取得します
		String strMode = (String)htbParam.get( MODE_KEY );

		// 処理モードがONの場合は以下の処理は行わない
		// グループと人管理XMOを使用して、子グループおよび人が存在するか検索を行い
		// 存在する場合は同様の登録処理を行います
		if( strMode == null || !strMode.equals("on") ) {
			htbData.put(MEMBER_SHIP_ID,htbParam.get( MEMBER_SHIP_ID ) );
			insertChild( htbData, objDataAccess );
		}

	}

	/**
	 * グループと人管理XMOから指定されたメンバーシップIDの子リストを取得し
	 * 存在する場合は子に対して、RoleAssignmentを登録します
	 * @param htbData パラメータ
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void insertChild( Hashtable htbData, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		try {

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

			// メンバーシップIDを取得します
			String strMemberShipID = (String)htbData.get( MEMBER_SHIP_ID );
			// グループと人管理XMOクライアントにメンバーシップIDを設定して
			// 検索処理を行います
			objGroupAndPeople.setMemberShipID( strMemberShipID );

			// 現在使用中のコネクションインデックスを設定します
			objGroupAndPeople.setConnectionIndex( objDataAccess.getConnectionIndex() );

			if( !objGroupAndPeople.select() ) {
				// 検索に失敗した場合は検索エラーを返します
				throw new XMOException( objGroupAndPeople.getMessageData() );
			}

			// 検索結果数分ループして、insert処理を呼び出します
			if( objGroupAndPeople.next() ) {
				// メンバーシップIDより見つかったレコードの子IDをキーにして、子リストを取得する
				String strParentID = objGroupAndPeople.getChildID();

				// パラメータクリア
				objGroupAndPeople.clear();
				objGroupAndPeople.setParentID( strParentID );

				// 子リスト検索
				if( !objGroupAndPeople.select() ) {

					// 検索に失敗した場合は検索エラーを返します
					throw new XMOException( objGroupAndPeople.getMessageData() );
				}

				// 子リスト分ループして親グループと同じロールを割り当てます。
				while( objGroupAndPeople.next() ) {

					// 子のメンバーシップIDを設定します
					Hashtable htbChildParam = setData( htbData );

					htbChildParam.put( MEMBER_SHIP_ID, objGroupAndPeople.getMemberShipID() );

					htbChildParam.put( USER_ID, objGroupAndPeople.getChildID() );

					// アサインのインサート処理の再帰呼び出しを行います
					insertAction( htbChildParam, objDataAccess );
				}
			}
		}
		catch( Exception e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );

			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}
	}

	/**
	 * RoleAssignmentsテーブルへ更新処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * 省略したフィールドは更新されません。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             MEMBER_SHIP_ID          人々ID
	 *             USER_ID                 ユーザID
	 *             ROLE_ID                 権限ID
	 *             GROUP_ID                グループID
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 更新情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	synchronized public String update( Hashtable htParam )
		throws XMOException
	{
		// LOデータがnullのとき
		if( htParam == null ) {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );	
			// パラメータエラーをスローする
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {
			// トランザクションを開始する
			objDataAccess.trans( htParam );

			// 更新処理実行メソッドを実行します
			updateAction( htParam, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException se ) {
			DebugLog.write( this.getClass(), se, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		// 正常時空文字返却
		return "";
	}

	/**
	 * 更新処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 更新情報
	 * @exception XMOException XMO独自例外
	 * @exception SQLException DBエラー
	 */
	private void updateAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		// 更新処理用のデータをセットします
		Hashtable htbData = setData( htbParam );

		String strSQL = objDataAccess.getUpdateSQL(htbData);

		// 条件文の取得
		String strCondition = (String)htbParam.get( CONDITION_KEY );
		if( strCondition != null ) {
			strSQL += strCondition;
		}

		// 更新処理を実行
		objDataAccess.execute( strSQL );
	}

	/**
	 * RoleAssignmentsテーブルへ削除処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           削除条件文
	 *          ---------------------------------------------
	 *          または
	 *          ---------------------------------------------
	 *             DELETE_USER_ID          user_id
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 削除情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	synchronized public String delete( Hashtable htParam )
		throws XMOException
	{
		// 削除情報データがnullのとき
		if( htParam == null ) {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );	
			// パラメータエラーをスローする
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {

			// トランザクションを開始する
			objDataAccess.trans( htParam );

			// 削除処理実行メソッドを実行します
			deleteAction( htParam, objDataAccess );
			
			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック

			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException se ) {
			DebugLog.write( this.getClass(), se, DebugLog.HIGHT );
			// ロールバック

			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}
		return DELETE_COMPLETE;
	}

	/**
	 * 削除処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 削除情報
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deleteAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		// user_idの取得
		String strUserID = (String)htbParam.get( DELETE_USER_ID );
		
		// group_idの取得
		String strGroupID = (String)htbParam.get( DELETE_GROUP_ID );
		
		if( strGroupID != null ) {
			// グループIDが等しいレコードを削除する
			deleteEqGroup( strGroupID, objDataAccess );
		}
		else if( strUserID == null ) {
			// 条件式指定の削除処理を実行する
			deleteCondition( htbParam, objDataAccess );
		} else {
			// ユーザIDが等しいレコードを削除する
			deleteEqUser( strUserID, objDataAccess );
		}

	}

	/**
	 * 削除処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 削除情報
	 * @exception XMOException XMO独自例外
	 * @exception SQLException DBエラー
	 */
	private void deleteCondition( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "DELETE FROM " + TABLE_NAME );

		// 条件文の取得
		String strCondition = (String)htbParam.get( CONDITION_KEY );
		if( strCondition != null ) {
			sbSQL.append( strCondition );
		}
		// 削除処理を実行
		objDataAccess.execute( sbSQL.toString() );

		//処理モードを取得します
		String strMode = (String)htbParam.get( MODE_KEY );

		// 処理モードがONの場合は以下の処理は行わない
		// グループと人管理XMOを使用して、子グループおよび人が存在するか検索を行い
		// 存在する場合は同様の削除処理を行います
		if( strMode == null || !strMode.equals("on") ) {
			deleteChild( htbParam, objDataAccess );
		}

	}

	/**
	 * グループと人管理XMOから指定されたメンバーシップIDの子リストを取得し
	 * 存在する場合は子に対して、RoleAssignmentを削除します
	 * @param htbData パラメータ
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deleteChild( Hashtable htbData, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		try {

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

			// メンバーシップIDを取得します
			String strMemberShipID = (String)htbData.get( MEMBER_SHIP_ID );

			// グループと人管理XMOクライアントにメンバーシップIDを設定して
			// 検索処理を行います
			objGroupAndPeople.setMemberShipID( strMemberShipID );

			// 現在使用中のコネクションインデックスを設定します
			objGroupAndPeople.setConnectionIndex( objDataAccess.getConnectionIndex() );

			if( !objGroupAndPeople.select() ) {
				// 検索に失敗した場合は検索エラーを返します
				throw new XMOException( objGroupAndPeople.getMessageData() );
			}

			// 検索結果数分ループして、delet処理を呼び出します
			if( objGroupAndPeople.next() ) {

				// メンバーシップIDより見つかったレコードの子IDをキーにして、子リストを取得する
				String strParentID = objGroupAndPeople.getChildID();

				// パラメータクリア
				objGroupAndPeople.clear();
				objGroupAndPeople.setParentID( strParentID );

				// 子リスト検索
				if( !objGroupAndPeople.select() ) {

					// 検索に失敗した場合は検索エラーを返します
					throw new XMOException( objGroupAndPeople.getMessageData() );
				}

				// 子リスト分ループして親グループと同じロールを割り当てます。
				while( objGroupAndPeople.next() ) {

					// 子のメンバーシップIDを設定します
					Hashtable htbChildParam = setData( htbData );

					htbChildParam.put( MEMBER_SHIP_ID, objGroupAndPeople.getMemberShipID() );
					// 条件文の組み立て
					String strUserID = objGroupAndPeople.getChildID();
					String strRoleID = (String)htbData.get(ROLE_ID);
					String strGroupID = (String)htbData.get(GROUP_ID);
					
					String strCondition = " WHERE " + USER_ID + "='" + StringEscapeUtils.escapeSql(strUserID) + "' AND " + ROLE_ID + "='" + StringEscapeUtils.escapeSql(strRoleID) + "' AND " + GROUP_ID + "='" + StringEscapeUtils.escapeSql(strGroupID) + "'";
					htbChildParam.put( CONDITION_KEY, strCondition );

					// アサインの削除処理の再帰呼び出しを行います
					deleteAction( htbChildParam, objDataAccess );
				}
			}
		}
		catch( Exception e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );

			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}
	}

	/**
	 * RoleAssignmentsテーブルからuser_idの一致するレコードを削除します。
	 *
	 * @param strUserID
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deleteEqUser( String strUserID, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		StringBuffer sbSQL = new StringBuffer( "DELETE FROM " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " WHERE " );
		sbSQL.append( USER_ID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strUserID) );
		sbSQL.append( "' ");

		objDataAccess.execute( sbSQL.toString() );

	}

	/**
	 * RoleAssignmentsテーブルからuser_idの一致するレコードを削除します。
	 *
	 * @param strGroupID
	 * @param objDataAccess データアクセスオブジェクト
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private void deleteEqGroup( String strGroupID, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		StringBuffer sbSQL = new StringBuffer( "DELETE FROM " );
		sbSQL.append( TABLE_NAME );
		sbSQL.append( " WHERE " );
		sbSQL.append( GROUP_ID );
		sbSQL.append( " = '" );
		sbSQL.append( StringEscapeUtils.escapeSql(strGroupID) );
		sbSQL.append( "' ");

		objDataAccess.execute( sbSQL.toString() );

	}

	/**
	 * RoleAssignmentsテーブルへ検索処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           検索条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 検索情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public Vector select( Hashtable htParam )
		throws XMOException
	{
		// 権限割当データがnullのとき
		if( htParam == null ) {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );	
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

		// 戻り値
		Vector vecReturn = new Vector();

		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {
			// トランザクションを開始する
			objDataAccess.trans( htParam );

			// 検索処理実行メソッド
			vecReturn = selectAction( htParam, objDataAccess );

			// コミット
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException se ) {
			DebugLog.write( this.getClass(), se, DebugLog.HIGHT );
			// ロールバック
			try { objDataAccess.rollback(); }
			catch( Exception ex ) {}
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		return vecReturn;
	}

	/**
	 * 検索処理実行メソッドです。<BR>
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 検索情報
	 * @return Vector 検索結果
	 * @exception XMOException XMO独自例外
	 * @exception SQLException DBエラー
	 */
	private Vector selectAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		// SQLの組み立て
		StringBuffer sbSQL = new StringBuffer();
		sbSQL.append( "SELECT * FROM " + TABLE_NAME );

		// 条件文の取得
		String strCondition = (String)htbParam.get( "condition_key" );
		if( strCondition != null ) {
			sbSQL.append( strCondition );
		}

		// 順序の取得
		String strOrderBy = (String)htbParam.get( "order_by" );
		if( strOrderBy != null ) {
			sbSQL.append( strOrderBy );
		}

		// クエリーを実行します
		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

		Vector vecReturn = new Vector();
		while(rs.next()) {
			String strRoleAssignID = ChangeEncode.setChar( rs.getString( ROLE_ASSIGN_ID ) );
			String strUserID = ChangeEncode.setChar( rs.getString( USER_ID ) );
			String strRoleID = ChangeEncode.setChar( rs.getString( ROLE_ID ) );
			String strGroupID = ChangeEncode.setChar( rs.getString( GROUP_ID ) );
			RoleAssignmentsData objData = new RoleAssignmentsData();
			objData.setRoleAssignID( strRoleAssignID );
			objData.setUserID( strUserID );
			objData.setRoleID( strRoleID );
			objData.setGroupID( strGroupID );
			vecReturn.add( objData );
		}
		return vecReturn;
	}

	/**
	 * 最大のRoleAssignID取得
	 * @return String 最大RoleAssignID
	 */
	private String getMaxRoleAssignID( DataAccess objDataAccess )
		throws SQLException
	{
		String strSQL = "";
		try{
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv=new Environment();
			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
				strSQL = "select MAX(CONVERT(INT," + ROLE_ASSIGN_ID + ")) + 1 as maxassignid from " + TABLE_NAME;
			//Oracleの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE )){
				strSQL = "select MAX(TO_NUMBER(" + ROLE_ASSIGN_ID + ")) + 1 as maxassignid from " + TABLE_NAME;
			//PostgreSQLの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				strSQL = "select MAX(TO_NUMBER((" + ROLE_ASSIGN_ID + "),'9999999999')) + 1 as maxassignid from " + TABLE_NAME;
			}
		}
		catch(Exception ex)
		{

		}

		String strMaxAssignID = "";

		DebugLog.write( this.getClass(), strSQL, DebugLog.ROW );
		ResultSet rs = objDataAccess.executeQuery(strSQL);

		while(rs.next()) {
			int intTemp = 0;
			intTemp = rs.getInt( "maxassignid" );
			strMaxAssignID = new Integer(intTemp).toString();
		}
		return strMaxAssignID;
	}

	/**
	 * 権限割当の存在チェックを行います
	 * @param htbParam パラメータ
	 * @param objDataAccess DBアクセスクラス
	 * @return boolean true: 割り当てられている false: 割り当てられていない
	 * @exception SQLException DBエラー
	 */
	private boolean isExitAssign( Hashtable htbParam, DataAccess objDataAccess )
		throws SQLException
	{
		// ユーザIDの取得
		String strUserID = (String)htbParam.get( USER_ID );
		// 権限IDの取得
		String strRoleID = (String)htbParam.get( ROLE_ID );
		// グループIDの取得
		String strGroupID = (String)htbParam.get( GROUP_ID );

		// 条件文の組み立て
		String strCondition = " WHERE " + USER_ID + "='" + StringEscapeUtils.escapeSql(strUserID) + "' AND " + ROLE_ID + "='" + StringEscapeUtils.escapeSql(strRoleID) + "' AND " + GROUP_ID + "='" + StringEscapeUtils.escapeSql(strGroupID) + "'";
		return objDataAccess.isExit( strCondition, TABLE_NAME );
	}

	/**
	 * 登録、更新処理時のデータを組み立てます
	 * @param htData
	 * @return Hashtable
	 */
	private Hashtable setData( Hashtable htbParam ) {
		Hashtable htbData = new Hashtable();
		putData( htbData, htbParam, ROLE_ASSIGN_ID );
		putData( htbData, htbParam, USER_ID );
		putData( htbData, htbParam, ROLE_ID );
		putData( htbData, htbParam, GROUP_ID );
		return htbData;
	}

	/**
	 * 安全にHashtableに追加するメソッドです
	 */
	private void putData( Hashtable htbData, Hashtable htbParam, String strKey ) {
		String strValue = (String)htbParam.get( strKey );
		if( strValue != null ) {
			htbData.put( strKey, strValue );
		}
	}

	/**
	 * メッセージオブジェクトを作成します
	 * @param strMessageID メッセージID
	 * @return MessageData メッセージオブジェクト 例外発生時はnullを返します
	 */
	private MessageData getMessageData( String strMessageID) {
		MessageData objMessage = null;
		try {
			objMessage = Message.getInstance().getMessageData( strMessageID, MSG_FIEL_PATH, MSG_FILE_NAME );
		}
		catch( Exception e ) {

		}
		return objMessage;
	}

}

