/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: DfsConfig.java,v 1.2 2005/09/07 13:38:06 rampil Exp $
 */
package org.logical_paradox.vsan.dfs;

import java.util.Enumeration;
import java.util.ResourceBundle;

import org.logical_paradox.common.util.StringUtils;
import org.logical_paradox.vsan.ConfigException;

/**
 * ドメインファイルシステムのコンフィグレーション
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public class DfsConfig {
	/** デフォルトの接続共有セッション数 */
	public static final int DEFAULT_DOMAIN_SESSION_CONNECTIONS = 5;
	/** デフォルトのセッションタイムアウト秒数 */
	public static final int DEFAULT_DOMAIN_SESSION_TIMEOUT = 36000;
	/** デフォルトのコネクションプーリング数 */
	public static final int DEFAULT_CONNECTION_MAX = 25;
	/** デフォルトのドメイン更新確認間隔 = 1時間 */
	public static final long DEFAULT_DOMAIN_SYNCHRO_INTERVAL = 1000 * 60 * 60;
	/** デフォルトのクライアント接続監視間隔 = 1時間 */
	public static final long DEFAULT_CLIENT_MONITOR_INTERVAL = 1000 * 60 * 60;

	/** ドメイン名 */
	private String domainPreconnectId;
	/** 接続先ドメインコントローラーID */
	private String domainControllerId;
	/** このドメインに対する最大接続数 */
	private int domainConnectionMax = DEFAULT_CONNECTION_MAX;
	/** 1つの接続を共有するセッション数 */
	private int domainSessionConnections = DEFAULT_DOMAIN_SESSION_CONNECTIONS;
	/** セッションタイムアウト秒数 */
	private long domainSessionTimeout = DEFAULT_DOMAIN_SESSION_TIMEOUT;
	/** ドメイン情報を更新するタイミング */
	private long domainSynchroInterval = DEFAULT_DOMAIN_SYNCHRO_INTERVAL;
	/** クライアント接続監視間隔 */
	private long clientMonitorInterval = DEFAULT_CLIENT_MONITOR_INTERVAL;
	/** レコード書き込み時の固定長指定 */
	private boolean fixed = true;

	/**
	 * コンストラクタ
	 * @param p プロパティファイルの内容
	 * @throws ConfigException 設定値に問題があった場合に送出される例外
	 */
	public DfsConfig(ResourceBundle rc) throws ConfigException {
		parse(rc);
	}
	/**
	 * プロパティ値を取り込んで解析する
	 * プロパティ値に問題がある場合、例外を送出する
	 * @param p プロパティ値
	 * @throws ConfigException プロパティ値に問題があった
	 */
	protected void parse(ResourceBundle rc) throws ConfigException {
		for(Enumeration e = rc.getKeys(); e.hasMoreElements();) {
			String key = (String)e.nextElement();
			String value = rc.getString(key);

			if("domain.controller.id".equals(key) == true) {
				domainControllerId = value;
			} else if("domain.preconnect.id".equals(key) == true) {
				domainPreconnectId = value;
			} else if("domain.connection.max".equals(key) == true) {
				domainConnectionMax = Integer.parseInt(value);
			} else if("domain.session.connections".equals(key) == true) {
				domainSessionConnections = Integer.parseInt(value);
			} else if("domain.session.timeout".equals(key) == true) {
				domainSessionTimeout = Long.parseLong(value);
			} else if("domain.synchrno.interval".equals(key) == true) {
				domainSynchroInterval = Long.parseLong(value);
			} else if("client.monitor.interval".equals(key) == true) {
				clientMonitorInterval = Long.parseLong(value);
			} else if("domain.record.type".equals(key) == true) {
				if("fixed".equals(value.toLowerCase()) == true) {
					fixed = true;
				} else if("variable".equals(value.toLowerCase()) == true) {
					fixed = false;
				} else {
					throw new ConfigException("'" + value + "' is invalid value of domain.record.type");
				}
			} else {
				throw new ConfigException(key);
			}
		}

		// 必須項目のチェック
		// 自分のノードIDと、接続先ドメインコントローラーが必要
		if(
			StringUtils.isEmpty(domainControllerId) == true ||
			StringUtils.isEmpty(domainPreconnectId) == true
		) {
			throw new ConfigException();
		}
	}

	/**
	 * レコード書き込みを固定長で行うかどうかを返す．
	 * @return true:固定長 / false:可変長
	 */
	public boolean isFixed() {
		return fixed;
	}
	/**
	 * クライアント接続監視間隔を返す．
	 * @return クライアント接続監視間隔(msec)
	 */
	public long getClientMonitorInterval() {
		return clientMonitorInterval;
	}
	/**
	 * ドメイン更新確認間隔を返す．
	 * @return ドメイン更新確認間隔
	 */
	public long getDomainSynchroInterval() {
		return domainSynchroInterval;
	}

	/**
	 * 接続先ドメインコントローラーのIDを返す
	 * @return 接続先ドメインコントローラーのID
	 */
	public String getDomainControllerId() {
		return domainControllerId;
	}

	/**
	 * 起動時に接続するドメイン名を返す
	 * @return ドメイン名
	 */
	public String getDomainPreconnectId() {
		return domainPreconnectId;
	}

	/**
	 * 1つの接続を共有するセッション数を返す
	 * @return 1つの接続を共有するセッション数
	 */
	public int getDomainSessionConnections() {
		return domainSessionConnections;
	}

	/**
	 * セッションタイムアウト秒数を返す
	 * @return セッションタイムアウト秒数
	 */
	public long getDomainSessionTimeout() {
		return domainSessionTimeout;
	}

	/**
	 * 最大接続数を返す
	 * @return 最大接続数
	 */
	public int getDomainConnectionMax() {
		return domainConnectionMax;
	}

}
