001    package railo.runtime.db;
002    
003    import java.util.Map;
004    import java.util.TimeZone;
005    
006    import org.apache.commons.collections.map.ReferenceMap;
007    
008    import railo.commons.lang.ClassException;
009    import railo.commons.lang.ClassUtil;
010    import railo.runtime.config.Config;
011    import railo.runtime.engine.ThreadLocalPageContext;
012    
013    public abstract class DataSourceSupport implements DataSourcePro, Cloneable {
014    
015        private Class clazz;
016            private final boolean blob;
017        private final boolean clob;
018        private final int connectionLimit;
019        private final int connectionTimeout;
020            private final long metaCacheTimeout;
021            private final TimeZone timezone;
022        private final String name;
023            private final boolean storage;
024        protected final int allow;
025        private final boolean readOnly;
026            private final String username;
027            private final String password;
028        
029            
030            private Map<String,ProcMetaCollection> procedureColumnCache;
031    
032            public DataSourceSupport(String name, Class clazz,String username, String password, boolean blob,boolean clob,int connectionLimit, int connectionTimeout, long metaCacheTimeout, TimeZone timezone, int allow, boolean storage, boolean readOnly){
033                    this.name=name;
034            this.clazz=clazz;
035                    this.blob=blob;
036                    this.clob=clob;
037                    this.connectionLimit=connectionLimit;
038                    this.connectionTimeout=connectionTimeout;
039                    this.metaCacheTimeout=metaCacheTimeout;
040            this.timezone=timezone;
041            this.allow=allow;
042            this.storage=storage;
043            this.readOnly=readOnly;
044            this.username=username;
045            this.password=password;
046            }
047            
048            @Override
049            public Object clone() {
050                    return cloneReadOnly();
051            }
052            
053    
054            public Map<String,ProcMetaCollection> getProcedureColumnCache() {
055                    if(procedureColumnCache==null)
056                            procedureColumnCache=new ReferenceMap();
057                    return procedureColumnCache;
058            }
059            
060    
061    
062            @Override
063        public final boolean isBlob() {
064            return blob;
065        }
066    
067        @Override
068        public final boolean isClob() {
069            return clob;
070        }
071    
072        @Override
073        public final int getConnectionLimit() {
074            return connectionLimit;
075        }
076    
077        @Override
078        public final int getConnectionTimeout() {
079            return connectionTimeout;
080        }
081    
082        @Override
083        public final long getMetaCacheTimeout() {
084                    return metaCacheTimeout;
085            } 
086            
087            @Override
088            public final TimeZone getTimeZone() {
089                    return timezone;
090            } 
091        
092            @Override
093            public final Class getClazz() {
094            return clazz;
095        }
096    
097            @Override
098            public final void setClazz(Class clazz) {
099            this.clazz = clazz;
100        }
101    
102            @Override
103            public final String getName() {
104            return name;
105        }
106    
107            @Override
108            public final boolean isStorage() {
109                    return storage;
110            }
111            
112            @Override
113            public final boolean hasAllow(int allow) {
114            return (this.allow&allow)>0;
115        }
116    
117            @Override
118            public final boolean hasSQLRestriction() {
119            return this.allow!=DataSource.ALLOW_ALL;
120        }
121        
122            @Override
123            public final boolean isReadOnly() {
124            return readOnly;
125        }
126        
127            @Override
128            public String getPassword() {
129            return password;
130        }
131            
132            @Override
133            public String getUsername() {
134            return username;
135        }
136    
137            @Override
138            public boolean equals(Object obj) {
139                    if(this==obj)return true;
140                    if(!(obj instanceof DataSourcePro)) return false;
141                    DataSourcePro ds = (DataSourcePro)obj;
142                    return id().equals(ds.id());
143            } 
144            
145    
146            public String id() {
147                    return getConnectionStringTranslated()+":"+getConnectionLimit()+":"+getConnectionTimeout()+":"+getMetaCacheTimeout()+":"+getName()+":"
148                            +getUsername()+":"+getPassword()+":"+getClazz().getName()+":"+(getTimeZone()==null?"null":getTimeZone().getID())+":"+isBlob()+":"+isClob()+":"
149                            +isReadOnly()+":"+isStorage();
150            } 
151    
152        @Override
153        public String toString() {
154                    return id();
155            }
156        
157        public static Class toClass(String className) throws ClassException {
158            try {
159                            return Class.forName(className);
160                    } 
161                    catch (ClassNotFoundException e) {
162                            Config config = ThreadLocalPageContext.getConfig();
163                            if(config!=null) return ClassUtil.loadClass(config.getClassLoader(),className);
164                            return ClassUtil.loadClass(className);
165                    }
166            }
167    
168    }