/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
package jp.co.sint.tools;

import javax.servlet.http.*;

import java.util.*;
import org.apache.log4j.Category;
import jp.co.sint.config.*;

import java.io.File;
import java.net.*;      //7.1.1 ST0236 追加

/**
 * @version $Id: SIURLMap.java,v 1.0 2003/07/25 Exp $
 * @author  Jinwang Chen
 * <br>Description: JSPのサイトとサブレットのサイトを設定ファイルからマップに読み込んで
 *               メモリに保存します。
 * <p>History</p>
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 * ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * J.W.Chen       2003/07/25  Original
 */

public class SIURLMap {
  
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  private static ResourceBundle urlMapBundle=ResourceBundle.getBundle(SIConfig.SICONFIG_URLMAP_FILE_NAME,new Locale("ja","JP"));
  //8.1.5 ST2365 追加 ここから
  private static Set userAgentSet = Collections.unmodifiableSet(new HashSet(
      Arrays.asList(new String[]{SIConfig.SIUSER_AGENT_VOD, SIConfig.SIUSER_AGENT_SOFTBANK3G_1, SIConfig.SIUSER_AGENT_SOFTBANK3G_2})));
  //8.1.5 ST2365 追加 ここまで
  
  public SIURLMap() {}
  
  /**
   * <b>getUrl</b>
   * 設定ファイルからサイトの相対パス名を取得します。
   * @param lKeyName  対象のサイトのロジックパス名
   * @return ウェブサイトの物理パス名
   * @throws なし
   */
  public static String getUrl(String lKeyName){
    if (SIUtil.isNull(lKeyName)) return "";
    try {
      String lRes=urlMapBundle.getString(lKeyName);
      if (lRes.startsWith("/")) return lRes;
      else return "/"+lRes;
    }catch(MissingResourceException me){
      log.error("getUrl(String lKeyName):not found the specified key name.lKeyName="+lKeyName);
      return "";
    }
  }
  
  /**
   * <b>getUrl</b>
   * 設定ファイルからサイトの相対パス名を取得して、フルパスに変更します。
   * @param request クライアントからのリクエスト
   * @param lKeyName  設定ファイルに定義される対象のサイトのロジックパス名
   * @return ウェブサイトの物理パス名
   * @throws なし
   */
  public static String getUrl(HttpServletRequest request,String lKeyName){
    String lUrl="";
    if (SIUtil.isNull(lKeyName)) return "";
    try {
      lUrl=urlMapBundle.getString(lKeyName);
      
      if (SIUtil.isNull(lUrl)) lUrl="/";
      else lUrl=SIHTMLUtil.getRootPath(request)+(lUrl.trim().startsWith("/")?lUrl.trim():"/"+lUrl.trim());
    }catch(MissingResourceException me){
      lUrl="/";
    }
    
    if (isMobile(request)){//7.2.0 ST0242 修正
      lUrl=lUrl+";jsessionid="+request.getSession(true).getId();
      if(isIMode(request)){
        return SIHTMLUtil.consURL(request,lUrl,false);
      }else
      return SIHTMLUtil.consURL(request,lUrl,true);
    }else
    return SIHTMLUtil.consURL(request,lUrl,false);
  }
  
  public static String getRecommendUrl(HttpServletRequest request,String lKeyName,String lCmdtyCode,String lIndividualCode){
    String lUrl="";
    if (SIUtil.isNull(lKeyName)) return "";
    try {
      lUrl=urlMapBundle.getString(lKeyName);
      
      if (SIUtil.isNull(lUrl)) lUrl="/";
      else lUrl=SIHTMLUtil.getRootPath(request)+(lUrl.trim().startsWith("/")?lUrl.trim():"/"+lUrl.trim());
    }catch(MissingResourceException me){
      lUrl="/";
    }
    if(isVod(request)){
      return SIHTMLUtil.consURL(request,lUrl,true)+"?shc=0&cmc="+lCmdtyCode+"&inc="+lIndividualCode;
    }else return SIHTMLUtil.consURL(request,lUrl,true)+"?shc=0/cmc="+lCmdtyCode+"/inc="+lIndividualCode;
  }
  
