/* * org.openmicroscopy.shoola.env.cache.CacheServiceImpl * *------------------------------------------------------------------------------ * Copyright (C) 2006-2008 University of Dundee. All rights reserved. * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.env.cache; //Java imports import java.io.InputStream; //Third-party libraries import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; import net.sf.ehcache.store.MemoryStoreEvictionPolicy; //Application-internal dependencies import omero.gateway.cache.CacheService; import omero.log.LogMessage; import omero.log.Logger; /** * Provides the caching service. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author Donald MacDonald      * <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a> * @version 3.0 * <small> * (<b>Internal version:</b> $Revision: $Date: $) * </small> * @since 3.0-Beta3 */ class CacheServiceImpl implements CacheService { /** Reference to the manager. */ private CacheManager manager; /** The id of the last created cache. */ private int cacheID; /** Reference to the log service.*/ private Logger log; /** * Creates a new instance. * * @param config The configuration file as input stream. * @param log Reference to the logger. */ CacheServiceImpl(InputStream config, Logger log) { if (log == null) throw new IllegalArgumentException("Logger cannot be null"); manager = new CacheManager(config); this.log = log; cacheID = -1; } /** Shuts down the cache manager. */ public void shutDown() { try { manager.shutdown(); } catch (Exception e) { String s = "Cache shut down"; LogMessage msg = new LogMessage(); msg.print(s); msg.print(e); log.debug(this, msg); } } /** * Implemented as specified by {@link CacheService}. * @see CacheService#createCache() */ public int createCache() { return createCache(DEFAULT); } /** * Implemented as specified by {@link CacheService}. * @see CacheService#createCache(int, int) */ public int createCache(int type, int size) { Cache cache; if (size <= 0) size = 1; switch (type) { case PERSISTENCE_ON_DISK: //TODO: implement. return -1; case IN_MEMORY: cacheID++; //name, maximum number of elements, overflow to disk, eternal //time to Idle, time to live //cache = new Cache(""+cacheID, size, true, false, 300, 600); cache = new Cache(""+cacheID, size, MemoryStoreEvictionPolicy.LRU, true, manager.getDiskStorePath(), false, 300, 600, false, 300, null, null, 10000000); manager.addCache(cache); break; case DEFAULT: cacheID++; manager.addCache(""+cacheID); break; default: return -1; } return cacheID; } /** * Implemented as specified by {@link CacheService}. * @see CacheService#createCache(int) */ public int createCache(int type) { return createCache(type, CACHE_SIZE); } /** * Implemented as specified by {@link CacheService}. * @see CacheService#removeCache(int) */ public void removeCache(int cacheID) { Cache cache = null; try { cache = manager.getCache(""+cacheID); } catch (Exception e) { String s = "Remove cache with ID: "+cacheID; LogMessage msg = new LogMessage(); msg.print(s); msg.print(e); log.debug(this, msg); } if (cache != null) manager.removeCache(""+cacheID); } /** * Implemented as specified by {@link CacheService}. * @see CacheService#addElement(int, Object, Object) */ public void addElement(int cacheID, Object key, Object element) { Cache cache = null; try { cache = manager.getCache(""+cacheID); } catch (Exception e) { String s = "Cannot retrieve cache with ID: "+cacheID; LogMessage msg = new LogMessage(); msg.print(s); msg.print(e); log.debug(this, msg); } if (cache == null) return; if (cache.getSize() >= cache.getCacheConfiguration().getMaxElementsInMemory()) cache.flush(); cache.put(new Element(key, element)); } /** * Implemented as specified by {@link CacheService}. * @see CacheService#getElement(int, Object) */ public Object getElement(int cacheID, Object key) { Cache cache = null; try { cache = manager.getCache(""+cacheID); } catch (Exception e) { String s = "Cannot retrieve cache with ID: "+cacheID; LogMessage msg = new LogMessage(); msg.print(s); msg.print(e); log.debug(this, msg); } if (cache == null) return null; Element element = null; try { element = cache.get(key); } catch (Exception e) { String s = "Cannot retrieve the specified key: "+key.toString(); LogMessage msg = new LogMessage(); msg.print(s); msg.print(e); log.debug(this, msg); } if (element == null) return null; return element.getObjectValue(); } /** * Implemented as specified by {@link CacheService}. * @see CacheService#clearCache(int) */ public void clearCache(int cacheID) { Cache cache = null; try { cache = manager.getCache(""+cacheID); } catch (Exception e) { String s = "Cannot retrieve cache with ID: "+cacheID; LogMessage msg = new LogMessage(); msg.print(s); msg.print(e); log.debug(this, msg); } if (cache == null) return; cache.removeAll(); } /** * Implemented as specified by {@link CacheService}. * @see CacheService#clearAllCaches() */ public void clearAllCaches() { try { String[] names = manager.getCacheNames(); if (names == null) return; Cache cache; for (int i = 0; i < names.length; i++) { cache = manager.getCache(names[i]); if (cache != null) cache.removeAll(); manager.removeCache(names[i]); } } catch (Exception e) { //the cache is not alive. } } /** * Implemented as specified by {@link CacheService}. * @see CacheService#setCacheEntries(int, int) */ public void setCacheEntries(int cacheID, int size) { Cache cache = null; try { cache = manager.getCache(""+cacheID); } catch (Exception e) { String s = "Cannot retrieve cache with ID: "+cacheID; LogMessage msg = new LogMessage(); msg.print(s); msg.print(e); log.debug(this, msg); } if (cache == null) return; cache.flush(); cache.getCacheConfiguration().setMaxElementsInMemory(size); } }