package com.nifty.cloud.ncs.http;

import java.util.MissingResourceException;
import java.util.ResourceBundle;

/**
 * HttpClientで使用するプロパティを定義するクラスです。
 */
public class ClientProperties
{
	private static ResourceBundle bundle;
	
	static {
		bundle = ResourceBundle.getBundle("client");
	}
	
	/** ニフクラサービスのデフォルトのユーザーエージェントです。 */
	private static final String DEFAULT_USER_AGENT = "NIFCLOUD Service Java client"+ " : " + getAgentVersion();

	/** HTTPユーザーエージェントです。 */
	private String userAgent = DEFAULT_USER_AGENT;

	/** 最大リトライ数です。 */
	private int maxRetry = 5;

	/**
	 * 使用するHTTPプロトコルです。
	 * デフォルトの設定では値はhttpsです。
	 */
	private String protocol = "https";

	/** プロキシホストです。 */
	private String proxyHost = null;

	/** プロキシポート番号です。 */
	private int proxyPort = -1;

	/** プロキシユーザー名です。 */
	private String proxyUserName = null;

	/** プロキシユーザーのパスワードです。 */
	private String proxyPassword = null;

	/** 最大HTTP接続数です。 */
	private int maxConnections = 10;

	/** 接続のタイムアウトです。 */
	private int connectTimeout = 10 * 1000;

	/** ソケットのタイムアウトです。 */
	private int socketTimeout = 60 * 1000;

	/** ソケットのバッファサイズのヒントです。 */
	private int socketBufferSizeHint = 0;

    /**
     *  AgentVersionを取得する
     *  ユーザによる改変によって設定ファイルが読み取れなかった場合には、"custom"が返却される。
     * @return 提供バージョン 
     */
    private static String getAgentVersion() {
    	String version;
    	
    	try {
    		version = bundle.getString("version");
    	}catch (MissingResourceException e) {
    		version = "custom";
    	}
    	
    	return version;
    	
    	}
    	
    
	/**
	 * ユーザーエージェントを設定します。
	 *
	 * @param userAgent
	 *  ユーザーエージェント
	 */
	public void setUserAgent(String userAgent)
	{
		this.userAgent = userAgent;
	}

	/**
	 * ユーザーエージェントを取得します。
	 *
	 * @return
	 *  ユーザーエージェント
	 */
	public String getUserAgent()
	{
		return (userAgent);
	}

	/**
	 * 最大リトライ回数を設定します。
	 *
	 * @param maxRetry
	 *   最大リトライ回数
	 */
	public void setMaxRetry(int maxRetry)
	{
		this.maxRetry = maxRetry;
	}

	/**
	 * 最大リトライ回数を取得します。
	 *
	 * @return
	 *   最大リトライ回数
	 */
	public int getMaxRetry()
	{
		return (maxRetry);
	}

	/**
	 * HTTPプロトコル文字列を設定します。
	 *
	 * @param protocol
	 *  HTTPプロトコル文字列
	 */
	public void setProtocol(String protocol)
	{
		this.protocol = protocol;
	}

	/**
	 * HTTPプロトコル文字列を取得します。
	 *
	 * @return
	 *  HTTPプロトコル文字列
	 */
	public String getProtocol()
	{
		return (protocol);
	}

	/**
	 * HTTPプロキシホストを設定します。
	 *
	 * @param proxyHost
	 *  HTTPプロキシホスト
	 */
	public void setProxyHost(String proxyHost)
	{
		this.proxyHost = proxyHost;
	}

	/**
	 * HTTPプロキシホストを取得します。
	 *
	 * @return
	 *  HTTPプロキシホスト
	 *
	 */
	public String getProxyHost()
	{
		return (proxyHost);
	}

	/**
	 * HTTPプロキシポート番号を設定します。
	 *
	 * @param proxyPort
	 *  HTTPプロキシポート番号
	 */
	public void setProxyPort(int proxyPort)
	{
		this.proxyPort = proxyPort;
	}

	/**
	 * HTTPプロキシポート番号を取得します。
	 *
	 * @return
	 *  HTTPプロキシポート番号
	 */
	public int getProxyPort()
	{
		return (proxyPort);
	}

	/**
	 * HTTPプロキシユーザー名を取得します。
	 *
	 * @return
	 *  HTTPプロキシユーザー名
	 */
	public String getProxyUserName()
	{
		return (proxyUserName);
	}

	/**
	 * HTTPプロキシユーザー名を設定します。
	 *
	 * @param proxyUserName
	 *  HTTPプロキシユーザー名
	 */
	public void setProxyUserName(String proxyUserName)
	{
		this.proxyUserName = proxyUserName;
	}

	/**
	 * HTTPプロキシユーザーのパスワードを設定します。
	 *
	 * @param proxyPassword
	 *  HTTPプロキシユーザーのパスワード
	 */
	public void setProxyPassword(String proxyPassword)
	{
		this.proxyPassword = proxyPassword;
	}

	/**
	 * HTTPプロキシユーザーのパスワードを取得します。
	 *
	 * @return
	 *  HTTPプロキシユーザーのパスワード
	 */
	public String getProxyPassword()
	{
		return (proxyPassword);
	}

	/**
	 * 最大HTTP接続数を設定します。
	 *
	 * @param maxConnections
	 *  最大HTTP接続数
	 */
	public void setMaxConnections(int maxConnections)
	{
		this.maxConnections = maxConnections;
	}

	/**
	 * Get the maximum number of open HTTP connections.
	 * 最大HTTP接続数を取得します。
	 *
	 * @return
	 *  最大HTTP接続数
	 */
	public int getMaxConnections()
	{
		return (maxConnections);
	}

	/**
	 * Set the timeout to socket connect.
	 * ソケット接続のタイムアウトを設定します。
	 *
	 * @param connectTimeout
	 *  ソケット接続のタイムアウト
	 */
	public void setConnectTimeout(int connectTimeout)
	{
		this.connectTimeout = connectTimeout;
	}

	/**
	 * ソケット接続のタイムアウトを取得します。
	 *
	 * @return
	 *  ソケット接続のタイムアウト
	 */
	public int getConnectTimeout()
	{
		return (connectTimeout);
	}

	/**
	 * ソケット読み込み／書き込みのタイムアウトを設定します。
	 *
	 * @param socketTimeout
	 *  ソケット読み込み／書き込みのタイムアウト
	 */
	public void setSocketTimeout(int socketTimeout)
	{
		this.socketTimeout = socketTimeout;
	}

	/**
	 * ソケット読み込み／書き込みのタイムアウトを取得します。
	 *
	 * @return
	 *  ソケット読み込み／書き込みのタイムアウト
	 */
	public int getSocketTimeout()
	{
		return (socketTimeout);
	}

	/**
	 * ソケットのバッファサイズのヒントを設定します。
	 *
	 * @param size
	 *  ソケットのバッファサイズのヒント
	 */
	public void setSocketBufferSizeHint(int size)
	{
		this.socketBufferSizeHint = size;
	}

	/**
	 * ソケットのバッファサイズのヒントを取得します。
	 *
	 * @return
	 *  ソケットのバッファサイズのヒント
	 */
	public int getSocketBufferSizeHint()
	{
		return (socketBufferSizeHint);
	}
}
