/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	アサイン更新処理　LOのアサイン画面のアサインツリー表示画面Actionクラス
//
//		変更履歴
//			2005.02.10  新規作成  石崎賢太郎（UNITEC）
//
//	機能
//
//	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.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.Lo.LoData;
import jp.co.ntt.lms.xmo.LoRelation.LoRelationClient;
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;
import org.apache.struts.util.MessageResources;

/**
 * LOアサイン画面のアサインツリー表示画面Actionクラスです。
 * 
 * @author Kentaro Ishizaki (UNITEC)
 * @version 1.0
 */
public class Assignmentsframe_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");

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

		// メッセージリソース取得
		MessageResources resources = getResources(request, "msg.xmf.xmo.Assignments.MessageResources");
		
		///////////////////////////////////////////
		// グループ／ユーザ情報取得
		///////////////////////////////////////////
		String strSelectName_o = "";

		if (strSelectID.substring(0, 2).equals("GR"))
		{
			// グループ情報取得
			GroupsClient objGroups = new GroupsClient();

			//検索条件の設定
			objGroups.setWhereGroupID(strSelectID);
			//検索実行
			if (!objGroups.select())
			{
				// 検索がうまくいかなかった場合
				if (objGroups.isErr())
				{
					// エラーの場合
					request.setAttribute("message", "");
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", objGroups.getURL());
					return mapping.findForward("error");
				}
				else
				{
					request.setAttribute("message", objGroups.getMessage());
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					return mapping.findForward("error");
				}
			}

			// 表示するグループ情報の取得
			if (objGroups.next())
			{
				//グループ名
				strSelectName_o = objGroups.getGroupName();
			}
			else
			{
				//グループ名が存在しない場合エラーを出力する
				request.setAttribute("message", resources.getMessage("M022007"));
				request.setAttribute("detail", "");
				request.setAttribute("close", "on");
				return mapping.findForward("error");
			}
		}
		else
		{
			// ユーザー情報取得
			PeopleClient objPeople = new PeopleClient();

			//検索条件の設定
			objPeople.setWhereUserID(strSelectID);
			//検索実行
			if (!objPeople.select())
			{
				// 検索がうまくいかなかった場合
				if (objPeople.isErr())
				{
					// エラーの場合
					request.setAttribute("message", "");
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", objPeople.getURL());
					return mapping.findForward("error");
				}
				else
				{
					request.setAttribute("message", objPeople.getMessage());
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", "");
					return mapping.findForward("error");
				}
			}

			// 表示するユーザー情報の取得
			if (objPeople.next())
			{
				//ユーザー名
				strSelectName_o = objPeople.getUserName();
			}
			else
			{
				//ユーザー名が存在しない場合エラーを出力する
				request.setAttribute("message", resources.getMessage("M032010"));
				request.setAttribute("detail", "");
				request.setAttribute("close", "on");
				request.setAttribute("errorurl", "");
				return mapping.findForward("error");
			}
		}

		///////////////////////////////////////////
		// ツリーデータ取得部
		// Assignmentsテーブル取得
		///////////////////////////////////////////
		AssignmentsClient objAssignmentsXMO = null;
		LoRelationClient objLoRelationXMO = null;
		LoClient objLoXMO = null;

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

		// AssignmentsのコンポーネントＩＤの取得
		objAssignmentsXMO = new AssignmentsClient();
		objAssignmentsXMO.setWhereMemberShipID( strParentID + strSelectID );
		objAssignmentsXMO.setWhereMethodFlag(false);
		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");
			}
		}
		String strMaterialID = "";
		while (objAssignmentsXMO.next())
		{
			// コンポーネントＩＤの取得
			strMaterialID = objAssignmentsXMO.getMaterialID();
			// LORelationの子ＩＤ（ＬＯＩＤ）取得
			objLoRelationXMO = new LoRelationClient();
			objLoRelationXMO.setmaterialID( strMaterialID );
			if (!objLoRelationXMO.select())
			{
				// 検索がうまくいかなかった場合
				if (objLoRelationXMO.isErr())
				{
					// エラーの場合
					request.setAttribute("message", "");
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", objLoRelationXMO.getURL());
					return mapping.findForward("error");
				}
				else
				{
					request.setAttribute("message", objLoRelationXMO.getMessage());
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", "");
					return mapping.findForward("error");
				}
			}

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

				// 親ＩＤの取得
				strInfo[2]= objLoRelationXMO.getParentID();
				// 子ＩＤの取得
				String strChildID = objLoRelationXMO.getChildID();

				vecIDList.add(strChildID);
				htbParentList.put(strChildID, 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))
		{
			// ログインユーザに割当たっているグループを取得します
			XMSBaseClient objXmoBase = new XMSBaseClient();
			if (!objXmoBase.searchRootLoList(strUserID, XMSBaseClient.MANAGE_TYPE))
			{
				// 検索がうまくいかなかった場合
				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");
				}
			}


			// 検索がうまくいった場合
			LoData[] objLoList = objXmoBase.getRootLoList();
			for (int i = 0; i < objLoList.length; i++)
			{
				vecFilterIDList.add(objLoList[i].getLoID());
			}

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

		for (int i = 0; i < vecIDList.size(); i++)
		{
			String strChildID = (String)vecIDList.get(i);
			String[] strInfo = (String[])htbParentList.get(strChildID);
			String strLearnAuthority = strInfo[0];
			String strManagementAuthority = strInfo[1];
			String strLOParentID = strInfo[2];

			//更新するLo情報をデータベースから取得する。
			objLoXMO = new LoClient();
			// 検索条件の設定
			objLoXMO.setWhereLoID(strChildID);
			if (!objLoXMO.select())
			{
				// 検索がうまくいかなかった場合
				if( objLoXMO.isErr() ) {
					// エラーの場合
					request.setAttribute("message", "");
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", objLoXMO.getURL());
					return mapping.findForward("error");
				}
				else
				{
					request.setAttribute("message", objLoXMO.getMessage());
					request.setAttribute("detail", "");
					request.setAttribute("close", "on");
					request.setAttribute("errorurl", "");
					return mapping.findForward("error");
				}
			}
			String strLoTytle = "";
			String strLoType = "";
			if (objLoXMO.next())
			{
				// ＬＯタイトルの取得
				strLoTytle = objLoXMO.getLoTytle();
				// ＬＯタイプの取得
				strLoType = objLoXMO.getLoType();
			}
			else
			{
				request.setAttribute("message", "ＬＯタイトルが取得できません。");
				request.setAttribute("detail", "");
				request.setAttribute("close", "on");
				request.setAttribute("errorurl", "");
				return mapping.findForward("error");
			}
			// 取得データセーブ
			String[] strAssignmentsInfo = new String[6];
			if (vecFilterIDList.contains(strChildID))
			{
				// 子IDがログインユーザに管理アサインされているLOと同一の場合
				// LO_TREE_ROOTに置き換え
				strAssignmentsInfo[0] = AssignmentsConstants.LO_TREE_ROOT;
			}
			else
			{
				strAssignmentsInfo[0] = strLOParentID;
			}
			strAssignmentsInfo[1] = strChildID;
			strAssignmentsInfo[2] = strLoTytle;
			strAssignmentsInfo[3] = strLoType;
			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);
		// 選択名
		request.setAttribute("strSelectName_o", strSelectName_o);
		// LOデータリスト
		request.setAttribute("strAssignmentsCopy_o", strAssignmentsCopy_o);
		
		return mapping.findForward("success");
	}
}
