package org.itscool.stylist.io;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import org.itscool.commons.util.ServletTagUtil;
import org.itscool.weber.controller.Globals;

/**
 * XHTMLに含まれるエラー出力タグ情報を応答データに変換します
 * @author kano
 * @version 1.00A 2006/08/09 新規作成
 */
public class HtmlErrorInfoTagConverter extends HtmlConverter {
    
//    /**
//     * インスタンスの初期化を行います
//     * @param context ServletContextインスタンス
//     * @param req HttpServletRequestインスタンス
//     */
//    public HtmlErrorInfoTagConverter(ServletContext context,
//        HttpServletRequest req) {
//        super(context, req);
//    }
    
    /**
     * 応答用のXHTMLデータの作成を開始します
     * @return 応答データ
     */
    public String convert() {
        StringBuffer sb = new StringBuffer();
        
        HashMap errMap =
            (HashMap)ServletTagUtil.findObject(
            context, req,
            Globals.REQ_PARAM_FORM_ERR,
            ServletTagUtil.SCOPE_REQUEST);
        StackTraceElement[] errTrace =
            (StackTraceElement[])ServletTagUtil.findObject(
            context, req,
            Globals.REQ_PARAM_SYSTEM_ERR,
            ServletTagUtil.SCOPE_REQUEST);
        String errMsg =
            (String)ServletTagUtil.findObject(
            context, req,
            Globals.REQ_PARAM_SYSTEM_ERR_MSG,
            ServletTagUtil.SCOPE_REQUEST);
        
        if( errMap == null && errTrace == null && errMsg == null ){
            return "";
        }
        
        //システム例外チェック
        if ( errTrace != null && errMsg != null &&
            errTrace.length > 0 && errMsg.length() > 0 ){
            sb.append(createErrObject(errTrace, errMsg));
            //フォーム入力エラーチェック
        }else if (errMap != null) {
            sb.append(createErrObject(errMap));
        }
        
        //エラー情報の削除
        req.removeAttribute(Globals.REQ_PARAM_FORM_ERR);
        return sb.toString();
    }
    
    /**
     * エラー出力文字列を作成します
     * @param map FrontServletでセットされたエラーリスト
     * @return エラー出力文字列
     */
    private String createErrObject(HashMap map) {
        //フォーム入力エラーオブジェクトを取得します
        StringBuffer sb = new StringBuffer();
        
        //エラー情報を出力します
        //Collection values = map.values();
        //Iterator it = values.iterator();
        Set keySet = map.keySet();
        Iterator it = keySet.iterator();
        
        while (it.hasNext()) {
            String errCode = (String)it.next();
            String msg = (String)map.get(errCode);
            sb.append("[").append(errCode).append("] ");
            sb.append(msg+ "<br/>").append(LINE);
        }
        sb.append("<hr/>").append(LINE);
        return sb.toString();
    }
    
    /**
     * エラー出力文字列を作成します
     * @param errObject 例外のスタックトレースリスト
     * @param errMsg 最上位のエラーメッセージ
     * @return エラー出力文字列
     */
    private String createErrObject(StackTraceElement[] errObject,
        String errMsg){
        //フォーム入力エラーオブジェクトを取得します
        
        //エラー情報を出力します
        StringBuffer sb = new StringBuffer();
        sb.append(errMsg);
        sb.append("<hr/>");
        sb.append(LINE);
        for( int i=0; i<errObject.length; i++ ){
            sb.append("    at ");
            sb.append((String) errObject[i].toString() + "<br/>");
            sb.append(LINE);
        }
        return sb.toString();
    }
}
