/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: RSSDSRConfig.java,v 1.8 2006/01/27 16:39:04 rampil Exp $
 */
package org.logical_paradox.rss.dsr;

import java.io.IOException;

import org.logical_paradox.rss.RSSConfig;
import org.logical_paradox.rss.RSSIllegalConfigException;
import org.logical_paradox.rss.RSSNullValueException;
import org.logical_paradox.rss.RSSValueFormatException;
import org.logical_paradox.rss.dsr.algorithm.ServiceBindingAlgorithm;

/**
 * RSSDSRConfig
 * 分散サービスレジストリのコンフィグ
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.8 $
 */
public class RSSDSRConfig extends RSSConfig {
	/** デフォルトの分散ネットワーク監視間隔 */
	public static final int DEFAULT_MONITOR_INTERVAL = 60000;
	/** デフォルトのサービス探索深度 */
	public static final int DEFAULT_SERVICE_TRACE_LEVEL = 3;

	/** DSRの名称 */
	private String cfgRSSDistributedServiceRegistry;
	/** デバッグトレースログの出力スイッチ(true:出力 / false:出力しない) */
	private boolean cfgDSRSwDebugTraceLog;
	/** ランログの出力スイッチ(true:出力 / false:出力しない) */
	private boolean cfgDSRSwRunLog;
	/** デバッグトレースログのファイル名 */
	private String cfgDebugTraceLogFilename;
	/** ランログのファイル名 */
	private String cfgRunLogFilename;
	/** DSR選択アルゴリズム */
	private ServiceBindingAlgorithm cfgDSRBindingAlgorithm;
	/** 経路決定ノード選択アルゴリズム */
	private ServiceBindingAlgorithm cfgRNodeBindingAlgorithm;
	/** コンテンツ管理システム選択アルゴリズム */
	private ServiceBindingAlgorithm cfgRCMGRBindingAlgorithm;
	/** インデックスシステム選択アルゴリズム */
	private ServiceBindingAlgorithm cfgIndexServerBindingAlgorithm;
	/** キューシステム選択アルゴリズム */
	private ServiceBindingAlgorithm cfgOqs4rBindingAlgorithm;
	/** ネットワーク監視感覚 */
	private int cfgMonitorInterval;
	/** サービス探索深度 */
	private int cfgTraceLevel;

