001    package railo.runtime.cfx.customtag;
002    
003    import railo.runtime.cfx.CFXTagException;
004    import railo.runtime.reflection.Reflector;
005    
006    import com.allaire.cfx.CustomTag;
007    
008    /**
009     * 
010     */
011    public final class JavaCFXTagClass implements CFXTagClass {
012            
013            private String name;
014            private String strClass;
015            private Class clazz;
016            private boolean readOnly=false;
017    
018        
019            public JavaCFXTagClass(String name, String strClass) {
020                    name=name.toLowerCase();
021                    if(name.startsWith("cfx_"))name=name.substring(4);
022                    this.name=name;
023                    this.strClass=strClass;
024            }
025            private JavaCFXTagClass(String name, String strClass, Class clazz,boolean readOnly) {
026                    
027                    this.name=name;
028                    this.strClass=strClass;
029                    this.clazz=clazz;
030                    this.readOnly=readOnly;
031            }
032            
033            @Override
034            public CustomTag newInstance() throws CFXTagException {
035                    try {
036                            return _newInstance();
037                    } catch (Throwable e) {
038                            throw new CFXTagException(e);
039                    }
040            }
041    
042            public CustomTag _newInstance() throws ClassNotFoundException, InstantiationException, IllegalAccessException  {
043                    
044                    Object o=getClazz().newInstance();
045                    return (CustomTag)o;
046            }
047        /**
048         * @return Returns the clazz.
049         * @throws ClassNotFoundException 
050         */
051        public Class<CustomTag> getClazz() throws ClassNotFoundException {
052            if(clazz==null) {
053                clazz=this.getClass().getClassLoader().loadClass(strClass);
054                    }
055            return clazz;
056        }
057        
058        /**
059         * @return Returns the name.
060         */
061        public String getName() {
062            return name;
063        }
064        /**
065         * @return Returns the strClass.
066         */
067        public String getStrClass() {
068            return strClass;
069        }
070    
071        @Override
072        public boolean isReadOnly() {
073            return readOnly;
074        }
075    
076        @Override
077        public CFXTagClass cloneReadOnly() {
078            return new JavaCFXTagClass(name,strClass,clazz,true);
079        }
080        @Override
081        public String getDisplayType() {
082            return "Java";
083        }
084        @Override
085        public String getSourceName() {
086            return strClass;
087        }
088        
089        @Override
090        public boolean isValid() {
091            try {
092                return Reflector.isInstaneOf(getClazz(),CustomTag.class);
093            } 
094            catch (ClassNotFoundException e) {
095                return false;
096            }
097        }
098    }