/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	ロールアサイン子グループ取得処理Actionクラス
//
//		変更履歴
//			2005.02.16  新規作成  氏名 石崎賢太郎
//
//	機能
//
//	ロールアサイン子グループ取得処理Actionクラスです。
//
/////////////////////////////////////////////////////////////////
package jp.co.ntt.lms.xmf.actions.xmo.RoleAssignments;

import java.util.Hashtable;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jp.co.ntt.lms.xmf.xmo.RoleAssignments.RoleAssignmentsConstants;
import jp.co.ntt.lms.xmo.Base.XMSBaseClient;
import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import jp.co.ntt.lms.xmo.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.Groups.GroupsData;
import jp.co.ntt.lms.xmo.util.HtmlEscape;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 * ロールアサイン子グループ取得処理Actionクラスです。
 * 
 * @author Kentaro Ishizaki (UNITEC)
 * @version 1.0
 */
public class RoleAssignmentsGetChildGroupsAction extends Action
{
	/**
	 * strutsフレームワークから呼ばれるメソッドです。
	 * 
	 * @param mapping マッピングオブジェクト。
	 * @param form アクションフォームオブジェクト。
	 * @param request リクエストオブジェクト。
	 * @param response レスポンスオブジェクト。
	 * @return ActionForward アクションフォワードオブジェクト。
	 * @throws Exception
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		// パラメータ取得
		String strParentID = request.getParameter( "ParentID" );

		// キャッシュ無効処理
		response.setHeader( "cache-control", "no-cache" );

		GroupAndPeopleClient objXMO = null;
		int intGPResult = 0;	
		try {
			StringBuffer strGetLine = new StringBuffer();
			strGetLine.append( "<childlenlist>\n" );
			
			if(strParentID.equals(RoleAssignmentsConstants.GROUP_TREE_ROOT)){
				// ログインしているユーザに管理アサインされているLOを取得します。
				// ログインユーザIDの取得
				String strUserID = (String)request.getSession().getAttribute(RoleAssignmentsConstants.USER_ID);
				if(strUserID == null){
					request.setAttribute("strChildGroups", "ERR1");
					return mapping.findForward("success");
				}
				
				// セッションからXMOIDを取得する
				String strXmoID = (String)request.getSession().getAttribute(RoleAssignmentsConstants.ASSIGN_XMO_ID);
				if(strXmoID == null){
					request.setAttribute("strChildGroups", "ERR2");
					return mapping.findForward("success");
				}
				XMSBaseClient objXms = new XMSBaseClient();
				
				// ルートGroupリスト検索処理(アサイン管理(LO)が割当たっているものを取得)
				if(!objXms.searchRootGroupList(strUserID, strXmoID)){
					request.setAttribute("strChildGroups", "ERR3");
					return mapping.findForward("success");
				}
				
				// 検索がうまくいった場合
				GroupsData[] objGroupsList = objXms.getRootGroupList();
				
				// ルート直下のMemberShipIDをセッションに格納するためのHashtableをインスタンス化
				Hashtable htbRootInfo = new Hashtable();
				// セッションに格納します
				request.getSession().setAttribute(RoleAssignmentsConstants.ASSIGN_ROOT_INFO, htbRootInfo);
				for( int i = 0; i < objGroupsList.length; i++ ) {
					GroupsData objGroupsData = objGroupsList[i];
					
					String strGroupID = objGroupsData.getGroupID();
					String strParentGroupID = objGroupsData.getParentID();
					// セッション情報にLOIDをキーにして、MemberShipIDを格納します
					htbRootInfo.put(strGroupID, strParentGroupID);
					
					// 出力文字列の作成
					strGetLine.append( "<child title=\"" );
					strGetLine.append( HtmlEscape.escape(objGroupsData.getGroupName()) );
					strGetLine.append( "\" iconid=\"group\" id=\"" );
					strGetLine.append( strGroupID );
					strGetLine.append( "\" type=\"" );
					if(i == objGroupsList.length - 1){
						strGetLine.append( objGroupsData.getGroupType() + "^L");
					}
					else{
						strGetLine.append(objGroupsData.getGroupType());
					}
					strGetLine.append( "\" />\n" );
				}
			}
			else{
			
				// グループと人管理XMOの取得
				objXMO = new GroupAndPeopleClient();
				objXMO.setParentID( strParentID );
				
				if( !objXMO.select() ) {
					// 検索がうまくいかなかった場合
					if( objXMO.isErr() ) {
						// エラーの場合
						request.setAttribute("message", "");
						request.setAttribute("detail", "");
						request.setAttribute("close", "on");
						request.setAttribute("errorurl", objXMO.getURL());
						return mapping.findForward("error");
					}
					else {
						String strMessage =  objXMO.getMessage();
						request.setAttribute("message", strMessage);
						request.setAttribute("detail", "");
						request.setAttribute("close", "on");
						request.setAttribute("errorurl", "");
						return mapping.findForward("error");
					}
				}else{
					intGPResult = objXMO.getResultCount();
				}
				// グループ管理XMOの取得
				String strGroupflag = "";//人かグループか判断する
				GroupsClient objGroups = new GroupsClient();

				Vector vecChildList = new Vector();
				while( objXMO.next() ) {
					
					// グループIDの取得
					String strChildID = objXMO.getChildID();
					if(strChildID.substring( 0, 2 ).equals( "GR" ) ) {
						vecChildList.add( strChildID );
					}
				}
				
				for( int i = 0; i < vecChildList.size(); i++ ) {
					String strChildID = (String)vecChildList.get(i);
					// グループIDを元にグループ名称を取得する
					objGroups.clear();
					objGroups.setWhereGroupID( strChildID );
					if( objGroups.select() ) {
						String strGroupName = "";
						String strGroupType = "";
						if( objGroups.next() ) {
							strGroupName = objGroups.getGroupName();
							strGroupType = objGroups.getGroupType();
						}
						//同階層の最終レコードの場合
						if(i==vecChildList.size()-1){
							strGroupType = strGroupType + "^L";
						}
						strGetLine.append( "<child title=\"" );
						strGetLine.append( HtmlEscape.escape(strGroupName) );
						strGetLine.append( "\" iconid=\"group\" id=\"" );
						strGetLine.append( strChildID );
						strGetLine.append( "\" type=\"" );
						strGetLine.append( strGroupType );
						strGetLine.append( "\" />\n" );
					}
					else {
						// 検索がうまくいかなかった場合
						if( objGroups.isErr() ) {
							// エラーの場合
							request.setAttribute("message", "");
							request.setAttribute("detail", "");
							request.setAttribute("close", "on");
							request.setAttribute("errorurl", objGroups.getURL());
							return mapping.findForward("error");
						}
						else {
							String strMessage =  objGroups.getMessage();
							request.setAttribute("message", strMessage);
							request.setAttribute("detail", "");
							request.setAttribute("close", "on");
							request.setAttribute("errorurl", "");
							return mapping.findForward("error");
						}
					}
				}
			}
			strGetLine.append( "</childlenlist>\n" );

			request.setAttribute("strChildGroups", strGetLine.toString());
			return mapping.findForward("success");
		}
		catch( Exception e ) {
			e.printStackTrace();
			request.setAttribute("strChildGroups", "ERR_EXCEPTION");
			return mapping.findForward("success");
		}
		
	}
}
