Package com.opengamma.livedata.resolver

Source Code of com.opengamma.livedata.resolver.DefaultDistributionSpecificationResolver

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

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

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

import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.livedata.LiveDataSpecification;
import com.opengamma.livedata.normalization.NormalizationRuleSet;
import com.opengamma.livedata.server.DistributionSpecification;
import com.opengamma.util.ArgumentChecker;

/**
* This class produces a {@code DistributionSpecification}
* using an underlying {@code IdResolver}, {@code NormalizationRuleResolver}, and
* {@code JmsTopicNameResolver}.  
*/
public class DefaultDistributionSpecificationResolver
  extends AbstractResolver<LiveDataSpecification, DistributionSpecification>
  implements DistributionSpecificationResolver {

  private static final Logger s_logger = LoggerFactory.getLogger(DefaultDistributionSpecificationResolver.class);

  private final IdResolver _idResolver;
  private final NormalizationRuleResolver _normalizationRuleResolver;
  private final JmsTopicNameResolver _jmsTopicNameResolver;
 
  public DefaultDistributionSpecificationResolver(
      IdResolver idResolver,
      NormalizationRuleResolver normalizationRuleResolver,
      JmsTopicNameResolver jmsTopicNameResolver) {
   
    ArgumentChecker.notNull(idResolver, "ID Resolver");
    ArgumentChecker.notNull(normalizationRuleResolver, "Normalization rule resolver");
    ArgumentChecker.notNull(jmsTopicNameResolver, "JMS topic name resolver");
   
    _idResolver = idResolver;
    _normalizationRuleResolver = normalizationRuleResolver;
    _jmsTopicNameResolver = jmsTopicNameResolver;
  }

  @Override
  public Map<LiveDataSpecification, DistributionSpecification> resolve(Collection<LiveDataSpecification> liveDataSpecifications) {
   
    ArgumentChecker.notNull(liveDataSpecifications, "Live Data specification");
   
    Collection<ExternalIdBundle> identifierBundles = new ArrayList<ExternalIdBundle>();
    Map<ExternalIdBundle, Collection<LiveDataSpecification>> identifierBundle2LiveDataSpec = new HashMap<ExternalIdBundle, Collection<LiveDataSpecification>>();
    Map<LiveDataSpecification, ExternalId> liveDataSec2Identifier = new HashMap<LiveDataSpecification, ExternalId>();
    Map<LiveDataSpecification, NormalizationRuleSet> liveDataSec2NormalizationRule = new HashMap<LiveDataSpecification, NormalizationRuleSet>();
    Collection<JmsTopicNameResolveRequest> jmsTopicNameRequests = new ArrayList<JmsTopicNameResolveRequest>();
    Map<JmsTopicNameResolveRequest, Collection<LiveDataSpecification>> jmsTopicNameRequest2LiveDataSec = new HashMap<JmsTopicNameResolveRequest, Collection<LiveDataSpecification>>();
    Map<LiveDataSpecification, String> liveDataSec2JmsTopicName = new HashMap<LiveDataSpecification, String>();
   
    for (LiveDataSpecification liveDataSpec : liveDataSpecifications) {
      identifierBundles.add(liveDataSpec.getIdentifiers());
      Collection<LiveDataSpecification> liveDataSpecs = identifierBundle2LiveDataSpec.get(liveDataSpec.getIdentifiers());
      if (liveDataSpecs == null) {
        liveDataSpecs = new ArrayList<LiveDataSpecification>();
        identifierBundle2LiveDataSpec.put(liveDataSpec.getIdentifiers(), liveDataSpecs);
      }
      liveDataSpecs.add(liveDataSpec);
     
      NormalizationRuleSet normalizationRule = _normalizationRuleResolver.resolve(liveDataSpec.getNormalizationRuleSetId());
      liveDataSec2NormalizationRule.put(liveDataSpec, normalizationRule);
    }
   
    Map<ExternalIdBundle, ExternalId> bundle2Identifier = _idResolver.resolve(identifierBundles);
    for (Map.Entry<ExternalIdBundle, ExternalId> entry : bundle2Identifier.entrySet()) {
      Collection<LiveDataSpecification> liveDataSpecsForBundle = identifierBundle2LiveDataSpec.get(entry.getKey());
      for (LiveDataSpecification liveDataSpecForBundle : liveDataSpecsForBundle) {
        liveDataSec2Identifier.put(liveDataSpecForBundle, entry.getValue());
      }
    }
     
    for (LiveDataSpecification liveDataSpec : liveDataSpecifications) {
      ExternalId identifier = liveDataSec2Identifier.get(liveDataSpec);
      NormalizationRuleSet normalizationRule = liveDataSec2NormalizationRule.get(liveDataSpec);
      if (identifier == null || normalizationRule == null) {
        liveDataSec2JmsTopicName.put(liveDataSpec, null);      
      } else {
        JmsTopicNameResolveRequest jmsTopicNameRequest = new JmsTopicNameResolveRequest(identifier, normalizationRule);
        jmsTopicNameRequests.add(jmsTopicNameRequest);
       
        Collection<LiveDataSpecification> liveDataSpecs = jmsTopicNameRequest2LiveDataSec.get(jmsTopicNameRequest);
        if (liveDataSpecs == null) {
          liveDataSpecs = new ArrayList<LiveDataSpecification>();
          jmsTopicNameRequest2LiveDataSec.put(jmsTopicNameRequest, liveDataSpecs);
        }
        liveDataSpecs.add(liveDataSpec);
      }
    }
   
    Map<JmsTopicNameResolveRequest, String> jmsTopicNames = _jmsTopicNameResolver.resolve(jmsTopicNameRequests);
    for (Map.Entry<JmsTopicNameResolveRequest, String> entry : jmsTopicNames.entrySet()) {
      Collection<LiveDataSpecification> liveDataSpecsForRequest = jmsTopicNameRequest2LiveDataSec.get(entry.getKey());
      for (LiveDataSpecification liveDataSpecForRequest : liveDataSpecsForRequest) {
        liveDataSec2JmsTopicName.put(liveDataSpecForRequest, entry.getValue());
      }
    }
   
    Map<LiveDataSpecification, DistributionSpecification> returnValue = new HashMap<LiveDataSpecification, DistributionSpecification>();

    for (LiveDataSpecification liveDataSpec : liveDataSpecifications) {
      ExternalId identifier = liveDataSec2Identifier.get(liveDataSpec);
      NormalizationRuleSet normalizationRule = liveDataSec2NormalizationRule.get(liveDataSpec);
      String jmsTopicName = liveDataSec2JmsTopicName.get(liveDataSpec);
      if (identifier == null || normalizationRule == null || jmsTopicName == null) {
        s_logger.info("Unable to resolve liveDataSpec: {} - identifier: {}, normalizationRule: {}, jmsTopicName: {}",
                      liveDataSpec, identifier, normalizationRule, jmsTopicName);
        returnValue.put(liveDataSpec, null);
      } else {
        DistributionSpecification distributionSpec = new DistributionSpecification(
            identifier,
            normalizationRule,
            jmsTopicName);
        returnValue.put(liveDataSpec, distributionSpec);
      }
    }
   
    return returnValue;
  }

}
TOP

Related Classes of com.opengamma.livedata.resolver.DefaultDistributionSpecificationResolver

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.