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

import javax.servlet.http.*;

import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.log4j.Category;

import java.util.*;
import java.net.*;
import jp.co.sint.config.SIConfig;

/**
 * @version $Id: SIURLParameter.java,v 1.0 2004/09/01 Exp $
 * @author  Abukawa
 * <br>Description: changeURLParamで変換したURLのパラメータを取得します。
 * <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>
 * Abukawa 2004/09/01 Original
 */

public class SIURLParameter extends Hashtable {
  
  private HttpServletRequest request;
  // ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  /**
   * <b>SIURLParameter</b> コンストラクタ
   * 
   * @param argReq リクエスト
   * @return なし
   * @throws なし
   */
  public SIURLParameter(HttpServletRequest argReq) {
    request = argReq;
    analyzeInfo();
  }
  
  //multipart/form-dataの場合
  public SIURLParameter(HttpServletRequest argReq,String path) {
    request = argReq;
    analyzeInfo2(path);
  }
  
  /**
   * <b>analyzeInfo</b> URLを解析します
   * 
   * @return なし
   * @throws なし
   */
  private void analyzeInfo() {
    try {
      if (request != null && request.getPathInfo() != null) {
        boolean nameflag = true;
        String name = null;
        String tempUrl = "";
        String pathInfo = request.getPathInfo();
        
        HttpSession session = request.getSession(true);// セッションの取得
        while (!pathInfo.equals(tempUrl)) {
          tempUrl = pathInfo;
          pathInfo = URLDecoder.decode(pathInfo, SIConfig.SIENCODE_SHIFT_JIS);
        }
        // 解析
        // 最初はスラッシュのため0レングスが入るので1からスタート
        if (pathInfo.length() > 0) {
          String[] params = pathInfo.split("/");
          for (int x = 1; x < params.length; x++) {
            if (name == null) {
              if (params[x].length() > 0) {
                name = params[x];
              }
            } else {
              params[x] = params[x].replace('(', ':'); // 7.2.0 ST0318 追加
              this.put(name, params[x].replace(' ', '/'));
              name = null;
            }
          }
          if (name != null) {
            this.put(name, "");
          }
        }
      }
    } catch (Exception e) {
      System.out.println(e);
    }
  }
  
  private void analyzeInfo2(String path) {
    DiskFileUpload objDfu = new DiskFileUpload();
    // アップロードファイルの最大サイズ（-1は無限）
    objDfu.setSizeMax(-1);
    // バッファサイズ
    objDfu.setSizeThreshold(1024);
    // 一時ファイルの保存先フォルダ
    objDfu.setRepositoryPath(path);
    // ヘッダの文字エンコーディング
    objDfu.setHeaderEncoding(SIConfig.SIENCODE_SHIFT_JIS);
    
    //serverの文字コード設定
    ResourceBundle rb = ResourceBundle.getBundle(SIConfig.SICONFIG_ENCODING_FILE_NAME);
    String clientCode = rb.getString("clientCode");
    
    try {
      if (request != null) {
        request.setCharacterEncoding(SIConfig.SIENCODE_SHIFT_JIS);
        List objLst = objDfu.parseRequest(request);
        Iterator objItr = objLst.iterator();
        while (objItr.hasNext()) {
          FileItem objFi = (FileItem) objItr.next();
          if (objFi.isFormField()) {
            byte tempByte[] = objFi.get();
            String str = new String(tempByte, clientCode);
            this.put(objFi.getFieldName(), str);
            log.debug(objFi.getString());
            log.debug(str);
          } else if(objFi.getName().endsWith(".jpg")) {
            byte tempByte[] = objFi.get();
            String str = new String(tempByte, clientCode);
            this.put(objFi.getFieldName(), str);
            this.put(objFi.getFieldName() + "_data", objFi);
          }
        }
      }
    } catch (Exception e) {
      System.out.println(e);
    }
  }
  
  /**
   * <b>getParam</b> パラメータを取得（getInfoParam or getRequestParamを実行）
   * 
   * @param argName パラメータ名
   * @return ret 指定したパラメータの値
   * @throws なし
   */
  public Object getParam(String argName) {
    Object ret = null;
    ret = this.getInfoParam(argName);
    if (ret == null) {
      ret = this.getRequestParam(argName);
    }
    return ret;
  }
  
  /**
   * <b>getInfoParam</b> ハッシュからパラメータを取得
   * 
   * @param argName パラメータ名
   * @return ret 指定したパラメータの値
   * @throws なし
   */
  public Object getInfoParam(String argName) {
    Object ret = null;
    ret = this.get(argName);
    return ret;
  }
  
  /**
   * <b>getRequestParam</b> リクエストからパラメータを取得
   * 
   * @param argName パラメータ名
   * @return ret 指定したパラメータの値
   * @throws なし
   */
  public Object getRequestParam(String argName) {
    Object ret = null;
    if (request != null) {
      ret = request.getParameter(argName);
    }
    return ret;
  }
  
}