package railo.runtime.db;
import java.util.Map;
import java.util.TimeZone;
import org.apache.commons.collections.map.ReferenceMap;
import railo.commons.lang.ClassException;
import railo.commons.lang.ClassUtil;
import railo.runtime.config.Config;
import railo.runtime.engine.ThreadLocalPageContext;
public abstract class DataSourceSupport implements DataSourcePro, Cloneable {
private Class clazz;
private final boolean blob;
private final boolean clob;
private final int connectionLimit;
private final int connectionTimeout;
private final long metaCacheTimeout;
private final TimeZone timezone;
private final String name;
private final boolean storage;
protected final int allow;
private final boolean readOnly;
private final String username;
private final String password;
private Map<String,ProcMetaCollection> procedureColumnCache;
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){
this.name=name;
this.clazz=clazz;
this.blob=blob;
this.clob=clob;
this.connectionLimit=connectionLimit;
this.connectionTimeout=connectionTimeout;
this.metaCacheTimeout=metaCacheTimeout;
this.timezone=timezone;
this.allow=allow;
this.storage=storage;
this.readOnly=readOnly;
this.username=username;
this.password=password;
}
@Override
public Object clone() {
return cloneReadOnly();
}
public Map<String,ProcMetaCollection> getProcedureColumnCache() {
if(procedureColumnCache==null)
procedureColumnCache=new ReferenceMap();
return procedureColumnCache;
}
@Override
public final boolean isBlob() {
return blob;
}
@Override
public final boolean isClob() {
return clob;
}
@Override
public final int getConnectionLimit() {
return connectionLimit;
}
@Override
public final int getConnectionTimeout() {
return connectionTimeout;
}
@Override
public final long getMetaCacheTimeout() {
return metaCacheTimeout;
}
@Override
public final TimeZone getTimeZone() {
return timezone;
}
@Override
public final Class getClazz() {
return clazz;
}
@Override
public final void setClazz(Class clazz) {
this.clazz = clazz;
}
@Override
public final String getName() {
return name;
}
@Override
public final boolean isStorage() {
return storage;
}
@Override
public final boolean hasAllow(int allow) {
return (this.allow&allow)>0;
}
@Override
public final boolean hasSQLRestriction() {
return this.allow!=DataSource.ALLOW_ALL;
}
@Override
public final boolean isReadOnly() {
return readOnly;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean equals(Object obj) {
if(this==obj)return true;
if(!(obj instanceof DataSourcePro)) return false;
DataSourcePro ds = (DataSourcePro)obj;
return id().equals(ds.id());
}
public String id() {
return getConnectionStringTranslated()+":"+getConnectionLimit()+":"+getConnectionTimeout()+":"+getMetaCacheTimeout()+":"+getName()+":"
+getUsername()+":"+getPassword()+":"+getClazz().getName()+":"+(getTimeZone()==null?"null":getTimeZone().getID())+":"+isBlob()+":"+isClob()+":"
+isReadOnly()+":"+isStorage();
}
@Override
public String toString() {
return id();
}
public static Class toClass(String className) throws ClassException {
try {
return Class.forName(className);
}
catch (ClassNotFoundException e) {
Config config = ThreadLocalPageContext.getConfig();
if(config!=null) return ClassUtil.loadClass(config.getClassLoader(),className);
return ClassUtil.loadClass(className);
}
}
}