/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	アサイン更新処理　LOのアサイン画面のグループツリー表示Actionクラス
//
//		変更履歴
//			2005.02.16  新規作成  氏名 石崎賢太郎
//
//	機能
//
//	LOのアサイン画面のグループツリー表示Actionクラスです。
//
/////////////////////////////////////////////////////////////////
package jp.co.ntt.lms.xmf.actions.xmo.Assignments;

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.Assignments.AssignmentsConstants;
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.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.Groups.GroupsData;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.People.PeopleClient;
import jp.co.ntt.lms.xmo.util.DuplicateFilter;

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

/**
 * LOのアサイン画面のグループツリー表示Actionクラスです。
 * 
 * @author Kentaro Ishizaki (UNITEC)
 * @version 1.0
 */
public class Assignmentsframe_lo_assignAction 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
	{
		///////////////////////////////////////////
		// パラメータ取得
		// 	・parentID	親ＩＤ	必須
		// 	・selectID	子ＩＤ	必須
		///////////////////////////////////////////
		String strParentID = request.getParameter("parentID");
		String strSelectID = request.getParameter("selectID");

		///////////////////////////////////////////
		// パラメータチェック
		///////////////////////////////////////////

		//選択されたLOのタイトルを取得します。
		String strLoTytle_o = "";
		LoClient objLo = new LoClient();
		objLo.setWhereLoID( strSelectID );
		if( !objLo.select() ) {
			// 検索がうまくいかなかった場合
			if( objLo.isErr() ) {
				// エラーの場合
				request.setAttribute("message", "");
				request.setAttribute("detail", "");
				request.setAttribute("close", "on");
				request.setAttribute("errorurl", objLo.getURL());
				return mapping.findForward("error");
			}
			else {
				request.setAttribute("message", objLo.getMessage());
				request.setAttribute("detail", "");
				request.setAttribute("close", "on");
				return mapping.findForward("error");
			}
		}

		// 選択Lo情報の取得
		if( objLo.next() ) {
			//LO名
			strLoTytle_o = objLo.getLoTytle();
		}
		else {
			//Lo名が存在しない場合エラーを出力する
			String strMessage =  "LO名が存在しません。";
			request.setAttribute("message", strMessage);
			request.setAttribute("detail", "");
			request.setAttribute("close", "on");
			return mapping.findForward("error");
		}


		// ツリーデータ取得用のアプレット
		String strServerName_o = request.getServerName();
		int intServerPort_o = request.getServerPort();
		String strContextPath_o = request.getContextPath();

		// ツリーデータ取得部
		// Assignmentsテーブル取得
		AssignmentsClient objAssignmentsXMO = null;
		GroupAndPeopleClient objGroupAndPeopleXMO = null;
		GroupsClient objGroupsXMO = null;
		PeopleClient objPeopleXMO = null;

		// 表示情報取得エリア
		Vector vecAssignmentsList = new Vector();
		Vector vecIDList = new Vector();
		Vector vecFilterIDList = new Vector();
		Hashtable htbParentList = new Hashtable();


		// AssignmentsのコンポーネントＩＤの取得
		objAssignmentsXMO = new AssignmentsClient();
		objAssignmentsXMO.setWhereMaterialID( strParentID + strSelectID );
		objAssignmentsXMO.setOrderByAssignmentsID();

		if( !objAssignmentsXMO.select() ) {
			// 検索がうまくいかなかった場合
			if( objAssignmentsXMO.isErr() ) {
				// エラーの場合
				request.setAttribute("message", "");
				request.setAttribute("detail", "");
				request.setAttribute("close", "on");
				request.setAttribute("errorurl", objAssignmentsXMO.getURL());
				return mapping.findForward("error");
			}
			else {
				request.setAttribute("message", objAssignmentsXMO.getMessage());
				request.setAttribute("detail", "");
				request.setAttribute("close", "on");
				request.setAttribute("errorurl", "");
				return mapping.findForward("error");
			}
		}
		while( objAssignmentsXMO.next() ) {
			// メンバーシップＩＤの取得
			String strMemberShipID = objAssignmentsXMO.getMemberShipID();
			// GroupAndPeopleの子ＩＤ取得
			objGroupAndPeopleXMO = new GroupAndPeopleClient();
			objGroupAndPeopleXMO.setMemberShipID( strMemberShipID );
			if( !objGroupAndPeopleXMO.select() ) {
				// 検索がうまくいかなかった場合
				if( objGroupAndPeopleXMO.isErr() ) {
					// エラーの場合
					request.setAttribute("message", "");
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", objGroupAndPeopleXMO.getURL());
					return mapping.findForward("error");
				}
				else {
					request.setAttribute("message", objGroupAndPeopleXMO.getMessage());
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", "");
					return mapping.findForward("error");
				}
			}

			if( objGroupAndPeopleXMO.next() ) {
				String[] strInfo = new String[4];
				// 学習権限、管理権限の取得
				strInfo[0] = objAssignmentsXMO.getLearnAuthority();
				strInfo[1] = objAssignmentsXMO.getManagementAuthority();

				// 親ＩＤの取得
				strInfo[2] = objGroupAndPeopleXMO.getParentID();
				// 子ＩＤの取得
				strInfo[3] = objGroupAndPeopleXMO.getChildID();
				String strFilterMemberShipID = strInfo[2] + "^" + strInfo[3];
				vecIDList.add( strFilterMemberShipID );
				// メンバーシップIDをキーにしてアサイン情報をハッシュに格納する。
				htbParentList.put( strFilterMemberShipID, strInfo );
			}
		}

		// ログインしているユーザでアサイン権限のあるグループを取得します。
		// ログインユーザIDの取得
		String strUserID = (String)request.getSession().getAttribute( AssignmentsConstants.USER_ID );
		if( strUserID == null ) {
			// セッションが切れている場合はログイン画面にリダイレクト
			request.setAttribute("message", "");
			request.setAttribute("detail", "");
			request.setAttribute("close", "on");
			request.setAttribute("errorurl", AssignmentsConstants.LOGIN_REDIRECT);
			return mapping.findForward("error");
		}

		if( !strUserID.equals(AssignmentsConstants.SUPER_USER) ) {
			// セッションからXMOIDを取得する
			String strXmoID = (String)request.getSession().getAttribute( AssignmentsConstants.ASSIGN_XMO_ID );
			if( strXmoID == null ) {
				// セッションが切れている場合はログイン画面にリダイレクト
				request.setAttribute("message", "");
				request.setAttribute("detail", "");
				request.setAttribute("close", "on");
				request.setAttribute("errorurl", AssignmentsConstants.LOGIN_REDIRECT);
				return mapping.findForward("error");
			}

			// ログインユーザに割当たっているグループを取得します
			XMSBaseClient objXmoBase = new XMSBaseClient();
			if( !objXmoBase.searchRootGroupList(strUserID, strXmoID) ) {
				// 検索がうまくいかなかった場合
				if( objXmoBase.isErr() ) {
					// エラーの場合
					request.setAttribute("message", "");
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", objXmoBase.getURL());
					return mapping.findForward("error");
				}
				else {
					request.setAttribute("message", objXmoBase.getMessage());
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", "");
					return mapping.findForward("error");
				}
			}


			// 検索がうまくいった場合
			GroupsData[] objGroupsList = objXmoBase.getRootGroupList();
			for( int i = 0; i < objGroupsList.length; i++ ) {
				vecFilterIDList.add( objGroupsList[i].getGroupID() );
			}

			// 表示する情報の絞込み
			DuplicateFilter objFilter = new DuplicateFilter(vecIDList, vecFilterIDList, false );
			objFilter.filterDuplicateMemberShip();
		}

		for( int i = 0; i < vecIDList.size(); i++ ) {
			String strMemberShipID = (String)vecIDList.get(i);
			String[] strInfo = (String[])htbParentList.get(strMemberShipID);
			String strLearnAuthority = strInfo[0];
			String strManagementAuthority = strInfo[1];
			String strGRParentID = strInfo[2];
			String strChildID = strInfo[3];
			if( strChildID.substring( 0, 2 ).equals( "GR" ) ) {
				//更新するグループ情報をデータベースから取得する
				objGroupsXMO = new GroupsClient();
				// 検索条件の設定
				objGroupsXMO.setWhereGroupID( strChildID );
				if( !objGroupsXMO.select() ) {
					// 検索がうまくいかなかった場合
					if( objGroupsXMO.isErr() ) {
						// エラーの場合
						request.setAttribute("message", "");
						request.setAttribute("detail", "");
						request.setAttribute("close", "on");
						request.setAttribute("errorurl", objGroupsXMO.getURL());
						return mapping.findForward("error");
					}
					else {
						request.setAttribute("message", objGroupsXMO.getMessage());
						request.setAttribute("detail", "");
						request.setAttribute("close", "on");
						request.setAttribute("errorurl", "");
						return mapping.findForward("error");
					}
				}
				String strGroupName = "";
				String strGroupType = "";
				if( objGroupsXMO.next() ) {
					// グループ名の取得
					strGroupName = objGroupsXMO.getGroupName();
					strGroupType = objGroupsXMO.getGroupType();
				}else{
					String strMessage =  "グループ名が取得できません。";
					request.setAttribute("message", strMessage);
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", "");
					return mapping.findForward("error");
				}
				// 取得データセーブ
				String[] strAssignmentsInfo = new String[6];
				if( vecFilterIDList.contains( strChildID ) ) {
					// 子IDがログインユーザにアサインされているグループと同一の場合
					// GROUP_TREE_ROOTに置き換え
					strAssignmentsInfo[0] = AssignmentsConstants.GROUP_TREE_ROOT;
				}
				else {
					strAssignmentsInfo[0] = strGRParentID;
				}
				strAssignmentsInfo[1] = strChildID;
				strAssignmentsInfo[2] = strGroupName;
				strAssignmentsInfo[3] = strGroupType;
				strAssignmentsInfo[4] = strLearnAuthority;
				strAssignmentsInfo[5] = strManagementAuthority;
				vecAssignmentsList.add(strAssignmentsInfo);
			} else {
				//更新するユーザ情報をデータベースから取得する
				objPeopleXMO = new PeopleClient();
				// 検索条件の設定
				objPeopleXMO.setWhereUserID( strChildID );
				if( !objPeopleXMO.select() ) {
					// 検索がうまくいかなかった場合
					if( objPeopleXMO.isErr() ) {
						// エラーの場合
						request.setAttribute("message", "");
						request.setAttribute("detail", "");
						request.setAttribute("close", "on");
						request.setAttribute("errorurl", objPeopleXMO.getURL());
						return mapping.findForward("error");
					}
					else {
						request.setAttribute("message", objPeopleXMO.getMessage());
						request.setAttribute("detail", "");
						request.setAttribute("close", "on");
						request.setAttribute("errorurl", "");
						return mapping.findForward("error");
					}
				}
				String strUserName = "";
				String strType = "";
				if( objPeopleXMO.next() ) {
					// ユーザ名の取得
					strUserName = objPeopleXMO.getUserName();
					strType = objPeopleXMO.getSex() + "^" + objPeopleXMO.getUserType();
				}else{
					String strMessage =  "グループ名が取得できません。";
					request.setAttribute("message", strMessage);
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", "");
					return mapping.findForward("error");
				}
				// 取得データセーブ
				String[] strAssignmentsInfo = new String[6];
				strAssignmentsInfo[0] = strGRParentID;
				strAssignmentsInfo[1] = strChildID;
				strAssignmentsInfo[2] = strUserName;
				strAssignmentsInfo[3] = strType;
				strAssignmentsInfo[4] = strLearnAuthority;
				strAssignmentsInfo[5] = strManagementAuthority;
				vecAssignmentsList.add(strAssignmentsInfo);
			}
		}


		//LOデータリストをベクターから配列にコピーします。
		String[][] strAssignmentsCopy_o = new String[vecAssignmentsList.size()][6];
		vecAssignmentsList.copyInto( strAssignmentsCopy_o );

		
		// リクエストに変数をセット
		request.setAttribute("strServerName_o", strServerName_o);
		request.setAttribute("intServerPort_o", new Integer(intServerPort_o));
		request.setAttribute("strContextPath_o", strContextPath_o);
		// LO名
		request.setAttribute("strLoTytle_o", strLoTytle_o);
		// LOデータリスト
		request.setAttribute("strAssignmentsCopy_o", strAssignmentsCopy_o);
		
		return mapping.findForward("success");
	}
}
