package railo.runtime.cache; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.oro.text.regex.MalformedPatternException; import railo.commons.io.cache.Cache; import railo.commons.io.cache.CacheEntry; import railo.commons.io.cache.exp.CacheException; import railo.loader.util.Util; import railo.runtime.cache.util.CacheKeyFilterAll; import railo.runtime.cache.util.WildCardFilter; import railo.runtime.op.Caster; import railo.runtime.type.Array; import railo.runtime.type.ArrayImpl; import railo.runtime.type.Struct; import railo.runtime.type.StructImpl; import railo.runtime.type.dt.TimeSpan; // MUST this must be come from configuration public class CacheEngine { private static Map caches=new HashMap(); private Cache cache; public CacheEngine(Cache cache) { this.cache=cache; } public void delete(String key,boolean throwWhenNotExists) throws IOException { if(!cache.remove(key) && throwWhenNotExists) throw new CacheException("there is no entry in cache with key ["+key+"]"); } public boolean exists(String key) { return cache.contains(key); } public int flush(String key, String filter) throws MalformedPatternException, IOException { if(!Util.isEmpty(key)) return cache.remove(key)?1:0; if(!Util.isEmpty(filter)) return cache.remove(new WildCardFilter(filter,false)); return cache.remove(CacheKeyFilterAll.getInstance()); } public Object get(String key, Object defaultValue) { return cache.getValue(key, defaultValue); } public Object get(String key) throws IOException { return cache.getValue(key); } public Array keys(String filter) { try { List keys; if(Util.isEmpty(filter)) keys=cache.keys(); else keys=cache.keys(new WildCardFilter(filter,false)); return Caster.toArray(keys); } catch (Exception e) {} return new ArrayImpl(); } public Struct list(String filter) { Struct sct=new StructImpl(); try { List entries; if(Util.isEmpty(filter)) entries=cache.entries(); else entries=cache.entries(new WildCardFilter(filter,false)); Iterator it = entries.iterator(); CacheEntry entry; while(it.hasNext()){ entry=(CacheEntry) it.next(); sct.setEL(entry.getKey(), entry.getValue()); } } catch (Exception e) {e.printStackTrace();} return sct; } public void set(String key, Object value, TimeSpan timespan) { Long until=timespan==null?null:Long.valueOf(timespan.getMillis()); cache.put(key, value, null, until); } public Struct info() { return cache.getCustomInfo(); } public Struct info(String key) throws IOException { if(key==null) return info(); CacheEntry entry = cache.getCacheEntry(key); return entry.getCustomInfo(); } public Cache getCache() { return cache; } /*public static void updateConnection(Config config, String name, String className, Struct connection, boolean _default) throws IOException { Document doc = getDocument(config); Element parent= getChildByName(doc.getDocumentElement(),"connections"); Element[] connections=getChildren(parent,"connection"); Element conn; String str; // update boolean updated=false; for(int i=0;i<connections.length;i++){ conn = connections[i]; str=conn.getAttribute("name"); if(_default)conn.setAttribute("default", "false"); if(!Util.isEmpty(str) && str.trim().equalsIgnoreCase(name.trim())){ updateConnection(conn,name,className,connection,_default); updated=true; } } // insert if(!updated){ conn=doc.createElement("connection"); updateConnection(conn,name,className,connection,_default); parent.appendChild(conn); } store(config,doc); } private static void updateConnection(Element conn, String name, String className, Struct custom, boolean _default) { conn.setAttribute("name", name); conn.setAttribute("class", className); conn.setAttribute("custom", toString(custom)); conn.setAttribute("default", _default?"true":"false"); } public static void deleteConnection(Config config, String name) throws IOException { Document doc = getDocument(config); Element parent= getChildByName(doc.getDocumentElement(),"connections"); Element[] connections=getChildren(parent,"connection"); Element conn; String str; for(int i=0;i<connections.length;i++){ conn = connections[i]; str=conn.getAttribute("name"); if(Util.isEmpty(str) || !str.trim().equalsIgnoreCase(name.trim())) continue; parent.removeChild(conn); } store(config,doc); }*/ }