/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	ユーザー・グループ・LO情報設定処理 Velcity Toolクラス
//
//		変更履歴
//			2005.02.19  新規作成  村上 靖征
//
//	機能
//
//	このクラスはユーザー・グループ・LO情報設定処理を行うVelocity Toolクラスです。
//
////////////////////////////////////////////////////////////////

package jp.co.ntt.lms.xmf.tools;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;

import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.Lo.HistoryData;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.People.PeopleClient;
import jp.co.ntt.lms.xmo.RoleAssignments.RoleAssignmentsClient;
import jp.co.ntt.lms.xmo.Roles.RolesClient;
import jp.co.ntt.lms.xms.framework.XmsInnerException;

/**
 * URL文字列操作 Velocity Toolクラス
 * 
 * このクラスはユーザー・グループ・LO情報をrequest コンテキストに<BR>
 * 設定処理を行うための Velocity Toolクラスです。
 * 
 * @author 村上 靖征
 * @version 1.0
 */
public class ViewItemInfoTool
{
	/**
	 * 指定したID がユーザーIDかどうかを判断する
	 * 
	 * @param id ID
	 * @return ユーザーIDかどうかを示すフラグ
	 */
	public boolean isUserId(String id)
	{
		if (id != null)
		{
			return id.startsWith("PE");
		}
		else
		{
			return false;
		}
	}
	
	/**
	 * 指定したID がグループID かどうかを判断する。
	 * 
	 * @param id ID
	 * @return グループIDかどうかを示すフラグ
	 */
	public boolean isGroupId(String id)
	{
		if (id != null)
		{
			return id.startsWith("GR");
		}
		else
		{
			return false;
		}
	}
	
	/**
	 * 指定したID が LO ID かどうかを判断する。
	 * 
	 * @param id ID
	 * @return LO ID かどうかを示すフラグ。
	 */
	public boolean isLoId(String id)
	{
		if (id != null)
		{
			return id.startsWith("LO");
		}
		else
		{
			return false;
		}
	}
	
