/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
//	LOプロパティ画面表示用Bean
//	変更履歴
//	2004.01.08 新規作成  ishizaki
//

package jp.co.ntt.lms.Common.Bean.xmo.Base;

import java.util.Map;

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

import jp.co.ntt.lms.xmo.MenuData;
import jp.co.ntt.lms.xmo.XMOPropertyDef;
import jp.co.ntt.lms.xmo.Assignments.AssignUsableList;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xmo.Lo.GetMenu;
import jp.co.ntt.lms.xmo.Lo.HistoryData;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.Lo.MaterialData;
import jp.co.ntt.lms.xmo.LoRelation.LoRelationClient;
import jp.co.ntt.lms.xmo.util.DebugLog;

/**
 * LOプロパティ画面表示用Bean<br>
 * 
 * 
 * @author ishizaki
 *
 */
public class ShowLoPropertyBean extends AbstractBaseBean {

	/** メニューデータ **/
	private MenuData[] menuData;
	/** ステータス **/
	private int status;
	/** LOタイトル **/
	private String loTytle;
	/** 外部ID **/
	private String foreignID;
	/** 教材リスト **/
	private MaterialData materialData;
	/** キーワード **/
	private String keyWord;
	/** LOの説明 **/
	private String loExplanation;
	/** LOのバージョン **/
	private String loVersion;
	/** 登録日 **/
	private String entryDate;
	/** 最終更新日 **/
	private String lastDate;
	/** 更新回数 **/
	private String renewCnt;
	/** 登録者 **/
	private String entryName;
	/** 登録者ID **/
	private String entryID;
	/** 更新者名 **/
	private String lastName;
	/** 更新者ID **/
	private String lastID;
	/** RealLOID **/
	private String realLoId;
	/** 前提条件 */
	private String prerequisite;
	/** 前提条件を満たしている・満たしていない */
	private boolean fillPrerequisite;
	/** アサインの有効・無効判定 */
	private boolean assignUsable;
	
	
	/**
	 * LOプロパティ画面表示に必要なデータを収集します<br>
	 * 
	 * <pre>
	 * requestより取得できるパラメータ
	 * tree_view_type,ini_menu,parentID,treepath,Lotype	からメニュー作成に必要なパラメータ
	 * selectId,loId,parentIDを作成する
	 * 
	 * ポップアップタイプはLOなので4とする
	 *
	 * 画面に必要なデータメニューとステータスとプロパティをデータベースより取得する
	 * </pre>
	 * @param request HttpServletRequest
	 * @param response  HttpServletResponse
	 * @see jp.co.ntt.lms.Common.Bean.xmo.Base.AbstractBaseBean#executeQueryTask()
	 *
	 * @exception Exception メニュー取得,ステータス取得,前提条件のチェック,アサインの有効・無効判定,
	 * 							プロパティ取得いずれかに失敗した場合
	 */
	public void executeQueryTask(
		HttpServletRequest request,
		HttpServletResponse response) throws Exception{
		//BaseVoの中身をデバック
		DebugLog.write(this.getClass(),this.baseVo.toString(),DebugLog.ROW);

		// メニューに必要なパラメータを作成する 
		//コンテナ以外がクリックされた場合ParentIDとselectIDとLoIDは同じになる
		//のでPerentIDをselectIdとLoIdにセットする
		super.baseVo.setSelectId(super.baseVo.getParentID());
		super.baseVo.setLoId(super.baseVo.getParentID());
		//parentIDが選択されたLOIDなので親IDを取得する
		// 取得する親コンテナIDが仮想ルートコンテナＩＤだった場合に備えて、
		// 引数にＨＴＴＰリクエストオブジェクトを渡すように修正。
		super.baseVo.setParentID(
			treePathToParentId(
				super.baseVo.getTreepath(),super.baseVo.getLoId(), request));
		//ポップアップタイプはLOなので4
		super.baseVo.setPopupType("4");
		//戻りページの設定
		super.baseVo.setBackPage("/view/xmo/Base/frameset_g.vm");

		//BaseVoの中身をデバック
		DebugLog.write(this.getClass(),this.baseVo.toString(),DebugLog.ROW);

		//LOが削除されたかどうかチェックし、削除されていればLO一覧画面へ飛ぶ
		if(isDeleteLo(super.baseVo.getLoId(),super.baseVo.getParentID()) == false){

			String treePath = super.baseVo.getTreepath();
			int index = treePath.lastIndexOf("/");
			String path = treePath.substring(0,index);
			// 削除対象LOの親LOまでのツリーを設定する。
			super.baseVo.setTreepath(path);

			response.sendRedirect(
				"ShowLoChildren.vm?tree_view_type="
					+ super.baseVo.getTreeViewType()
					+ "&ini_menu="
					+ super.baseVo.getIniMenu()
					+ "&parentID="
					+ super.baseVo.getParentID()
					+ "&treepath="
					+ super.baseVo.getTreepath());

			return;
		}

		//メニューの作成
		makeMenuList();
		//プロパティ
		setProperty(super.baseVo.getLoId());
		//ステータス
		setStatus(super.baseVo.getLoId(), super.baseVo.getUserId());
		// 前提条件のチェック
		checkPrerequisite();
		// アサインの有効・無効チェック
		checkAssignUsable();
	}



