/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: RSSRCMConfig.java,v 1.5 2006/02/21 14:54:48 akabane Exp $
 */
package org.logical_paradox.rss.rcm;
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;

/**
 * RSSCMServConfig
 * コンテンツ管理システム用コンフィグ
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.5 $
 */
public class RSSRCMConfig extends RSSConfig {
	/** ランログ出力設定 */
	private boolean cfgRCMSwRunLog = false;
	/** ランログファイル名 */
	private String cfgRCMRunLogFilename = "rssrcm.run.log";
	/** リモートコンテンツ管理システム */
	private String cfgRSSContentsMngrService = "";
	/** 初期のレジストラ数 */
	private int cfgInitialRegisterServices = 5;
	/** 初期のコンテンツファインダー数 */
	private int cfgInitialFinderServices = 10;
	/** ピーク時の最大レジストラ数 */
	private int cfgMaxRegisterServices = 15;
	/** ピーク時の最大コンテンツファインダー数 */
	private int cfgMaxFinderServices = 20;
	/** コンテンツリジストラ名の接頭辞 */
	private String cfgRegisterServicePrefix = "";
	/** コンテンツレジストラごとに使用される登録エージェント数 */
	private int cfgAgentsPerRegister = 2;
	/** コンテンツレジスターキューのサイズ */
	private int cfgRegistQueueSize = 262144;
	/** コンテンツ送信間隔(msec) */
	private int cfgContentsSendingInterval = 500;
	private int cfgContentsSendingScale = 20;
	/** コンテンツアクセサ */
	private String cfgContentsAccessor = "";
	/** コンテンツアクセサの接続文字列 */
	private String cfgContentsConnStr = "";
	/** DSR */
	private String cfgRSSDistributedServiceRegistry;
	/** コンテンツエンコーディング */
	private String cfgContentsEncoding;

	/** コンテンツキュー */
	private ContentsQueue q = null;


	/**
	 * コンストラクタ
	 * @param fn ファイル名
	 * @throws IOException コンフィグファイルの読み込みに失敗した
	 * @throws RSSIllegalConfigException 不正なコンフィグパラメータを検出した
	 */
	public RSSRCMConfig(String fn) throws IOException, RSSIllegalConfigException {
		super(fn);
		String errmsg = checkResourceVariables();
		if(errmsg != null) {
			throw new RSSIllegalConfigException(errmsg);
		}
	}
	/**
	 * ランログ出力スイッチを返す．
	 * @return true:出力する / false:出力しない
	 */
	public boolean getRCMSwRunLog() {
		return cfgRCMSwRunLog;
	}
	/**
	 * ランログファイル名を返す．
	 * @return ランログファイル名
	 */
	public String getRCMRunLogFilename() {
		return cfgRCMRunLogFilename;
	}
	/**
	 * コンテンツ管理システムのスタブを返す．
	 * @return コンテンツ管理システムのスタブ
	 */
	public String getRSSContentsMngrService() {
		return cfgRSSContentsMngrService;
	}
	/**
	 * コンテンツを管理する際のエンコーディングを返す．
	 * @return エンコーディング
	 */
	public String getContentsEncoding() {
		return cfgContentsEncoding;
	}
	public int getInitialRegisterServices() {
		return cfgInitialRegisterServices;
	}
	public int getMaxRegisterServices() {
		return cfgMaxRegisterServices;
	}
	public int getMaxFinderServices() {
		return cfgMaxFinderServices;
	}
	public String getRegisterServicePrefix() {
		return cfgRegisterServicePrefix;
	}
	public int getAgentsPerRegister() {
		return cfgAgentsPerRegister;
	}
	public int getRegistQueueSize() {
		return cfgRegistQueueSize;
	}
	public int getContentsSendingInterval() {
		return cfgContentsSendingInterval;
	}
	public int getContentsSendingScale() {
		return cfgContentsSendingScale;
	}
	public String getContentsAccessor() {
		return cfgContentsAccessor;
	}
	public String getContentsConnStr() {
		return cfgContentsConnStr;
	}
	public String getRSSDistributedServiceRegistry() {
		return cfgRSSDistributedServiceRegistry;
	}
	public ContentsQueue getContentsQueue() {
		return q;
	}
	public int getInitialFinderServices() {
		return cfgInitialFinderServices;
	}

