Package com.opengamma.bbg.livedata

Source Code of com.opengamma.bbg.livedata.AbstractBloombergLiveDataServer

/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.bbg.livedata;

import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Set;

import net.sf.ehcache.CacheManager;

import org.fudgemsg.FudgeMsg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.opengamma.bbg.referencedata.ReferenceDataProvider;
import com.opengamma.bbg.util.BloombergDataUtils;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.id.ExternalScheme;
import com.opengamma.livedata.normalization.StandardRuleResolver;
import com.opengamma.livedata.resolver.DefaultDistributionSpecificationResolver;
import com.opengamma.livedata.resolver.DistributionSpecificationResolver;
import com.opengamma.livedata.resolver.EHCachingDistributionSpecificationResolver;
import com.opengamma.livedata.resolver.IdResolver;
import com.opengamma.livedata.resolver.NormalizationRuleResolver;
import com.opengamma.livedata.server.StandardLiveDataServer;
import com.opengamma.livedata.server.Subscription;
import com.opengamma.util.ArgumentChecker;


/**
* Allows common functionality to be shared between the live and recorded Bloomberg data servers
*/
public abstract class AbstractBloombergLiveDataServer extends StandardLiveDataServer {
  private static final Logger s_logger = LoggerFactory.getLogger(AbstractBloombergLiveDataServer.class);
  private static final String DEFAULT_BBG_SUB_PREFIX = "/buid/";
 
  private NormalizationRuleResolver _normalizationRules; 
  private IdResolver _idResolver;
  private DistributionSpecificationResolver _defaultDistributionSpecificationResolver;

  /**
   * Creates an instance.
   *
   * @param cacheManager  the cache manager, not null
   */
  public AbstractBloombergLiveDataServer(CacheManager cacheManager) {
    super(cacheManager);
  }

  //-------------------------------------------------------------------------
  /**
   * Gets the reference data provider.
   *
   * @return the reference data provider
   */
  protected abstract ReferenceDataProvider getReferenceDataProvider();

  @Override
  protected ExternalScheme getUniqueIdDomain() {
    return ExternalSchemes.BLOOMBERG_BUID;
  }
 
  @Override
  protected boolean snapshotOnSubscriptionStartRequired(Subscription subscription) {
    // As per Kirk, it is possible that you don't get all fields initially.
    // Should we optimize this by asset type?
    return true;
  }
 
  /**
   *
   * @return the prefix to use when making the subscription, including slashes.
   * e.g. "/buid/"
   */
  protected String getBloombergSubscriptionPathPrefix() {
    return DEFAULT_BBG_SUB_PREFIX;
  }
 
 
  @Override
  public Map<String, FudgeMsg> doSnapshot(Collection<String> uniqueIds) {
    ArgumentChecker.notNull(uniqueIds, "Unique IDs");
    if (uniqueIds.isEmpty()) {
      return Collections.emptyMap();
    }
   
    Set<String> buids = Sets.newHashSetWithExpectedSize(uniqueIds.size());
    for (String uniqueId : uniqueIds) {
      String buid = getBloombergSubscriptionPathPrefix() + uniqueId;
      buids.add(buid);
    }
   
    // caching ref data provider must not be used here
    Map<String, FudgeMsg> snapshotValues = getReferenceDataProvider().getReferenceDataIgnoreCache(buids, BloombergDataUtils.STANDARD_FIELDS_SET);
    Map<String, FudgeMsg> returnValue = Maps.newHashMap();
    for (String buid : buids) {
      FudgeMsg fieldData = snapshotValues.get(buid);
      if (fieldData == null) {
        Exception e = new Exception("Stack Trace");
        e.fillInStackTrace();
        s_logger.error("Could not find result for {} in data snapshot, skipping", buid, e);
        //throw new OpenGammaRuntimeException("Result for " + buid + " was not found");
      } else {
        String securityUniqueId = buid.substring(getBloombergSubscriptionPathPrefix().length());
        returnValue.put(securityUniqueId, fieldData);
      }
    }
    return returnValue;
  }

  public synchronized NormalizationRuleResolver getNormalizationRules() {
    if (_normalizationRules == null) {
      _normalizationRules = new StandardRuleResolver(BloombergDataUtils.getDefaultNormalizationRules(getReferenceDataProvider(), getCacheManager(), getUniqueIdDomain()));
    }
    return _normalizationRules;
  }

  public synchronized IdResolver getIdResolver() {
    if (_idResolver == null) {
      _idResolver = new BloombergIdResolver(getReferenceDataProvider());
    }
    return _idResolver;
  }

  public synchronized DistributionSpecificationResolver getDefaultDistributionSpecificationResolver() {
    if (_defaultDistributionSpecificationResolver == null) {
      BloombergJmsTopicNameResolver topicResolver = new BloombergJmsTopicNameResolver(getReferenceDataProvider());
      DefaultDistributionSpecificationResolver distributionSpecResolver = new DefaultDistributionSpecificationResolver(getIdResolver(), getNormalizationRules(), topicResolver);
      return new EHCachingDistributionSpecificationResolver(distributionSpecResolver, getCacheManager(), "BBG");
    }
    return _defaultDistributionSpecificationResolver;
  }

}
TOP

Related Classes of com.opengamma.bbg.livedata.AbstractBloombergLiveDataServer

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.