/*
 * 作成日: 2005/10/08
 *
 * 変更履歴
 *     2006.01.20  getAssigneeToGroupID のバグ修正
 *                 getManagementMembershipID を 非推奨に設定。(将来削除予定)
 *
 *     2006.02.09  isManagementAssign を追加。
 * 
 */
package jp.co.ntt.lms.otm;

import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import jp.co.ntt.lms.otm.util.OTMUtil;
import jp.co.ntt.lms.xmf.xmo.Base.Common;
import jp.co.ntt.lms.xmo.XMOPropertyDef;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xmo.Base.XMSBaseClient;
import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.RoleAssignments.RoleAssignmentsClient;
import jp.co.ntt.lms.xmo.Roles.RolesClient;

/**
 * 
 * OTM ユーザーに関連した情報を取得するクラス
 * 
 * @author yasu
 *
 */
public class OTMUser {
	
	private String		userID;
		
	/**
	 * 引数を指定したコンストラクタ
	 * @param userId	ユーザーID
	 */
	public OTMUser(String userId)
	{
		this.userID = userId;
	}

	/**
	 * 指定された権限を持つロールIDのリストを取得する。
	 * 
	 * @param xmoClassName XMO のクラス名
	 * @return
	 * @throws Exception
	 */
	private static String[] getRoleIDList(String xmoClassName) throws Exception {

		// 指定された権限の XMOID 取得
		XMSBaseClient objXMSBase = new XMSBaseClient();
		objXMSBase.setWhereClassName(xmoClassName);
		if( !objXMSBase.select() )
		{
			// 検索がうまくいかなかった場合
			if( objXMSBase.isErr() )
			{
				throw new Exception(objXMSBase.getMessage());
			}
		}
		objXMSBase.next();
		String instructor_xmoid = objXMSBase.getXmoID();

		// Roles, RolesFunction テーブルから、指定された権限をもつロールのロールIDリストの取得
		RolesClient rolesClient = new RolesClient();
		Vector vecFunction = new Vector();
		vecFunction.add(instructor_xmoid);
		rolesClient.searchRoleIdFromFunc(vecFunction);
		if (rolesClient.isErr())
		{
			throw new Exception(rolesClient.getMessage());
		}
		//counselorRoleIDList = rolesClient.getRoleIdList();
		return rolesClient.getRoleIdList();
	}
	
	
	/**
	 * このユーザーの上位グループのうち、指定されたLOがアサインされた
	 * 最上位のグループの外部IDを取得する。
	 * グループの検索には内部的に getAssigneeTopGroupID が使用される。
	 * 
	 * 見つからなかった場合は、null が返却される。
	 * 
	 * @param loID
	 * @return
	 */
	public String getAssigneeTopGroupForeignID(String loID) throws Exception
	{
		String foreignID = null;

		String groupID = getAssigneeTopGroupID(loID);

		foreignID = OTMUtil.getGroupForeignID(groupID);
		
		return foreignID;
	}
	
	/**
	 * このユーザーの上位グループのうち、指定されたLOがアサインされた
	 * 最上位のグループのグループIDを取得する。
	 * 
	 * 見つからなかった場合は、null が返却される。
	 * 
	 * @param loID
	 * @return
	 * @throws Exception
	 */
	public String getAssigneeTopGroupID(String loID) throws Exception
	{
		
		//LOのマテリアルID の取得
		Vector materialIDVector = OTMUtil.getMaterial(loID);
		if (materialIDVector.size() == 0)
		{
			throw new Exception("LOID " + loID + " のマテリアルIDが取得できません。");
		}
		String materialID = (String)materialIDVector.get(0);
		
		//このユーザーのメンバーシップID を取得
		String membershipID = getMembershipID(loID);
		GroupAndPeopleClient client = new GroupAndPeopleClient();
		client.setWhereMemberShipID(membershipID);
		client.select();
		client.next();

		String childID = client.getChildID();
		//その親グループのID を取得
		String groupID = client.getParentID();
		String parentID = groupID;
		
		String result = null;
		AssignmentsClient assignClient = new AssignmentsClient();
		while (!parentID.equals(Common.GROUP_ROOT))
		{
			childID = groupID;
			groupID = parentID;
			parentID = OTMUtil.getParentGroupID(groupID);
			
			//このグループに対して指定したLOが学習アサインされているか
			assignClient.clear();
			assignClient.setWhereLearnAuthority();
			assignClient.setWhereMaterialID(materialID);
			assignClient.setWhereMemberShipID(parentID + groupID);
			assignClient.select();
			if (!assignClient.next())
			{
				//学習アサインされていない
				//この時点での childID の値が取得すべきグループID
				result = childID;
				break;
			}
			else
			{
				//学習アサインされている
				result = groupID;
			}
		}
		
		return result;
	}
		