	/**
	 * パラメータ確認メソッド
	 */
	@Override
	protected String checkResourceVariables() {
		String errmsg = "";

		try {
			cfgRCMSwRunLog = getPropertyAsBool("RCM_SW_RUNLOG");
		} catch(RSSValueFormatException vfe) {
			errmsg += "RCM_SW_RUNLOGが不正です\n";
		} catch(RSSNullValueException ne) {}

		if(getProperty("RCM_RUNLOG_FILENAME") != null) {
			cfgRCMRunLogFilename = getProperty("RCM_RUNLOG_FILENAME");
		}
		cfgRSSContentsMngrService = getProperty("RSS_CONTENTS_MNGR_SERVICE");
		if(cfgRSSContentsMngrService == null) {
			errmsg += "RSS_CONTENTS_MNGR_SERVICEが設定されていません\n";
		}
		cfgRSSDistributedServiceRegistry = getProperty("RSS_DSR");
		if(cfgRSSDistributedServiceRegistry == null) {
			errmsg += "RSS_DSRが設定されていません\n";
		}

		try {
			cfgInitialRegisterServices = getPropertyAsInt("INITIAL_REGISTER_SERVICES");
		} catch(RSSValueFormatException vfe) {
			errmsg += "INITIAL_REGISTER_SERVICESが不正です\n";
		} catch(RSSNullValueException ne) {}
		try {
			cfgInitialFinderServices = getPropertyAsInt("INITIAL_FINDER_SERVICES");
		} catch(RSSValueFormatException vfe) {
			errmsg += "INITIAL_FINDER_SERVICESが不正です\n";
		} catch(RSSNullValueException ne) {}
		try {
			cfgMaxRegisterServices = getPropertyAsInt("MAX_REGISTER_SERVICES");
		} catch(RSSValueFormatException vfe) {
			errmsg += "MAX_REGISTER_SERVICESが不正です\n";
		} catch(RSSNullValueException ne) {}
		try {
			cfgMaxFinderServices = getPropertyAsInt("MAX_FINDER_SERVICES");
		} catch(RSSValueFormatException vfe) {
			errmsg += "MAX_FINDER_SERVICESが不正です\n";
		} catch(RSSNullValueException ne) {}

		cfgRegisterServicePrefix = getProperty("REGISTER_SERVICE_PREFIX");
		if(cfgRegisterServicePrefix == null) {
			errmsg += "REGISTER_SERVICE_PREFIXが設定されていません\n";
		}
		try {
			cfgAgentsPerRegister = getPropertyAsInt("AGENTS_PER_REGISTER");
		} catch(RSSValueFormatException vfe) {
			errmsg += "AGENTS_PER_REGISTERが不正です\n";
		} catch(RSSNullValueException ne) {}
		try {
			cfgRegistQueueSize = getPropertyAsInt("REGIST_QUEUE_SIZE");
		} catch(RSSValueFormatException vfe) {
			errmsg += "REGIST_QUEUE_SIZEが不正です\n";
		} catch(RSSNullValueException ne) {}
		try {
			cfgContentsSendingInterval = getPropertyAsInt("CONTENTS_SENDING_INTERVAL");
		} catch(RSSValueFormatException vfe) {
			errmsg += "CONTENTS_SENDING_INTERVALが不正です\n";
		} catch(RSSNullValueException ne) {}
		try {
			cfgContentsSendingScale = getPropertyAsInt("CONTENTS_SENDING_SCALE");
		} catch(RSSValueFormatException vfe) {
			errmsg += "CONTENTS_SENDING_SCALEが不正です\n";
		} catch(RSSNullValueException ne) {}

		cfgContentsAccessor = getProperty("CONTENTS_ACCESSOR");
		if(cfgContentsAccessor == null) {
			errmsg += "CONTENTS_ACCESSORが設定されていません\n";
		}
		if(getProperty("CONTENTS_CONNSTR") != null) {
			cfgContentsConnStr = getProperty("CONTENTS_CONNSTR");
		}
		if(getProperty("CONTENTS_ENCODING") != null) {
			cfgContentsEncoding = getProperty("CONTENTS_ENCODING");
		} else {
			errmsg += "が指定されていません\n";
		}
		if(errmsg.trim().length() > 0) {
			return errmsg;
		}

		// コンテンツキューが生成されていないならば，ここで生成する
		if(getRegistQueueSize() > 0) {
			q = new ContentsQueue(getRegistQueueSize());
		}
		return null;
	}
}

// end of RSRCMConfig.java
