//
//  VeriTrans BuySmart Flex
//  adapter kit sample　CCUtil.java　Version 1.0.1
//  Copyright (c) 2001-2002 VeriTrans Inc.
//  Note: CCUtil for BuySmart Flex.
//

// CUSTOM:
//   URL を変えたいときはカスタマイズしてください
package CCAdapterSamples;

import java.io.*;
import java.util.*;
import java.net.*;
import javax.servlet.http.*;

//
// PURPOSE:
//   パッケージ中の各クラスで利用されるユーティリティメソッドを格納したクラス
//
// ATTENTION:
//   基本的にカスタマイズする必要はありません
//
public class CCUtil {

    // 文字エンコーディング
    private static String encodingEucJp = "EUC_JP"; // EUC
    private static String encodingShiftJis = "SJIS"; // SJIS

    // キャラクタセット
    private static String charsetEucJp = "euc-jp"; // EUC
    private static String charsetShiftJis = "shift_jis"; // SJIS

    //
    // PURPOSE:
    //   あつかう日本語が EUC かどうか判定する
    //   (CCCustom クラスの encoding が euc に設定されているかどうか)
    //
    // INPUT:
    //
    // RETURN:
    //   EUC : true , SJIS : false
    //
    // ATTENTION:
    //
    public static boolean isEuc() {
        if ((CCCustom.encoding).equals("euc")) return true;
        return false;
    }

    //
    // PURPOSE:
    //   あつかう日本語が SJIS かどうか判定する
    //   (CCCustom クラスの encoding が sjis に設定されているかどうか)
    //
    // INPUT:
    //
    // RETURN:
    //   EUC : false , SJIS : true
    //
    // ATTENTION:
    //
    public static boolean isSjis() {
        if ((CCCustom.encoding).equals("sjis")) return true;
        return false;
    }

    //
    // PURPOSE:
    //   Java のクラスライブラリで利用するエンコーディング文字列をえる
    //
    // INPUT:
    //
    // RETURN:
    //   エンコーディングを表す文字列
    //
    // ATTENTION:
    //
    public static String getEncoding() {
	if (CCUtil.isEuc()) return encodingEucJp; // EUC
	return encodingShiftJis; // else SJIS
    }

    //
    // PURPOSE:
    //   キャラクタセット文字列をえる
    //
    // INPUT:
    //
    // RETURN:
    //   EUC : euc-jp , SJIS : shift_jis
    //
    // ATTENTION:
    //
    public static String getCharset() {
	if (CCUtil.isEuc()) return charsetEucJp; // EUC
	return charsetShiftJis; // else SJIS
    }

    //
    // PURPOSE:
    //   META タグに指定する CONTENT 文字列をえる
    //
    // INPUT:
    //
    // RETURN:
    //   CONTENT 文字列
    //
    // ATTENTION:
    //
    public static String getContent() {
	return "text/html; charset=" + getCharset();
    }

    //
    // PURPOSE:
    //   VeriTrans イメージロゴをえる
    //
    // INPUT:
    //
    // RETURN:
    //   HTML の IMG タグ文字列
    //
    // ATTENTION:
    //
    public static String getCClogo() {
	return CCCustom.imageDir + "/" + CCCustom.ccLogo + ".gif";
    }

    //
    // PURPOSE:
    //   HTML の冒頭部分を出力する
    //
    // INPUT:
    //   pw    -  出力先のリファレンス
    //   title -  <TITLE> にする文字列 
    //
    // RETURN:
    //
    // ATTENTION:
    //
    public static void printHeader(PrintWriter pw, String title) {
	pw.println("<html>");
	pw.println("<head>");
	pw.print("<meta http-equiv=\"Content-Type:\" content=\"");
	pw.print(getContent());
	pw.println("\">");
	pw.println("<title>");
	pw.println(title);
	pw.println("</title>");
	pw.println("</head>");
	pw.println("<body>");
    }

    //
    // PURPOSE:
    //   HTML の末尾部分を出力する
    //
    // INPUT:
    //   pw    -  出力先のリファレンス
    //
    // RETURN:
    //
    // ATTENTION:
    //
    public static void printFooter(PrintWriter pw) {
	pw.println("</body>");
	pw.println("</html>");
    }