	/**
	 * 指定されたLOが学習アサインされているグループのうち、このユーザーが
	 * 指定された権限を持つグループのIDからなるリストを返却する。
	 * 
	 * @param loID
	 * @param xmoClassName XMO のクラス名
	 * @return
	 * @throws Exception
	 */
	public Vector getLearnGroupIDList(String loID, String xmoClassName) throws Exception
	{
		//初期化
		Vector result = new Vector();
		
		// 指定権限ロールIDリストのセット
		String[] roleIDList = getRoleIDList(xmoClassName);
		
		// ロールID と ユーザーIDから、このユーザーが指定された権限で
		// ロール割り当てされているグループのメンバーシップIDを取得
		Hashtable membershipIdHash = new Hashtable(); //メンバーシップID 取得用
		RoleAssignmentsClient raClient = new RoleAssignmentsClient();
		for(int i = 0; i < roleIDList.length ; i++)
		{

			// 権限ロールIDリストからの取り出し
		    String roleId = roleIDList[i];

		    raClient.clear();
			raClient.setWhereUserID(userID);
		    // クエリにこのロールIDをセット
		    raClient.setWhereRoleID(roleId);
		    if(raClient.select() == false){
				throw new Exception(raClient.getMessage());
		    }
		    
		    // グループID を元に グループのメンバーシップIDの取得
		    String groupID = null;
		    while (raClient.next())
		    {
		    	groupID = raClient.getGroupID();
				GroupAndPeopleClient gapc = new GroupAndPeopleClient();
				gapc.setWhereChildID(groupID);
				gapc.select();
				while( gapc.next() ) {
					// グループのメンバーシップが未登録なら登録する
					if(gapc.isGroup()){
						String strAssignMembershipID = gapc.getMemberShipID();
						if(!membershipIdHash.containsKey(strAssignMembershipID)){
							membershipIdHash.put(strAssignMembershipID, groupID);
						}
					}
				}
		    }
		}

		// 指定したメソッドのマテリアルID を取得
		Vector vcMaterialID = OTMUtil.getMaterial(loID);
		for (int i = 0; i < vcMaterialID.size(); i++)
		{
			// 指定したメソッドが学習アサインされているグループの
			// メンバーシップを取得する
			String materialID = (String)vcMaterialID.get(i);
			AssignmentsClient assignClient = new AssignmentsClient();
			assignClient.setWhereMaterialID(materialID);
			assignClient.setWhereLearnAuthority();
			assignClient.select();
			while (assignClient.next())
			{
				// 指定したメソッドが学習アサインされているグループの
				// メンバーシップと比較する
				String assignedMembershipID = assignClient.getMemberShipID();
				Iterator itr = membershipIdHash.keySet().iterator();
				while (itr.hasNext())
				{
					String membershipID = (String)itr.next();
					
					// 同じ場合、グループが未登録なら登録する
					if (membershipID.compareTo(assignedMembershipID) == 0)
					{
						String strGroupID = (String)membershipIdHash.get(membershipID);
						if(!result.contains(strGroupID))
						{
							result.add(strGroupID);
						}
					}
				}
			}
		}
		return result;
	}

