package org.itscool.commons.request;

import org.itscool.commons.logging.SimpleLog;
import org.itscool.commons.util.URLDecodeUtil;


/**
 * シンプルな形式（Contents-type=application)のリクエストパラメータを解析
 * し、キーとパラメータの一覧を保持するクラスです
 * @author KANO
 */
public class SimpleHttpGeneralForm extends HttpGeneralForm{
    
    /**
     * リクエストされたパラメータを解析します<BR>
     * 解析されたパラメータはキーとString型の値のペアでリストに追加されます<BR>
     * ※ 日本語の処理が正常にどうさしません<BR>
     * AbstractPostRequestクラスのdoDefaultParseData()を使用してください
     * @param buffer リクエストから取得されたバイト形式のデータ
     * @param encode エンコーディング
     */
    protected void doParseData(byte[] buffer, String encode ) {
        if(log.getLevel().equals(SimpleLog.TRACE)){
            log.trace("--------- recieved simple part request data ---- ");
            log.trace("[@data]"+new String(buffer));
        }
        String data = null;
        data = new String(buffer);
        //data = StringUtil.convEncode(buffer, "Shift_JIS");
        if( data == null || data.length() == 0) return;
        //System.out.println("[@data]" + data);
        
        String stack = data;
        
        //URLエンコードされたHTTPボディ部の情報を、ストリームを使って読み出す。
        //これは（名前、値）という形式以外のデータがURLエンコードで送られてき
        //た場合に使える。
        //URLDecoder.decode()は特別な符号化方式を使用して application/x-www-form-urlencoded
        //文字列を復号化します
        try{
            //stack = URLDecoder.decode(data, encode);
            stack = URLDecodeUtil.decode(data, encode);
        }catch(Exception e){
            e.printStackTrace();
        }
        //String stack = StringUtil.convEncode(data, "Shift_JIS");
        
        while(stack.length() > 0){
            int kubunPos = stack.indexOf("&");
            if(kubunPos == -1 ) kubunPos = stack.length();
            String record = stack.substring(0, kubunPos);
            
            int eqPos = record.indexOf("=");
            String key = record.substring(0, eqPos);
            String value = record.substring(eqPos+1, record.length());
            this.addParameter(key, value);
            
//            System.out.print("[@key]"+key);
//            System.out.println(" [@data]"+value);
            if(log.getLevel().equals(SimpleLog.TRACE)){
                log.trace("[@key]"+key + " [@data]"+value);
            }
            stack = stack.substring(record.length(), stack.length());
            if(stack.indexOf("&")==0){
                stack = stack.substring(1, stack.length());
            }
        }
        //重複キーによる複数パラメータのマージを行う
        margeParamsByDuplicateKey();
    }
    
}