  // 7.0.1 追加 ここから
  /**
   * <b>getUrl</b>
   * 設定ファイルからサイトの相対パス名を取得して、フルパスに変更してencodeして戻す。
   * @param request クライアントからのリクエスト
   * @param response クライアントまでのresponse
   * @param lKeyName  設定ファイルに定義される対象のサイトのロジックパス名
   * @return ウェブサイトの物理パス名
   * @throws なし
   */
  public static String getUrl(HttpServletRequest request,HttpServletResponse response,String lKeyName){
    return getUrl(request,lKeyName);//7.2.0 ST0242 修正
  }
  // 7.0.1 追加 ここまで
  
  /**
   * <b>getUrls</b>
   * 設定ファイルからサイトの相対パス名を取得して、フルパスに変更します。
   * @param request クライアントからのリクエスト
   * @param lKeyName  設定ファイルに定義される対象のサイトのロジックパス名
   * @return ウェブサイトの物理パス名
   * @throws なし
   */
  public static String getHttpsUrl(HttpServletRequest request,String lKeyName){
    String lUrl="";
    if (SIUtil.isNull(lKeyName)) return "";
    try {
      lUrl=urlMapBundle.getString(lKeyName);
      if (SIUtil.isNull(lUrl)) lUrl="/";
      else lUrl=SIHTMLUtil.getRootPath(request)+(lUrl.trim().startsWith("/")?lUrl.trim():"/"+lUrl.trim());
    }catch(MissingResourceException me){
      lUrl="/";
    }
    
    if (isMobile(request)){//7.2.0 ST0242 修正
      lUrl=lUrl+";jsessionid="+request.getSession(true).getId();
    }
    return SIHTMLUtil.consURL(request,lUrl,true);
  }
  
  /**
   * <b>getUrls</b>
   * 設定ファイルからサイトの相対パス名を取得して、フルパスに変更します。]
   * cookieによって、セッション情報をurlにつけるかどうかを処理します。
   * @param request クライアントからのリクエスト
   * @param response クライアントまでのresponse
   * @param lKeyName  設定ファイルに定義される対象のサイトのロジックパス名
   * @return ウェブサイトの物理パス名
   * @throws なし
   */
  public static String getHttpsUrl(HttpServletRequest request,HttpServletResponse response,String lKeyName){
    return getHttpsUrl(request,lKeyName);//7.2.0 ST0242 修正
  }
  
  /**
   * <b>getUserAgent</b>
   * 端末種類情報の取得
   * @param request クライアントからのリクエスト
   * @return 端末種類情報
   * @throws なし
   */
  public final static String getUserAgent(HttpServletRequest request){
    String lRes=request.getHeader("user-agent");
    if (SIUtil.isNull(lRes)) lRes=SIConfig.SIUSER_AGENT_PC;
    else if (lRes.startsWith( SIConfig.SIUSER_AGENT_IMODE)) lRes=SIConfig.SIUSER_AGENT_IMODE; 
    //else if (lRes.indexOf(SIConfig.SIUSER_AGENT_AU)!=-1) lRes=SIConfig.SIUSER_AGENT_AU;// 7.0.1 修正 
    else if (lRes.startsWith(SIConfig.SIUSER_AGENT_VOD)) lRes=SIConfig.SIUSER_AGENT_VOD;// 7.0.1 追加 
    else if (lRes.startsWith(SIConfig.SIUSER_AGENT_SOFTBANK3G_1)) { lRes = SIConfig.SIUSER_AGENT_SOFTBANK3G_1;}
    else if (lRes.startsWith(SIConfig.SIUSER_AGENT_SOFTBANK3G_2)) { lRes = SIConfig.SIUSER_AGENT_SOFTBANK3G_2;}
    else if (lRes.indexOf(SIConfig.SIUSER_AGENT_AU) != -1) { lRes = SIConfig.SIUSER_AGENT_AU;}
    else if (lRes.indexOf(SIConfig.SIUSER_AGENT_IPHONE) != -1) { lRes = SIConfig.SIUSER_AGENT_IPHONE;}
    else if ((lRes.indexOf(SIConfig.SIUSER_AGENT_ANDROID) != -1) && (lRes.indexOf(SIConfig.SIUSER_AGENT_MOBILE) != -1)) { lRes = SIConfig.SIUSER_AGENT_ANDROID;}
    // EDBTG005-00 nagayoshi add start
    else if (lRes.indexOf(SIConfig.SIUSER_AGENT_IPOD) != -1) { lRes = SIConfig.SIUSER_AGENT_IPOD;}
    // EDBTG005-00 nagayoshi add end
    else lRes=SIConfig.SIUSER_AGENT_PC;
    return lRes;
  }
  