	/**
	 * 指定されたLOに対して、このユーザーの講師となっている
	 * ユーザーのIDのリストを取得する。
	 * 
	 * @param loID
	 * @return
	 * @throws Exception
	 */
	public List getInstructorIDList(String loID) throws Exception
	{
		//ユーザーが指定されたLOを学習する際の受講クラス（グループ）ID
		String strGroupID = OTMUtil.getGroupID(getMembershipID(loID));
		
		// 指定されたLOを管理アサインされたユーザーのIDからなるリスト
		Vector tmpInstructorList = new Vector();
		// LOのマテリアルIDを調べる
		Vector tmpVcMaterialID = OTMUtil.getMaterial(loID);
		for (int i = 0; i < tmpVcMaterialID.size(); i++)
		{
			String strMaterialID = (String)tmpVcMaterialID.get(i);
			
			// マテリアルIDを持つLOを管理アサインされたメンバーシップIDを調べる
			AssignmentsClient assignClient = new AssignmentsClient();
			assignClient.setWhereMaterialID(strMaterialID);
			assignClient.setWhereManagementAuthority();
			assignClient.select();
			while ( assignClient.next() )
			{
				String strMemberShipID = assignClient.getMemberShipID();

				// メンバーシップIDからユーザーIDを調べる
				GroupAndPeopleClient gapc = new GroupAndPeopleClient();
				gapc.setWhereMemberShipID(strMemberShipID);
				gapc.select();
				while( gapc.next() )
				{
					Vector tmpVec = new Vector();
					String strManagerUserID = gapc.getChildID();
					tmpInstructorList.add(strManagerUserID);
				}
			}
		}

		// 条件を満たしたユーザーID からなるリスト
		Vector instructorList = new Vector();
		// 講師権限を持つロールIDのリスト
		String[] instructorRoleIDs = getRoleIDList(XMOPropertyDef.INSTRUCTOR_XMO);
		// 受講クラス（グループ）に対して講師権限を持っているユーザーを選択する
		for (int i = 0; i < tmpInstructorList.size(); i++)
		{
			// 候補となるユーザー
			String instructorID = (String)tmpInstructorList.get(i);
			
			// 受講クラス（グループ）に対して講師権限があるか
		    for (int j = 0; j < instructorRoleIDs.length; j++)
		    {
			    String roleId = instructorRoleIDs[j];
				RoleAssignmentsClient raClient = new RoleAssignmentsClient();
				
				// 検索条件に受講クラス（グループ）IDをセット
				raClient.setWhereGroupID(strGroupID);
				// 検索条件にロールIDをセット
			    raClient.setWhereRoleID(roleId);			    	
			    // 検索条件に候補者のユーザーIDをセット
			    raClient.setWhereUserID(instructorID);
			    if(!raClient.select())
			    {
					throw new Exception(raClient.getMessage());
			    }
			    
			    // グループに対して講師権限でロール割り当てを受けたユーザーID の取得
			    if (raClient.next())
			    {
			    	if(!instructorList.contains(instructorID))
			    	{
			    		instructorList.add(instructorID);
			    	}
			    }
		    }
		}
		
		return instructorList;
	}
	
//	/**
//	 * 指定された教材のこのユーザーに対する学習割り当てを示す
//	 * アサインID を取得する。
//	 * 
//	 * メンバーシップID は getMembershipID のロジックに従って選択された
//	 * ものを使用する。
//	 * マテリアルIDは getMaterial のロジックに従って選択されたものから、
//	 * 一番目のマテリアルID を使用する。
//	 * 
//	 * @param loID
//	 * @return
//	 */
//	public String getAssignmentID(String loID) throws Exception
//	{
//		String assignmentID = null;
//		
//		List materialIDList = getMaterial(loID);
//		if (materialIDList.size() == 0)
//		{
//			throw new Exception("指定されたLO " + loID + " の親が登録されていません。");
//		}
//		String materialID = (String)materialIDList.get(0);
//		
//		String membershipID = getMembershipID(loID);
//		
//		AssignmentsClient client = new AssignmentsClient();
//		client.setWhereMaterialID(materialID);
//		client.setWhereMemberShipID(membershipID);
//		client.setWhereLearnAuthority();
//		if (client.select())
//		{
//			if (client.next())
//			{
//				assignmentID = client.getAssignID();
//			}
//			else
//			{
//				throw new Exception(client.getMessage());
//			}
//		}
//		else
//		{
//			throw new Exception(client.getMessage());
//		}
//		
//		return assignmentID;
//	}
	