	/**
	 * ツリーパス文字列を分解し親Idを取得する。<br>
	 * ツリーパスの自LOIDの一つ前のLOIDを親LOIDとします。
	 *
	 * @param treePath ツリーパス。
	 * @param loId LOID 親コンテナのＩＤを取得するＬＯのＩＤ。
	 * @param request ＨＴＴＰリクエストオブジェクト。
	 * @return 指定したＬＯの親ＬＯＩＤ。
	 */
	// 親コンテナのＩＤが仮想ルートコンテナを表すＩＤであった場合に備えて、
	// セッションを取得できるようにリクエストオブジェクトをパラメータに含める必要がある。
	// セッションには仮想ルートＩＤと子ＬＯＩＤから仮想ルートの本当のＩＤを変換するオブジェクトを取得します。
	// メソッド名称にスペルミスがあったので、合わせて変更しました。
	private String treePathToParentId(String treePath,String loId, HttpServletRequest request) 
		throws Exception {
		//treePath = (例)LO0/LO1/LO4/:/LO4
		int startIndex = treePath.indexOf("/" + loId + "/");
		if(startIndex == -1){
			startIndex = treePath.indexOf("/" + loId);
		}
		//(例)LO0/LO1
		String root = treePath.substring(0, startIndex);
		int lastIndex = root.lastIndexOf("/");
		//(例)LO1
		// このメソッドの戻り値
		String parentLoID = null;

		parentLoID = root.substring(lastIndex + 1, root.length());
		// =================================================================
		// 仮想ルートコンテナを指定された場合の対応
		if (parentLoID.equals("lotreeroot") == true) {
			// LOIDを子IDに設定して、親IDを取得する
			LoRelationClient objLoRelation = new LoRelationClient();
			objLoRelation.setChildID( loId );
			// 検索処理実行
			if( !objLoRelation.select() ) {
				// 検索処理に失敗した場合
				throw new Exception( objLoRelation.getMessage() );
			}
			// 検索結果の取得
			if ( objLoRelation.next() ) {
				parentLoID = objLoRelation.getParentID();
			}
		}
		
		return parentLoID;
	}
	
	/**
	 * LOの存在チェックを行う
	 * 
	 * @param childId 子ID
	 * @param parentId 親ID
	 * @return 存在すればture,存在しなければfalse
	 * 
	 */
	public boolean isDeleteLo(String childId,String parentId)throws Exception{
		LoRelationClient client = new LoRelationClient();
		client.setWhereParentID(parentId);
		client.setWhereChildID(childId);
		if(client.select()){
			if(client.getResultCount() > 0){
				//LOが存在した
				return true;
			}
			
		}else{
			throw new Exception("LoClient is ERR");
		}
		
		return false;
	}

