/**
* 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;
}
}