Package com.opengamma.master.region.impl

Source Code of com.opengamma.master.region.impl.EHCachingRegionSource

/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.master.region.impl;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.opengamma.core.AbstractEHCachingSourceWithExternalBundle;
import com.opengamma.core.region.Region;
import com.opengamma.core.region.RegionSource;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.util.ehcache.EHCacheUtils;

/**
* A cache decorating a {@code RegionSource}.
* <p>
* The cache is implemented using {@code EHCache}.
*/
public class EHCachingRegionSource extends AbstractEHCachingSourceWithExternalBundle<Region, RegionSource> implements RegionSource {

  private static final Logger s_logger = LoggerFactory.getLogger(EHCachingRegionSource.class);
  /**
   * The cache name.
   */
  private static final String CACHE_NAME = "RegionCache";

  /**
   * The cache.
   */
  private final Cache _cache;

  /**
   * Creates an instance.
   *
   * @param underlying the underlying source, not null
   * @param cacheManager the cache manager, not null
   */
  public EHCachingRegionSource(RegionSource underlying, CacheManager cacheManager) {
    super(underlying, cacheManager);
    EHCacheUtils.addCache(cacheManager, CACHE_NAME);
    _cache = EHCacheUtils.getCacheFromManager(cacheManager, CACHE_NAME);
  }

  @Override
  public Region getHighestLevelRegion(ExternalId externalId) {
    return getHighestLevelRegion(ExternalIdBundle.of(externalId));
  }

  @Override
  public Region getHighestLevelRegion(ExternalIdBundle bundle) {
    Region result = null;
    Element element = _cache.get(bundle);
    if (element != null) {
      s_logger.debug("Cache hit on {}", bundle);
      result = (Region) element.getObjectValue();
    } else {
      s_logger.debug("Cache miss on {}", bundle);
      result = getUnderlying().getHighestLevelRegion(bundle);
      s_logger.debug("Caching regions {}", result);
      element = new Element(bundle, result);
      _cache.put(element);
      if (result != null) {
        _cache.put(new Element(result.getUniqueId(), result));
      }
    }
    return result;
  }

  /**
   * Call this at the end of a unit test run to clear the state of EHCache. It should not be part of a generic lifecycle method.
   */
  @Override
  public void shutdown() {
    super.shutdown();
    _cache.getCacheManager().removeCache(CACHE_NAME);
  }

}
TOP

Related Classes of com.opengamma.master.region.impl.EHCachingRegionSource

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.