/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.cache; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; import org.fudgemsg.FudgeMsg; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.util.ehcache.EHCacheUtils; /** * Caches Fudge message objects on top of another Fudge message store. This is an in-memory cache. */ public class CachingFudgeMessageStore implements FudgeMessageStore { private static final Logger s_logger = LoggerFactory.getLogger(CachingFudgeMessageStore.class); private final FudgeMessageStore _underlying; private final CacheManager _cacheManager; private final Cache _cache; public CachingFudgeMessageStore(final FudgeMessageStore underlying, final CacheManager cacheManager, final ViewComputationCacheKey cacheKey) { _underlying = underlying; _cacheManager = cacheManager; final String cacheName = cacheKey.toString(); EHCacheUtils.addCache(cacheManager, cacheKey.toString()); _cache = EHCacheUtils.getCacheFromManager(cacheManager, cacheName); } protected FudgeMessageStore getUnderlying() { return _underlying; } protected CacheManager getCacheManager() { return _cacheManager; } protected Cache getCache() { return _cache; } @Override public void delete() { s_logger.info("Delete on {}", this); getCacheManager().removeCache(getCache().getName()); getUnderlying().delete(); } @Override public FudgeMsg get(long identifier) { final Element cacheElement = getCache().get(identifier); if (cacheElement != null) { return (FudgeMsg) cacheElement.getObjectValue(); } final FudgeMsg data = getUnderlying().get(identifier); getCache().put(new Element(identifier, data)); return data; } @Override public void put(final long identifier, final FudgeMsg data) { getUnderlying().put(identifier, data); getCache().put(new Element(identifier, data)); } @Override public String toString() { return "CachingFudgeMessageStore[" + getCache().getName() + "]"; } @Override public Map<Long, FudgeMsg> get(Collection<Long> identifiers) { final Map<Long, FudgeMsg> result = new HashMap<Long, FudgeMsg>(); final List<Long> missing = new ArrayList<Long>(identifiers.size()); for (Long identifier : identifiers) { final Element cacheElement = getCache().get(identifier); if (cacheElement != null) { result.put(identifier, (FudgeMsg) cacheElement.getObjectValue()); } else { missing.add(identifier); } } if (missing.isEmpty()) { return result; } if (missing.size() == 1) { final Long missingIdentifier = missing.get(0); final FudgeMsg data = getUnderlying().get(missingIdentifier); result.put(missingIdentifier, data); getCache().put(new Element(missingIdentifier, data)); } else { final Map<Long, FudgeMsg> missingData = getUnderlying().get(missing); for (Map.Entry<Long, FudgeMsg> data : missingData.entrySet()) { result.put(data.getKey(), data.getValue()); getCache().put(new Element(data.getKey(), data.getValue())); } } return result; } @Override public void put(final Map<Long, FudgeMsg> data) { getUnderlying().put(data); for (Map.Entry<Long, FudgeMsg> element : data.entrySet()) { getCache().put(new Element(element.getKey(), element.getValue())); } } }