package org.itscool.weber.tag;

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

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

/**
 * 指定した値が要求した変数のサブストリングに一致する場合、
 * このタグ内の内容を評価します
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2005/10/26
*/
public class MatchTag extends BodyTagSupport {
	/** name属性 */
    protected String name;
    /** property属性 */
    protected String property;
    /** subproperty属性 */
    protected String subproperty;
    /** value属性 */
    protected String value;
    /** scope属性 */
    protected String scope;
    
    public int doStartTag() throws JspException {
        try {
            Object 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);
            }
            
            //EL式対応バージョン
        	value = JspTagUtil.findValue(pageContext, value, scope).toString();
        	
            return doParamCheck(result, value);
        } catch (Exception e) {
            String err =
                "["
                    + property
                    + "]"
                    + "doStartTag() failed ("
                    + MatchTag.class.getName()
                    + ") ("
                    + e.getMessage()
                    + ")";
            throw new JspException(err);
        }
    }
    
    public int doParamCheck(Object result, Object value){
    	if(result == null || value == null){
        	return EVAL_BODY_INCLUDE;
        }else if( result.toString().equals(value.toString())){
        	return EVAL_BODY_INCLUDE;
        }else{
        	return SKIP_BODY;
        }
    }
    
    
    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;
	}
    
}