  public final static boolean isApps(HttpServletRequest request) {
    String UA=request.getHeader("user-agent");
    return UA.indexOf(SIConfig.SIUSER_AGENT_APPS) != -1;
  }
  
  /**
   * <b>isIMode</b>
   * iモード端末かどうか
   * @param request クライアントからのリクエスト
   * @return  iモード端末かどうか
   * @throws なし
   */
  public final static boolean isIMode(HttpServletRequest request){
    return getUserAgent(request).equals(SIConfig.SIUSER_AGENT_IMODE);
  }
  
  /**
   * <b>isAU</b>
   * au端末かどうか
   * @param request クライアントからのリクエスト
   * @return  au端末かどうか
   * @throws なし
   */
  public final static boolean isAU(HttpServletRequest request){
    return getUserAgent(request).equals(SIConfig.SIUSER_AGENT_AU);// 7.0.1 修正
  }
  
  /**
   * <b>isAU2</b>
   * 非対応のau端末かどうか
   * @param request クライアントからのリクエスト
   * @return  非対応のau端末かどうか
   * @throws なし
   */
  public final static boolean isAU2(HttpServletRequest request){
    String userAgent = request.getHeader("user-agent");
    return userAgent.startsWith("KDDI-CA21 ")
        ||userAgent.startsWith("KDDI-CA22 ")
        ||userAgent.startsWith("KDDI-CA23 ")
        ||userAgent.startsWith("KDDI-CA24 ")
        ||userAgent.startsWith("KDDI-CA25 ")
        ||userAgent.startsWith("KDDI-CA26 ")
        ||userAgent.startsWith("KDDI-CA27 ")
        ||userAgent.startsWith("KDDI-CA28 ")
        ||userAgent.startsWith("KDDI-HI21 ")
        ||userAgent.startsWith("KDDI-HI23 ")
        ||userAgent.startsWith("KDDI-HI24 ")
        ||userAgent.startsWith("KDDI-KC21 ")
        ||userAgent.startsWith("KDDI-KC22 ")
        ||userAgent.startsWith("KDDI-KC23 ")
        ||userAgent.startsWith("KDDI-KC24 ")
        ||userAgent.startsWith("KDDI-KC25 ")
        ||userAgent.startsWith("KDDI-KC26 ")
        ||userAgent.startsWith("KDDI-KC27 ")
        ||userAgent.startsWith("KDDI-KC28 ")
        ||userAgent.startsWith("KDDI-KC29 ")
        ||userAgent.startsWith("KDDI-KC2A ")
        ||userAgent.startsWith("KDDI-MA21 ")
        ||userAgent.startsWith("KDDI-PT21 ")
        ||userAgent.startsWith("KDDI-PT22 ")
        ||userAgent.startsWith("KDDI-PT23 ")
        ||userAgent.startsWith("KDDI-SA21 ")
        ||userAgent.startsWith("KDDI-SA22 ")
        ||userAgent.startsWith("KDDI-SA24 ")
        ||userAgent.startsWith("KDDI-SA25 ")
        ||userAgent.startsWith("KDDI-SA26 ")
        ||userAgent.startsWith("KDDI-SA27 ")
        ||userAgent.startsWith("KDDI-SA28 ")
        ||userAgent.startsWith("KDDI-SA29 ")
        ||userAgent.startsWith("KDDI-SA2A ")
        ||userAgent.startsWith("KDDI-SN21 ")
        ||userAgent.startsWith("KDDI-SN22 ")
        ||userAgent.startsWith("KDDI-SN23 ")
        ||userAgent.startsWith("KDDI-SN24 ")
        ||userAgent.startsWith("KDDI-SN25 ")
        ||userAgent.startsWith("KDDI-SN26 ")
        ||userAgent.startsWith("KDDI-SN27 ")
        ||userAgent.startsWith("KDDI-SN28 ")
        ||userAgent.startsWith("KDDI-SN29 ")
        ||userAgent.startsWith("KDDI-ST21 ")
        ||userAgent.startsWith("KDDI-ST22 ")
        ||userAgent.startsWith("KDDI-ST23 ")
        ||userAgent.startsWith("KDDI-ST24 ")
        ||userAgent.startsWith("KDDI-ST25 ")
        ||userAgent.startsWith("KDDI-ST26 ")
        ||userAgent.startsWith("KDDI-ST27 ")
        ||userAgent.startsWith("KDDI-ST28 ")
        ||userAgent.startsWith("KDDI-ST29 ")
        ||userAgent.startsWith("KDDI-ST2A ")
        ||userAgent.startsWith("KDDI-ST2C ")
        ||userAgent.startsWith("KDDI-ST2D ")
        ||userAgent.startsWith("KDDI-TS21 ")
        ||userAgent.startsWith("KDDI-TS22 ")
        ||userAgent.startsWith("KDDI-TS23 ")
        ||userAgent.startsWith("KDDI-TS24 ")
        ||userAgent.startsWith("KDDI-TS25 ")
        ||userAgent.startsWith("KDDI-TS26 ")
        ||userAgent.startsWith("KDDI-TS27 ")
        ||userAgent.startsWith("KDDI-TS28 ")
        ||userAgent.startsWith("KDDI-TS29 ")
        ||userAgent.startsWith("KDDI-TS2A ")
        ||userAgent.startsWith("KDDI-TS2B ")
        ||userAgent.startsWith("KDDI-TS2C ")
        ||userAgent.startsWith("KDDI-TS2D ")
        ||userAgent.startsWith("KDDI-TS2E ");
  }
  
