/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.bbg.livedata;
import static com.opengamma.bbg.BloombergConstants.VALID_EQUITY_TYPES;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.fudgemsg.FudgeMsg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.bbg.BloombergConstants;
import com.opengamma.bbg.referencedata.ReferenceData;
import com.opengamma.bbg.referencedata.ReferenceDataProvider;
import com.opengamma.bbg.referencedata.ReferenceDataProviderGetRequest;
import com.opengamma.bbg.referencedata.ReferenceDataProviderGetResult;
import com.opengamma.bbg.util.BloombergDomainIdentifierResolver;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.id.ExternalId;
import com.opengamma.livedata.resolver.AbstractResolver;
import com.opengamma.livedata.resolver.JmsTopicNameResolveRequest;
import com.opengamma.livedata.resolver.JmsTopicNameResolver;
import com.opengamma.util.ArgumentChecker;
/**
*
*
*/
public class BloombergJmsTopicNameResolver extends AbstractResolver<JmsTopicNameResolveRequest, String> implements JmsTopicNameResolver {
private static final Logger s_logger = LoggerFactory
.getLogger(BloombergJmsTopicNameResolver.class);
private final ReferenceDataProvider _referenceDataProvider;
private static final Set<String> BBG_VALID_EQUITY_TYPES = VALID_EQUITY_TYPES;
public BloombergJmsTopicNameResolver(ReferenceDataProvider referenceDataProvider) {
ArgumentChecker.notNull(referenceDataProvider, "Reference Data Provider");
_referenceDataProvider = referenceDataProvider;
}
/**
* @return the referenceDataProvider
*/
public ReferenceDataProvider getReferenceDataProvider() {
return _referenceDataProvider;
}
@Override
public Map<JmsTopicNameResolveRequest, String> resolve(Collection<JmsTopicNameResolveRequest> requests) {
Map<JmsTopicNameResolveRequest, String> returnValue = new HashMap<JmsTopicNameResolveRequest, String>();
Map<String, Collection<JmsTopicNameResolveRequest>> lookupKey2Requests = new HashMap<String, Collection<JmsTopicNameResolveRequest>>();
for (JmsTopicNameResolveRequest request : requests) {
ExternalId marketDataUniqueId = request.getMarketDataUniqueId();
if (!marketDataUniqueId.getScheme().equals(ExternalSchemes.BLOOMBERG_BUID)) {
s_logger.info("No Bloomberg BUID found, was given: " + marketDataUniqueId);
returnValue.put(request, null);
continue;
}
String lookupKey = BloombergDomainIdentifierResolver.toBloombergKey(marketDataUniqueId);
Collection<JmsTopicNameResolveRequest> requestsForLookupKey = lookupKey2Requests.get(lookupKey);
if (requestsForLookupKey == null) {
requestsForLookupKey = new ArrayList<JmsTopicNameResolveRequest>();
lookupKey2Requests.put(lookupKey, requestsForLookupKey);
}
requestsForLookupKey.add(request);
}
if (!lookupKey2Requests.keySet().isEmpty()) {
ReferenceDataProviderGetRequest rdRequest = ReferenceDataProviderGetRequest.createGet(
lookupKey2Requests.keySet(), BloombergConstants.JMS_TOPIC_NAME_RESOLVER_FIELDS, true);
ReferenceDataProviderGetResult referenceData = _referenceDataProvider.getReferenceData(rdRequest);
for (Map.Entry<String, Collection<JmsTopicNameResolveRequest>> entry : lookupKey2Requests.entrySet()) {
String lookupKey = entry.getKey();
ReferenceData result = referenceData.getReferenceDataOrNull(lookupKey);
for (JmsTopicNameResolveRequest request : entry.getValue()) {
String jmsTopicName = getJmsTopicName(request, result);
returnValue.put(request, jmsTopicName);
}
}
}
return returnValue;
}
private String getJmsTopicName(JmsTopicNameResolveRequest request, ReferenceData result) {
if (result == null) {
s_logger.info("No reference data available for {}", request);
return null;
} else if (result.isIdentifierError()) {
s_logger.info("Failed to retrieve reference data for {}: {}", request, result.getErrors());
return null;
}
FudgeMsg resultFields = result.getFieldValues();
final String prefix = "LiveData" + SEPARATOR + "Bloomberg" + SEPARATOR;
final String suffix = request.getNormalizationRule().getJmsTopicSuffix();
final String bbgUniqueId = request.getMarketDataUniqueId().getValue();
final String defaultTopicName = prefix + bbgUniqueId + suffix;
String bbgSecurityType = resultFields.getString(BloombergConstants.FIELD_SECURITY_TYPE);
if (bbgSecurityType == null) {
return defaultTopicName;
} else if (BBG_VALID_EQUITY_TYPES.contains(bbgSecurityType)) {
String bbgExchange = resultFields.getString(BloombergConstants.FIELD_PRIMARY_EXCHANGE_NAME);
String bbgTicker = resultFields.getString(BloombergConstants.FIELD_TICKER);
if (bbgExchange == null || bbgTicker == null) {
return defaultTopicName;
}
return prefix + "Equity" + SEPARATOR + bbgExchange + SEPARATOR + bbgTicker + suffix;
} else if (bbgSecurityType.equals(BloombergConstants.BLOOMBERG_US_DOMESTIC_BOND_SECURITY_TYPE)) {
String issuer = resultFields.getString(BloombergConstants.FIELD_ISSUER);
String cusip = resultFields.getString(BloombergConstants.FIELD_ID_CUSIP);
if (issuer == null || cusip == null) {
return defaultTopicName;
}
return prefix + "Bond" + SEPARATOR + issuer + SEPARATOR + cusip + suffix;
} else if (bbgSecurityType.equals(BloombergConstants.BLOOMBERG_GLOBAL_BOND_SECURITY_TYPE)) {
String issuer = resultFields.getString(BloombergConstants.FIELD_ISSUER);
String isin = resultFields.getString(BloombergConstants.FIELD_ID_ISIN);
if (issuer == null || isin == null) {
return defaultTopicName;
}
return prefix + "Bond" + SEPARATOR + issuer + SEPARATOR + isin + suffix;
} else if (bbgSecurityType.equals(BloombergConstants.BLOOMBERG_EQUITY_OPTION_SECURITY_TYPE)) {
String underlyingTicker = resultFields.getString(BloombergConstants.FIELD_OPT_UNDL_TICKER);
String ticker = resultFields.getString(BloombergConstants.FIELD_TICKER);
if (underlyingTicker == null || ticker == null) {
return defaultTopicName;
}
return prefix + "EquityOption" + SEPARATOR + underlyingTicker + SEPARATOR + ticker + suffix;
} else {
return defaultTopicName;
}
}
}