	/**
	 * このユーザーが指定されたLOを学習する際の、
	 * 受講用のグループへの所属を示すメンバーシップIDを取得する。
	 * (どのグループのメンバーとして受講するのかが決定される。)
	 * 
	 * メンバーシップID が見つからなかった場合、null が返却される。
	 * 
	 * 複数、学習アサインが行われている場合は、一番古いアサイン
	 * に対するものを取得する。
	 * 
	 * @param loID
	 * @return 受講ユーザーのメンバーシップID
	 * @throws Exception
	 */
	public String getMembershipID(String loID) throws Exception
	{
		//
		// ユーザーが所属するすべてのグループに対して
		// ユーザーに振られたメンバーシップIDとグループID のハッシュ
		// メンバーシップID をキーとし、グループID を値とするハッシュ
		//
		//Vector vcMembership = new Vector();
		Hashtable membershipHash = OTMUtil.getMembershipHash(userID);

		Vector vcMaterial = OTMUtil.getMaterial(loID);
		String classMembership = null;
		
		RoleAssignmentsClient raClient = new RoleAssignmentsClient();
		Date mostOldOpeningDate = null;
		//ユーザーが持つすべてのメンバーシップID に対して
		//for(int i = 0; i < vcMembership.size(); i++)
		Iterator membershipItr = membershipHash.keySet().iterator();
		while (membershipItr.hasNext())
		{
			//String membershipID = (String)vcMembership.get(i);
			String membershipID = (String)membershipItr.next();
			
			//指定されたLOについてのすべてのマテリアル(通常ひとつ)
			//を検索し、学習アサインされているかチェックする。
			for (int i = 0; i < vcMaterial.size(); i++)
			{
				String materialID = (String)vcMaterial.get(i);
				AssignmentsClient ac = new AssignmentsClient();
				ac.setWhereLearnAuthority();
				ac.setWhereMaterialID(materialID);
				ac.setWhereMemberShipID(membershipID);
				ac.select();
				while ( ac.next() )
				{
					//
					//学習アサインされているので、
					//親グループに対して講師権限を持ったユーザーが存在するか
					//どうかをチェック
					//
					boolean rolecheck = false;
					String[] roleIds = getRoleIDList(XMOPropertyDef.INSTRUCTOR_XMO);
					String parentID = (String)membershipHash.get(membershipID);
					for (int j=0; j < roleIds.length; j++)
					{
						raClient.clear();
						raClient.setWhereRoleID(roleIds[j]);
						raClient.setWhereGroupID(parentID);
						raClient.select();
						if (raClient.next())
						{
							//存在すれば、チェックOK
							rolecheck = true;
							break;
						}
					}
					if (rolecheck == false)
					{
						//存在しなければ、
						//次のアサインをチェック
						continue;
					}
					if (classMembership == null)
					{
						classMembership = ac.getMemberShipID();
						mostOldOpeningDate = ac.getOpeningDate();
					}
					else
					{
						Date openingDate = ac.getOpeningDate();
						if (openingDate != null)
						{
							if (openingDate.compareTo(mostOldOpeningDate) < 0)
							{
								//このアサインが古ければ
								classMembership = ac.getMemberShipID();
								mostOldOpeningDate = ac.getOpeningDate();
							}
						}
					}
			    } // アサインの while loop
			} // マテリアルの for loop
		} //メンバーシップの while loop
		raClient = null;
		
		return classMembership;
	}
	
