/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	個別ログ参照画面表示
//
//		変更履歴
//			2005.01.31  新規作成  OGA
//
//	機能
//
//	個別ログ参照画面にツリーを表示させます。
//
/////////////////////////////////////////////////////////////////
/*
 * 作成日: 2005/02/20
 *
 * TODO この生成されたファイルのテンプレートを変更するには次へジャンプ:
 * ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
 */
package jp.co.ntt.lms.xmf.actions.lo.wbt.IndividualLog;

import java.util.Hashtable;

import jp.co.ntt.lms.xmf.actions.lo.wbt.IndividualLog.inc.*;

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

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 jp.co.ntt.lms.xmo.XMOException;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.lo.*;
import jp.co.ntt.lms.lo.WBT.IndividualLog.IndividualLogStoreData;
import jp.co.ntt.lms.Common.RDF.*;
import jp.co.ntt.lms.xmo.MessageData;


/**
 * @author Administrator
 *
 * TODO この生成された型コメントのテンプレートを変更するには次へジャンプ:
 * ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
 */
public class IndividualLogMenu_TreeAction  extends Action{

	private IndividualLogMessga_inc IndividualLogMessga_inc = new IndividualLogMessga_inc();
	private IndividualLogCommon_inc IndividualLogCommon_inc = new IndividualLogCommon_inc();
	
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {

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

		////////////////////////////////////////////////////////////////////
		// パラメータ取得
		// 	・LoID				LOID				必須
		// 	・AuID				AuID				任意
		// 	・LoType			LoType				必須
		// 	・userId			ユーザID			必須
		// 	・returnURL			戻りページ			必須
		////////////////////////////////////////////////////////////////////
		String strShowChildlenURL  ="";
		String strTopURL = "";

		String strLoID = request.getParameter( "LoID" );
		String strAuID = request.getParameter( "AuID" );
		String strLoType = request.getParameter( "LoType" );
		String strUserID = request.getParameter( "userId" );
		// リアルＬＯＩＤ。
		String strRealLoID = "";
		///////////////////////////////////////////
		// パラメータチェック
		///////////////////////////////////////////
		if( strLoID == null || strLoType == null || strUserID == null ) {
			Exception e = new Exception();
			e.printStackTrace();
			request.setAttribute("message", IndividualLogMessga_inc.M012002);
			request.setAttribute("detail", IndividualLogMessga_inc.D012002);
			request.setAttribute("close", "on");

			return mapping.findForward("error");
		}

		/////////////////////////////////////////////
		// ツリーのルートに表示するGIF名称を設定
		/////////////////////////////////////////////
		String strRootGif = "";
		strRootGif = IndividualLogCommon_inc.IMG_ROOT_LO_CLOSE_o;

		String strprm = ""; //script用TREE表示文字列

		// ポップアップメニューを表示するVMの設定を保持します。
		String strChildVM = "GetMenu.do";
		// 子リストを表示するJSPの設定を保持します。
		String strChildVM2 = "GetChildMatSt.do";

		String strDocument = "";
		String strMaterialID = "";

		try {
			IndividualLogStoreData onjData = new IndividualLogStoreData();
			strRealLoID = onjData.getRealLoID(strLoID);

			// 教材種別を元に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();
				}
			}

			// LOから教材詳細情報を取得
			Hashtable objParams = new Hashtable();
			objParams.put( "MATID", strMaterialID );
			if( objLoTopClient.getMaterialStructFile(objParams) ) {
				strDocument = objLoTopClient.getMaterialFile();
			}
			else{
				//教材構造ファイルの取得に失敗しました。;
				Exception e = new Exception();
				e.printStackTrace();
				return mapping.findForward("error");
			}

		}catch(Exception ex)
		{
			//システムエラー
			ex.printStackTrace();
			return mapping.findForward("error");
		}

		StringBuffer strIniNode = new StringBuffer();
		String strSectionTopID = null;
		String strSectionTopTitle = null;
		try
		{
			RDFDocument objDocument = new RDFDocument();
			RDFNode objRDFNode = objDocument.load( new StringBuffer(strDocument) );
			RDFNode objSectionTop = objRDFNode.getChildNodes().getNode(0);
			strSectionTopID = objSectionTop.getID();
			strSectionTopTitle = objSectionTop.getTitle();
			request.getSession().setAttribute( strLoID, objRDFNode );

			// 初期展開NodeIDを取得する
			strIniNode = getSectionNodeID( objRDFNode.getChildNodes().getNode(0), null );
		}
		catch(Exception ex)
		{
			//教材構造の展開に失敗しました。
			ex.printStackTrace();
			return mapping.findForward("error");
		}

		strprm = new String(strIniNode);

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

		request.setAttribute( "strServerName", strServerName);
		request.setAttribute( "intServerPort", new Integer(intServerPort));
		request.setAttribute( "strContextPath", strContextPath);
		request.setAttribute( "strSectionTopID", strSectionTopID);
		request.setAttribute( "strRootGif", strRootGif);
		request.setAttribute( "strSectionTopTitle", strSectionTopTitle);
		request.setAttribute( "strprm", strprm);

		request.setAttribute( "strChildVM", strChildVM);
		request.setAttribute( "strChildVM2", strChildVM2);

		request.setAttribute( "strShowChildlenURL", strShowChildlenURL);
		request.setAttribute( "strTopURL", strTopURL);
		request.setAttribute( "strLoID", strLoID);
		request.setAttribute( "strAuID", strAuID);
		request.setAttribute( "strLoType", strLoType);
		request.setAttribute( "strUserID", strUserID);
		request.setAttribute( "strRealLoID", strRealLoID);
		
		return mapping.findForward("success");
	}

	/*
	 * ログ参照画面ツリーに初期表示する教材構造を取得します。
	 */
	private StringBuffer getSectionNodeID( RDFNode objNode, StringBuffer strIniNodeID ) {
		if( strIniNodeID == null ) {
			strIniNodeID = new StringBuffer();
		}

		RDFNodeList objList = objNode.getChildNodes();
		int intLength = objList.getLength();
		for( int i = 0; i < intLength; i++ ) {
			RDFNode objChildNode = objList.getNode( i );
			if( objChildNode.getNodeType() == RDFNode.BLOCK_NODE ) {
				if( strIniNodeID.length() > 0 ) {
					strIniNodeID.append( "," );
				}
				strIniNodeID.append( "'" + objNode.getID() + "'" );
				break;
			}
		}

		// 子ノード再帰呼び出し
		for( int i = 0; i < intLength; i++ ) {
			RDFNode objChildNode = objList.getNode( i );
			if( objChildNode.getNodeType() == RDFNode.BLOCK_NODE ) {
				strIniNodeID = getSectionNodeID( objChildNode, strIniNodeID );
			}
		}

		return strIniNodeID;
	}
}
