package org.itscool.stylist.el;


import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.itscool.commons.bean.BeanUtil;
import org.itscool.commons.bean.BeanUtilRuntimeException;
import org.itscool.commons.util.ServletTagUtil;

/**
 * EL式を展開するクラスです
 */
public class LayoutRegex extends BaseElRegex{
    private ServletContext context;
    private HttpServletRequest req;
    
    public LayoutRegex(ServletContext context, HttpServletRequest req){
        this.context = context;
        this.req = req;
    }
    
    /**
     * 先頭が"./"で始まるパスにサーブレットのコンテキストパスに
     * 置き換えます。
     * @param dstStr 変換もとのパス
     * @return サーブレットのコンテキストパスを付加した結果を返します
     */
    public String replacePath(String dstStr){
        String replace = "\""+req.getContextPath() + "/";
        StringBuffer sb = parsePath(dstStr, replace);
        return sb.toString();
    }

    /**
     * EL式に記述された属性名に指定されたオブジェクトを取得します
     * @param elems 属性名を展開したリスト
     * @return 属性から取得されたオブジェクト
     */
    protected Object getAttribute(ElementList elems) throws BeanUtilRuntimeException {
        int size = elems.size();
        String name = elems.getElement(0);
        if( size > 1 ){
            String property = elems.getElement(1);
            Object obj = ServletTagUtil.findProperty(context, req, name, property, null);
            if( size > 2 ){
                for( int i=2; i<size; i++ ){
                    property = elems.getElement(i);
                    if( obj == null || obj.toString().length() == 0 ){
                        return "";
                    }
                    try{
                        obj = BeanUtil.getProperty(obj, property);
                    }catch(Exception e ){
                        throw new ElRegexException("BeanUtil getProperty failed ElementList="+elems.toString());
                    }
                }
            }
            
            if( obj != null){
                return obj;
            }else{
                return null;
            }
        }else{
            Object obj = ServletTagUtil.findObject(context, req, name, null);
            if( obj != null){
                return obj;
            }else{
                int strToken1 = name.trim().indexOf("'");
                int strToken2 = name.trim().lastIndexOf("'");
                if( strToken1 == 0 && strToken2 == name.length()-1 ){   //文字列指定の場合
                    obj = BeanUtil.supressQuate(name);
                } else if( BeanUtil.isPrimitive(name)){         //Primitive型に変換可能な場合
                    obj = name;
                }
                return obj;
            }
        }
    }
    
}