	/**
	 * このユーザーが指定されたLOを管理する際の、
	 * 受講用のグループへの所属を示すメンバーシップIDを取得する。
	 * (どのグループのメンバーとして受講するのかが決定される。)
	 * 
	 * メンバーシップID が見つからなかった場合、null が返却される。
	 * 
	 * 複数、管理アサインが行われている場合は、一番古いアサイン
	 * に対するものを取得する。
	 * 
	 * @deprecated
	 * 
	 * @param loID
	 * @return 受講ユーザーのメンバーシップID
	 * @throws Exception
	 */
	public String getManagementMembershipID(String loID) throws Exception
	{
		//
		// ユーザーが所属するすべてのグループに対して
		// ユーザーに振られたメンバーシップIDとグループID のハッシュ
		// メンバーシップID をキーとし、グループID を値とするハッシュ
		//
		//Vector vcMembership = new Vector();
		Hashtable membershipHash = new Hashtable();

		GroupAndPeopleClient gapc = new GroupAndPeopleClient(); 
		gapc.setWhereChildID(userID);
		gapc.select();
		while( gapc.next() )
		{
			String strMembershipID = gapc.getMemberShipID();
			//vcMembership.add(strMembershipID);
			if (!membershipHash.containsKey(strMembershipID))
			{
				membershipHash.put(strMembershipID, gapc.getParentID());
			}
		}
		Vector vcMaterial = OTMUtil.getMaterial(loID);
		String classMembership = null;
		
		RoleAssignmentsClient raClient = new RoleAssignmentsClient();
		Date mostOldOpeningDate = null;
		//ユーザーが持つすべてのメンバーシップID に対して
		//for(int i = 0; i < vcMembership.size(); i++)
		Iterator membershipItr = membershipHash.keySet().iterator();
		while (membershipItr.hasNext())
		{
			//String membershipID = (String)vcMembership.get(i);
			String membershipID = (String)membershipItr.next();
			
			//指定されたLOについてのすべてのマテリアル(通常ひとつ)
			//を検索し、管理アサインされているかチェックする。
			for (int i = 0; i < vcMaterial.size(); i++)
			{
				String materialID = (String)vcMaterial.get(i);
				AssignmentsClient ac = new AssignmentsClient();
				ac.setWhereManagementAuthority();
				ac.setWhereMaterialID(materialID);
				ac.setWhereMemberShipID(membershipID);
				ac.select();
				while ( ac.next() )
				{
					//
					//管理アサインされているので、
					//親グループに対して講師権限を持ったユーザーが存在するか
					//どうかをチェック
					//
					boolean rolecheck = false;
					String[] roleIds = getRoleIDList(XMOPropertyDef.INSTRUCTOR_XMO);
					String parentID = (String)membershipHash.get(membershipID);
					for (int j=0; j < roleIds.length; j++)
					{
						raClient.clear();
						raClient.setRoleID(roleIds[j]);
						raClient.setGroupID(parentID);
						raClient.select();
						if (raClient.next())
						{
							//存在すれば、チェックOK
							rolecheck = true;
							break;
						}
					}
					if (rolecheck == false)
					{
						//存在しなければ、
						//次のアサインをチェック
						continue;
					}
					if (classMembership == null)
					{
						classMembership = ac.getMemberShipID();
						mostOldOpeningDate = ac.getOpeningDate();
					}
					else
					{
						Date openingDate = ac.getOpeningDate();
						if (openingDate != null)
						{
							if (openingDate.compareTo(mostOldOpeningDate) < 0)
							{
								//このアサインが古ければ
								classMembership = ac.getMemberShipID();
								mostOldOpeningDate = ac.getOpeningDate();
							}
						}
					}
			    } // アサインの while loop
			} // マテリアルの for loop
		} //メンバーシップの while loop
		raClient = null;
		
		return classMembership;
	}
	
