package railo.runtime.functions.cache;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;
import railo.commons.io.cache.Cache;
import railo.commons.io.cache.CacheEntryFilter;
import railo.commons.io.cache.exp.CacheException;
import railo.commons.lang.StringUtil;
import railo.runtime.PageContext;
import railo.runtime.cache.CacheConnection;
import railo.runtime.config.Config;
import railo.runtime.config.ConfigImpl;
import railo.runtime.config.ConfigWeb;
import railo.runtime.engine.ThreadLocalPageContext;
public class Util {
/**
* get the default cache for a certain type, also check definitions in application context (application.cfc/cfapplication)
* @param pc current PageContext
* @param type default type -> Config.CACHE_DEFAULT_...
* @param defaultValue value returned when there is no default cache for this type
* @return matching cache
*/
public static Cache getDefault(PageContext pc, int type,Cache defaultValue) {
// get default from application conetx
String name=null;
if(pc!=null && pc.getApplicationContext()!=null)
name=pc.getApplicationContext().getDefaultCacheName(type);
Config config=ThreadLocalPageContext.getConfig(pc);
if(!StringUtil.isEmpty(name)){
Cache cc = getCache(config, name, null);
if(cc!=null) return cc;
}
// get default from config
CacheConnection cc= ((ConfigImpl)config).getCacheDefaultConnection(type);
if(cc==null) return defaultValue;
try {
return cc.getInstance(config);
} catch (Throwable t) {
return defaultValue;
}
}
/**
* get the default cache for a certain type, also check definitions in application context (application.cfc/cfapplication)
* @param pc current PageContext
* @param type default type -> Config.CACHE_DEFAULT_...
* @return matching cache
* @throws IOException
*/
public static Cache getDefault(PageContext pc, int type) throws IOException {
// get default from application conetx
String name=pc!=null?pc.getApplicationContext().getDefaultCacheName(type):null;
if(!StringUtil.isEmpty(name)){
Cache cc = getCache(pc.getConfig(), name, null);
if(cc!=null) return cc;
}
// get default from config
Config config = ThreadLocalPageContext.getConfig(pc);
CacheConnection cc= ((ConfigImpl)config).getCacheDefaultConnection(type);
if(cc==null) throw new CacheException("there is no default "+toStringType(type,"")+" cache defined, you need to define this default cache in the Railo Administrator");
return cc.getInstance(config);
}
public static Cache getCache(PageContext pc,String cacheName, int type) throws IOException {
if(StringUtil.isEmpty(cacheName)){
return getDefault(pc, type);
}
return getCache(ThreadLocalPageContext.getConfig(pc), cacheName);
}
public static Cache getCache(PageContext pc,String cacheName, int type, Cache defaultValue) {
if(StringUtil.isEmpty(cacheName)){
return getDefault(pc, type,defaultValue);
}
return getCache(ThreadLocalPageContext.getConfig(pc), cacheName,defaultValue);
}
public static Cache getCache(Config config,String cacheName) throws IOException {
CacheConnection cc= config.getCacheConnections().get(cacheName.toLowerCase().trim());
if(cc==null) throw noCache(config,cacheName);
return cc.getInstance(config);
}
public static Cache getCache(Config config,String cacheName, Cache defaultValue) {
CacheConnection cc= config.getCacheConnections().get(cacheName.toLowerCase().trim());
if(cc==null) return defaultValue;
try {
return cc.getInstance(config);
} catch (Throwable t) {
return defaultValue;
}
}
public static CacheConnection getCacheConnection(Config config,String cacheName) throws IOException {
CacheConnection cc= config.getCacheConnections().get(cacheName.toLowerCase().trim());
if(cc==null) throw noCache(config,cacheName);
return cc;
}
public static CacheConnection getCacheConnection(Config config,String cacheName, CacheConnection defaultValue) {
CacheConnection cc= config.getCacheConnections().get(cacheName.toLowerCase().trim());
if(cc==null) return defaultValue;
return cc;
}
private static CacheException noCache(Config config, String cacheName) {
StringBuilder sb=new StringBuilder("there is no cache defined with name [").append(cacheName).append("], available caches are [");
Iterator<String> it = ((ConfigImpl)config).getCacheConnections().keySet().iterator();
if(it.hasNext()){
sb.append(it.next());
}
while(it.hasNext()){
sb.append(", ").append(it.next());
}
sb.append("]");
return new CacheException(sb.toString());
}
private static String toStringType(int type, String defaultValue) {
if(type==ConfigImpl.CACHE_DEFAULT_OBJECT) return "object";
if(type==ConfigImpl.CACHE_DEFAULT_TEMPLATE) return "template";
if(type==ConfigImpl.CACHE_DEFAULT_QUERY) return "query";
if(type==ConfigImpl.CACHE_DEFAULT_RESOURCE) return "resource";
if(type==ConfigImpl.CACHE_DEFAULT_FUNCTION) return "function";
return defaultValue;
}
public static String key(String key) {
return key.toUpperCase().trim();
}
public static boolean removeEL(ConfigWeb config, CacheConnection cc) {
try {
remove(config,cc);
return true;
} catch (Throwable e) {
return false;
}
}
public static void remove(ConfigWeb config, CacheConnection cc) throws Throwable {
Cache c = cc.getInstance(config);
// FUTURE no reflection needed
Method remove=null;
try{
remove = c.getClass().getMethod("remove", new Class[0]);
}
catch(Exception ioe){
c.remove((CacheEntryFilter)null);
return;
}
try {
remove.invoke(c, new Object[0]);
}
catch (InvocationTargetException e) {
throw e.getTargetException();
}
}
public static int toType(String type, int defaultValue) {
type=type.trim().toLowerCase();
if("object".equals(type)) return ConfigImpl.CACHE_DEFAULT_OBJECT;
if("query".equals(type)) return ConfigImpl.CACHE_DEFAULT_QUERY;
if("resource".equals(type)) return ConfigImpl.CACHE_DEFAULT_RESOURCE;
if("template".equals(type)) return ConfigImpl.CACHE_DEFAULT_TEMPLATE;
if("function".equals(type)) return ConfigImpl.CACHE_DEFAULT_FUNCTION;
return defaultValue;
}
public static String toType(int type, String defaultValue) {
if(ConfigImpl.CACHE_DEFAULT_OBJECT==type) return "object";
if(ConfigImpl.CACHE_DEFAULT_QUERY==type) return "query";
if(ConfigImpl.CACHE_DEFAULT_RESOURCE==type) return "resource";
if(ConfigImpl.CACHE_DEFAULT_TEMPLATE==type) return "template";
if(ConfigImpl.CACHE_DEFAULT_FUNCTION==type) return "function";
return defaultValue;
}
}