/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	ネームパス用 Velocity Toolクラス
//
//		変更履歴
//			2005.02.19  新規作成  村上 靖征
//
//	機能
//
//	このクラスはネームパスを処理するクラスです。
//
////////////////////////////////////////////////////////////////

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

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

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.xmf.tools.ToolBase;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.Groups.GroupsClient;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.People.PeopleClient;

/**
 * ネームパスを処理するVelocity Toolクラス
 * 
 * このクラスはネームパスを処理するクラスです。
 * 
 * @author 村上 靖征
 * @version 1.0
 */
public class PathTool extends ToolBase
{
	/**
	 * IDパスから名称パスを作成するメソッドです。
	 * 
	 * @param strIDPath
	 *            '/'区切りのIDパス
	 * @return String '/'区切りの名称パス
	 */
	public ArrayList getNamePath(String strIDPath, String strTreeType)
			throws Exception
	{
		// 文字列を'/'のトークンに分解します
		StringTokenizer objToken = new StringTokenizer(strIDPath, "/");

		ArrayList strPath_info = new ArrayList();

		Vector vecIDList = new Vector();
		Vector vecMatIDList = new Vector();
		boolean blIsMatID = false;
		while (objToken.hasMoreTokens())
		{
			String strID = objToken.nextToken();
			// トークンが';'の場合
			if (strID.equals(":"))
			{
				blIsMatID = true;
				continue;
			}
			if (!blIsMatID)
			{
				// IDリストに追加
				vecIDList.add(strID);
			}
			else
			{
				// 教材IDリストに追加
				vecMatIDList.add(strID);
			}
		}

		// IDリストからIDを取得し、IDをキーにしてグループ名の取得を行います
		StringBuffer strNameBuf = new StringBuffer();
		// グループのツリーの場合グループXMOから情報を取得する
		String GROUP_TYPE = getContextString("GROUP_TYPE");
		String LO_TYPE = getContextString("LO_TYPE");
		if (strTreeType.equals(GROUP_TYPE))
		{
			GroupsClient objGroups = new GroupsClient();
			PeopleClient objPeople = new PeopleClient();
			for (int i = 0; i < vecIDList.size(); i++)
			{
				String strID = (String) vecIDList.get(i);
				String USER_PRE = getContextString("USER_PRE");
				String GROUP_PRE = getContextString("GROUP_PRE");
				String GROUP_TREE_ROOT = getContextString("GROUP_TREE_ROOT");
				if (strID.startsWith(USER_PRE))
				{
					// Peopleクライアントのパラメータクリア
					objPeople.clear();
					// 検索条件にIDをセットする
					objPeople.setWhereUserID(strID);
					if (!objPeople.select()) { return null; }

					if (objPeople.next())
					{
						strNameBuf.append(objPeople.getUserName());
					}
				}
				else if (strID.startsWith(GROUP_PRE))
				{
					// グループクライアントのパラメータクリア
					objGroups.clear();
					// 検索条件にIDをセットする
					objGroups.setWhereGroupID(strID);
					if (!objGroups.select()) { return null; }

					if (objGroups.next())
					{
						strNameBuf.append(objGroups.getGroupName());
					}
				}
				else if (strID.equals(GROUP_TREE_ROOT))
				{
					String GROUP_ROOT_NAME = getContextString("GROUP_ROOT_NAME");
					strNameBuf.append(GROUP_ROOT_NAME);
				}

				// 区切り文字('/')の付加
				if (i < vecIDList.size() - 1)
				{
					strNameBuf.append(" > ");
				}
			}
		}
		// LOのツリーの場合はLoXMOから情報を取得する
		else if (strTreeType.equals(LO_TYPE))
		{
			LoClient objLo = new LoClient();
			for (int i = 0; i < vecIDList.size(); i++)
			{
				// グループクライアントのパラメータクリア
				objLo.clear();
				String strID = (String) vecIDList.get(i);
				String LO_TREE_ROOT = getContextString("LO_TREE_ROOT");
				if (strID.equals(LO_TREE_ROOT))
				{
					String LO_ROOT_NAME = getContextString("LO_ROOT_NAME");
					strNameBuf.append(LO_ROOT_NAME);
				}
				// 検索条件にIDをセットする
				objLo.setWhereLoID(strID);
				if (!objLo.select()) { return null; }

				if (objLo.next())
				{
					strNameBuf.append(objLo.getLoTytle());
				}

				// 区切り文字('/')の付加
				if (i < vecIDList.size() - 1)
				{
					strNameBuf.append(" > ");
				}
			}
			// 教材IDリストを元に教材構造から章名を取得する
			for (int i = 1; i < vecMatIDList.size(); i++)
			{
				// 教材タイプを取得する
				String strLoType = objLo.getLoType();
				// 教材IDを取得する
				String strLoID = objLo.getLoID();
				// 章IDを取得する
				String strAuID = (String) vecMatIDList.get(i);
				// RealLOIDを取得する
				String strRealLOID = objLo.getRealLOID();
				// 教材種別を元にLoTopClientをインスタンス化
				// LOサーバ名の取得
				// LOサーバ名の取得
				Environment objEnv = new Environment();
				String strLoServerName = objEnv.getLoServerName();
				// LOクラスをインスタンス化します
				LoTopClient objLoTopClient = new LoTopClient(strLoServerName,
						strLoType);
				// 教材IDの取得
				String strMaterialID = "";
				// LOから教材詳細情報を取得
				if (objLoTopClient.getData(strRealLOID))
				{
					if (objLoTopClient.getDataLength() > 0)
					{
						LoComData objData = objLoTopClient.getDataInfo(0);
						// 教材IDの取得
						strMaterialID = objData.getMaterialID();
					}
				}
				// 教材構造取得メソッドをコールします
				// パラメータの準備
				Hashtable objParams = new Hashtable();
				objParams.put("MATID", strMaterialID);
				objParams.put("AUID", strAuID);
				if (!objLoTopClient.getMaterialStruct(objParams))
				{
					// ここにエラー処理記述
					throw new Exception("教材取得エラー");
				}

				MaterialNode objNode = (MaterialNode) objLoTopClient
						.getMaterialStruct();
				strNameBuf.append(" > " + objNode.getTitle());
			}

		}

		strPath_info.add(strNameBuf.toString());
		strPath_info.add(MultibyteCutter(strNameBuf.toString(), 56));
		return strPath_info;
	}