	/**
	 * 指定したユーザーのユーザー情報を request コンテキストに設定する。
	 * 以下の属性が request コンテキストに設定される。
	 * 
	 *   prefix + "_userinfo_loginid" ログインID
     *   prefix + "_userinfo_foreignid" 外部ID
     *   prefix + "_userinfo_username" ユーザー名
     *   prefix + "_userinfo_readingname" ユーザー名カナ
     *   prefix + "_userinfo_custommsgdir" コメント
     *   prefix + "_userinfo_groupname" グループ名
     *   prefix + "_userinfo_groupid" グループID
     *   prefix + "_userinfo_roleid_list" アサインされているロールIDのリスト
     *   prefix + "_userinfo_rolegroupid_list" アサインされているロールのグループID のリスト
     * 											順序は、ロールID のリストの順序に対応する。
     *   prefix + "_userinfo_rolename_list" アサインされているロール名のリスト	
     * 											順序は、ロールID のリストの順序に対応する。
     *   prefix + "_userinfo_rolegroupname_list" アサインされている ロールのグループ名のリスト	
     * 											順序は、ロールID のリストの順序に対応する。
     *
	 * @param userId ユーザーID
	 * @param request リクエスト
	 * @param prefix プレフィックス。属性名のプレフィックスとして使用される。
	 * @throws Exception
	 */
    public void setUserInfo(String userId, HttpServletRequest request, String prefix) throws Exception
    {
        //ユーザー名の取得
        PeopleClient pClient = new PeopleClient();
        pClient.setWhereUserID(userId);
        if (!pClient.select())
        {
            // エラー処理
            throw new XmsInnerException("ユーザーIDからユーザー情報が取得できません。");
        }
        if (!pClient.next())
        {
            // エラー処理
            throw new XmsInnerException("ユーザーIDから取得されるユーザー情報がありません。");
        }
        String userName = pClient.getUserName();
        String userLoginId = pClient.getLoginID();
        String userReadingName = pClient.getReadingName();
        String userCustomMsgDir = pClient.getCustomMsgDir();
        String userForeignId = pClient.getForeignID();

        //グループIDの取得
        String groupId = "";
        GroupAndPeopleClient gpClient = new GroupAndPeopleClient();
        gpClient.setWhereChildID(userId);
        if (gpClient.select())
        {
            if (gpClient.next())
            {
                groupId = gpClient.getParentID();
            }
        }

        //グループ情報の取得
        String groupName = "";
        GroupsClient gsClient = new GroupsClient();
        if (groupId.length() > 0)
        {
            gsClient.setWhereGroupID(groupId);
            if (!gsClient.select())
            {
                // エラー処理
                throw new XmsInnerException("グループIDからグループ情報が取得できません。");
            }
            if (!gsClient.next())
            {
                // エラー処理
                throw new XmsInnerException("グループIDから取得されるグループ情報がありません。");
            }
            groupName = gsClient.getGroupName();
        }
        else
        {
            groupName = "";
        }

        //ロール情報の取得
        RoleAssignmentsClient raClient = new RoleAssignmentsClient();
        raClient.setWhereUserID(userId);
        ArrayList roleIdList = new ArrayList();
        ArrayList roleGroupIdList = new ArrayList();
        if (raClient.select())
        {
            int count = raClient.getResultCount();
            for (int i=0; i < count; i++)
            {
                raClient.next();
                roleIdList.add(raClient.getRoleID());
                roleGroupIdList.add(raClient.getGroupID());
            }
        }
        
        ArrayList roleNameList = new ArrayList();
        RolesClient rolesClient = new RolesClient();
        for (int i=0; i < roleIdList.size(); i++)
        {
            rolesClient.clear();
            rolesClient.setWhereRoleID((String)roleIdList.get(i));
            if (rolesClient.select())
            {
                rolesClient.next();
                roleNameList.add(rolesClient.getRoleName());
            }
        }
        
        ArrayList roleGroupNameList = new ArrayList();
        for (int i=0; i < roleGroupIdList.size(); i++)
        {
            gsClient.clear();
            gsClient.setWhereGroupID((String)roleGroupIdList.get(i));
            if (gsClient.select())
            {
                gsClient.next();
                roleGroupNameList.add(gsClient.getGroupName());
            }
        }
        
        request.setAttribute(prefix + "_userinfo_loginid", userLoginId);
        request.setAttribute(prefix + "_userinfo_foreignid", userForeignId);
        request.setAttribute(prefix + "_userinfo_username", userName);
        request.setAttribute(prefix + "_userinfo_readingname", userReadingName);
        request.setAttribute(prefix + "_userinfo_custommsgdir", userCustomMsgDir);        
        request.setAttribute(prefix + "_userinfo_groupname", groupName);
        request.setAttribute(prefix + "_userinfo_groupid", groupId);
        request.setAttribute(prefix + "_userinfo_roleid_list", roleIdList);
        request.setAttribute(prefix + "_userinfo_rolegroupid_list", roleGroupIdList);
        request.setAttribute(prefix + "_userinfo_rolename_list", roleNameList);
        request.setAttribute(prefix + "_userinfo_rolegroupname_list", roleGroupNameList);
    }
    
    /**
	 * 指定したグループのグループ情報を request コンテキストに設定する。
	 * 以下の属性が request コンテキストに設定される。
	 * 
	 * prefix + "_groupinfo_foreignid" 外部ID
     * prefix + "_groupinfo_groupname" グループ名
     * prefix + "_groupinfo_custommsgdir" コメント
     * 
     * @param groupId グループID
     * @param request リクエスト
     * @param prefix プレフィックス。属性名のプレフィックスとして使用される。
     * @throws Exception
     */
    public void setGroupInfo(String groupId, HttpServletRequest request, String prefix) throws Exception
    {
    	if (groupId == null)
    	{
    		return;
    	}
        //グループ情報の取得
        String groupName = "";
        String groupForeignId = "";
        String groupCustomMsgDir = "";
        
        GroupsClient gsClient = new GroupsClient();
        if (groupId.length() > 0)
        {
            gsClient.setWhereGroupID(groupId);
            if (!gsClient.select())
            {
                // エラー処理
                throw new XmsInnerException("グループIDからグループ情報が取得できません。");
            }
            if (!gsClient.next())
            {
                // エラー処理
                throw new XmsInnerException("グループIDから取得されるグループ情報がありません。");
            }
            groupName = gsClient.getGroupName();
            groupForeignId = gsClient.getForeignID();
            groupCustomMsgDir = gsClient.getCustomMsgDir();
        }
        
        request.setAttribute(prefix + "_groupinfo_foreignid", groupForeignId);
        request.setAttribute(prefix + "_groupinfo_groupname", groupName);
        request.setAttribute(prefix + "_groupinfo_custommsgdir", groupCustomMsgDir);        
    }
    
