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

//
//	People 管理XMO データアクセスクラス
//			変更履歴
//				2004.01.08	新規作成	　　　　　　二條智文

//
package jp.co.ntt.lms.xmo.People;

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.Lo.LoLogDelete.LogUtil;
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.XMODate;
import jp.co.ntt.lms.xmo.util.IdGenerator;
import jp.co.ntt.lms.xmo.util.RmsKPassword;
import jp.co.ntt.lms.xmo.Message.Message;
import jp.co.ntt.lms.xmo.Environment;
/**
 * People 管理XMO データアクセスクラスです。<BR>
 * このクラスはPeopleテーブルへの登録、修正、削除、検索処理を実行します。<BR>
 * DataAccessクラスを使用し、登録、修正、削除、検索処理単位で
 * トランザクション管理を行います。
 * @author T.Nijou
 * @version 0.0.0.1 2004.01.08
 */
public class PeopleDataAccess
	implements PeopleMessage, PeopleTable
{

	private static final String ROLE_ID = "1";

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

	/**
	 * People テーブルへ登録処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * なおテーブルの主キー以外を省略した場合は省略したフィールドには
	 * Null値が格納されます。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             USER_NAME               ユーザ名
	 *             ENCRYPT_PASSWORD        パスワード
	 *             CONTACT_ADDRESSS        住所
	 *             SEX                     性別
	 *             CONTACT_EMAIL           メール１
	 *             CONTACT_EMAIL2          メール２
	 *             READING_NAME            ヨミカタ
	 *             BIRTHDAY                生年月日
	 *             CONTACT_TEL             電話番号
	 *             CUSTOM_MSG_DIR          コメント
	 *             DELETE_FLAG             削除フラグ
	 *             FOREIGN_ID              外部キー
	 *             LOGIN_ID                ログインID
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 登録情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	public PeopleData insert( Hashtable htData )
		throws XMOException
	{
		// 人データがnullのとき
		if( htData == null ) {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );	
			// パラメータエラーをスローする
			throw new XMOException( PARAM_WAR );
		}

		PeopleData objData = null;

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

			// 登録処理を実行します
			objData = insertAction( htData, objDataAccess );
			// コミット処理
			objDataAccess.commit();
		}
		catch( XMOException xe ) {
			DebugLog.write( this.getClass(), xe, DebugLog.HIGHT );
			// ロールバック
			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 登録情報
	 * @exception XMOException XMO独自エラー
	 * @exception SQLException DBエラーが発生した場合
	 */
	private PeopleData insertAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{


		//////////////////////////////////////////////////////
		// ログインIDの存在チェックを行います
		//////////////////////////////////////////////////////
		if( objDataAccess.isExit( htbParam, LOGIN_ID ) ) {
			throw new XMOException( getMessageData( EXIT_LOGINID_WAR ) );
		}
		//////////////////////////////////////////////////////
		// 外部IDの存在チェックを行います
		//////////////////////////////////////////////////////

		// 最大のユーザIDを取得します
		String strUserID = getMaxUserID( objDataAccess );
		// ユーザプレフィックスを付加します
		strUserID = "PE" + strUserID;

		// 入力データから外部IDを取得する
		String strForeignID = (String)htbParam.get( FOREIGN_ID );
		if(strForeignID == null){
			// 入力データがnullの場合は自動採番した外部IDを取得する
			strForeignID = getAutomaticPeForeignID(strUserID);
			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 );
		}

		// 戻りデータに採番したユーザIDを格納する
		PeopleData objData = new PeopleData();
		objData.setUserID( strUserID );
		htbParam.put( USER_ID, strUserID );
		htbParam.put(SEX, setDefaultSex((String)htbParam.get(SEX)));

		// 登録処理用のデータをセットします
		Hashtable htbData = setData( htbParam );
		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( (String)htbParam.get( USER_ID ) );
			// 現在のトランザクションを共有するため使用中のコネクションインデックスを
			// 設定します
			groupAss.setConnectionIndex( objDataAccess.getConnectionIndex() );
			// インサート処理
			if( !groupAss.insert() ) {
				// グループと人登録エラーを投げる
				throw new XMOException( groupAss.getMessageData() );
			}
		}
		catch( Exception e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// グループと人登録エラーを投げる
			throw new XMOException( getMessageData( SYSTEM_ERR ) );
		}

		try {
			// 学習者権限を付与するためにRoleAssignmentsClientクラスをインスタンス化します
			RoleAssignmentsClient roleAss = new RoleAssignmentsClient();
			// 登録データをセットします
			roleAss.setUserID( (String)htbParam.get( USER_ID ) );	//ユーザーID
			roleAss.setRoleID( ROLE_ID );							//権限ID
			roleAss.setGroupID( strParentID );						//グループID
			roleAss.setMode("on");									//処理モード
			// 現在のトランザクションを共有するため使用中のコネクションインデックスを
			// 設定します
			roleAss.setConnectionIndex( objDataAccess.getConnectionIndex() );
			// インサート処理
			if( !roleAss.insert() ) {
				// ロールアサイン登録エラーを投げる
				throw new XMOException( roleAss.getMessageData() );
			}
		}
		catch( Exception e ) {
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
			// ロールアサイン登録エラーを投げる
			throw new XMOException( getMessageData( SYSTEM_ERR ) );
		}

		return objData;
	}

	/**
	 * Peopleテーブルへ更新処理を行います。<BR>
	 * 以下の情報をHashtableに格納して渡してください。<BR>
	 * 省略したフィールドは更新されません。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             USER_ID                 ユーザID
	 *             USER_NAME               ユーザ名
	 *             ENCRYPT_PASSWORD        パスワード
	 *             CONTACT_ADDRESSS        住所
	 *             SEX                     性別
	 *             CONTACT_EMAIL           メール１
	 *             CONTACT_EMAIL2          メール２
	 *             READING_NAME            ヨミカタ
	 *             BIRTHDAY                生年月日
	 *             CONTACT_TEL             電話番号
	 *             CUSTOM_MSG_DIR          コメント
	 *             DELETE_FLAG             削除フラグ
	 *             FOREIGN_ID              外部キー
	 *             LOGIN_ID                ログインID
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 更新情報
	 * @return String 結果(正しく終了した場合のみ)
	 * @exception XMOException データベースエラーが発生した場合
	 */
	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 ) {
			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 データベースエラーが発生した場合
	 */
	private void updateAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{
		// 更新するレコードを取得します
		Vector vecSelect = selectAction( htbParam, objDataAccess );
		//////////////////////////////////////////////////////
		// ログインIDの存在チェックを行います
		//////////////////////////////////////////////////////
		String strLoginID = (String)htbParam.get( LOGIN_ID );
		// ログインIDが更新対象の場合のみ存在チェックを行う
		if( strLoginID != null ) {
			int intCount = vecSelect.size();
			for( int i = 0; i < intCount; i++ ) {
				PeopleData objData = (PeopleData)vecSelect.get(i);
				if( !strLoginID.equals( objData.getLoginID() ) ) {
					if( objDataAccess.isExit( htbParam, LOGIN_ID ) ) {
						throw new XMOException( getMessageData( EXIT_LOGINID_WAR ) );
					}
				}
			}
		}

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

		htbParam.put(SEX, setDefaultSex((String)htbParam.get(SEX)));

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

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

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

	}

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

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

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

			// 削除処理実行メソッドを実行します
			deleteAction( htData, 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 deleteAction( Hashtable htbParam, DataAccess objDataAccess )
		throws XMOException, SQLException
	{

		// UserIDの取得
		String strUserID = (String)htbParam.get( DELETE_USERID );
		if( strUserID == null ) {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );	
			throw new XMOException( getMessageData( PARAM_WAR ) );
		}
		// 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 ) );
		}

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

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

			// 現在使用中のコネクションインデックスを設定します
			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 ) );
		}

		if ( strParentID.equals( XMOPropertyDef.WASTES_GROUPID ) ) {
			// ParentIDが無所属の場合、
			try {
				// RoleAssignments XMOのクライアントをインスタンス化します
				RoleAssignmentsClient objRoleAssignments =
					new RoleAssignmentsClient();

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

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

				// LO共通ログおよびLO個別ログを削除します
				LogUtil objLogUtil = new LogUtil();
				objLogUtil.delete( strUserID, objDataAccess );
			} catch (Exception e) {
				DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
				// データベースエラーを設定
				throw new XMOException( getMessageData( DB_ERR ) );
			}

			// 入力のuser_idに等しいレコードを削除する
			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( "' ");

			// SQLを実行する
			objDataAccess.execute( sbSQL.toString() );
		}
	}

	/**
	 * Peopleテーブルへ検索処理を行います。<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 ) {
			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 );
			// ORDER BY句がない場合、LOIDのORDER BY句を追加する
			if(strCondition.indexOf("ORDER BY") == -1)
			{
				sbSQL.append(" ORDER BY USER_ID ");
			}
		}
		else
		{
			sbSQL.append(" ORDER BY USER_ID ");
		}

		ResultSet rs = objDataAccess.executeQuery(sbSQL.toString());

		Vector vecReturn = new Vector();
		while(rs.next()) {
			String strUserID = ChangeEncode.setChar( rs.getString( USER_ID ) );
			String strUserName = ChangeEncode.setChar( rs.getString( USER_NAME ) );
			String strEncryptPassword = ChangeEncode.setChar( RmsKPassword.GetDecordPassword( rs.getString( ENCRYPT_PASSWORD ) ) );
			String strContactAddress = ChangeEncode.setChar( rs.getString( CONTACT_ADDRESSS ) );
			String strSex = ChangeEncode.setChar( rs.getString( SEX ) );
			String strContactEmail = ChangeEncode.setChar( rs.getString( CONTACT_EMAIL ) );
			String strContactEmail2 = ChangeEncode.setChar( rs.getString( CONTACT_EMAIL2 ) );
			String strReadingName = ChangeEncode.setChar( rs.getString( READING_NAME ) );
			String strBirthday = XMODate.parseYYYYMMDD( rs.getTimestamp( BIRTHDAY ) );
			String strContactTel = ChangeEncode.setChar( rs.getString( CONTACT_TEL ) );
			String strCustomMsgDir = ChangeEncode.setChar( rs.getString( CUSTOM_MSG_DIR ) );
			String strDeleteFlag = ChangeEncode.setChar( rs.getString( DELETE_FLAG ) );
			String strForeignID = ChangeEncode.setChar( rs.getString( FOREIGN_ID ) );
			String strLoginID = ChangeEncode.setChar( rs.getString( LOGIN_ID ) );
			String strAdUserId = ChangeEncode.setChar( rs.getString( AD_USER_ID ) );
			String strAdDn = ChangeEncode.setChar( rs.getString( AD_DN ) );
			String strUserType = ChangeEncode.setChar( rs.getString( USER_TYPE ) );
			String strOid = ChangeEncode.setChar( rs.getString( OID ) );
			PeopleData objData = new PeopleData();
			objData.setUserID( strUserID );
			objData.setUserName( strUserName );
			objData.setEncryptPassword( strEncryptPassword );
			objData.setContactAddress( strContactAddress );
			objData.setSex( strSex );
			objData.setContactEmail( strContactEmail );
			objData.setContactEmail2( strContactEmail2 );
			objData.setReadingName( strReadingName );
			objData.setBirthday( strBirthday );
			objData.setContactTel( strContactTel );
			objData.setCustomMsgDir( strCustomMsgDir );
			objData.setDeleteFlag( strDeleteFlag );
			objData.setForeignID( strForeignID );
			objData.setLoginID( strLoginID );
			objData.setAdUserId( strAdUserId );
			objData.setAdDn( strAdDn );
			objData.setUserType( strUserType );
			objData.setOid( strOid );
			vecReturn.add( objData );
		}

		return vecReturn;

	}
	/**
	 * 最大ユーザID取得メソッドです
	 * @return 最大ユーザID（プレフィックスはついていません)
	 */
	private String getMaxUserID( DataAccess objDataAccess )
		throws SQLException
	{
		String strSQL = "";
		try
		{
			// 環境ファイルからDB種別情報取得
			Environment objEnv = new Environment();
			//DB種別情報が "0" の時　MS SQLServer
			//DB種別情報が "1" の時　Oracle
			//DB種別情報が "2" の時　PostgreSQL
			if ( objEnv.getDBType().equals(objEnv.DB_SQLSERVER) ) {
				strSQL = "select MAX(RTRIM(SUBSTRING(" + USER_ID + ", 3, { fn LENGTH(" + USER_ID + ") }))) as maxuserid from " + TABLE_NAME;
			//Oracleの場合 OR PostgreSQLの場合
			}else if(objEnv.getDBType().equals( objEnv.DB_ORACLE ) || objEnv.getDBType().equals( objEnv.DB_POSTGRE )){
				strSQL = "select MAX(RTRIM(SUBSTR(" + USER_ID + ", 3, LENGTH(" + USER_ID + ") ))) as maxuserid from " + TABLE_NAME;
			}

		}
		catch( Exception e )
		{
			DebugLog.write( this.getClass(), e, DebugLog.HIGHT );
		}
		Vector vecList = new Vector();
		String strMaxUserID = "";

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

		while(rs.next()) {
			strMaxUserID = rs.getString( "maxuserid" );
		}

		return IdGenerator.getNextId( strMaxUserID );
	}

	/**
	 * 登録、更新処理時のデータを組み立てます
	 * @param htData
	 * @return Hashtable
	 */
	private Hashtable setData( Hashtable htbParam ) {
		Hashtable htbData = new Hashtable();
		putData( htbData, htbParam, USER_ID );
		putData( htbData, htbParam, USER_NAME );
		putPasswdData( htbData, htbParam, ENCRYPT_PASSWORD );
		putData( htbData, htbParam, CONTACT_ADDRESSS );
		putData( htbData, htbParam, SEX );
		putData( htbData, htbParam, CONTACT_EMAIL );
		putData( htbData, htbParam, CONTACT_EMAIL2 );
		putData( htbData, htbParam, READING_NAME );
		putData( htbData, htbParam, BIRTHDAY );
		putData( htbData, htbParam, CONTACT_TEL );
		putData( htbData, htbParam, CUSTOM_MSG_DIR );
		putData( htbData, htbParam, DELETE_FLAG );
		putData( htbData, htbParam, FOREIGN_ID );
		putData( htbData, htbParam, LOGIN_ID );
		putData( htbData, htbParam, AD_USER_ID );
		putData( htbData, htbParam, USER_TYPE );
		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 );
		}
	}

	/**
	 * 安全にHashtableに追加するメソッドです※パスワード暗号化用
	 */
	private void putPasswdData( Hashtable htbData,  Hashtable htbParam, String strKey ) {
		String strValue = (String)htbParam.get( strKey );
		if( strValue != null ) {
			htbData.put( strKey, RmsKPassword.GetEncodePassword( 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;
	}

	/**
	 * 性別が省略された場合の値を生成します。
	 * @param strSex 性別
	 * @return String 省略時の性別を返します
	 */
	private String setDefaultSex(String strSex) {

		if((strSex==null) || (strSex.length()==0)){
			strSex = "3";
		}

		return strSex;
	}

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

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

}
