/** * Implements the CFML Function getbasetaglist */ package railo.runtime.functions.other; import java.util.Iterator; import java.util.Map; import javax.servlet.jsp.tagext.Tag; import railo.runtime.PageContext; import railo.runtime.config.ConfigImpl; import railo.runtime.ext.function.Function; import railo.runtime.ext.tag.AppendixTag; import railo.runtime.tag.CFImportTag; import railo.runtime.tag.CFTag; import railo.runtime.tag.CFTagCore; import railo.runtime.tag.Module; import railo.runtime.type.util.ListUtil; import railo.transformer.library.tag.TagLib; import railo.transformer.library.tag.TagLibTag; public final class GetBaseTagList implements Function { public static String call(PageContext pc) { return call(pc,","); } public static String call(PageContext pc, String delimiter) { Tag tag=pc.getCurrentTag(); StringBuffer sb=new StringBuffer(); while(tag!=null) { if(sb.length()>0)sb.append(delimiter); sb.append(getName(pc,tag)); tag=tag.getParent(); } return sb.toString(); } private static String getName(PageContext pc, Tag tag) { Class clazz = tag.getClass(); if(clazz==CFImportTag.class)clazz=CFTag.class; String className=clazz.getName(); TagLib[] tlds = ((ConfigImpl)pc.getConfig()).getTLDs(); TagLibTag tlt; for(int i=0;i<tlds.length;i++) { //String ns = tlds[i].getNameSpaceAndSeparator(); Map tags = tlds[i].getTags(); Iterator it = tags.keySet().iterator(); while(it.hasNext()){ tlt=(TagLibTag) tags.get(it.next()); if(tlt.getTagClassName().equals(className)) { // custm tag if(tag instanceof AppendixTag) { AppendixTag atag=(AppendixTag)tag; if(atag.getAppendix()!=null && !(tag instanceof Module)) { return tlt.getFullName().toUpperCase()+atag.getAppendix().toUpperCase(); } } // built in cfc based custom tag if(tag instanceof CFTagCore) { if(((CFTagCore)tag).getName().equals(tlt.getAttribute("__name").getDefaultValue())) return tlt.getFullName().toUpperCase(); continue; } return tlt.getFullName().toUpperCase(); } } } return ListUtil.last(className,".",true).toUpperCase(); } }