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 }