  // 7.0.1 追加 ここから
  /**
   * <b>isAUPost</b>
   * au端末かどうかと、formのメソッドはpostかgetかを判断します。
   * @param request クライアントからのリクエスト
   * @return  au端末かつpostのメソッドかどうか。
   * @throws なし
   */
  public final static boolean isAUPost(HttpServletRequest request){
    if (getUserAgent(request).equals(SIConfig.SIUSER_AGENT_AU)){
      return request.getMethod().equalsIgnoreCase("POST");
    }else return false;
  }

  /**
   * <b>isVod</b>
   * ボーダフォンの端末かどうかを判断します。
   * @param request クライアントからのリクエスト
   * @return  vodafoneの端末かどうか
   * @throws なし
   */
  public final static boolean isVod(HttpServletRequest request){
    //return getUserAgent(request).equals(SIConfig.SIUSER_AGENT_VOD);
    return userAgentSet.contains(getUserAgent(request));
  }
  // 7.0.1 追加 ここまで
  
  //iPhone端末
  public final static boolean isIPhone(HttpServletRequest request){
    return getUserAgent(request).equals(SIConfig.SIUSER_AGENT_IPHONE);
  }
  
  //Android端末
  public final static boolean isAndroid(HttpServletRequest request){
    return getUserAgent(request).equals(SIConfig.SIUSER_AGENT_ANDROID);
  }
  
  // EDBTG005-00 nagayoshi add start
  //iPad端末
  public final static boolean isIPod(HttpServletRequest request){
    return getUserAgent(request).equals(SIConfig.SIUSER_AGENT_IPOD);
  }
  // EDBTG005-00 nagayoshi add end
  
  //スマートフォン
  public final static boolean isSmartPhone(HttpServletRequest request){
    // EDBTG005-00 nagayoshi add start
    // return isIPhone(request)||isAndroid(request);
    return isIPhone(request)||isAndroid(request) || isIPod(request) || isApps(request);
    // EDBTG005-00 nagayoshi add end
  }
  
