/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: Config.java,v 1.1 2005/05/11 17:48:20 rampil Exp $
 */
package org.logical_paradox.httpd;

import org.logical_paradox.common.cli.Argument;
import org.logical_paradox.common.cli.ArgumentParser;
import org.logical_paradox.httpd.exception.*;

/**
 * httpサーバーに関する設定
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.1 $
 */
public class Config {
	/** デフォルトポート番号 */
	public static final int DEFAULT_LISTENING_PORT = 1111;
	/** デフォルトのリクエストプロセッサースレッドプーリング数 */
	public static final int DEFAULT_POOLING_THREADS = 25;
	/** デフォルトのホスト名 */
	public static final String DEFAULT_HOSTNAME = "localhost";

	/** listenするポート番号 */
	private int port = DEFAULT_LISTENING_PORT;
	/** プーリングしているスレッド数 */
	private int threads = DEFAULT_POOLING_THREADS;
	/** サーバーのホスト名 */
	private String hostname = DEFAULT_HOSTNAME;

	/**
	 * コンストラクタ
	 * 引数を解析してコンフィグレーション値を作成する
	 * @param args プログラム引数
	 */
	public Config(String[] args) throws IllegalConfigException {
		parser(args);
	}

	/**
	 * 引数パーザー
	 * @param args 引数の配列
	 */
	protected void parser(String[] args) throws IllegalConfigException {
		IllegalConfigException ice = new IllegalConfigException();

		// コマンドライン引数の解析
		Argument[] arguments = ArgumentParser.parse(args);

		for(int i = 0; i < arguments.length; i++) {
			Argument arg = arguments[i];
			if(arg.isOption() == true) {
				if("port".equals(arg.getName())) {
					// listenするポート番号
					setPort(Integer.parseInt(arg.getValue()));
				} else if("threads".equals(arg.getName())) {
					// スレッドプーリング数
					setThreads(Integer.parseInt(arg.getValue()));
				} else if("host".equals(arg.getName())) {
					// ホスト名
					setHostName(arg.getValue());
				} else {
					// 知らないオプションの場合
					ice.add("オプション[" + arg.getName() + "," + arg.getValue() + "]は無効です");
				}
			}
		}

		// エラーメッセージが積まれている場合は例外をスローする
		if(ice.hasError()) {
			throw ice;
		}
	}
	/**
	 * ポート番号を返す
	 * @return ポート番号
	 */
	public int getPort() {
		return port;
	}
	/**
	 * ポート番号を設定する
	 * @param p ポート番号
	 */
	public void setPort(int p) {
		port = p;
	}

	/**
	 * プーリングしているスレッド数を返す
	 * @return スレッドプーリング数
	 */
	public int getThreads() {
		return threads;
	}
	/**
	 * プーリングしているスレッド数を設定する
	 * @param th スレッドプーリング数
	 */
	public void setThreads(int th) {
		threads = th;
	}
	/**
	 * ホスト名を返す
	 * @return ホスト名
	 */
	public String getHostName() {
		return hostname;
	}
	/**
	 * ホスト名を設定する
	 * @param hn ホスト名
	 */
	public void setHostName(String hn) {
		hostname = hn;
	}
}