	/**
	 * このユーザーが、指定されたLOの講師であるかどうか
	 * を示すブール値を返却する。
	 * 
	 * @param loID
	 * @return
	 * @throws Exception
	 */
	public boolean isInstructor(String loID) throws Exception
	{
		
		//
		// Step1.
		// 最初に、このユーザーが講師権限をもつグループリストを取得。
		//
		
		// 講師権限をもつロールIDリストの取得
		String[] instructorRoleIDList = getRoleIDList(XMOPropertyDef.INSTRUCTOR_XMO);
		
		// ロールID と ユーザーID を使用して、
		// このユーザーがロール割り当てされているグループを取得
		Vector groupIdList = new Vector(); //グループID 取得用
		for (int i = 0; i < instructorRoleIDList.length ; i++)
		{
			RoleAssignmentsClient raClient = new RoleAssignmentsClient();
			raClient.setWhereUserID(userID);
			// 講師権限をもつロールID
		    String roleId = instructorRoleIDList[i];
		    // クエリにこのロールIDをセット
		    raClient.setWhereRoleID(roleId);
		    if(!raClient.select())
		    {
				throw new Exception(raClient.getMessage());
		    }
		    
		    // ロール割り当てされたグループID の取得
		    while (raClient.next())
		    {
		        String groupId = raClient.getGroupID();
		        groupIdList.add(groupId);
		    }
		}
		//
		// ロール割り当てされたグループがない場合
		// このユーザーには、そもそもどのグループに対しても
		// 講師権限を持っていない。
		//
		if(groupIdList.size() == 0)
	    {
			return false;
	    }

		//
		// Step 2.
		// このユーザーが講師権限をもつグループがあったので、
		// そのグループ に対して、指定されたLO が学習アサインされているか
		// を判断。
		//

		GroupAndPeopleClient gapc = new GroupAndPeopleClient();
		for (int i = 0; i < groupIdList.size();i++)
		{
			gapc.clear();
			gapc.setWhereChildID((String)groupIdList.get(i));
			gapc.select();
			if (gapc.next())
			{
				String membershipID = gapc.getMemberShipID();
				Vector materialIDVector = OTMUtil.getMaterial(loID);
				for (int j=0; j < materialIDVector.size(); j++)
				{
					String materialID = (String)materialIDVector.get(j);
					AssignmentsClient assignClient = new AssignmentsClient();
					//学習アサイン
					assignClient.setWhereLearnAuthority();
					//マテリアルID
					assignClient.setWhereMaterialID(materialID);
					//メンバーシップID
					assignClient.setWhereMemberShipID(membershipID);
					assignClient.select();
					if (assignClient.next())
					{
						return true;
					}
				}
			}
		}
		
		return false;
	}
	