  /**
   * <b>changeURLParam</b>
   * URLのパラメータの?、=、&を / に変更します
   * @param argUrl 画面遷移先のURL
   * @return  ret 変更後のURL
   * @throws なし
   */  
  //7.1.1 ST0236 追加 ここから
  public static String changeURLParam(String argUrl) {
    String ret     = argUrl;
    String Url     = argUrl;
    String tempUrl = "";
    try {
      while (!Url.equals(tempUrl)) {
        tempUrl = Url;
        Url = URLDecoder.decode(Url,SIConfig.SIENCODE_SHIFT_JIS);
      }
      if ((Url != null && Url.length() > 0) && (Url.indexOf("?") > 0)) {
        String[] baseUrl   = Url.split("[?]",2);
        Url = baseUrl[0];
        String[] urlPram   = baseUrl[1].split("[&]");
        if (!Url.endsWith("/") && !Url.endsWith("?")) {
          Url = Url + "?";
        }
        for (int x = 0; x < urlPram.length; x++) {
          if (!urlPram[x].endsWith("=")) {
            //Url = Url + urlPram[x].replace('/',')') + "&";
            String[] Pram = urlPram[x].split("=");
            Pram[1] = Pram[1].replace(':','(');
            Url = Url + Pram[0] + "=" + URLEncoder.encode(Pram[1].replace('/',' '),SIConfig.SIENCODE_SHIFT_JIS) + "&";
          }
        }
        if (Url.endsWith("&")) {
          Url = Url.substring(0,Url.length() - 1);
        }
        
        //Url = URLEncoder.encode(Url,"Shift_JIS");
        if (Url != null && Url.length() > 0) {
          ret = Url.replace('?', '/');
          ret = ret.replace('&', '/');
          ret = ret.replace('=', '/');
        }
      }
    } catch(Exception e) {
      System.out.println(e);
    }
    return ret;
  }
  /**
   * <b>isMobile</b>
   * 携帯機種かどうかを判断します。
   * @param request クライアントからのリクエスト
   * @return  携帯機種かどうか
   * @throws なし
   */
  public final static boolean isMobile(HttpServletRequest request){
    return (isIMode(request)||isAU(request)||isVod(request));
  }
  
  // EDBTG005-00 nagayoshi add start
  public final static String convertSmartPhoneUrl(HttpServletRequest request, String lForwardKey, String lUrl) {
    String spUrl = lUrl;
    // １．lForwardKey置換対象チェック
    if (lForwardKey.indexOf("webshop.jsp.front.") >= 0
        || lForwardKey.indexOf("webshop.jsp.util.servlet.") >= 0) {
      // ２．カート以降の画面かを判定
      if (!lUrl.startsWith("/cart/")) {
        // ３．PC/SP切り替えCookie判定実施
        if (isSpSwitch(request)) {
          // ４．SPファイル存在チェック
          if(isSpFile(lUrl)) {
            //SP用フォルダパスへ変換
            spUrl = SIConfig.SP_VALUES + "/" + lUrl;
          }
        }
      } else {
        //SP用フォルダパスへ変換
        spUrl = SIConfig.SP_VALUES + "/" + lUrl;
      }
    }
    return spUrl;
  }
  
  public final static boolean isSpSwitch(HttpServletRequest request) {
    String val = "";
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
      for (int i = 0; i < cookies.length; i++) {
        if (cookies[i].getName().equals(SIConfig.SICOOKIE_SWITCH)) {
          val = cookies[i].getValue();
          break;
        }
      }
    }
    return SIUtil.isNull(val) || SIConfig.SP_VALUES.equals(val);
  }
  
  public final static boolean isPcSwitch(HttpServletRequest request) {
    String val = "";
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
      for (int i = 0; i < cookies.length; i++) {
        if (cookies[i].getName().equals(SIConfig.SICOOKIE_SWITCH)) {
          val = cookies[i].getValue();
          break;
        }
      }
    }
    return SIConfig.PC_VALUES.equals(val);
  }
  
  public final static boolean isSpFile(String lUrl) {
    File spFile = new File(SIConfig.SP_DIRECTORY_PATH + SIConfig.SP_VALUES + "/" + lUrl);
    return spFile.exists();
  }
  // EDBTG005-00 nagayoshi add end
}