	/**
	 * LoClientよりプロパティ情報を取得し、各プロパティにセットする<br>
	 *
	 * セットされるプロパティは下記の通り<br>
	 * <pre>
     * LOタイトル
	 * 外部ID
	 * キーワード
	 * LOの説明
	 * LOのバージョン
	 * 登録日
	 * 登録者
	 * 登録者ID
	 * 最終更新日
	 * 更新者
	 * 更新者ID
	 * 更新回数
	 * 前提条件
	 * RealLOID
	 * </pre>
	 *
	 * @param loId
	 * @exception Exception プロパティ情報の取得に失敗した場合
	 */
	private void setProperty(String loId) throws Exception {
		// LO情報をLOXMOより取得します。
		LoClient objLo = new LoClient();

		// 検索条件を設定
		objLo.setWhereLoID(loId);
		//検索失敗
		if (objLo.select() == false) {
			throw new Exception("select Method of LoClient Class returned false.");
		}

		// LOデータの取得
		if (objLo.next()) {
			this.loTytle = objLo.getLoTytle();				//LOタイトル
			this.foreignID = objLo.getForeignID(); 			//外部ID
			this.keyWord = objLo.getKeyWord();				//キーワード
			this.loExplanation = objLo.getLoExplanation();	//LOの説明
			this.loVersion = objLo.getLoVersion();			//LOのバージョン
			this.realLoId = objLo.getRealLOID();			//RealLOID
			this.prerequisite = objLo.getPrere();			// 前提条件

		}

		// 検索条件を設定
		if (objLo.selectHistory(this.realLoId) == false) {
			//検索失敗
			throw new Exception("selectHistory Method of LoClient Class returned false.");
		}

		// LOHistoryデータの取得
		HistoryData objHistory = (HistoryData) objLo.getHistory();
		this.entryDate = objHistory.getEntryDate();					//登録日
		this.entryName	= objHistory.getEntryUserName();			//登録者
		this.entryID		= objHistory.getEntryLoginID();			//登録者ID
		this.lastDate = objHistory.getLastDate(); 					//最終更新日
		this.lastName		= objHistory.getLastUserName();			//最終更新者
		this.lastID		= objHistory.getLastLoginID();				//更新者ID
		this.renewCnt = objHistory.getRenewCnt();					//更新回数

	}

	/**
	 * LoClientからステータスを取得しstatusプロパティにセットする<br>
	 *
	 * @param loId
	 * @param userId
	 * @exception Exception ステータスの取得に失敗した場合
	 */
	private void setStatus(String loId,String userId) throws Exception {
		LoClient objLo = new LoClient();
		if (objLo.checkStatus(loId, userId) == false) {
			//検索失敗
			throw new Exception("checkStatus Method of LoClient Class returned false.");
		}
		//ステータスをセット
		this.status = objLo.getStatus();
	}

	/**
	 * アサインの有効無効判定を行う。<BR>
	 * 結果はassignUsable に格納される。<BR>
	 * true: 有効 false: 無効
	 */
	private void checkAssignUsable() throws Exception {
		
		//　ログイン者がスーパユーザの場合は無条件で有効
		if( baseVo.getUserId().equals( XMOPropertyDef.ROOT_USER ) ) {
			assignUsable = true;
			return;	
		}
		
		AssignmentsClient client = new AssignmentsClient();
		
		Map res = client.checkAssignUsable( 
						baseVo.getUserId(), null, baseVo.getLoId(), 
						AssignmentsClient.SELF);
						
		AssignUsableList usable = (AssignUsableList)res.get(baseVo.getLoId());
		
		if( usable == null ) {
			// 指定したLOに対応する情報が得られない場合はfalse
			assignUsable = false;	
		}
		assignUsable = usable.isUsable();
	}