    //
    // PURPOSE:
    //   #???# のタグを置き換える
    //
    // INPUT:
    //   s     -  置き換え対象の文字列
    //   token -  置き換えたいキー(???)と置き換える文字が格納されたハッシュ
    //
    // RETURN:
    //   置き換えられた文字列
    //
    // ATTENTION:
    //
    public static String replaceToken(String s, Hashtable token) {
	StringBuffer sb = new StringBuffer(s);
	Enumeration e = token.keys();
        while (e.hasMoreElements()) {
            String key = (String)e.nextElement();
            String value = (String)token.get(key);
            key = "#" + key + "#";
	    int start = (sb.toString()).indexOf(key);
	    while (start >= 0) {
		int end = start + key.length();
		sb.replace(start, end, value);
		start = (sb.toString()).indexOf(key);
	    }
        }
	return sb.toString();
    }

    //
    // PURPOSE:
    //   HTML テンプレートを出力する
    //   同時にタグの置き換えもおこなう
    //
    // INPUT:
    //   pw    -  出力先
    //   file  -  テンプレートファイル名
    //   token -  置き換えたいキー(???)と置き換える文字が格納されたハッシュ
    //
    // RETURN:
    //   置き換えられた文字列
    //
    // ATTENTION:
    //
    public static void printTemplate(PrintWriter pw, String template, Hashtable token) throws IOException {
	token.put("content", getContent());
	try {
	    String path = new String(CCCustom.templateDir + System.getProperty("file.separator") + template);
            FileInputStream fis = new FileInputStream(path);
            BufferedReader br = new BufferedReader(new InputStreamReader(fis, CCUtil.getEncoding()));
	    while (br.ready()) {
		String content = br.readLine();
		content = CCUtil.replaceToken(content, token);
		pw.println(content);
	    }
	    br.close();
            fis.close();
        }
	catch(IOException e) {
            throw e;
	}
    }

    //
    // PURPOSE:
    //   エンコーディングにあったレスポンスライターをえる
    //
    // INPUT:
    //   response -  Servlet の response
    //
    // RETURN:
    //   PrintWriter のリファレンス
    //
    // ATTENTION:
    //
    public static PrintWriter getWriter(HttpServletResponse response) throws UnsupportedEncodingException, IOException {
	try {
	    return new PrintWriter(new OutputStreamWriter(response.getOutputStream(), CCUtil.getEncoding()), true);
	}
	catch (UnsupportedEncodingException uee) {
	    throw uee;
	}
	catch (IOException ioe) {
	    throw ioe;
	}
    }

    //
    // PURPOSE:
    //   POST & GET のデータをえる
    //
    // INPUT:
    //   response -  Servlet の response
    //
    // RETURN:
    //   データのキーと値のペアが格納されたハッシュ
    //
    // ATTENTION:
    //
    public static Hashtable getQuery(HttpServletRequest request) {
	Hashtable params = new Hashtable();
	Enumeration e = request.getParameterNames();
	while (e.hasMoreElements()) {
	    String key = (String)e.nextElement();
	    String[] values = request.getParameterValues(key);
	    params.put(key, values[0]);
	}
	return params;
    }

    //
    // PURPOSE:
    //   キーと値が格納されたハッシュを key1=value1&key2=value2... に
    //   連結したのちエンコードする
    //
    // INPUT:
    //   params -  キーと値が格納されたハッシュ
    //
    // RETURN:
    //   エンコードされた文字列
    //
    // ATTENTION:
    //   このクラスの urlDecode とペアで利用すること
    //
    public static String urlEncode(Hashtable params) {
	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);
    }

    //
    // PURPOSE:
    //   key1=value1&key2=value2... に連結したのちエンコードされた文字列
    //   をデコードしハッシュに戻す
    //
    // INPUT:
    //   params -  エンコードされた文字列
    //
    // RETURN:
    //   デコードされたハッシュ
    //
    // ATTENTION:
    //   このクラスの urlEncode とペアで利用すること
    //
    public static Hashtable urlDecode(String s) throws Exception {
	try {
	    s = URLDecoder.decode(s);
	}
	catch (Exception e) {
	    throw e;
	}
	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;
    }

    //
    // PURPOSE:
    //   文字列から数字以外を除外する
    //
    // INPUT:
    //   params -  対象文字列
    //
    // RETURN:
    //   変換された文字列
    //
    // ATTENTION:
    //
    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();
    }

}
