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

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

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

import org.apache.commons.lang.StringEscapeUtils;

import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.RoleAssignments.RoleAssignmentsClient;
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.util.IdGenerator;
import jp.co.ntt.lms.xmo.Message.Message;

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

	/**
	 * コンストラクタです。<BR>
	 * 親クラスのコンストラクタを呼び出し、自分が管理するテーブル名を
	 * 設定します。
	 */
	public GroupsDataAccess() {
	}

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

		// 返却GroupsDataオブジェクト
		GroupsData objData = null;
		// データアクセスクラスをインスタンス化します
		DataAccess objDataAccess = new DataAccess(TABLE_NAME);
		try {
			// トランザクションを開始する
			objDataAccess.trans( htData );

			// 登録処理を実行します
			objData = insertAction( htData, objDataAccess );

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

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

	/**
	 * 登録処理実行メソッドです。<BR>
	 * 自分のテーブルに登録処理を行った後、GroupAndPeople管理XMO
	 * に親子関係を登録します。
	 * パラメータのチェックおよびトランザクションの管理は
	 * 上位メソッド内で行ってください。<BR>
	 * @param htbParam 登録情報
	 * @return GroupsData グループデータ
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private GroupsData insertAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		//////////////////////////////////////////////////////
		// 外部IDの存在チェックを行います
		//////////////////////////////////////////////////////

		// 最大のグループID取得
		String strGroupID = getMaxGroupID(objDataAccess);

		// GroupIDのプレフィックスを付加します
		strGroupID = "GR" + strGroupID;

		// 入力データから外部IDを取得する
		String strForeignID = (String)htbParam.get( FOREIGN_ID );
		if(strForeignID == null){
			// 入力データがnullの場合は自動採番した外部IDを取得する
			strForeignID = getAutomaticGrForeignID(strGroupID);
			if( strForeignID == null ) {
				// 自動採番した外部IDがnullの場合はエラーとする(外部ID未設定エラー)
				throw new XMOException( getMessageData( FOREIGNID_HISSU_WAR ) );
			}

			// 自動採番された外部IDを登録データに格納する
			htbParam.put( FOREIGN_ID, strForeignID );
		}

		//////////////////////////////////////////////////////
		// 外部IDの存在チェックを行います
		//////////////////////////////////////////////////////

		if( objDataAccess.isExit( htbParam, FOREIGN_ID ) ) {
			throw new XMOException( getMessageData( EXIT_FOREIGNID_WAR ) );
		}


		// oidの取得を行い未設定の場合は外部IDと同値を入れる。
		String strOid = (String)htbParam.get(OID);
		String strTempForeignID = (String)htbParam.get( FOREIGN_ID );
		if( strTempForeignID != null && strOid == null ) {
			htbParam.put( OID, strTempForeignID );
		}

		// 登録処理用のデータをセットします
		Hashtable htbData = getData( htbParam );
		htbData.put( GROUP_ID, strGroupID );

		// 登録用SQLを生成します
		String strSQL = objDataAccess.getInsertSQL(htbData);

		// 登録処理を実行
		objDataAccess.execute( strSQL );

		// グループの親子関係を登録します
		// 親IDを取得します
		String strParentID = (String)htbParam.get( PARENT_ID );

		try {
			// グループの親子関係を登録するためにGroupAndPeopleClienクラスを
			// インスタンス化します
			GroupAndPeopleClient groupAss = new GroupAndPeopleClient();
			// 親IDを設定します
			groupAss.setParentID( strParentID );
			groupAss.setChildID( strGroupID );
			// 現在のトランザクションを共有するため使用中のコネクションインデックスを
			// 設定します
			groupAss.setConnectionIndex( objDataAccess.getConnectionIndex() );
			// インサート処理
			if( !groupAss.insert() ) {
				// 登録失敗時、MessageDataを取得し、例外に設定して投げる
				throw new XMOException( groupAss.getMessageData() );
			}
		}
		catch( Exception e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ここでExceptionが発生した場合はシステムエラー
			throw new XMOException( getMessageData( SYSTEM_ERR ) );
		}
		GroupsData objData = new GroupsData();
		objData.setGroupID(strGroupID);
		return objData;
	}

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

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

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

			// 更新処理を実行します
			updateAction( htData, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, 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
	{
		///////////////////////////////////////////////////////
		// 更新対象レコードの存在チェックを行います
		///////////////////////////////////////////////////////
		String strCondition = (String)htbParam.get( CONDITION_KEY );
		if( strCondition != null ) {
			if( !objDataAccess.isExit( strCondition ) ) {
				throw new XMOException( getMessageData( NOEXIT_RECORD_WAR ) );
			}
		}

		// 更新するレコードを取得します
		Vector vecSelect = selectAction( htbParam, objDataAccess );
		//////////////////////////////////////////////////////
		// 外部IDの存在チェックを行います
		//////////////////////////////////////////////////////
		String strForeignID = (String)htbParam.get( FOREIGN_ID );
		// 外部IDが更新対象の場合のみ存在チェックを行う
		if( strForeignID != null ) {
			int intCount = vecSelect.size();
			for( int i = 0; i < intCount; i++ ) {
				GroupsData objData = (GroupsData)vecSelect.get(i);
				if( !strForeignID.equals( objData.getForeignID() ) ) {
					if( objDataAccess.isExit( htbParam, FOREIGN_ID ) ) {
						throw new XMOException( getMessageData( EXIT_FOREIGNID_WAR ) );
					}
				}
			}
		}

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

		String strSQL = objDataAccess.getUpdateSQL(htbData);

		// 条件文の設定
		if( strCondition != null ) {
			strSQL += strCondition;
		}

		// 登録処理を実行
		objDataAccess.execute( strSQL );


	}

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

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

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

			// 削除処理実行メソッドを実行します
			deleteAction( htData, objDataAccess );

			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, 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 deleteAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		// ParentIDの取得
		String strParentID = (String)htbParam.get( DELETE_PARENTID );
		if( strParentID == null ) {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}
		// グループIDの取得
		String strGroupID = (String)htbParam.get( DELETE_GROUP_ID );
		if( strGroupID == null ) {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}

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

			// グループと人管理XMOクライアントにUserID,ParentIDを設定します。
			objGroupAndPeople.setDeleteSelectID( strGroupID );
			objGroupAndPeople.setDeleteParentID( strParentID );
			// GroupAndPeopleTreeインスタンス操作のための情報を設定します。
			objGroupAndPeople.setParentID( strParentID );
			objGroupAndPeople.setChildID( strGroupID );

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

			// 削除処理を実行します。
			if( !objGroupAndPeople.delete() ) {
				// 削除に失敗した場合は、例外を送出します。
				throw new XMOException( objGroupAndPeople.getMessageData() );
			}
		} catch (Exception e) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		// 権限を削除します。GroupIDカラムに存在する対象グループレコードの削除 N00102
		try {
			// RoleAssignments XMOのクライアントをインスタンス化します
			RoleAssignmentsClient objRoleAssignments =
				new RoleAssignmentsClient();

			// RoleAssignmentsXMOクライアントにstrGroupIDを設定します。
			objRoleAssignments.setWhereGroupID( strGroupID );
			objRoleAssignments.setConnectionIndex(
				objDataAccess.getConnectionIndex() );

			// 削除処理を実行します。
			if( !objRoleAssignments.delete() ) {
				// 削除に失敗した場合は、例外を送出します。
				throw new XMOException( objRoleAssignments.getMessageData() );
			}
		} catch (Exception e) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}

		// 権限を削除します。UserIDカラムに存在する対象グループレコードの削除 N00102
		try {
			// RoleAssignments XMOのクライアントをインスタンス化します
			RoleAssignmentsClient objRoleAssignments =
				new RoleAssignmentsClient();

			// RoleAssignmentsXMOクライアントにstrGroupIDを設定します。
			objRoleAssignments.setWhereUserID( strGroupID );
			objRoleAssignments.setConnectionIndex(
				objDataAccess.getConnectionIndex() );

			// 削除処理を実行します。
			if( !objRoleAssignments.delete() ) {
				// 削除に失敗した場合は、例外を送出します。
				throw new XMOException( objRoleAssignments.getMessageData() );
			}

		} catch (Exception e) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// データベースエラーを設定
			throw new XMOException( getMessageData( DB_ERR ) );
		}


		// SQLの組み立て -- Groupsテーブルのレコード削除
		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() );

	}

	/**
	 * Groupsテーブルへ検索処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           検索条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 検索情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public Vector select( Hashtable htData )
		throws XMOException
	{
		// グループデータがnullのとき
		if( htData == 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( htData );

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

			// コミット
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			// ロールバック
			try { objDataAccess.rollback(); } catch( Exception ex ) {}
			throw xe;
		}
		catch( SQLException e ) {
			DebugLog.write( this.getClass(), e, 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 );
			// ORDER BY句がない場合、LOIDのORDER BY句を追加する
			if(strCondition.indexOf("ORDER BY") == -1)
			{
				sbSQL.append(" ORDER BY GROUP_ID ");
			}
		}
		else
		{
			sbSQL.append(" ORDER BY GROUP_ID ");
		}

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

		Vector vecReturn = new Vector();
		while(rs.next()) {
			String strGroupID = ChangeEncode.setChar( rs.getString( GROUP_ID ) );
			String strGroupName = ChangeEncode.setChar( rs.getString( GROUP_NAME ) );
			String strGroupType = ChangeEncode.setChar( rs.getString( GROUP_TYPE ) );
			String strDeleteFlag = ChangeEncode.setChar( rs.getString( DELETE_FLAG ) );
			String strForeignID = ChangeEncode.setChar( rs.getString( FOREIGN_ID ) );
			String strCustomMsgDir = ChangeEncode.setChar( rs.getString( CUSTOM_MSG_DIR ) );
			String strOid = ChangeEncode.setChar( rs.getString( OID ) );
			String strAdDn = ChangeEncode.setChar( rs.getString( AD_DN ) );
			GroupsData objData = new GroupsData();
			objData.setGroupID( strGroupID );
			objData.setGroupName( strGroupName );
			objData.setGroupType( strGroupType );
			objData.setDeleteFlag( strDeleteFlag );
			objData.setForeignID( strForeignID );
			objData.setCustomMsgDir( strCustomMsgDir );
			objData.setOid( strOid );
			objData.setAdDn( strAdDn );

			vecReturn.add( objData );
		}

		return vecReturn;

	}

	/**
	 * 最大グループID取得メソッドです
	 * @return 最大グループID（プレフィックスはついていません)
	 */
	private String getMaxGroupID( DataAccess objDataAccess )
		throws SQLException
	{
		String strSQL ="";
		String strMaxGroupID = "";
		try{
			//XMS.iniファイルロードクラスのインスタンス
			Environment objEnv=new Environment();

			//SQLServerの場合
			if(objEnv.getDBType().equals( objEnv.DB_SQLSERVER )){
				strSQL = "select MAX(RTRIM(SUBSTRING(group_id, 3, { fn LENGTH(group_id) }))) as maxgroupid from Groups";
			//Oracleの場合 OR PostgreSQLの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				strSQL = "select MAX(RTRIM(SUBSTR(group_id, 3, LENGTH(group_id)))) as maxgroupid from Groups";
			}

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

			while(rs.next()) {
				strMaxGroupID = rs.getString( "maxgroupid" );
			}

		}
		catch(Exception ex)
		{

		}


		return IdGenerator.getNextId( strMaxGroupID );
	}

	/**
	 * 登録、更新処理時のデータを組み立てます
	 * @param htData
	 * @return Hashtable
	 */
	private Hashtable getData( Hashtable htbParam ) {
		Hashtable htbData = new Hashtable();
		putData( htbData, htbParam, GROUP_ID );
		putData( htbData, htbParam, GROUP_NAME );
		putData( htbData, htbParam, GROUP_TYPE );
		putData( htbData, htbParam, DELETE_FLAG );
		putData( htbData, htbParam, FOREIGN_ID );
		putData( htbData, htbParam, CUSTOM_MSG_DIR );
		putData( htbData, htbParam, OID );
		putData( htbData, htbParam, AD_DN );
		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;
	}

	/**
	 * 外部ID自動採番
	 * @param strGroupID
	 * @return String 自動採番外部ID
	 */
	public String getAutomaticGrForeignID(String strGroupID) {

		String strForeignID = null;
		// XMS2.ini ファイルにグループPrefixが設定しているかをチェックする
		try{
			Environment objEnv = new Environment();
			String strGetGrPrefix = objEnv.getGrPrefix();
			if (strGetGrPrefix != null ){
				strForeignID = strGetGrPrefix + strGroupID;
			}
		}
		catch(Exception ex)
		{
		}
		return 	strForeignID;
	}

}