	/**
	 * 前提条件を取得し前提条件のチェックを行う。<BR>
	 * 前提条件を満たしている・いないは前提条件が設定されている
	 * 場合のみチェックを行う。<BR>
	 * 結果がfillPrerequisite に格納される。<BR>
	 * true: 満たしている false: 満たしていない
	 */
	private void checkPrerequisite() throws Exception {
		
		// 前提条件が設定されている場合
		if( prerequisite != null && !prerequisite.equals( "" )  ) {
			LoClient objLo = new LoClient();
			if(!objLo.checkPrere(baseVo.getUserId(), baseVo.getLoId(), prerequisite)){
				throw new Exception( "checkPrerequisite Method of LoClient Class returned false." );
			}
			fillPrerequisite = objLo.isPrerequisited();
		}
	}
	
	/**
	 * 内部に保持している条件によって、LOアイコンのサフィクスを返します。<BR>
	 * <PRE>
	 * 1. アサイン有効・無効判定
	 *       無効 → "AN"
	 *       有効 → 2 へ
	 * 2. 前提条件の設定チェック
	 *       未設定 → 4 へ
	 *       設定あり → 3 へ
	 * 3. 前提条件を満たしているか、満たしていないかのチェック
	 *       満たしている → "ZC"
	 *       満たしていない → "ZN"
	 * 4. デフォルトパターン
	 *       → サフィクスなし
	 * </PRE>
	 * @return String アイコンサフィクス
	 */
	public String getIconSuffix() {
		
		String suffix = null;
		
		// アサイン有効・無効判定
		if( !assignUsable ) {
			// アサインが無効な場合は
			suffix = "AN";
		}
		// 前提条件チェック
		else if( prerequisite != null && !prerequisite.equals("") ) {
			// 前提条件が存在する場合
			if( fillPrerequisite ) {
				// 前提条件を満たしている場合
				suffix = "ZC";
			}
			else {
				suffix = "ZN";
			}
		}
		// デフォルト
		else {
			suffix = "";
		}

		return suffix;

	}
	
	
	
	/**
	 * メニューを作成する
	 * 
	 * 
	 */
	private void makeMenuList() throws Exception {
		//BaseVoを元にメニューを作成しプロパティにセットする
		GetMenu menu = new GetMenu();
		this.menuData = menu.getMenuList(super.baseVo);
	}

	/**
	 * Returns the menuData.
	 * @return MenuData[]
	 */
	public MenuData[] getMenuData() {
		return menuData;
	}

	/**
	 * Sets the menuData.
	 * @param menuData The menuData to set
	 */
	public void setMenuData(MenuData[] menuData) {
		this.menuData = menuData;
	}

	/**
	 * Returns the foreignID.
	 * @return String
	 */
	public String getForeignID() {
		return foreignID;
	}

	/**
	 * Returns the keyWord.
	 * @return String
	 */
	public String getKeyWord() {
		return keyWord;
	}

	/**
	 * Returns the loExplanation.
	 * @return String
	 */
	public String getLoExplanation() {
		return loExplanation;
	}

	/**
	 * Returns the loTytle.
	 * @return String
	 */
	public String getLoTytle() {
		return loTytle;
	}

	/**
	 * Returns the loVersion.
	 * @return String
	 */
	public String getLoVersion() {
		return loVersion;
	}


	/**
	 * Sets the foreignID.
	 * @param foreignID The foreignID to set
	 */
	public void setForeignID(String foreignID) {
		this.foreignID = foreignID;
	}

	/**
	 * Sets the keyWord.
	 * @param keyWord The keyWord to set
	 */
	public void setKeyWord(String keyWord) {
		this.keyWord = keyWord;
	}

	/**
	 * Sets the loExplanation.
	 * @param loExplanation The loExplanation to set
	 */
	public void setLoExplanation(String loExplanation) {
		this.loExplanation = loExplanation;
	}

	/**
	 * Sets the loTytle.
	 * @param loTytle The loTytle to set
	 */
	public void setLoTytle(String loTytle) {
		this.loTytle = loTytle;
	}

