import java.util.Hashtable;
import java.util.Enumeration;
import java.util.StringTokenizer;
import java.net.URLEncoder;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;

/**
 * <p>各種ユーティリティメソッドの実装クラス</p>
 *
 * @author VeriTrans, Inc.
 * @version 1.0, 2004/08 created.
 */

public class Util {
	/**
	* <p>GET/POST されたパラメータを取得</p>
	* @param request サーブレットリクエスト
	* @param encode パラメータのCharset(Shift_JIS,EUC-JP,ISO2022-JP...)
	* @return パラメータが入っているハッシュテーブル
	*/
	public static Hashtable getQuery(HttpServletRequest request,
										String encode)
	{
		 Hashtable params = new Hashtable();
		Enumeration e = request.getParameterNames();
		while (e.hasMoreElements()) {
			String key = (String)e.nextElement();
			String[] values = request.getParameterValues(key);
			params.put(key, jp2unicode(values[0], encode));
		}
		return params;
	}

	/**
	* <p>文字列をUnicodeに変更</p>
	* @param origin 変更対象文字列
	* @param encode 変更対象文字列のCharset(Shift_JIS,EUC-JP,ISO2022-JP...)
	* @return パラメータが入っているハッシュテーブル
	*/
	private static String jp2unicode(String origin, String encode)
	{
		try {
			if (origin == null) {
				return null;
			}
			return new String(origin.getBytes("8859_1"), encode);
		}
		catch (UnsupportedEncodingException e) {
			return origin;
		}
	}

	/**
	* <p>決済情報ハッシュテーブルをエンコーディング</p>
	* <p>エンコードルール： 
	* <br>キーとバリューを連結：key1=value1;key2=value2...</br>
	* <br>連結された文字列に対して標準エンコードを行う</br>
	* </p>
	* @param params 決済情報ハッシュテーブル
	* @return エンコーディング文字列
	*/
	public static String urlEncode(Hashtable params) throws Exception {
		try {
			String s = new String();
			Enumeration e = params.keys();
			while (e.hasMoreElements()) {
				if (s.length() > 0) s += ";";
					String key = (String)e.nextElement();
					s += (key + "=" + (String)params.get(key));
				}
				return URLEncoder.encode(s, "UTF-8");
			}
			catch (Exception e) {
				throw e;
		}
	}

	/**
	* <p>決済情報エンコード文字列をデコーディング</p>
	* <p>デコードルール： 
	*  <br>連結文字列に対して標準デコードを行う</br>
	*  <br>デコード結果(key1=value1;key2=value2...)からハッシュに戻る</br>
	* </p>
	* @param s 決済情報エンコード文字列
	* @return デコーディングされたハッシュテーブル
	*/
	public static Hashtable urlDecode(String s) throws Exception {
		try {
			s = URLDecoder.decode(s, "UTF-8");
			Hashtable tokens = new Hashtable();
			StringTokenizer st = new StringTokenizer(s, ";");
			while (st.hasMoreTokens()) {
				String keyValue = st.nextToken();
				StringTokenizer st2 = new StringTokenizer(keyValue, "=");
				String key = st2.nextToken();
				String value =  st2.nextToken();
				tokens.put(key, value);
			}
			return tokens;
		}
		catch (Exception e) {
			throw e;
		}
	}
    
	/**
	 * <p>文字列から数字以外を除去</p>
	 * @param s 対象文字列
	 * @return 除去後の文字列
	 */
	public static String stripCardNumber(String s) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0 ; i < s.length() ; i++) {
			char c = s.charAt(i);
			if (Character.isDigit(c)) sb.append(c);
		}
		return sb.toString();
	}
}
