sascha@541: package de.intevation.gnv.geobackend.base.query; sascha@541: sascha@541: import java.util.Collection; tim@895: import java.util.Iterator; sascha@541: sascha@541: import net.sf.ehcache.Cache; sascha@886: import net.sf.ehcache.CacheManager; sascha@541: import net.sf.ehcache.Element; sascha@541: sascha@542: import org.apache.log4j.Logger; sascha@541: tim@895: import de.intevation.gnv.geobackend.base.Result; tim@895: import de.intevation.gnv.geobackend.base.query.cache.CacheCleaner; ingo@1122: import de.intevation.gnv.geobackend.config.Configuration; tim@895: sascha@541: /** sascha@887: * @author Sascha L. Teichmann sascha@541: */ sascha@541: public class CachingQueryExecutorFactory sascha@541: extends QueryExecutorFactory sascha@541: { sascha@541: public static final String CACHE_NAME = "sql.cache"; sascha@541: sascha@542: private static Logger log = Logger.getLogger(CachingQueryExecutorFactory.class); sascha@542: sascha@541: protected CacheManager manager; sascha@541: sascha@541: public CachingQueryExecutorFactory() { sascha@542: log.info("using SQL cache"); ingo@1122: ingo@1122: init(); ingo@1122: } ingo@1122: ingo@1122: private void init() { ingo@1122: Configuration config = Configuration.getInstance(); ingo@1122: ingo@1122: if (config == null) { ingo@1122: log.error("No geobackend configuration found. " + ingo@1122: "Wasn't able to initialize cache."); ingo@1122: return; ingo@1122: } ingo@1122: else { ingo@1122: String configFile = config.getCacheConfiguration(); ingo@1122: manager = configFile != null ingo@1122: ? new CacheManager(configFile) ingo@1122: : new CacheManager(); ingo@1122: manager.addCache(CACHE_NAME); ingo@1122: CacheCleaner cc = new CacheCleaner(); ingo@1122: cc.start(); ingo@1122: } sascha@541: } sascha@541: sascha@541: public QueryExecutor getQueryExecutor() { sascha@541: return new DefaultQueryExceutor() { sascha@541: sascha@541: public Collection cachedResults(String query) { sascha@541: Cache cache = manager.getCache(CACHE_NAME); sascha@541: Element element = cache.get(query); sascha@542: if (log.isDebugEnabled()) { sascha@542: log.debug("found results in SQL cache: " + (element != null)); sascha@542: } sascha@541: return element != null sascha@541: ? (Collection)element.getObjectValue() sascha@541: : null; sascha@541: } sascha@541: sascha@542: public void cacheResults(String query, Collection results) { sascha@542: log.debug("store results in SQL cache"); sascha@541: Cache cache = manager.getCache(CACHE_NAME); sascha@541: cache.put(new Element(query, results)); sascha@541: } ingo@897: tim@895: public void clearCache(String[] tableNames) { tim@895: Cache cache = manager.getCache(CACHE_NAME); tim@895: Iterator keys = cache.getKeys().iterator(); tim@895: while (keys.hasNext()){ tim@895: String origKey = (String)keys.next(); tim@895: String key = origKey.toUpperCase(); tim@895: log.debug(key); tim@895: for (int i = 0; i < tableNames.length; i++){ tim@895: if (key.contains(tableNames[i])){ tim@895: log.debug(tableNames[i]+ " is contained in "+key); tim@895: log.debug("Cacheentry will be removed"); tim@895: boolean success = cache.remove(origKey); tim@895: if (!success){ tim@895: log.warn("Object could not be reoved from Cache."); tim@895: } tim@895: break; tim@895: } tim@895: } tim@895: } tim@895: } sascha@541: }; sascha@541: } sascha@542: sascha@542: public void shutdown() { sascha@542: log.info("shutting down SQL cache"); sascha@542: manager.getCache(CACHE_NAME).flush(); sascha@542: manager.shutdown(); sascha@542: } sascha@541: } sascha@541: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: