/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.masterdb.security;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.joda.beans.JodaBeanUtils;
import com.opengamma.master.security.ManageableSecurity;
import com.opengamma.master.security.SecuritySearchRequest;
import com.opengamma.util.db.DbMapSqlParameterSource;
import com.opengamma.util.ehcache.EHCacheUtils;
/**
* A cache decorating a {@link SecurityMasterDetailProvider}
*/
public class EHCachingSecurityMasterDetailProvider implements SecurityMasterDetailProvider {
/* package for testing */static final String SECURITY_CACHE = "security-detail-cache";
private final SecurityMasterDetailProvider _underlying;
/**
* The cache manager.
*/
private final CacheManager _manager;
/**
* The single security cache.
*/
private final Cache _detailsCache;
/**
* @param underlying The provider to wrap
* @param manager The cache manager
*/
public EHCachingSecurityMasterDetailProvider(SecurityMasterDetailProvider underlying, CacheManager manager) {
super();
_underlying = underlying;
_manager = manager;
EHCacheUtils.addCache(_manager, SECURITY_CACHE);
_detailsCache = EHCacheUtils.getCacheFromManager(_manager, SECURITY_CACHE);
}
@Override
public void init(DbSecurityMaster master) {
_underlying.init(master);
}
@Override
public ManageableSecurity loadSecurityDetail(ManageableSecurity base) {
ManageableSecurity cached;
Element e = _detailsCache.get(base.getUniqueId());
if (e != null) {
cached = (ManageableSecurity) e.getObjectValue();
} else {
cached = _underlying.loadSecurityDetail(base);
e = new Element(base.getUniqueId(), cached);
_detailsCache.put(e);
}
return JodaBeanUtils.clone(cached);
}
@Override
public void storeSecurityDetail(ManageableSecurity security) {
_underlying.storeSecurityDetail(security);
//TODO cache?
}
@Override
public void extendSearch(SecuritySearchRequest request, DbMapSqlParameterSource args) {
_underlying.extendSearch(request, args);
}
}