001    package railo.transformer.library.tag;
002    
003    import java.io.File;
004    import java.util.Map;
005    
006    import railo.commons.collections.HashTable;
007    import railo.runtime.tag.CFImportTag;
008    
009    
010    /**
011     * extends the normal tag library, because Custom Tags has no restrictions by a TLD this Taglib accept everything
012     */
013    public final class CustomTagLib extends TagLib {
014        
015        private String textTagLib;
016            private TagLib[] taglibs;
017        
018    
019        /**
020         * constructor of the class
021         * @param textTagLib
022         * @param nameSpace the namespace definition
023         * @param nameSpaceSeperator the seperator beetween namespace and name of the tag
024         */
025        public CustomTagLib(String textTagLib, String nameSpace,String nameSpaceSeperator) {
026            super(false);
027            this.textTagLib = textTagLib;
028            setNameSpace(nameSpace);
029            setNameSpaceSeperator(nameSpaceSeperator);
030    
031        }
032    
033        /**
034         * @see railo.transformer.library.tag.TagLib#getAppendixTag(java.lang.String)
035         */
036        public TagLibTag getAppendixTag(String name) {
037    
038            TagLibTag tlt = new TagLibTag(this);
039            tlt.setName("");
040            tlt.setAppendix(true);
041            tlt.setTagClass(CFImportTag.class.getName());
042            tlt.setHandleExceptions(true);
043            tlt.setBodyContent("free");
044            tlt.setParseBody(false);
045            tlt.setDescription("Creates a CFML Custom Tag");
046            tlt.setAttributeType(TagLibTag.ATTRIBUTE_TYPE_DYNAMIC);
047    
048            TagLibTagAttr tlta=new TagLibTagAttr(tlt);
049            tlta.setName("__custom_tag_path");
050            tlta.setRequired(true);
051            tlta.setRtexpr(true);
052            tlta.setType("string");
053            tlta.setHidden(true);
054            tlta.setDefaultValue(textTagLib);
055            
056            tlt.setAttribute(tlta);
057            setTag(tlt);
058            
059            return tlt;
060        }
061    
062        /**
063         * @see railo.transformer.library.tag.TagLib#getTag(java.lang.String)
064         */
065        public TagLibTag getTag(String name) {
066            if(taglibs!=null){
067                    TagLibTag tag=null;
068                    for(int i=0;i<taglibs.length;i++){
069                            if((tag=taglibs[i].getTag(name))!=null) return tag;
070                    }
071            }
072            return null;
073        }
074        /**
075         * @see railo.transformer.library.tag.TagLib#getTags()
076         */
077        public Map getTags() {
078            return new HashTable();
079        }
080    
081        /**
082         * @see railo.transformer.library.tag.TagLib#setTag(railo.transformer.library.tag.TagLibTag)
083         */
084        public void setTag(TagLibTag tag) {}
085    
086            public void append(TagLib other) {
087                    if(other instanceof CustomTagLib)
088                            textTagLib+=File.pathSeparatorChar+((CustomTagLib)other).textTagLib;
089                    else{
090                            if(taglibs==null){
091                                    taglibs=new TagLib[]{other};
092                            }
093                            else {
094                                    TagLib[] tmp = new TagLib[taglibs.length+1];
095                                    for(int i=0;i<taglibs.length;i++){
096                                            tmp[i]=taglibs[i];
097                                    }
098                                    tmp[taglibs.length]=other;
099                            }
100                            
101                    }
102            }
103        
104    
105    }