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 }