/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	ツリー情報取得 Velocity Toolクラス
//
//		変更履歴
//			2005.02.19  新規作成  村上 靖征
//
//	機能
//
//	このクラスはツリー情報を取得するクラスです。
//
////////////////////////////////////////////////////////////////

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

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import jp.co.ntt.lms.lo.LoComData;
import jp.co.ntt.lms.lo.LoTopClient;
import jp.co.ntt.lms.lo.MaterialNode;
import jp.co.ntt.lms.lo.MaterialNodeList;
import jp.co.ntt.lms.xmf.tools.ToolBase;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.XMOException;
import jp.co.ntt.lms.xmo.Base.XMSBaseClient;
import jp.co.ntt.lms.xmo.Base.Gui.BaseDisplayData;
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.Lo.LoData;
import jp.co.ntt.lms.xmo.LoRelation.LoRelationClient;
import jp.co.ntt.lms.xmo.Method.MethodClient;
import jp.co.ntt.lms.xmo.Method.MethodData;
import jp.co.ntt.lms.xmo.util.HtmlEscape;

/**
 * ツリー情報を取得するVelocity Toolクラス
 * 
 * このクラスはツリーの情報一覧を取得するクラスです。
 * 
 * @author 村上 靖征
 * @version 1.0
 */
public class TreeViewTool extends ToolBase
{

    /**
     * ツリー表示時のルートに表示する情報一覧を取得するメソッドです。
     * 
     * @param strTreeType
     *            ツリータイプ
     * @param strUserID
     *            ユーザID
     * @return Vector ルート情報
     */
    public Vector getRootList(String strTreeType, String strUserID)
            throws XMOException, Exception
    {
        return GetRootList.getRootList(context, strTreeType, strUserID);
    }

