/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	LO進捗抽象クラス
//
//		変更履歴
//			2005.01.31  新規作成  Katsuhiko.Sakurai(UNITEC)
//
//	機能
//
//	このクラスはLOの進捗を表現する抽象クラスです。
//
////////////////////////////////////////////////////////////////

package jp.co.ntt.lms.lo.progress;

import jp.co.ntt.lms.lo.progress.util.LearningProgressConfigurationManager;
import jp.co.ntt.lms.lo.progress.util.XMOInformationGetter;
import jp.co.ntt.lms.xmo.Lo.LoClient;


/**
 * LO進捗抽象クラスです。
 * 
 * LO階層構造をコンポジットパターンで実装します。
 * 
 * @author Katsuhiko Sakurai (UNITEC)
 * @version 1.0
 */
public abstract class AbstractLOProgress implements XMOProgress {

	protected LoClient loClient = null;
	protected LearningProgress progress = null;
	protected int level = 0;

	/**
	 * コンストラクタです。
	 * 
	 * @param loID 対象となるLoID 
	 * @param targetUserID 対象となるユーザ・グループID 
	 * @param level 階層のレベル 
	 * @throws Exception
	 */
	public AbstractLOProgress(String loID, String targetUserID, int level) throws Exception {
		this(loID, targetUserID, level, new LearningProgressConfigurationManager());
	}
	
	/**
	 * コンストラクタです。
	 * 
	 * @param loID 対象となるLoID 
	 * @param targetUserID 対象となるユーザ・グループID 
	 * @param level 階層のレベル 
	 * @param config 外部設定ファイル情報 
	 * @throws Exception
	 */
	public AbstractLOProgress(String loID, String targetUserID, int level, 
			LearningProgressConfigurationManager config) throws Exception {
		
		//loIDからLOクライアントを取得
		this.loClient = XMOInformationGetter.getLO(loID);
		
		// 進捗を設定
		this.progress = this.getProgress(loID, targetUserID, config);
		
		// レベルを設定
		this.level = level;
	}
	
	/**
	 * 子供の進捗情報を追加します。
	 * 
	 * リーフ(コンテナ以外のLO)ではこのメソッドは呼ばれることを想定しないため
	 * デフォルト実装を例外送出としています。
	 *  
	 * @param xmoProgress 進捗情報 
	 * @throws Exception
	 */
	public XMOProgress add(XMOProgress xmoProgress) throws Exception {
		throw new Exception();
	}
	
	/**
	 * 進捗情報を取得します。
	 * 
	 * @return LearningProgress 進捗情報 
	 */
	public LearningProgress getProgress() {
		return this.progress;
	}

	/**
	 * 進捗の項目名称を取得します。
	 * 
	 * @return String LOの名称 
	 */
	public String getItemName() {
		return this.loClient.getLoTytle();
	}

	/**
	 * 階層のレベルを取得します。
	 * 
	 * @return int 階層のレベル 
	 */
	public int getLevel() {
		return this.level;
	}

	/**
	 * 階層レベル付けされた項目名を取得します。
	 * 
	 * @return String 階層レベル付けされたLO名 
	 */
	public String getNestedItemName() {
		String space = "　";
		for(int i=1; i<=this.level; i++) space += space;
		
		return space + this.getItemName();
	}

	/**
	 * LOの説明を取得します。
	 * 
	 * @return String LOの説明 
	 */
	public String getExplanation() {
		return this.loClient.getLoExplanation();
	}
	
	/**
	 * 進捗情報を取得します。
	 * 
	 * @param loID 対象となるLoID
	 * @param targetUserID 対象となるユーザID
	 * @param config 設定ファイル情報
	 * @return LearningProgress 進捗情報
	 * @throws Exception　
	 */
	protected LearningProgress getProgress( String loID, String targetUserID, 
					LearningProgressConfigurationManager config ) throws Exception {
		return new LearningProgress(targetUserID, loID, config);
	}
}
