package org.itscool.weber.tag;

import java.io.IOException;

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

import org.itscool.commons.bean.BeanUtil;
import org.itscool.commons.util.JspTagUtil;

/**
 * クライアントへ文字列を出力するタグです。<BR>
 * 出力する内容はname属性で指定したJavaBeansのうちproperty属性で指定された
 * プロパティを取得し、クライアントに出力します。<BR>
 * propertyがNULLの場合はnameで指定した値を出力します<BR>
 * クライアントへはjava.lang.String型として出力されます。<BR>
 * プロパティがプリミティブ型の場合は対応するラッパークラスのtoString()メソッド
 * の結果になります。<BR>
 *<BR>
 *【属性】<BR>
 * name このフィールドの初期値を設定する際に使われるBeanの名前(必須)<BR>
 * property name属性で指定したオブジェクトのプロパティ名を指定します。(省略可能)<BR>
 *          property属性が指定されていない場合はname属性で取得したインスタンスのtoString()を返します<BR>
 * subproperty property属性によって取得したオブジェクトのメンバを指定するときに使用します。<BR>
 * scope property属性のスコープを指定します（request, session, application)<BR>
 * 
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2004/11/1
*/
public class WriteTag extends TagSupport {
	/** name属性 */
    protected String name;
    /** property属性 */
    protected String property;
    /** subproperty属性 */
    protected String subproperty;
    /** value属性 */
    protected String value;
    /** scope属性 */
    protected String scope;
    
    /**
     * パラメータにセットされたオブジェクトをHTMLに書き出します。<br>
     * scope属性が指定されていない場合は、次の順序でオブジェクトを検索します。
     * request, session, contextの順
    */
    public int doStartTag() throws JspException {
        try {
        	Object result;
            if( value != null && value.length() > 0 ){
            	result = JspTagUtil.findValue(pageContext, value, scope);
            }else{
            	result = JspTagUtil.findProperty(pageContext, name, property, scope);
            	if( ( result != null && result.toString().length() > 0 )
	                && ( subproperty != null && subproperty.length() > 0) ){
	                //subproperty属性（propertyに該当するオブジェクトのプロパティ
	                //を取得する場合）
	                result = BeanUtil.getProperty(result, subproperty);
	            }
            }
            doOut(result);
        } catch (Exception e) {
            String err =
                "["
                    + property
                    + "]"
                    + "doStartTag() failed ("
                    + getClass().getName()
                    + ") ("
                    + e.getMessage()
                    + ")";
            throw new JspException(err);
        }

        return SKIP_BODY;
    }
    
    /**
     * オブジェクトの内容をHTMLに出力します
     * @param result 出力内容
     * @throws IOException
     */
    public void doOut(Object result) throws IOException{
    	if (result == null || result.toString().length() == 0 ) {
            pageContext.getOut().print("");
        } else {
            pageContext.getOut().print(result);
        }
    }
    
    public int doEndTag() {
        return EVAL_PAGE;
    }

    /**
     * 名前を取得します
     * @return name 名前
     */
    public String getName() {
        return name;
    }
    /**
     * 名前をセットします
     * @param name 名前
     */
    public void setName(String name) {
        this.name = name;
    }
    /**
     * プロパティを取得します
     * @return property プロパティ
     */
    public String getProperty() {
        return property;
    }
    /**
     * プロパティをセットします
     * @param property プロパティ
     */
    public void setProperty(String property) {
        this.property = property;
    }
    /**
     * スコープを取得します
     * @return scope スコープ
     */
    public String getScope() {
        return scope;
    }
    /**
     * スコープをセットします
     * @param scope スコープ
     */
    public void setScope(String scope) {
        this.scope = scope;
    }
    /**
     * サブプロパティを取得します
     * @return サブプロパティ
     */
    public String getSubproperty() {
        return subproperty;
    }

    /**
     * サブプロパティをセットします
     * @param string サブプロパティ
     */
    public void setSubproperty(String string) {
        subproperty = string;
    }

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}
    
}