    /**
	 * 指定したLOのLO情報を request コンテキストに設定する。
	 * 以下の属性が request コンテキストに設定される。
	 * 
	 *	prefix + "_loinfo_foreignid" 外部ID
     *  prefix + "_loinfo_title" タイトル
     *  prefix + "_loinfo_keyword" キーワード
     *  prefix + "_loinfo_version" バージョン
     *  prefix + "_loinfo_realloid" Real LO ID
     *  prefix + "_loinfo_entrydate" 登録日
     *  prefix + "_loinfo_entryusername" 登録ユーザー名
     *  prefix + "_loinfo_entryloginid" 登録ユーザーログインID
     *  prefix + "_loinfo_lastdate" 最終更新日
     *  prefix + "_loinfo_lastusername" 最終更新ユーザー名
     *  prefix + "_loinfo_lastloginid" 最終更新ユーザーログインID
     *  prefix + "_loinfo_renewcount" 更新回数
     *  prefix + "_loinfo_explanation" 説明
     * 
     * @param loId LO ID
     * @param request リクエスト
     * @param prefix プレフィックス。属性名のプレフィックスとして使用される。
     * @throws Exception
     */
    public void setLoInfo(String loId, HttpServletRequest request, String prefix) throws Exception
    {
    	if (loId == null)
    	{
    		return;
    	}
    	
    	LoClient loClient = new LoClient();
    	loClient.setWhereLoID(loId);
    	
    	String loForeignId = "";
    	String loTitle = "";
    	String loKeyword = "";
    	String loVersion = "";
    	String loEntryDate = "";
    	String loEntryUserName = "";
    	String loEntryLoginId = "";
    	String loLastDate = "";
    	String loLastUserName = "";
    	String loLastLoginId = "";
    	String loRenewCount = "";
    	String loRealLoId = "";
    	String loExplanation = "";
    	
    	if (loClient.select())
    	{
    		if (loClient.next())
    		{
    			loForeignId = loClient.getForeignID();
    			loTitle 	= loClient.getLoTytle();
    			loKeyword 	= loClient.getKeyWord();
    			loVersion 	= loClient.getLoVersion();
    			loRealLoId  = loClient.getRealLOID();
    			loExplanation = loClient.getLoExplanation();
    			if (loClient.selectHistory(loRealLoId))
    			{
        			HistoryData historyData = (HistoryData) loClient.getHistory();
        			loEntryDate 	= historyData.getEntryDate();		//登録日
        			loEntryUserName	= historyData.getEntryUserName();	//登録者
        			loEntryLoginId	= historyData.getEntryLoginID();	//登録者ID
        			loLastDate 		= historyData.getLastDate(); 		//最終更新日
        			loLastUserName	= historyData.getLastUserName();	//最終更新者
        			loLastLoginId	= historyData.getLastLoginID();		//更新者ID
        			loRenewCount	= historyData.getRenewCnt();		//更新回数
    			}
    		}
    	}
    	
        request.setAttribute(prefix + "_loinfo_foreignid", loForeignId);
        request.setAttribute(prefix + "_loinfo_title", loTitle);
        request.setAttribute(prefix + "_loinfo_keyword", loKeyword);
        request.setAttribute(prefix + "_loinfo_version", loVersion);
        request.setAttribute(prefix + "_loinfo_realloid", loRealLoId);
        request.setAttribute(prefix + "_loinfo_entrydate", loEntryDate);
        request.setAttribute(prefix + "_loinfo_entryusername", loEntryUserName);
        request.setAttribute(prefix + "_loinfo_entryloginid", loEntryLoginId);
        request.setAttribute(prefix + "_loinfo_lastdate", loLastDate);
        request.setAttribute(prefix + "_loinfo_lastusername", loLastUserName);
        request.setAttribute(prefix + "_loinfo_lastloginid", loLastLoginId);
        request.setAttribute(prefix + "_loinfo_renewcount", loRenewCount);
        request.setAttribute(prefix + "_loinfo_explanation", loExplanation);
    }
}