	/**
	 * Sets the loVersion.
	 * @param loVersion The loVersion to set
	 */
	public void setLoVersion(String loVersion) {
		this.loVersion = loVersion;
	}


	/**
	 * Sets the status.
	 * @param status The status to set
	 */
	public void setStatus(int status) {
		this.status = status;
	}

	/**
	 * Returns the entryDate.
	 * @return String
	 */
	public String getEntryDate() {
		return entryDate;
	}

	/**
	 * Returns the lastDate.
	 * @return String
	 */
	public String getLastDate() {
		return lastDate;
	}

	/**
	 * Returns the renewCnt.
	 * @return String
	 */
	public String getRenewCnt() {
		return renewCnt;
	}

	/**
	 * Sets the entryDate.
	 * @param entryDate The entryDate to set
	 */
	public void setEntryDate(String entryDate) {
		this.entryDate = entryDate;
	}

	/**
	 * Sets the lastDate.
	 * @param lastDate The lastDate to set
	 */
	public void setLastDate(String lastDate) {
		this.lastDate = lastDate;
	}

	/**
	 * Sets the materialData.
	 * @param materialData The materialData to set
	 */
	public void setMaterialData(MaterialData materialData) {
		this.materialData = materialData;
	}

	/**
	 * Sets the renewCnt.
	 * @param renewCnt The renewCnt to set
	 */
	public void setRenewCnt(String renewCnt) {
		this.renewCnt = renewCnt;
	}

	/**
	 * Returns the materialData.
	 * @return MaterialData
	 */
	public MaterialData getMaterialData() {
		return materialData;
	}

	/**
	 * Returns the entryID.
	 * @return String
	 */
	public String getEntryID() {
		return entryID;
	}

	/**
	 * Returns the entryName.
	 * @return String
	 */
	public String getEntryName() {
		return entryName;
	}

	/**
	 * Returns the lastID.
	 * @return String
	 */
	public String getLastID() {
		return lastID;
	}

	/**
	 * Returns the lastName.
	 * @return String
	 */
	public String getLastName() {
		return lastName;
	}

	/**
	 * Sets the entryID.
	 * @param entryID The entryID to set
	 */
	public void setEntryID(String entryID) {
		this.entryID = entryID;
	}

	/**
	 * Sets the entryName.
	 * @param entryName The entryName to set
	 */
	public void setEntryName(String entryName) {
		this.entryName = entryName;
	}

	/**
	 * Sets the lastID.
	 * @param lastID The lastID to set
	 */
	public void setLastID(String lastID) {
		this.lastID = lastID;
	}

	/**
	 * Sets the lastName.
	 * @param lastName The lastName to set
	 */
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	/**
	 * ステータスを取得する
	 *
	 * @return ステータス
	 */
	public int getStatus() {
		return this.status;
	}

	/**
	 * Returns the assignUsable.
	 * @return boolean
	 */
	public boolean isAssignUsable() {
		return assignUsable;
	}

	/**
	 * Sets the assignUsable.
	 * @param assignUsable The assignUsable to set
	 */
	public void setAssignUsable(boolean assignUsable) {
		this.assignUsable = assignUsable;
	}


	/**
	 * Returns the fillPrerequisite.
	 * @return boolean
	 */
	public boolean isFillPrerequisite() {
		return fillPrerequisite;
	}

	/**
	 * Returns the prerequisite.
	 * @return String
	 */
	public String getPrerequisite() {
		return prerequisite;
	}

	/**
	 * Sets the fillPrerequisite.
	 * @param fillPrerequisite The fillPrerequisite to set
	 */
	public void setFillPrerequisite(boolean fillPrerequisite) {
		this.fillPrerequisite = fillPrerequisite;
	}

	/**
	 * Sets the prerequisite.
	 * @param prerequisite The prerequisite to set
	 */
	public void setPrerequisite(String prerequisite) {
		this.prerequisite = prerequisite;
	}

}
