/*
このファイルの中身は、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.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;
import java.util.*;
import java.sql.*;
import jp.co.ntt.lms.xmo.*;
import jp.co.ntt.lms.xmo.Message.Message;
import jp.co.ntt.lms.xmo.GroupAndPeople.*;
import jp.co.ntt.lms.xmo.Assignments.*;
import jp.co.ntt.lms.xmo.LoRelation.*;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.Groups.GroupsData;
import jp.co.ntt.lms.xmo.Base.XMSBaseClient;

/**
 * People 管理XMO サーバクラスです。<BR>
 * XMO基本メソッドを実装し、クライアントからの登録、更新、削除、検索処理
 * 要求をうけそれぞれの処理を行います。<BR>
 * RMIサーバとして動作するためRemoteインタフェースであるXMOインタフェースを実装し、
 * 永続的な起動状態を確保するためjava.rmi.server.UnicastRemoteObjectクラスを継承します。
 * @author T.Nijou
 * @version 0.0.0.1 2004.01.08
 */
public class People extends UnicastRemoteObject
	implements XMO, PeopleMessage, PeopleTable
{

	//////////////////////////////////////////////////////////////////
	// メソッド名定義
	//////////////////////////////////////////////////////////////////
	/** 登録メソッド名です */
	private static final String METHOD1 = "insert";	// 登録
	/** 更新メソッド名です */
	private static final String METHOD2 = "update";	// 更新
	/** 削除メソッド名です */
	private static final String METHOD3 = "delete";	// 削除
	/** 検索メソッド名です */
	private static final String METHOD4 = "select";	// 検索
	/** 教材（ＬＯＩＤ）リストの取得メソッド名です */
	private static final String METHOD5 = "getLoidList";
	/** ユーザの階層（グループ名）を取得するメソッド名です */
	private static final String METHOD6 = "searchReferenceList";	// ID変換

	/** XMOメッセージ番号 */
	public static final String XMO_MSG_NUM = "10";

	/**
	 * 人テーブルアクセスクラスを保持します
	 */
	private PeopleDataAccess pobjDataAccess = new PeopleDataAccess();

	/**
	 * コンストラクタです。
	 */
	public People() throws RemoteException {
		// リモートオブジェクトをエクスポートする
		// java.rmi.server.UnicastRemoteObject の
		// 引数なしのコンストラクタを呼び出す
		super();
	}

	/**
	 * メニュー一覧を返します
	 * @return Vector メニュー一覧
	 */
	public Vector getMenuList(Hashtable htbParam) {
		Vector vecMenuList = new Vector();
		try {
			PeopleEnv objEnv = PeopleEnv.getInstance();
			vecMenuList = objEnv.getMenuList();
		}
		catch( Exception e ) {
			return new Vector();
		}
		return vecMenuList;
	}

	/**
	 * メソッド一覧を返します
	 * @return Vector
	 */
	public Vector getMethodList() {
		Vector vecMethod = new Vector();
		vecMethod.add( METHOD1 );
		vecMethod.add( METHOD2 );
		vecMethod.add( METHOD3 );
		vecMethod.add( METHOD4 );
		return vecMethod;
	}

	/**
	 * デフォルトメニューを返します
	 * @return String
	 */
	public MenuData getDefaultMenu() {
		return null;
	}

	/**
	 * このXMOで定義された、メソッドのクライアント側からの入り口になるメソッドです。
	 * @param strMethodName 実行するメソッド名を指定します
	 * @param htData メソッドで実行するパラメータを指定します<BR>
	 *               なお必要なキーと値は各DAOの処理メソッドの説明を参照して下さい。
	 * @retunr Object 戻り値（さまざまな戻り値に対応するためObject型としてあります)<BR>
	 *                受け取り側では適切な値にキャストする必要があります。
	 */
	public Object execute( String strMethodName, Hashtable htData ) {

		Object objReturn = null;

		if( strMethodName.equals( METHOD1 ) ) {
			objReturn = insert( htData );
		}
		else if( strMethodName.equals( METHOD2 ) ) {
			objReturn = update( htData );
		}
		else if( strMethodName.equals( METHOD3 ) ) {
			objReturn = delete( htData );
		}
		else if( strMethodName.equals( METHOD4 ) ) {
			objReturn = select( htData );
		}
		else if( strMethodName.equals( METHOD5 ) ) {
			objReturn = getLoidList( htData );
		}
		else if( strMethodName.equals( METHOD6 ) ) {
			objReturn = searchReferenceList( htData );
		}

		return objReturn;
	}

	/**
	 * 起動確認（必ずtrueを返す）
	 * @return boolean 必ずtrueが返ります
	 */
	public boolean isLaunch() {
		return true;
	}

	/**
	 * Peopleテーブルへ登録処理を行います。<BR>
	 * 以下のパラメータチェックを行い、すべてOKの場合は
	 * DAOの登録処理メソッドを実行します。
	 * <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             削除フラグ
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 登録情報
	 * @return Vector 結果（配列の先頭にMessageDataオブジェクトを格納して返します)
	 */
	private Vector insert( Hashtable htData ) {
		Vector vecReturn = new Vector();

		MessageData objMessage = null;
		// 登録処理のパラメータチェックを行います
		String strMessage = insertCheck( htData );
		if( strMessage.equals( "" ) ) {
			try {
				PeopleData objData = pobjDataAccess.insert( htData );
				vecReturn.add( objData );
			}
			catch( XMOException xe ) {
				objMessage = xe.getMessageData();
			}
		}
		else {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );	
			objMessage = getMessageData( strMessage );
		}
		// メッセージデータオブジェクトの作成
		vecReturn.add( 0, objMessage );
		return vecReturn;
	}

	/**
	 * Peopleテーブルへ更新処理を行います。<BR>
	 * 以下のパラメータチェックを行い、すべてOKの場合は
	 * DAOの更新処理メソッドを実行します。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 登録情報
	 * @return Vector 結果（配列の先頭にMessageDataオブジェクトを格納して返します)
	 */
	private Vector update( Hashtable htData ) {
		Vector vecReturn = new Vector();

		MessageData objMessage = null;
		// 更新処理のパラメータチェックを行います
		String strMessage = updateCheck( htData );
		if( strMessage.equals( "" ) ) {
			try {
				pobjDataAccess.update( htData );
			}
			catch( XMOException xe ) {
				objMessage = xe.getMessageData();
			}
		}
		else {
			DebugLog.write( this.getClass(), new Exception(), DebugLog.HIGHT );	
			objMessage = getMessageData( strMessage );
		}

		vecReturn.add( objMessage );
		return vecReturn;
	}

	/**
	 * Peopleテーブルへ削除処理を行います。<BR>
	 * 以下のパラメータチェックを行い、すべてOKの場合は
	 * DAOの削除処理メソッドを実行します。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 削除情報
	 * @return Vector 結果（配列の先頭にMessageDataオブジェクトを格納して返します)
	 */
	private Vector delete( Hashtable htData ) {
		Vector vecReturn = new Vector();
		MessageData objMessage = null;
		try {
			pobjDataAccess.delete( htData );
		}
		catch( XMOException xe ) {
			objMessage = xe.getMessageData();
		}
		vecReturn.add( objMessage );
		return vecReturn;
	}

	/**
	 * Peopleテーブルへ検索処理を行います。<BR>
	 * 以下のパラメータチェックを行い、すべてOKの場合は
	 * DAOの検索処理メソッドを実行します。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             CONDITION_KEY           更新条件文
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htData 検索情報
	 * @return Vector 結果（配列の先頭にMessageDataオブジェクトを格納し、２番目移行に
	 *                      AssignmentsDataクラスを格納して返します。)
	 */
	private Vector select( Hashtable htData ) {
		Vector vecResult = new Vector();
		MessageData objMessage = null;
		try {
			vecResult = pobjDataAccess.select( htData );
		}
		catch( XMOException xe ) {
			objMessage = xe.getMessageData();
		}
		vecResult.add( 0, objMessage );
		return vecResult;
	}

	/**
	 * UserIDからLOIDの検索処理を行います。<BR>
     *
	 * @param htData 検索情報
	 * @return Vector 結果（配列の先頭にMessageDataオブジェクトを格納し、２番目移行に
	 *                      LOID(String型)を格納して返します。)
	 */
	private Vector getLoidList( Hashtable htData ) {

		String strUserID = (String)htData.get( METHOD5 );
		String strErr = "";
		String strMessage = "";

		Vector vecResult = new Vector();
		MessageData objMessage = null;
		try {
			/////////////////////////////////////////////////////////
			// UserIDをキーにGroupAndPeopleからmemberShipIDを取得
			/////////////////////////////////////////////////////////
			Vector vecMemberShipID = new Vector();
			GroupAndPeopleClient objGroupAndPeople = new GroupAndPeopleClient();
			objGroupAndPeople.setWhereChildID( strUserID );
			if( !objGroupAndPeople.select() ) {
				objMessage = objGroupAndPeople.getMessageData();
				vecResult.add( 0, objMessage );
				return vecResult;
			} else
			{
				// データ取得
				while( objGroupAndPeople.next() ) {
					String strMemberShipID = objGroupAndPeople.getMemberShipID();
					vecMemberShipID.add( strMemberShipID );
				}
			}

			//////////////////////////////////////////////////////
			// memberShipIDをキーにAssignmentsからmaterialIDを取得
			//////////////////////////////////////////////////////
			Vector vecMaterialID = new Vector();
			for(int i=0; i<vecMemberShipID.size(); i++)
			{
				AssignmentsClient objAssignments = new AssignmentsClient();
				objAssignments.setWhereMemberShipID( vecMemberShipID.elementAt(i).toString() );
				if( !objAssignments.select() ) {
					objMessage = objAssignments.getMessageData();
					vecResult.add( 0, objMessage );
					return vecResult;
				} else
				{
					// データ取得
					while( objAssignments.next() ) {
						String strMaterialID = objAssignments.getMaterialID();
						vecMaterialID.add( strMaterialID );
					}
				}
			}

			////////////////////////////////////////////////
			// materialIDをキーにLolelationからchildIDを取得
			////////////////////////////////////////////////
			for(int i=0; i<vecMaterialID.size(); i++)
			{
				LoRelationClient objLoRelation = new LoRelationClient();
				objLoRelation.setWhereMaterialID( vecMaterialID.elementAt(i).toString() );
				if( !objLoRelation.select() ) {
					objMessage = objLoRelation.getMessageData();
					vecResult.add( 0, objMessage );
					return vecResult;
				} else
				{
					// データ取得
					while( objLoRelation.next() ) {
						String strLoID = objLoRelation.getChildID();
						vecResult.add( strLoID );
					}
				}
			}
		}
		catch( Exception e ) {
			vecResult.add( 0, objMessage );
			return vecResult;
		}
		vecResult.add( 0, objMessage );
		return vecResult;
	}

	/**
	 * メッセージオブジェクトを作成します
	 * @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;
	}

	/**
	 * 登録処理のパラメータチェックを行います<BR>
	 * 以下のパラメータのチェックを行います。
	 * <PRE>
	 *             key                     説明
	 *          ---------------------------------------------
	 *             USER_NAME               ユーザ名
	 *             ENCRYPT_PASSWORD        パスワード
	 *             CONTACT_ADDRESSS        住所
	 *             SEX                     性別
	 *             CONTACT_EMAIL           メール１
	 *             CONTACT_EMAIL2          メール２
	 *             READING_NAME            ヨミカタ
	 *             BIRTHDAY                生年月日
	 *             CONTACT_TEL             電話番号
	 *             CUSTOM_MSG_DIR          コメント
	 *             DELETE_FLAG             削除フラグ
	 *             FOREING_ID              外部キー
	 *             LOGIN_ID                ログインID
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htbParam パラメータ
	 * @return String エラー時はエラー番号 OKのときは空文字を返します
	 */
	private String insertCheck( Hashtable htbParam ) {

		String strMessage = "";
		String strCheck = "";

		// ユーザIDのチェック
		strCheck = (String)htbParam.get( USER_ID );
		strMessage = PeopleCheck.checkUserID( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// ユーザ名のチェック(必須チェックあり)
		strCheck = (String)htbParam.get( USER_NAME );
		strMessage = PeopleCheck.checkUserName( strCheck, true );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// パスワードのチェック(必須チェックあり)
		strCheck = (String)htbParam.get( ENCRYPT_PASSWORD );
		strMessage = PeopleCheck.checkPassword( strCheck, true );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 住所のチェック
		strCheck = (String)htbParam.get( CONTACT_ADDRESSS );
		strMessage = PeopleCheck.checkAddress( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 性別のチェック
		strCheck = (String)htbParam.get( SEX );
		strMessage = PeopleCheck.checkSex( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// メール１のチェック
		strCheck = (String)htbParam.get( CONTACT_EMAIL );
		strMessage = PeopleCheck.checkEmail1( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// メール２のチェック
		strCheck = (String)htbParam.get( CONTACT_EMAIL2 );
		strMessage = PeopleCheck.checkEmail2( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// カナのチェック
		strCheck = (String)htbParam.get( READING_NAME );
		strMessage = PeopleCheck.checkReadingName( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 誕生日のチェック
		strCheck = (String)htbParam.get( BIRTHDAY );
		strMessage = PeopleCheck.checkBirthday( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 電話番号のチェック
		strCheck = (String)htbParam.get( CONTACT_TEL );
		strMessage = PeopleCheck.checkTel( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// コメントのチェック
		strCheck = (String)htbParam.get( CUSTOM_MSG_DIR );
		strMessage = PeopleCheck.checkCustomMsgDir( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// DELETE_FLAGのチェック
		strCheck = (String)htbParam.get( DELETE_FLAG );
		strMessage = PeopleCheck.checkDeleteFlag( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 外部キーのチェック(必須チェックあり)
		strCheck = (String)htbParam.get( FOREIGN_ID );

		// 外部IDが設定されているまたは画面入力なら
		if(strCheck != null || !BoolAutomaticPeForeignID()){
			strMessage = PeopleCheck.checkForeignID( strCheck, true );
			if( !strMessage.equals( "" ) ) {
				return strMessage;
			}
		}

		// ログインIDのチェック(必須チェックあり)
		strCheck = (String)htbParam.get( LOGIN_ID );
		strMessage = PeopleCheck.checkLoginID( strCheck, true );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// ＡＤユーザＩＤのチェック
		strCheck = (String)htbParam.get( AD_USER_ID );
		strMessage = PeopleCheck.checkAdUserId( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// ユーザタイプのチェック
		strCheck = (String)htbParam.get( USER_TYPE );
		strMessage = PeopleCheck.checkUserType( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// オブジェクトIDのチェック
		strCheck = (String)htbParam.get( OID );
		strMessage = PeopleCheck.checkOid( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}
		// ＡＤ識別名のチェック
		strCheck = (String)htbParam.get( AD_DN );
		strMessage = PeopleCheck.checkAdDn( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 正常時は空文字を返す
		return "";

	}

	/**
	 * 更新処理のパラメータチェックを行います<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             削除フラグ
	 *             FOREING_ID              外部キー
	 *             LOGIN_ID                ログインID
	 *          ---------------------------------------------
	 * </PRE>
	 * @param htbParam パラメータ
	 * @return String エラー時はエラー番号 OKのときは空文字を返します
	 */
	private String updateCheck( Hashtable htbParam ) {

		String strMessage = "";
		String strCheck = "";

		// ユーザIDのチェック
		strCheck = (String)htbParam.get( USER_ID );
		strMessage = PeopleCheck.checkUserID( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// ユーザ名のチェック
		strCheck = (String)htbParam.get( USER_NAME );
		strMessage = PeopleCheck.checkUserName( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// パスワードのチェック
		strCheck = (String)htbParam.get( ENCRYPT_PASSWORD );
		strMessage = PeopleCheck.checkPassword( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 住所のチェック
		strCheck = (String)htbParam.get( CONTACT_ADDRESSS );
		strMessage = PeopleCheck.checkAddress( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 性別のチェック
		strCheck = (String)htbParam.get( SEX );
		strMessage = PeopleCheck.checkSex( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// メール１のチェック
		strCheck = (String)htbParam.get( CONTACT_EMAIL );
		strMessage = PeopleCheck.checkEmail1( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// メール２のチェック
		strCheck = (String)htbParam.get( CONTACT_EMAIL2 );
		strMessage = PeopleCheck.checkEmail2( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// カナのチェック
		strCheck = (String)htbParam.get( READING_NAME );
		strMessage = PeopleCheck.checkReadingName( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 誕生日のチェック
		strCheck = (String)htbParam.get( BIRTHDAY );
		strMessage = PeopleCheck.checkBirthday( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 電話番号のチェック
		strCheck = (String)htbParam.get( CONTACT_TEL );
		strMessage = PeopleCheck.checkTel( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// コメントのチェック
		strCheck = (String)htbParam.get( CUSTOM_MSG_DIR );
		strMessage = PeopleCheck.checkCustomMsgDir( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// DELETE_FLAGのチェック
		strCheck = (String)htbParam.get( DELETE_FLAG );
		strMessage = PeopleCheck.checkDeleteFlag( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 外部キーのチェック
		strCheck = (String)htbParam.get( FOREIGN_ID );
		strMessage = PeopleCheck.checkForeignID( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// ログインIDのチェック
		strCheck = (String)htbParam.get( LOGIN_ID );
		strMessage = PeopleCheck.checkLoginID( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// ＡＤユーザＩＤのチェック
		strCheck = (String)htbParam.get( AD_USER_ID );
		strMessage = PeopleCheck.checkAdUserId( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// ユーザタイプのチェック
		strCheck = (String)htbParam.get( USER_TYPE );
		strMessage = PeopleCheck.checkUserType( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// オブジェクトIDのチェック
		strCheck = (String)htbParam.get( OID );
		strMessage = PeopleCheck.checkOid( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}
		// ＡＤ識別名のチェック
		strCheck = (String)htbParam.get( AD_DN );
		strMessage = PeopleCheck.checkAdDn( strCheck, false );
		if( !strMessage.equals( "" ) ) {
			return strMessage;
		}

		// 正常時は空文字を返す
		return "";
	}

	/**
	 * LO外部ID自動採番判断
	 * @return boolen　自動採番: true
	 */
	public boolean BoolAutomaticPeForeignID() {

		boolean boolflag = false;
		// XMS2.ini ファイルにグループPrefixが設定しているかをチェックする
		try{
			Environment objEnv = new Environment();
			String strGetPePrefix = objEnv.getPePrefix();

			if (strGetPePrefix != null){
				boolflag = true;
			}
		}
		catch(Exception ex)
		{
		}
		return 	boolflag;
	}

	/**
	 * IDから名称を取得します。<BR>
     * GroupAndPeopleClient.javaのsearchPathメソッドでパスを取得。
	 * @param htData 検索情報
	 * @return Vector 結果を返します。
	 */
	private Vector searchReferenceList( Hashtable htData ) {

		Vector vecRes = new Vector();						// 戻り値用ベクター
		MessageData objMessage = null;
		String[][] strReferenceList = null;
		String strUserID = (String)htData.get( USER_ID );	// ユーザーID
		String strUserName = (String)htData.get( USER_NAME );	// ユーザー名
		String strLoginUserID = (String)htData.get( LOGIN_USER_ID );	// ログインユーザID
		String strGroupID = "";
		try
		{
			// パラメータチェック
			if( strUserID == null || strLoginUserID == null ) {
				throw new XMOException( PARAM_WAR );
			}

			// ユーザIDがスーパユーザの場合は何もしない
			if( strUserID.equals(XMOPropertyDef.ROOT_USER) ) {
				// 長さ0の配列を返す。
				vecRes.add( objMessage );
				vecRes.add( new String[0] );
				return vecRes;
			}

			// 権限フィルター用ベクター
			Vector vecFilterList = null;

			// ログインユーザがスーパユーザ以外の場合は権限対象グループのリストを取得します。
			if( !strLoginUserID.equals(XMOPropertyDef.ROOT_USER) ) {

				// XMSBaseを使用して、ログインユーザが使用できるグループリストを取得します。
				XMSBaseClient objBase = new XMSBaseClient();
				if( !objBase.searchRootGroupList( strLoginUserID ) ) {
					throw new XMOException( objBase.getMessageData() );
				}

				GroupsData[] objRootGroups = objBase.getRootGroupList();
				// 権限フィルタ用のIDリストを作成する。
				vecFilterList = new Vector();
				for( int i = 0; i < objRootGroups.length; i++ ) {
					vecFilterList.add( objRootGroups[i].getGroupID() );
				}
			}


			// 指定されたユーザIDの参照リストを取得する
			GroupAndPeopleClient objGandP = new GroupAndPeopleClient();
			if( !objGandP.searchPath(strUserID) ) {
				// パス検索がうまくいかなかった場合
				DebugLog.write(this.getClass(), "学習者パス検索失敗", DebugLog.HIGHT);
				throw new XMOException( objGandP.getMessageData() );
			}

			// 参照IDリスト格納用のベクター
			Vector vecReferenceIDList = new Vector();
			while( objGandP.next() ) {
				StringBuffer sbPathForID = new StringBuffer();

				boolean isAuth = false;
				String[] strPath = objGandP.getPath();
				for( int i = 0; i < strPath.length-1; i++ ) {
					strGroupID = strPath[i];

					// 権限フィルターが設定されていた場合は権限によるチェックをします。
					if( vecFilterList != null &&
					    vecFilterList.contains( strGroupID ) )
					{
						// 権限フィルターにIDが含まれていたら権限フラグをtrueにする
						isAuth = true;
					}

					// 権限フィルターに含まれているIDより後にIDをバスリストに足す
					if( vecFilterList == null || isAuth ) {
						// 各階層のグループ名を取得
						sbPathForID.append(strGroupID);
						sbPathForID.append("/");
					}
				}
				sbPathForID.append(strUserID);

				if( vecFilterList == null || isAuth ) {
					String strPathForID = sbPathForID.toString();
					if( vecFilterList != null ) {
						// 権限フィルターが設定されていた場合はパスの頭に"grouptreeroot"を足す
						strPathForID = "grouptreeroot/" + strPathForID;
					}
					// PATHの取得
					vecReferenceIDList.add( strPathForID );
				}
			}
			// 結果を配列にコピーする
			String[] strReferenceIDList = new String[vecReferenceIDList.size()];
			vecReferenceIDList.copyInto( strReferenceIDList );


			// 名前パスリストを格納する
			String[] strReferenceNameList = new String[strReferenceIDList.length];
			GroupsClient objGroups = new GroupsClient();
			// IDパスから名前パスを生成する。
			for(int i = 0; i < strReferenceIDList.length; i ++) {
				// 名前パス生成StringBufferのインスタンス化
				StringBuffer strNameBuf = new StringBuffer();

				// トークン分割
				StringTokenizer objToken = new StringTokenizer( strReferenceIDList[i], "/" );

				while( objToken.hasMoreTokens() ) {
					String strID = objToken.nextToken();

					if( strID.length() <= 2 || strID.substring( 0, 2 ).equals( "PE" ) ) {
						// ユーザIDの場合は処理中断
						break;
					}

					String strGroupName = null;
					if( strID.equals( "grouptreeroot" ) ) {
						strGroupName = "root";
					}
					else {
						// グループクライアントのパラメータクリア
						objGroups.clear();

						// 各階層のグループ名を取得
						objGroups.setWhereGroupID( strID );
						if( !objGroups.select() ) {
							// 検索に失敗した場合はエラーを投げる
							throw new XMOException( objGroups.getMessageData() );
						}
						else {
							if( objGroups.next() ) {
								strGroupName = objGroups.getGroupName();
							}
						}
					}

					if( strGroupName != null ) {
						strNameBuf.append( strGroupName );
						// 区切り文字('/')の付加
						strNameBuf.append( "/" );
					}
				}

				strNameBuf.append( strUserName );
				// 配列に格納
				strReferenceNameList[i] = strNameBuf.toString();
			}

			strReferenceList = new String[2][strReferenceIDList.length];
			strReferenceList[0] = strReferenceIDList;
			strReferenceList[1] = strReferenceNameList;
		}
		catch( XMOException xe ) {
			objMessage = xe.getMessageData();
			DebugLog.write(this.getClass(), xe, DebugLog.HIGHT);
		}
		catch( Exception e ) {
			objMessage = getMessageData( SYSTEM_ERR );
			DebugLog.write(this.getClass(), e, DebugLog.HIGHT);
		}

		vecRes.add( objMessage );
		vecRes.add( strReferenceList );

		return vecRes;
	}

}

