/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.bbg.util; import static com.opengamma.bbg.BloombergConstants.DATA_PROVIDER_UNKNOWN; import static com.opengamma.bbg.BloombergConstants.DEFAULT_DATA_PROVIDER; import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.core.id.ExternalSchemes; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.ExternalScheme; import com.opengamma.util.ArgumentChecker; /** * Utility to assist with resolving Bloomberg codes. */ public final class BloombergDomainIdentifierResolver { /** Logger. */ private static final Logger s_logger = LoggerFactory.getLogger(BloombergDomainIdentifierResolver.class); /** * Prefixes used by Bloomberg. */ private static final Map<ExternalScheme, String> SCHEME_MAP = new LinkedHashMap<ExternalScheme, String>(); static { SCHEME_MAP.put(ExternalSchemes.BLOOMBERG_BUID, "/buid/"); SCHEME_MAP.put(ExternalSchemes.BLOOMBERG_BUID_WEAK, "/buid/"); SCHEME_MAP.put(ExternalSchemes.BLOOMBERG_TICKER, null); SCHEME_MAP.put(ExternalSchemes.BLOOMBERG_TICKER_WEAK, null); SCHEME_MAP.put(ExternalSchemes.BLOOMBERG_TCM, null); SCHEME_MAP.put(ExternalSchemes.ISIN, "/isin/"); SCHEME_MAP.put(ExternalSchemes.CUSIP, "/cusip/"); }; /** * Restricted constructor. */ private BloombergDomainIdentifierResolver() { } //------------------------------------------------------------------------- /** * Converts an external ID to a bloomberg key. * * @param externalId the external ID to convert, not null * @return the Bloomberg key, not null */ public static String toBloombergKey(ExternalId externalId) { ArgumentChecker.notNull(externalId, "externalId"); ExternalScheme scheme = externalId.getScheme(); if (SCHEME_MAP.containsKey(scheme)) { String prefix = SCHEME_MAP.get(scheme); String id = externalId.getValue(); return prefix != null ? prefix + id : id; } s_logger.warn("Unknown ExternalScheme {}", externalId); return externalId.getValue(); } /** * Converts an external ID to a bloomberg key. * * @param externalId the external ID to convert, not null * @param dataProvider the data provider, null or unknown calls {@link #toBloombergKey(ExternalId)} * @return the Bloomberg key, not null */ public static String toBloombergKeyWithDataProvider(ExternalId externalId, String dataProvider) { ArgumentChecker.notNull(externalId, "externalId"); if (dataProvider == null || dataProvider.contains(DATA_PROVIDER_UNKNOWN) || dataProvider.equalsIgnoreCase(DEFAULT_DATA_PROVIDER)) { return toBloombergKey(externalId); } ExternalScheme scheme = externalId.getScheme(); if (SCHEME_MAP.containsKey(scheme)) { String prefix = SCHEME_MAP.get(scheme); StringBuilder buf = new StringBuilder(); if (prefix != null) { buf.append(prefix); } if (scheme.equals(ExternalSchemes.BLOOMBERG_TICKER)) { String id = externalId.getValue().toUpperCase(Locale.US); if (id.endsWith("EQUITY")) { buf.append(id); } else { String[] splits = id.split(" "); if (id.endsWith("CURNCY") || id.endsWith("INDEX")) { buf.append(splits[0]).append(" ").append(dataProvider); } else { buf.append(splits[0]).append("@").append(dataProvider); } for (int i = 1; i < splits.length; i++) { buf.append(" ").append(splits[i]); } } } else { buf.append(externalId.getValue()).append("@").append(dataProvider); } return buf.toString(); } s_logger.warn("Unknown ExternalScheme {}", externalId); return externalId.getValue(); } /** * Selects the preferred external ID from a bundle. * * @param bundle the bundle, not null * @return the preferred external ID, not null */ public static ExternalId resolvePreferredIdentifier(ExternalIdBundle bundle) { ArgumentChecker.notNull(bundle, "bundle"); ArgumentChecker.isTrue(bundle.size() > 0, "Bundle must not be empty"); for (ExternalScheme preferredScheme : SCHEME_MAP.keySet()) { ExternalId preferredIdentifier = bundle.getExternalId(preferredScheme); if (preferredIdentifier != null) { return preferredIdentifier; } } return null; } }