	/**
	 * 部分文字列の取得を行います。
	 * 
	 * @param strSrc
	 *            変換対象文字列
	 * @param iLength
	 *            有効文字列長
	 * @return String 部分文字列
	 */
	private static String MultibyteCutter(String strSrc, int iLength)
			throws Exception
	{
		if (strSrc == null || strSrc.equals("")) { return strSrc; }

		int iByteLen = iLength;

		byte[] Temp = null;
		String ret = "";
		try
		{
			Temp = strSrc.getBytes("Windows-31J");
			if (Temp.length < iLength)
			{
				iByteLen = Temp.length;
			}

			ret = new String(Temp, 0, iByteLen, "Windows-31J");

			if (ret.length() == 0)
			{
				iByteLen--;
				ret = new String(Temp, 0, iByteLen, "Windows-31J");
			}
		}
		catch (Exception e)
		{
			throw e;
		}
		if (Temp.length > iLength)
		{
			return ret + "...";
		}
		else
		{
			return ret;
		}
	}

	/**
	 * 指定したLOID に対応する LO名のリストを取得する。
	 * $LO_TREE_ROOT (common.vmで定義) を LOID に指定している場合は、$LO_ROOT_NAME を
	 * LO名として返却します。
	 * 
	 * @param loIdArray コンテナまでのパスを表す LOID からなる配列
	 *                   (トップをインデックス 0 として、コンテナまで順にインデックスを振った
	 *                    配列となっている)
	 * @return List 引数の各LOID に対応したコンテナの名前からなるリスト
	 */
	public List getLoNameList(String[] loIdArray) throws Exception
	{
		List result = new ArrayList();
		
		LoClient client = new LoClient();
		for (int i=0; i < loIdArray.length; i++)
		{
			String loId = loIdArray[i];
			String name = "";
			String LO_TREE_ROOT = getContextString("LO_TREE_ROOT");
			if (loId.equals(LO_TREE_ROOT))
			{
				String LO_ROOT_NAME = getContextString("LO_ROOT_NAME");
				name = LO_ROOT_NAME;
			}
			else
			{
				client.clear();
				client.setWhereLoID(loId);

				if (client.select())
				{
					if (client.next())
					{
						name = client.getLoTytle();
					}
				}
			}
			result.add(name);
		}
		client = null;
		
		return result;
	}
}