package com.nifty.cloud.ncs;

import java.util.HashMap;
import java.util.Map;

/**
 * ニフクラサービスの応答内容を保持するクラスです。
 *
 * @param <T>
 *            この応答に含まれる結果の種類
 */
public class NiftyCloudResponse<T>
{
	/**  */
	public static final String NIFTY_REQUEST_ID = "NIFTY_REQUEST_ID";

	protected Map<String, String> metadata = new HashMap<String, String>();

	/** 応答結果 */
	protected T result;

	/**
	 * 応答メタデータを追加します。
	 *
	 * @param key
	 *  メタデータのキー
	 *
	 * @param value
	 *  メタデータの値
	 */
	public void addMetadata(String key, String value)
	{
		metadata.put(key, value);
	}

	/**
	 * Remove the response metadata.
	 * 応答メタデータを削除します。
	 *
	 * @param key
	 *  削除するメタデータのキー
	 */
	public void removeMetadata(String key)
	{
		metadata.remove(key);
	}

	/**
	 * 応答メタデータマップを取得します。
	 *
	 * @return
	 *  メタデータマップ
	 */
	public Map<String, String> getMetadata()
	{
		return (metadata);
	}

	/**
	 * 指定したキーに紐付くメタデータの値を取得します。
	 *
	 * @param key
	 *  メタデータのキー
	 * @return
	 *  メタデータの値
	 */
	public String getMetadataValue(String key)
	{
		return (metadata.get(key));
	}

	/**
	 * 要求IDを設定します。
	 *
	 * @param requestId
	 *  要求ID
	 */
	public void setRequestId(String requestId)
	{
		metadata.put(NIFTY_REQUEST_ID, requestId);
	}

	/**
	 * 要求IDの取得
	 *
	 * @return
	 *  要求ID
	 */
	public String getRequestId()
	{
		return (metadata.get(NIFTY_REQUEST_ID));
	}

	/**
	 * 応答結果を設定します。
	 *
	 * @param result
	 *  応答結果
	 */
	public void setResult(T result)
	{
		this.result = result;
	}

	/**
	 * Get the result contained by this response.
	 * 応答結果を取得します。
	 *
	 * @return
	 *  The result contained by this response.
	 *  応答結果
	 */
	public T getResult()
	{
		return (result);
	}

	@Override
	public String toString()
	{
		if (metadata == null) {
			return ("{}");
		}

		return (metadata.toString());
	}
}
