package org.sakaiproject.messagebundle.impl;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.memory.api.Cache;
import org.sakaiproject.memory.api.MemoryService;
import org.sakaiproject.messagebundle.api.MessageBundleProperty;
/**
* CachingMessageBundleServiceImpl
*
* Extends MessageBundleServiceImpl adding a level of caching for ResouceBundle's
* to mitigate redundant bundle loads from the database.
*
* @see MessageBundleServiceImpl
*
* @author Earle Nietzel
* Created on Aug 29, 2013
*
*/
public class CachingMessageBundleServiceImpl extends MessageBundleServiceImpl {
private static Log LOG = LogFactory.getLog(CachingMessageBundleServiceImpl.class);
private static String CACHE_NAME = "org.sakaiproject.messagebundle.cache.bundles";
private MemoryService memoryService;
private Cache cache;
public CachingMessageBundleServiceImpl() {
super();
}
public void init() {
cache = memoryService.newCache(CACHE_NAME);
super.init();
}
public void destroy() {
cache.destroy();
cache = null;
}
@Override
public Map<String, String> getBundle(String baseName, String moduleName, Locale loc) {
Map<String, String> bundle = null;
String key = super.getIndexKeyName(baseName, moduleName, loc.toString());
if (cache.containsKey(key)) {
bundle = (Map<String, String>) cache.get(key);
if (LOG.isDebugEnabled()) { LOG.debug("Retrieve bundle from cache with key=" + key); }
} else {
bundle = super.getBundle(baseName, moduleName, loc);
if (bundle != null) {
cache.put(key, bundle);
if (LOG.isDebugEnabled()) { LOG.debug("Add bundle to cache with key=" + key); }
}
}
return bundle;
}
@Override
public void updateMessageBundleProperty(MessageBundleProperty mbp) {
String key = super.getIndexKeyName(mbp.getBaseName(), mbp.getModuleName(), mbp.getLocale());
super.updateMessageBundleProperty(mbp);
invalidateCache(key);
}
@Override
public void deleteMessageBundleProperty(MessageBundleProperty mbp) {
String key = super.getIndexKeyName(mbp.getBaseName(), mbp.getModuleName(), mbp.getLocale());
super.deleteMessageBundleProperty(mbp);
invalidateCache(key);
}
@Override
public void revert(MessageBundleProperty mbp) {
String key = super.getIndexKeyName(mbp.getBaseName(), mbp.getModuleName(), mbp.getLocale());
super.revert(mbp);
invalidateCache(key);
}
private void invalidateCache(String key) {
if (cache.containsKey(key)) {
cache.remove(key);
if (LOG.isDebugEnabled()) { LOG.debug("Remove bundle from cache with key=" + key); }
}
}
public void setMemoryService(MemoryService memoryService) {
this.memoryService = memoryService;
}
}