	/**
	 * コンストラクタ
	 * @param fn コンフィグファイル名
	 * @throws IOException コンフィグファイルの読み込みに失敗
	 * @throws RSSIllegalConfigException コンフィグファイルの内容に問題がある
	 */
	public RSSDSRConfig(String fn) throws IOException, RSSIllegalConfigException {
		super(fn);
		String errmsg = checkResourceVariables();
		if(errmsg != null) {
			throw new RSSIllegalConfigException(errmsg);
		}
	}
	/**
	 * サービス探索深度を返す
	 * @return サービス探索深度
	 */
	public int getTraceLevel() {
		return cfgTraceLevel;
	}
	/**
	 * ネットワーク監視間隔を返す(msec)
	 * @return 監視間隔(msec)
	 */
	public int getMonitorInterval() {
		return cfgMonitorInterval;
	}
	/**
	 * DSRの名称を返す
	 * @return DSRの名称
	 */
	public String getRSSDistributedServiceRegistry() {
		return cfgRSSDistributedServiceRegistry;
	}
	/**
	 * デバッグトレースログの出力スイッチを返す
	 * @return true:出力 / false:出力しない
	 */
	public boolean getDSRSwDebugTraceLog() {
		return cfgDSRSwDebugTraceLog;
	}
	/**
	 * ランログの出力スイッチを返す
	 * @return true:出力 / false:出力しない
	 */
	public boolean getDSRSwRunLog() {
		return cfgDSRSwRunLog;
	}
	/**
	 * デバッグトレースログのファイル名を返す
	 * @return デバッグトレースログのファイル名
	 */
	public String getDebugTraceLogFilename() {
		return cfgDebugTraceLogFilename;
	}
	/**
	 * ランログのファイル名を返す
	 * @return ランログのファイル名
	 */
	public String getRunLogFilename() {
		return cfgRunLogFilename;
	}
	/**
	 * DSR選択アルゴリズムを返す
	 * @return DSR選択アルゴリズム
	 */
	public ServiceBindingAlgorithm getDSRBindingAlgorithm() {
		return cfgDSRBindingAlgorithm;
	}
	/**
	 * 経路決定ノード選択アルゴリズムを返す
	 * @return 経路決定ノード選択アルゴリズム
	 */
	public ServiceBindingAlgorithm getRNodeBindingAlgorithm() {
		return cfgRNodeBindingAlgorithm;
	}
	/**
	 * コンテンツ管理システム選択アルゴリズムを返す
	 * @return コンテンツ管理システム選択アルゴリズム
	 */
	public ServiceBindingAlgorithm getRCMGRBindingAlgorithm() {
		return cfgRCMGRBindingAlgorithm;
	}
	/**
	 * インデックスシステム選択アルゴリズムを返す
	 * @return インデックスシステム選択アルゴリズム
	 */
	public ServiceBindingAlgorithm getIndexServerBindingAlgorithm() {
		return cfgIndexServerBindingAlgorithm;
	}
	/**
	 * キューシステム選択アルゴリズムを返す
	 * @return キューシステム選択アルゴリズム
	 */
	public ServiceBindingAlgorithm getOqs4rBindingAlgorithm() {
		return cfgOqs4rBindingAlgorithm;
	}
	/**
	 * パラメータ確認メソッド
	 * @return エラーメッセージ
	 */
	@Override
	protected String checkResourceVariables() {
		StringBuffer errmsg = new StringBuffer();

		if(getProperty("RSS_DSR") != null) {
			cfgRSSDistributedServiceRegistry = getProperty("RSS_DSR");
		} else {
			errmsg.append("RSS_DSRが指定されていません．\n");
		}

		try {
			cfgDSRSwDebugTraceLog = getPropertyAsBool("DSR_SW_DEBUG_TRACE_LOG");
		} catch(RSSValueFormatException vfe) {
			errmsg.append("DSR_SW_DEBUG_TRACE_LOGが不正です\n");
		} catch(RSSNullValueException ne) {}

		try {
			cfgDSRSwRunLog = getPropertyAsBool("DSR_SW_RUNLOG");
		} catch(RSSValueFormatException vfe) {
			errmsg.append("DSR_SW_RUNLOGが不正です\n");
		} catch(RSSNullValueException ne) {}

		if(getProperty("DEBUG_TRACE_LOG_FILENAME") != null) {
			cfgDebugTraceLogFilename = getProperty("DEBUG_TRACE_LOG_FILENAME");
		} else {
			errmsg.append("DEBUG_TRACE_LOG_FILENAMEが指定されていません．\n");
		}

		if(getProperty("RUNLOG_FILENAME") != null) {
			cfgRunLogFilename = getProperty("RUNLOG_FILENAME");
		} else {
			errmsg.append("RUNLOG_FILENAMEが指定されていません．\n");
		}


		try {
			if(getProperty("DSR_BINDING_ALGORITHM") != null) {
				cfgDSRBindingAlgorithm = (ServiceBindingAlgorithm)Class.forName(getProperty("DSR_BINDING_ALGORITHM")).newInstance();
			} else {
				errmsg.append("DSR_BINDING_ALGORITHMが指定されていません．\n");
			}
		} catch(Exception slBindingAlgorithmExp) {
			errmsg.append(getProperty("RNODE_BINDING_ALGORITHM") + "のインスタンス生成時に例外が発生しました: " + slBindingAlgorithmExp.getMessage());
		}

		try {
			if(getProperty("RNODE_BINDING_ALGORITHM") != null) {
				cfgRNodeBindingAlgorithm = (ServiceBindingAlgorithm)Class.forName(getProperty("RNODE_BINDING_ALGORITHM")).newInstance();
			} else {
				errmsg.append("RNODE_BINDING_ALGORITHMが指定されていません．\n");
			}
		} catch(Exception rnodeBindingAlgorithmExp) {
			errmsg.append(getProperty("RNODE_BINDING_ALGORITHM") + "のインスタンス生成時に例外が発生しました: " + rnodeBindingAlgorithmExp.getMessage());
		}
		try {
			if(getProperty("RCMGR_BINDING_ALGORITHM") != null) {
				cfgRCMGRBindingAlgorithm = (ServiceBindingAlgorithm)Class.forName(getProperty("RCMGR_BINDING_ALGORITHM")).newInstance();
			} else {
				errmsg.append("RCMGR_BINDING_ALGORITHMが指定されていません．\n");
			}
		} catch(Exception rcmgrBindingAlgorithmExp) {
			errmsg.append(getProperty("RNODE_BINDING_ALGORITHM") + "のインスタンス生成時に例外が発生しました: " + rcmgrBindingAlgorithmExp.getMessage());
		}
		try {
			if(getProperty("IDXSRV_BINDING_ALGORITHM") != null) {
				cfgIndexServerBindingAlgorithm = (ServiceBindingAlgorithm)Class.forName(getProperty("IDXSRV_BINDING_ALGORITHM")).newInstance();
			} else {
				errmsg.append("IDXSRV_BINDING_ALGORITHM．\n");
			}
		} catch(Exception idxsrvBindingAlgorithmExp) {
			errmsg.append(getProperty("IDXSRV_BINDING_ALGORITHM") + "のインスタンス生成時に例外が発生しました: " + idxsrvBindingAlgorithmExp.getMessage());
		}
		try {
			if(getProperty("OQS4R_BINDING_ALGORITHM") != null) {
				cfgOqs4rBindingAlgorithm = (ServiceBindingAlgorithm)Class.forName(getProperty("OQS4R_BINDING_ALGORITHM")).newInstance();
			} else {
				errmsg.append("IDXSRV_BINDING_ALGORITHM．\n");
			}
		} catch(Exception oqs4rBindingAlgorithmExp) {
			errmsg.append(getProperty("OQS4R_BINDING_ALGORITHM") + "のインスタンス生成時に例外が発生しました: " + oqs4rBindingAlgorithmExp.getMessage());
		}

		try {
			if(getProperty("MONITOR_INTERVAL") != null) {
				cfgMonitorInterval = getPropertyAsInt("MONITOR_INTERVAL");
			} else {
				cfgMonitorInterval = DEFAULT_MONITOR_INTERVAL;
			}
		} catch(Exception oqs4rBindingAlgorithmExp) {
			errmsg.append(getProperty("MONITOR_INTERVAL") + "のインスタンス生成時に例外が発生しました: " + oqs4rBindingAlgorithmExp.getMessage());
		}
		try {
			if(getProperty("SERVICE_TRACE_LEVEL") != null) {
				cfgTraceLevel = getPropertyAsInt("SERVICE_TRACE_LEVEL");
			} else {
				cfgTraceLevel = DEFAULT_SERVICE_TRACE_LEVEL;
			}
		} catch(Exception e) {
			errmsg.append(getProperty("SERVICE_TRACE_LEVEL") + "のインスタンス生成時に例外が発生しました: " + e.getMessage());
		}

		if(errmsg.toString().trim().length() == 0) {
			return null;
		} else {
			return errmsg.toString();
		}
	}
}

// end of RSSDSRConfig.java
