package jp.co.sint.mpi;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;

import java.io.IOException;

import jp.co.sint.config.SIConfig;

/**
 * <p>MPIサンプル
 *    サーブレットコントローラー</p>
 * @author SBI VeriTrans Co., Ltd.
 * @version 1.0, 2005/05 created.
 */
public abstract class McController extends HttpServlet {
  //web.xml に記述されているマーチャント ID のパラメータ名
  public static final String MERCHANT_ID = "merchantID";
  // web.xml に記述されている電子署名鍵のパラメータ名
  public static final String SIGNATURE_KEY = "signatureKey";
  // web.xml に記述されているプロパティファイルのパラメータ名
  public static final String PROPERTIES = "properties";
  // web.xml に記述されているコンテンツキャラクタエンコーディングのパラメータ名
  //public static final String ENCODE = "encode";
  // web.xml に記述されている Auth URL のパラメータ名
  public static final String TERM_URL = "termURL";
  // web.xml に記述されている jspTemplate のパラメータ名
  public static final String JSPTEMPLATE = "jspTemplate";
  // セッションに保持するショッピングカートの名前
  public static final String SHOPPING_CART = "ShoppingCart";
  // セッションに保持する MI の名前
  public static final String MI = "MI";
  // セッションに保持する MI 電子署名の名前
  public static final String MI_SIG = "MI_SIG";
  // カードホルダから POST されてくる PARes の名前
  public static final String PARES = "PaRes";
  // カードホルダから POST されてくる PARes 電子署名の名前
  // これはダミー実装であり実際は PARes の XML
  // データ中に署名がうめこまれている
  public static final String PARES_SIG = "PaResSig";
  // カードホルダから POST されてくる MD の名前
  public static final String MD = "MD";
  // MD 電子署名の名前
  public static final String MD_SIG = "MD_SIG";
  // FORM の action の名前
  public static final String ACTION = "action";
  // 本人認証結果：本人認証許可
  public static final String AUTH_OK = "020";
  // 本人認証結果：決済許可
  public static final String SETTLEMENT_PERMITION = "021";
  // 本人認証結果：決済許可(本人認証失敗)
  public static final String SETTLEMENT_PERMITION_AUTH_MISS = "022";
  // 本人認証結果：3DGW利用不可
  public static final String AUTH_NG = "190";
  // 本人認証結果：決済不可
  public static final String SETTLEMENT_REFUSED = "191";
  // web.xmlのJPGWへのコマンド文字列パラメータ名称
  private static final String TXN_TYPE = "txnType";
  
  /**
   * <p>web.xml に記述されているマーチャント ID を取得する.</p>
   * @return マーチャント ID 文字列
   */
  protected String getMerchantID() {
  //throws ServletException, IOException {
    return (String)getServletContext().getInitParameter(MERCHANT_ID);
  }
  /**
   * <p>web.xml に記述されている電子署名鍵を取得する.</p>
   * @return 電子署名鍵文字列
   */
  protected String getSignatureKey() {
  //throws ServletException, IOException {
    return (String)getServletContext().getInitParameter(SIGNATURE_KEY);
  }
  /**
   * <p>web.xml に記述されているプロパティファイルを取得する.</p>
   * @return プロパティファイルのパス文字列
   */
  protected String getProperties() {
  //throws ServletException, IOException {
    return (String)getServletContext().getInitParameter(PROPERTIES);
  }
  /**
   * <p>コンテンツキャラクタエンコーディングを取得する.</p>
   * @return キャラクタエンコーディング文字列
   */
  protected String getEncode() {
  //throws ServletException, IOException {
  //return (String)getServletContext().getInitParameter(ENCODE);
  //規定エンコードの取得
    return SIConfig.SIENCODE_SHIFT_JIS;
  }
  /**
   * <p>web.xml に記述されている Auth URL を取得する.</p>
   * @return Auth URL 文字列
   */
  protected String getTermURL() {
  //throws ServletException, IOException {
    ServletContext context = getServletContext();
    StringBuffer url = new StringBuffer();
    url.append(context.getInitParameter(TERM_URL));
    return url.toString();
  }
  /**
   * <p>web.xml に記述されている取引タイプを取得する.</p>
   *  @return 取引タイプ文字列
   */
  protected String getTxnType() {
  //throws ServletException, IOException {
    return (String)getServletContext().getInitParameter(TXN_TYPE);
  }
  /**
   * <p>web.xml に記述されているJSPテンプレートパスを取得する.</p>
   *  @return 取引タイプ文字列
   */
  protected String getJspTemplate() {
  //throws ServletException, IOException {
    return (String)getServletContext().getInitParameter(JSPTEMPLATE);
  }
  /**
   *  <p>GET リクエストを処理する.</p>
   *  <p>基本的にこのサンプルでは POST による処理のみうけつける。
   *  よって GET リクエストに対してはエラー画面を表示する。</p>
     *
   *  @param request HttpServletRequest HTTPサーブレットリクエスト
   *  @param response HttpServletResponse HTTPサーブレットレスポンス
   */
  public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
    final String message = "このリクエストは処理できません。";
    final String jspTemplate = getJspTemplate();
    log(message);
    request.setAttribute("errmsg", message);
    dispatchTo(jspTemplate + "/error.jsp", request, response);
  }
  /**
   *  <p>JSP ページへディスパッチする.</p>
   *  @param page ディスパッチ先の jsp ページ
   *  @param request HttpServletRequest HTTPサーブレットリクエスト
   *  @param response HttpServletResponse HTTPサーブレットレスポンス
   */
  protected void dispatchTo(String page, HttpServletRequest request,HttpServletResponse response)
    throws ServletException, IOException {
    RequestDispatcher dispatcher =
    getServletContext().getRequestDispatcher(page);
    dispatcher.forward(request, response);
  }
  /**
   * <p>エラーページへディスパッチするメソッド</p>
   *  @param e 原因となった例外
   *  @param request HttpServletRequest HTTPサーブレットリクエスト
   *  @param response HttpServletResponse HTTPサーブレットレスポンス
   */
  protected void dispatchToError(Exception e, HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    log(e.getMessage(), e);
    final String jspTemplate = getJspTemplate();
    request.setAttribute("errmsg", e.getMessage());
    dispatchTo("/casher?a="+SIConfig.SIACTION_CANCEL, request, response);
  }
}
