package org.itscool.weber.tag;

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

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

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

/**
 * クライアントへ文字列を出力するタグです。<BR>
 * 出力する内容はname属性で指定したJavaBeansのうちproperty属性で指定された
 * プロパティを取得し、クライアントに出力します。<BR>
 * クライアントへはjava.lang.String型として出力されます。<BR>
 * プロパティがプリミティブ型の場合は対応するラッパークラスのtoString()メソッド
 * の結果になります。<BR>
 *
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2004/11/1
 * 
*/
public class ErrorTag extends TagSupport {

	/**
	 * フォーム入力エラー時のJSPページを生成します<BR>
	 * scopeが指定されていない場合は、次の順序でエラーオブジェクト
	 * を検索します<BR>。
	 * request, session, contextの順
	 * @return SKIP_BODYを返します
	*/
	public int doStartTag() throws JspException {

		try {
			
			HashMap errMap =
				(HashMap)JspTagUtil.findObject(
					pageContext,
					Globals.REQ_PARAM_FORM_ERR,
					JspTagUtil.SCOPE_REQUEST);
			StackTraceElement[] errTrace =
				(StackTraceElement[])JspTagUtil.findObject(
				pageContext,
				Globals.REQ_PARAM_SYSTEM_ERR,
				JspTagUtil.SCOPE_REQUEST);
			String errMsg =
				(String)JspTagUtil.findObject(
				pageContext,
				Globals.REQ_PARAM_SYSTEM_ERR_MSG,
				JspTagUtil.SCOPE_REQUEST);
				
			if( errMap == null && errTrace == null && errMsg == null ){
				return SKIP_BODY;
			}
			
			//システム例外チェック
            if ( errTrace != null && errMsg != null &&
            errTrace.length > 0 && errMsg.length() > 0 ){
				createErrObject(errTrace, errMsg);
            //フォーム入力エラーチェック
			}else if (errMap != null) {
                createErrObject(errMap);
            }
			
			//エラー情報の削除
			pageContext.getRequest().removeAttribute(
				Globals.REQ_PARAM_FORM_ERR);

		} catch (Exception e) {
			String err =
				"["
					+ "org.itscool.action.ERROR"
					+ "]"
					+ "doStartTag() failed ("
					+ ErrorTag.class.getName()
					+ ") ("
					+ e.getMessage()
					+ ")";
			throw new JspException(err);
		}

		return SKIP_BODY;
	}

	private void createErrObject(HashMap map) throws IOException {
		//フォーム入力エラーオブジェクトを取得します

		//エラー情報を出力します
		Set keySet = map.keySet();
		Iterator it = keySet.iterator();
		
		JspWriter out = pageContext.getOut();
		out.println("<div align=\"center\">");
		while (it.hasNext()) {
			String key = (String)it.next();
			String msg = (String)map.get(key);
			if( msg == null ){
				out.println("Not Found Message [ " + key + " ] <BR>");
			}else{
				out.println(msg + "<BR>");
			}
		}
		out.println("</div>");
		out.println("<HR>");
	}
	
	private void createErrObject(StackTraceElement[] errObject,
	String errMsg) throws IOException {
		//フォーム入力エラーオブジェクトを取得します

		//エラー情報を出力します
		JspWriter out = pageContext.getOut();
		out.println("<div align=\"left\">");
		out.println(errMsg);
		out.println("<HR>");
		for( int i=0; i<errObject.length; i++ ){
			out.print("    at ");
			out.println((String) errObject[i].toString() + "<BR>");
		}
		out.println("</div>");
	}
	
	
	public int doEndTag() {
		return EVAL_PAGE;
	}

}
