package railo.runtime.functions.cache;
import java.util.ArrayList;
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.ConfigImpl;
import railo.runtime.exp.PageException;
import railo.runtime.exp.SecurityException;
import railo.runtime.op.Caster;
import railo.runtime.type.Collection.Key;
import railo.runtime.type.KeyImpl;
import railo.runtime.type.Struct;
import railo.runtime.type.util.ListUtil;
public class CacheSetProperties {
private static final Key OBJECT_TYPE = KeyImpl.intern("objecttype");
public static Object call(PageContext pc,Struct properties) throws PageException {
try {
Object obj=properties.removeEL(OBJECT_TYPE);
String objectType=Caster.toString(obj);
CacheConnection[] conns=getCaches(pc,objectType);
for(int i=0;i<conns.length;i++){
setProperties(conns[i],properties);
}
} catch (CacheException e) {
throw Caster.toPageException(e);
}
return call(pc, null);
}
private static void setProperties(CacheConnection cc, Struct properties) throws SecurityException {
throw new SecurityException("it is not allowed to change cache connection setting this way, please use the tag cfadmin or the railo administrator frontend instead ");
}
private static CacheConnection[] getCaches(PageContext pc,String cacheName) throws CacheException {
ConfigImpl config=(ConfigImpl) pc.getConfig();
if(StringUtil.isEmpty(cacheName)){
return new CacheConnection[]{
config.getCacheDefaultConnection(ConfigImpl.CACHE_DEFAULT_OBJECT),
config.getCacheDefaultConnection(ConfigImpl.CACHE_DEFAULT_TEMPLATE)
}
;
// MUST which one is first
}
ArrayList<CacheConnection> list=new ArrayList<CacheConnection>();
String name;
String[] names=ListUtil.listToStringArray(cacheName, ',');
for(int i=0;i<names.length;i++){
name=names[i].trim().toLowerCase();
if(name.equalsIgnoreCase("template"))
list.add(config.getCacheDefaultConnection(ConfigImpl.CACHE_DEFAULT_TEMPLATE));
else if(name.equalsIgnoreCase("object"))
list.add(config.getCacheDefaultConnection(ConfigImpl.CACHE_DEFAULT_OBJECT));
else{
CacheConnection cc= config.getCacheConnections().get(name);
if(cc==null) throw new CacheException("there is no cache defined with name ["+name+"]");
list.add(cc);
}
}
return list.toArray(new CacheConnection[list.size()]);
}
}