    /**
     * 下位のグループ情報を取得する。
     * 
     * @param request リクエスト
     * @return グループ情報をあらわすXML
     */
    public String getChildGroups(HttpServletRequest request)
    {
        HttpSession session = request.getSession();

        // パラメータ取得
        String strParentID = request.getParameter("ParentID");
        String strUserID = request.getParameter("userId");

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

        try
        {
            StringBuffer strGetLine = new StringBuffer();
            strGetLine.append("<childlenlist>\n");

            // グループ管理XMOの取得
            GroupsClient objGroups = new GroupsClient();

            String GROUP_TREE_ROOT = getContextString("GROUP_TREE_ROOT");
            if (strParentID.equals(GROUP_TREE_ROOT))
            {
                Vector vecRootList = null;
                try
                {
                    String GROUP_TYPE = getContextString("GROUP_TYPE");
                    vecRootList = getRootList(GROUP_TYPE, strUserID);
                }
                catch (XMOException xe)
                {
                    xe.printStackTrace();
                    return "";
                }
                // ルート情報をセッションに格納
                Hashtable htbRootInfo = new Hashtable();
                String ROOT_INFO = getContextString("ROOT_INFO");
                session.setAttribute(ROOT_INFO, htbRootInfo);

                int intGRResult = vecRootList.size();
                for (int i = 0; i < intGRResult; i++)
                {
                    GroupsData objGroupsData = (GroupsData) vecRootList.get(i);

                    // セッションに入れたHastableにGroupIDをキーにして親IDを格納する。
                    htbRootInfo.put(objGroupsData.getGroupID(), objGroupsData
                            .getParentID());

                    String strGroupName = objGroupsData.getGroupName();
                    String strType = objGroupsData.getGroupType();
                    String strGroupID = objGroupsData.getGroupID();

                    //最終レコードの場合
                    if (i == intGRResult - 1)
                    {
                        strType = strType + "^L";
                    }

                    strGetLine.append("<child title=\"");
                    strGetLine.append(HtmlEscape.escape(strGroupName));
                    strGetLine.append("\" iconid=\"group\" id=\"");
                    strGetLine.append(strGroupID);
                    strGetLine.append("\" type=\"");
                    strGetLine.append(strType);
                    strGetLine.append("\" />\n");
                }
            }
            else
            {

                XMSBaseClient objBase = new XMSBaseClient();

                // 検索処理
                int intResult = 0;
                int intCounter = 0;
                String strName = "";
                String strType = "";
                String strID = "";
                String strIconID = "";
                if (objBase.selectGroupAndPeopleBaseDisplay(strParentID))
                {
                    BaseDisplayData[] objDisplayList = objBase.getBaseDisplay();
                    //検索件数を取得
                    intResult = objDisplayList.length;
                    // 検索がうまくいった場合
                    for (int i = 0; i < objDisplayList.length; i++)
                    {

                        BaseDisplayData objDisplay = objDisplayList[i];

                        strName = objDisplay.getTitle();
                        strType = objDisplay.getType();
                        strID = objDisplay.getID();
                        strIconID = "person";
                        if (strID.substring(0, 2).equals("GR"))
                        {
                            strIconID = "group";
                        }
                        intCounter++;
                        //最終レコード以外
                        if (intCounter == intResult)
                        {
                            strType = strType + "^L";
                        }

                        strGetLine.append("<child title=\"");
                        strGetLine.append(HtmlEscape.escape(strName));
                        strGetLine.append("\" iconid=\"" + strIconID
                                + "\" id=\"");
                        strGetLine.append(strID);
                        strGetLine.append("\" type=\"");
                        strGetLine.append(strType);
                        strGetLine.append("\" />\n");
                    }
                }
            }

            strGetLine.append("</childlenlist>\n");
            //out.write( strGetLine.toString() );
            return strGetLine.toString();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 下位の情報を取得する。
     * 
     * @param request リクエスト
     * @return 下位の情報をあらわすXML
     * @throws Exception
     */
    public String getChildMatSt(HttpServletRequest request) throws Exception
    {

        HttpSession session = request.getSession();

        // パラメータ取得
        String strMaterialPath = request.getParameter("MaterialPath");

        ///////////////////////////////////////////
        // セッション変数の取得
        // ・isLeaner 学習者種別 任意
        ///////////////////////////////////////////
        String LEANER = getContextString("LEANER");
        String strLearner = (String) session.getAttribute(LEANER);

        ///////////////////////////////////////////
        // セッション変数のチェック
        ///////////////////////////////////////////
        if (strLearner == null)
        {
            //response.sendRedirect( LOGIN_URL );
            return "";
        }

        // 取得したパスから、教材部分のパスのみを取得
        StringTokenizer objToken = new StringTokenizer(strMaterialPath, ":");
        while (objToken.hasMoreTokens())
        {
            objToken.nextToken();
            strMaterialPath = objToken.nextToken();
        }

        // 教材部分のパスからLOIDを取得し、その詳細情報を取得します
        String strLoID = "";
        objToken = new StringTokenizer(strMaterialPath, "/");
        int intCount = 0;
        StringBuffer strMatPath = new StringBuffer();
        while (objToken.hasMoreTokens())
        {
            if (intCount == 0)
            {
                strLoID = objToken.nextToken();
            }
            else
            {
                strMatPath.append("/");
                strMatPath.append(objToken.nextToken());
            }
            intCount++;
        }

        // LOXMOクライアントのインスタンスを生成します
        LoClient objLoClient = new LoClient();
        // LOIDを検索条件に設定します
        objLoClient.setWhereLoID(strLoID);

        // 検索処理実行
        if (!objLoClient.select())
        {
            // 検索処理に失敗した場合
            // ここにエラー処理を記述する
            // 今は特に何もしない
            return "";
        }

        // 検索結果の取得
        String strMaterialID = "";
        String strLoType = "";
        String strRealLOID = null;
        if (objLoClient.next())
        {
            // 教材種別の取得
            strLoType = objLoClient.getLoType();
            strRealLOID = objLoClient.getRealLOID();
        }

        try
        {
            StringBuffer strGetLine = new StringBuffer();
            strGetLine.append("<childlenlist>\n");

            // 教材種別を元にLoTopClientをインスタンス化
            // LOサーバ名の取得
            Environment objEnv = new Environment();
            String strLoServerName = objEnv.getLoServerName();
            // LOクラスをインスタンス化します
            LoTopClient objLoTopClient = new LoTopClient(strLoServerName,
                    strLoType);

            // LOから教材詳細情報を取得
            if (objLoTopClient.getData(strRealLOID))
            {
                if (objLoTopClient.getDataLength() > 0)
                {
                    LoComData objData = objLoTopClient.getDataInfo(0);
                    // 教材IDの取得
                    strMaterialID = objData.getMaterialID();
                }
            }

            // 教材パスを組み立てなおす
            strMaterialPath = "/" + strMaterialID + strMatPath.toString();

            // 教材構造取得メソッドをコールします
            // パラメータの準備
            Hashtable objParams = new Hashtable();
            objParams.put("MATID", strMaterialID);
            objParams.put("MatPath", strMaterialPath);

            if (!objLoTopClient.getMaterialStruct(objParams))
            {
                // ここにエラー処理記述
                return "";
            }

            MaterialNode objNode = (MaterialNode) objLoTopClient
                    .getMaterialStruct();
            if (objNode != null)
            {
                MaterialNodeList objNodeList = objNode.getChildList();
                int intCnt = 0;
                int intChildListCount = objNodeList.getChildCount();
                objNodeList.first();
                while (objNodeList.hasNext())
                {
                    MaterialNode objNodetemp = objNodeList.next();
                    String strIconID = "";
                    switch (objNodetemp.getNodeType())
                    {
                    // コースの場合
                    case MaterialNode.COURSE_NODE:
                        strIconID = "course";
                        break;
                    // ブロックの場合
                    case MaterialNode.BLOCK_NODE:
                        strIconID = "block";
                        break;
                    // AUの場合
                    case MaterialNode.AU_NODE:
                        strIconID = "au";
                        break;
                    default:
                        break;
                    }

                    //最終レコードである場合
                    if (intChildListCount - 1 == intCnt)
                    {
                        //L字型のGifアイコンを使用するための識別子をセットする
                        strLoType = "L" + strLoType;
                    }

                    strGetLine.append("<child title=\""
                            + objNodetemp.getTitle() + "\" iconid=\""
                            + strIconID + "\" id=\"" + objNodetemp.getAuID()
                            + "\"  type=\"" + strLoType + "\"/>\n");

                    intCnt++;
                }
            }

            strGetLine.append("</childlenlist>\n");

            return strGetLine.toString();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 下位の情報を取得する。
     * 
     * @param request リクエスト
     * @return 下位の情報をあらわすXML
     */
    public String getChildMaterial(HttpServletRequest request)
    {

        HttpSession session = request.getSession();

        // パラメータ取得
        String strParentID = request.getParameter("ParentID");
        String strUserID = request.getParameter("userId");

        ///////////////////////////////////////////
        // セッション変数の取得
        // ・isLeaner 学習者種別 任意
        ///////////////////////////////////////////
        String LEANER = getContextString("LEANER");
        String strLearner = (String) session.getAttribute(LEANER);

        ///////////////////////////////////////////
        // セッション変数のチェック
        ///////////////////////////////////////////
        if (strLearner == null)
        {
            //response.sendRedirect( LOGIN_URL );
            return "";
        }

        int intLRResult = 0;
        try
        {
            StringBuffer strGetLine = new StringBuffer();
            strGetLine.append("<childlenlist>\n");

            String LO_TREE_ROOT = getContextString("LO_TREE_ROOT");
            if (strParentID.equals(LO_TREE_ROOT))
            {
                Vector vecRootList = null;
                try
                {
                    String LO_TYPE = getContextString("LO_TYPE");
                    vecRootList = getRootList(LO_TYPE, strUserID);
                }
                catch (XMOException xe)
                {
                    xe.printStackTrace();
                    return "";
                }

                // ルート情報をセッションに格納
                Hashtable htbRootInfo = new Hashtable();
                String ROOT_INFO = getContextString("ROOT_INFO");
                session.setAttribute(ROOT_INFO, htbRootInfo);

                intLRResult = vecRootList.size();
                for (int i = 0; i < intLRResult; i++)
                {
                    LoData objLoData = (LoData) vecRootList.get(i);

                    // セッションに入れたHastableにLOIDをキーにして親IDを格納する。
                    htbRootInfo.put(objLoData.getLoID(), objLoData
                            .getParentID());

                    // LOIDの取得
                    String strLoID = objLoData.getLoID();
                    String strLoName = objLoData.getLoTytle();
                    String strLoType = objLoData.getLoType();
                    String strIconID = "";
                    // LO種別によってアイコンIDを振り分ける
                    if (strLoType.equals("0"))
                    {
                        strIconID = "container";
                    }
                    else
                    {
                        strIconID = "course";
                    }

                    //同階層の最終レコードの場合
                    if (i == intLRResult - 1)
                    {
                        strLoType = "L" + strLoType;
                    }
                    strGetLine.append("<child title=\"");
                    strGetLine.append(HtmlEscape.escape(strLoName));
                    strGetLine.append("\" iconid=\"");
                    strGetLine.append(strIconID);
                    strGetLine.append("\" id=\"");
                    strGetLine.append(strLoID);
                    strGetLine.append("\" type=\"");
                    strGetLine.append(strLoType);
                    strGetLine.append("\" />\n");
                }
            }
            else
            {

                XMSBaseClient objBase = new XMSBaseClient();

                // 検索処理
                int intResult = 0;
                int intCounter = 0;
                String strName = "";
                String strType = "";
                String strID = "";
                String strIconID = "";
                if (objBase.selectLoBaseDisplay(strParentID))
                {
                    BaseDisplayData[] objDisplayList = objBase.getBaseDisplay();
                    //検索件数を取得
                    intResult = objDisplayList.length;
                    // 検索がうまくいった場合
                    for (int i = 0; i < objDisplayList.length; i++)
                    {

                        BaseDisplayData objDisplay = objDisplayList[i];

                        strName = objDisplay.getTitle();
                        strType = objDisplay.getType();
                        strID = objDisplay.getID();
                        strIconID = "course";
                        if (strType.equals("0"))
                        {
                            strIconID = "container";
                        }
                        intCounter++;
                        //最終レコード以外
                        if (intCounter == intResult)
                        {
                            strType = "L" + strType;
                        }

                        strGetLine.append("<child title=\"");
                        strGetLine.append(HtmlEscape.escape(strName));
                        strGetLine.append("\" iconid=\"");
                        strGetLine.append(strIconID);
                        strGetLine.append("\" id=\"");
                        strGetLine.append(strID);
                        strGetLine.append("\" type=\"");
                        strGetLine.append(strType);
                        strGetLine.append("\" />\n");
                    }
                }
            }

            strGetLine.append("</childlenlist>\n");

            return strGetLine.toString();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 下位のメソッド情報を取得する。
     * 
     * @param request リクエスト
     * @return 下位のメソッド情報をあらわすXML
     */
    public String getChildMethods(HttpServletRequest request)
    {

        HttpSession session = request.getSession();

        // パラメータ取得
        String strParentID = request.getParameter("ParentID");
        String strUserID = request.getParameter("userId");

        ///////////////////////////////////////////
        // セッション変数の取得
        // ・isLeaner 学習者種別 任意
        ///////////////////////////////////////////
        String LEANER = getContextString("LEANER");
        String strLearner = (String) session.getAttribute(LEANER);

        ///////////////////////////////////////////
        // セッション変数のチェック
        ///////////////////////////////////////////
        if (strLearner == null)
        {
            //response.sendRedirect( LOGIN_URL );
            return "";
        }

        int intLRResult = 0;
        try
        {
            StringBuffer strGetLine = new StringBuffer();
            strGetLine.append("<childlenlist>\n");

            String METHOD_TREE_ROOT = getContextString("METHOD_TREE_ROOT");
            if (strParentID.equals(METHOD_TREE_ROOT))
            {
                Vector vecRootList = null;
                try
                {
                    String METHOD_TYPE = getContextString("METHOD_TYPE");
                    vecRootList = getRootList(METHOD_TYPE, strUserID);
                }
                catch (XMOException xe)
                {
                    xe.printStackTrace();
                    return "";
                }

                // ルート情報をセッションに格納
                Hashtable htbRootInfo = new Hashtable();
                String ROOT_INFO = getContextString("ROOT_INFO");
                session.setAttribute(ROOT_INFO, htbRootInfo);

                intLRResult = vecRootList.size();
                for (int i = 0; i < intLRResult; i++)
                {
                    LoData objLoData = (LoData) vecRootList.get(i);

                    // セッションに入れたHastableにLOIDをキーにして親IDを格納する。
                    htbRootInfo.put(objLoData.getLoID(), objLoData.getParentID());

                    // LOIDの取得
                    String strLoID = objLoData.getLoID();
                    String strLoName = objLoData.getLoTytle();
                    String strLoType = objLoData.getLoType();
                    String strIconID = "";
                    // LO種別によってアイコンIDを振り分ける
                    if (strLoType.equals("0"))
                    {
                        strIconID = "container";
                    }
                    else
                    {
                        strIconID = "course";
                    }

                    //同階層の最終レコードの場合
                    if (i == intLRResult - 1)
                    {
                        strLoType = "L" + strLoType;
                    }
                    strGetLine.append("<child title=\"");
                    strGetLine.append(HtmlEscape.escape(strLoName));
                    strGetLine.append("\" iconid=\"");
                    strGetLine.append(strIconID);
                    strGetLine.append("\" id=\"");
                    strGetLine.append(strLoID);
                    strGetLine.append("\" type=\"");
                    strGetLine.append(strLoType);
                    strGetLine.append("\" />\n");
                }
            }
            else
            {
            	String strLoName;
            	String strLoID;
            	String strLoType;
            	String strMethodID;
            	
				// LOリレーション管理XMOの取得
            	LoRelationClient objXMO = new LoRelationClient();
            	MethodClient objMethodClient = new MethodClient();
				objXMO.setParentID(strParentID);

				if (objXMO.select())
				{
					intLRResult = objXMO.getResultCount();
					// グループ管理XMOの取得
					LoClient objLo = new LoClient();
	
					int intCounter = 0;
					while (objXMO.next())
					{
						intCounter++;
						
						// LoIDの取得
						strLoID = objXMO.getChildID();
						
						// LO情報の取得
						objLo.clear();
						objLo.setWhereLoID(strLoID);
						if (!objLo.select())
							continue;
						if (!objLo.next())
							continue;
						
						strLoType = objLo.getLoType();
						if (intCounter == intLRResult)
							strLoType = "L" + strLoType;
						strLoName = objLo.getLoTytle();
						
						// メソッド情報を取得
						objMethodClient.clear();
						objMethodClient.setWhereLoID(strLoID);
						if (!objMethodClient.select())
							continue;
						if (objMethodClient.getResultCount() <= 0)
							continue;
						
						MethodData[] arrayMethod = objMethodClient.getResultList();
						strMethodID = arrayMethod[0].getMethodLOID();

						// コンテナとその他LOを区別するためstrLoTypeを追加
						strGetLine.append("<child title=\"");
						strGetLine.append(HtmlEscape.escape(strLoName));
						strGetLine.append("\" iconid=\"container\" id=\"");
						strGetLine.append(strLoID);
						strGetLine.append("\" type=\"");
						strGetLine.append(strLoType);
						strGetLine.append("\" methodId=\"");
						strGetLine.append(strMethodID);
						strGetLine.append("\" />\n");
					}
				}
            }

            strGetLine.append("</childlenlist>\n");

            return strGetLine.toString();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return "";
        }
    }
}