	/**
	 * 指定されたLOが管理アサインされているかどうかを示す
	 * ブール値を返却する。
	 * LOのマテリアルIDとこのユーザーのメンバーシップの組に対して
	 * すべて検索し、管理アサインされているものがあれば真。
	 * 
	 * @param loID
	 * @return
	 * @throws Exception
	 */
	public boolean isManagementAssign(String loID) throws Exception
	{
	    boolean result = false;
		//
		// ユーザーが所属するすべてのグループに対して
		// ユーザーに振られたメンバーシップIDとグループID のハッシュ
		// メンバーシップID をキーとし、グループID を値とするハッシュ
		//
		Hashtable membershipHash = new Hashtable();

		GroupAndPeopleClient gapc = new GroupAndPeopleClient(); 
		gapc.setWhereChildID(userID);
		gapc.select();
		while( gapc.next() )
		{
			String strMembershipID = gapc.getMemberShipID();
			if (!membershipHash.containsKey(strMembershipID))
			{
				membershipHash.put(strMembershipID, gapc.getParentID());
			}
		}
		Vector vcMaterial = OTMUtil.getMaterial(loID);
		String classMembership = null;
		
		RoleAssignmentsClient raClient = new RoleAssignmentsClient();
		Date mostOldOpeningDate = null;
		//ユーザーが持つすべてのメンバーシップID に対して
		Iterator membershipItr = membershipHash.keySet().iterator();
		while (membershipItr.hasNext())
		{
			String membershipID = (String)membershipItr.next();
			
			//指定されたLOについてのすべてのマテリアル(通常ひとつ)
			//を検索し、管理アサインされているかチェックする。
			for (int i = 0; i < vcMaterial.size(); i++)
			{
				String materialID = (String)vcMaterial.get(i);
				AssignmentsClient ac = new AssignmentsClient();
				ac.setWhereManagementAuthority();
				ac.setWhereMaterialID(materialID);
				ac.setWhereMemberShipID(membershipID);
				ac.select();
				while ( ac.next() )
				{
					//
					//管理アサインされている
					//
				    result = true;
				    break;
				}
				if (result == true)
				{
				    break;
				}
			}
			if (result == true)
			{
			    break;
			}
		}
		
		return result;
	}

//	/**
//	 * このユーザーの上位グループのうち、指定されたLOが管理アサインされた
//	 * 最上位のグループの外部IDを取得する。
//	 * グループの検索には内部的に getAssigneeTopGroupID が使用される。
//	 * 
//	 * 見つからなかった場合は、null が返却される。
//	 * 
//	 * @param loID
//	 * @return
//	 */
//	public String getAssigneeTopGroupManagementForeignID(String loID) throws Exception
//	{
//		String foreignID = null;
//
//		String groupID = getAssigneeTopGroupManagementID(loID);
//
//		GroupsClient gClient = new GroupsClient();
//		gClient.setWhereGroupID(groupID);
//		if (gClient.select())
//		{
//			if (gClient.next())
//			{
//				foreignID = gClient.getForeignID();
//			}
//		}
//		gClient = null;
//		
//		return foreignID;
//	}
//	
//	/**
//	 * このユーザーの上位グループのうち、指定されたLOが管理アサインされた
//	 * 最上位のグループのグループIDを取得する。
//	 * 
//	 * 見つからなかった場合は、null が返却される。
//	 * 
//	 * @param loID
//	 * @return
//	 * @throws Exception
//	 */
//	public String getAssigneeTopGroupManagementID(String loID) throws Exception
//	{
//		
//		//LOのマテリアルID の取得
//		Vector materialIDVector = OTMUtil.getMaterial(loID);
//		if (materialIDVector.size() == 0)
//		{
//			throw new Exception("LOID " + loID + " のマテリアルIDが取得できません。");
//		}
//		String materialID = (String)materialIDVector.get(0);
//		
//		//このユーザーのメンバーシップID を取得
//		String membershipID = getManagementMembershipID(loID);
//		GroupAndPeopleClient client = new GroupAndPeopleClient();
//		client.setWhereMemberShipID(membershipID);
//		client.select();
//		client.next();
//
//		String childID = client.getChildID();
//		//その親グループのID を取得
//		String groupID = client.getParentID();
//		String parentID = groupID;
//		
//		String result = null;
//		AssignmentsClient assignClient = new AssignmentsClient();
//		while (!parentID.equals(Common.GROUP_ROOT))
//		{
//			childID = groupID;
//			groupID = parentID;
//			parentID = OTMUtil.getParentGroupID(groupID);
//			
//			//このグループに対して指定したLOが学習アサインされているか
//			assignClient.clear();
//			assignClient.setWhereLearnAuthority();
//			assignClient.setMaterialID(materialID);
//			assignClient.setWhereMemberShipID(parentID + groupID);
//			assignClient.select();
//			if (!assignClient.next())
//			{
//				//学習アサインされていない
//				//この時点での childID の値が取得すべきグループID
//				result = childID;
//				break;
//			}
//			else
//			{
//				result = groupID;
//			}
//		}
//		
//		return result;
//	}

}
