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: