/** * 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.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.bbg.referencedata.ReferenceDataProvider; import com.opengamma.bbg.util.BloombergDomainIdentifierResolver; import com.opengamma.bbg.util.ReferenceDataProviderUtils; import com.opengamma.core.id.ExternalSchemes; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.livedata.resolver.AbstractResolver; import com.opengamma.livedata.resolver.IdResolver; import com.opengamma.util.ArgumentChecker; /** * Resolves Bloomberg IDs. Accepts IDs of types: * <ul> * <li>{@link ExternalSchemes#BLOOMBERG_BUID} * <li>{@link ExternalSchemes#BLOOMBERG_TICKER} * <li>{@link ExternalSchemes#BLOOMBERG_TCM} * <li>{@link ExternalSchemes#ISIN} * <li>{@link ExternalSchemes#CUSIP} * </ul> * Returns an ID collection with {@link ExternalSchemes#BLOOMBERG_BUID}. * All other IDs are stripped out. * */ public class BloombergIdResolver extends AbstractResolver<ExternalIdBundle, ExternalId> implements IdResolver { /** Logger. */ private static final Logger s_logger = LoggerFactory.getLogger(BloombergIdResolver.class); private final ReferenceDataProvider _referenceDataProvider; public BloombergIdResolver(ReferenceDataProvider referenceDataProvider) { ArgumentChecker.notNull(referenceDataProvider, "Reference Data Provider"); _referenceDataProvider = referenceDataProvider; } /** * @return the referenceDataProvider */ public ReferenceDataProvider getReferenceDataProvider() { return _referenceDataProvider; } @Override public Map<ExternalIdBundle, ExternalId> resolve(Collection<ExternalIdBundle> bundles) { Map<ExternalIdBundle, ExternalId> result = new HashMap<ExternalIdBundle, ExternalId>(); Set<String> bbgKeys = new HashSet<String>(); Map<String, Collection<ExternalIdBundle>> bbgKey2Bundle = new HashMap<String, Collection<ExternalIdBundle>>(); for (ExternalIdBundle bundle : bundles) { String bbgUniqueId = null; ExternalId preferredIdentifier = BloombergDomainIdentifierResolver.resolvePreferredIdentifier(bundle); if (preferredIdentifier != null) { if (!preferredIdentifier.getScheme().equals(ExternalSchemes.BLOOMBERG_BUID)) { String bloombergKey = BloombergDomainIdentifierResolver.toBloombergKey(preferredIdentifier); bbgKeys.add(bloombergKey); Collection<ExternalIdBundle> bundlesForKey = bbgKey2Bundle.get(bloombergKey); if (bundlesForKey == null) { bundlesForKey = new ArrayList<ExternalIdBundle>(); bbgKey2Bundle.put(bloombergKey, bundlesForKey); } bundlesForKey.add(bundle); } else { bbgUniqueId = preferredIdentifier.getValue(); result.put(bundle, ExternalSchemes.bloombergBuidSecurityId(bbgUniqueId)); } } else { s_logger.info("Unable to identify any Bloomberg compatible identifier for {}", bundle); result.put(bundle, null); } } Map<String, String> bbgKey2BbgUniqueId = ReferenceDataProviderUtils.getBloombergUniqueIDs(bbgKeys, getReferenceDataProvider()); for (String bbgKey : bbgKey2Bundle.keySet()) { String bbgUniqueId = bbgKey2BbgUniqueId.get(bbgKey); ExternalId identifier; if (bbgUniqueId == null) { identifier = null; } else { identifier = ExternalSchemes.bloombergBuidSecurityId(bbgUniqueId); } for (ExternalIdBundle bundle : bbgKey2Bundle.get(bbgKey)) { if (identifier == null) { s_logger.warn("Unable to get Bloomberg unique ID for {}", bundle); } result.put(bundle, identifier); } } return result; } }