//===========================================================================
//package
//===========================================================================
package jp.gr.java_conf.bugslife.util;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 *<PRE>
 * 
 * メッセージ管理クラス
 * 
 * メッセージの読み出しおよび項目の埋め込みを行うクラス
 * 
 * 使い方
 * MessageString.get(メッセージID, [埋め込み情報1,...])
 * 
 * 埋め込み情報はメッセージ
 *
 *</PRE>
 * @version	0.0, 2001/06/12
 * @author	鰐川 正寛
 */
//===========================================================================
// version	0.0,2000/12/28	新規作成
//============================================================================
public class MessageString
{
//============================================================================
// attributes
//============================================================================
	/**
	 * 画面表示用メッセージリソース
	 */
	private ResourceBundle mBundle = null;
	/**
	 * 画面表示用バンドルパス
	 */
	private final static String BUNDLE_NAME_VIEWMSG = "ApplicationResources";
	/**
	 * Log
	 */
	private Log log = LogFactory.getLog(this.getClass().getName());
//============================================================================
// methods
//============================================================================

	/**
	 * デフォルトコンストラクタ
	 *
	 */
	public MessageString(){
		try {
		    mBundle = ResourceBundle.getBundle(BUNDLE_NAME_VIEWMSG);
		} catch (MissingResourceException mre) {
		    
		}
	}

	/**
	 * メッセージの取得(内部用)
	 *
	 * ※必ず、bandleLogMsg(string)か、bandleViewMsg(string)を実行してから
	 * このメソッドを使用すること。
	 *
	 * @param msgId		メッセージID
	 * @param bundle	メッセージリソース
	 */
	public String get(String msgId) 
	{
		String str = null;
		try {
			str = mBundle.getString(msgId);
			
		} catch (MissingResourceException mre) {
			str = "invalid message id = " + msgId + " :args = {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}";
		}
		return str;
	}

	/**
	 * メッセージの取得およびフォーマット(引数が2個以上)(内部用)
	 *
	 * ※必ず、bundleLogMsg(string)か、bundleViewMsg(string)を実行してから
	 * このメソッドを使用すること。
	 *
	 * @param msgId		メッセージID
	 * @param args		埋め込み情報
	 * @param bundle	メッセージリソース
	 */
	public String get(String msgId, Object[] args)
	{
		String iString = null;
		String value = get(msgId);
		
		try {
			//埋め込み情報にnullが無いかチェックする
			Object nonNullArgs[] = args;
			for (int i = 0; i < args.length; i++) {
				if (args[i] == null) {					//nullか？
					if (nonNullArgs == args) {			//コピーされていないか
						nonNullArgs = (Object[])args.clone();	//コピーする
					}
					nonNullArgs[i] = "null";			//"null"の文字に置き換え
				}
			}
			//メッセージへ埋め込み
			iString = MessageFormat.format(value, nonNullArgs);
		} catch (IllegalArgumentException iae) {
			//引数エラーの場合
			//メッセージの後ろに引数を追加する
			StringBuffer buf = new StringBuffer();
			buf.append(value);
			for (int i = 0; i < args.length; i++) {
				buf.append(" arg[" + i + "]=" + args[i]);
			}
			iString = buf.toString();
		}
		return iString;
	}
	/**
	 * メッセージの取得およびフォーマット(引数が１個)
	 *
	 * @param msgId		メッセージID
	 * @param arg		埋め込み情報１
	 * @param bundle	メッセージリソース
	 */
	public String get(String msgId, Object arg)
	{
		Object[] args = new Object[] {arg};
		return get(msgId, args);
	}
}
