001    /**
002     * Implements the CFML Function getbasetagdata
003     */
004    package railo.runtime.functions.other;
005    
006    import javax.servlet.jsp.tagext.Tag;
007    
008    import railo.commons.lang.StringUtil;
009    import railo.runtime.PageContext;
010    import railo.runtime.exp.ExpressionException;
011    import railo.runtime.exp.PageException;
012    import railo.runtime.ext.function.Function;
013    import railo.runtime.tag.CFTag;
014    import railo.runtime.tag.CFTagCore;
015    import railo.runtime.type.Struct;
016    
017    public final class GetBaseTagData implements Function {
018            
019            private static final long serialVersionUID = -7016207088098049143L;
020    
021            public static Struct call(PageContext pc , String tagName) throws PageException {
022                    return call(pc,tagName,-1);
023            }
024            
025        public static Struct call(PageContext pc , String tagName, double minLevel) throws PageException {
026            CFTag tag=getParentCFTag(pc.getCurrentTag(), tagName, (int)minLevel);
027            if(tag==null) throw new ExpressionException("can't find base tag with name ["+tagName+"]");
028            return tag.getVariablesScope();
029            }
030        
031        public synchronized static CFTag getParentCFTag(Tag tag,String trgTagName, int minLevel) {
032            String pureName=trgTagName;
033            int level=0;
034            CFTag cfTag;
035            while(tag!=null) {
036                    if(tag instanceof CFTag && minLevel<=(level++)) {
037                    cfTag=(CFTag)tag;
038                    if(cfTag instanceof CFTagCore){
039                    
040                            CFTagCore tc=(CFTagCore) cfTag;
041                            
042                            if((tc.getName()+"").equalsIgnoreCase(pureName))
043                                    return cfTag;
044                            if(StringUtil.startsWithIgnoreCase(pureName,"cf")) {
045                            pureName=pureName.substring(2);
046                        }
047                            if((tc.getName()+"").equalsIgnoreCase(pureName))
048                                    return cfTag;
049                    }
050                    else if( cfTag.getAppendix().equalsIgnoreCase(pureName)) {
051                        return cfTag;
052                    }
053                    else if(StringUtil.startsWithIgnoreCase(pureName,"cf_")) {
054                        pureName=pureName.substring(3);
055                        if(cfTag.getAppendix().equalsIgnoreCase(pureName)) 
056                            return cfTag;
057                    }
058                }
059                    tag=tag.getParent();
060            }
061            return null;
062        }
063    }