com.opengamma.bbg.loader.EquityLoader.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.bbg.loader.EquityLoader.java

Source

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

import static com.opengamma.bbg.BloombergConstants.FIELD_CRNCY;
import static com.opengamma.bbg.BloombergConstants.FIELD_EXCH_CODE;
import static com.opengamma.bbg.BloombergConstants.FIELD_GICS_SUB_INDUSTRY;
import static com.opengamma.bbg.BloombergConstants.FIELD_ID_BBG_UNIQUE;
import static com.opengamma.bbg.BloombergConstants.FIELD_ID_CUSIP;
import static com.opengamma.bbg.BloombergConstants.FIELD_ID_ISIN;
import static com.opengamma.bbg.BloombergConstants.FIELD_ID_SEDOL1;
import static com.opengamma.bbg.BloombergConstants.FIELD_MARKET_SECTOR_DES;
import static com.opengamma.bbg.BloombergConstants.FIELD_MIC_1;
import static com.opengamma.bbg.BloombergConstants.FIELD_MIC_LOCAL_EXCH;
import static com.opengamma.bbg.BloombergConstants.FIELD_MIC_PRIM_EXCH;
import static com.opengamma.bbg.BloombergConstants.FIELD_NAME;
import static com.opengamma.bbg.BloombergConstants.FIELD_SECURITY_DES;
import static com.opengamma.bbg.BloombergConstants.FIELD_SECURITY_SHORT_DES;
import static com.opengamma.bbg.BloombergConstants.FIELD_TICKER;
import static com.opengamma.bbg.BloombergConstants.MARKET_SECTOR_PREFERRED;
import static com.opengamma.bbg.BloombergConstants.VALID_EQUITY_TYPES;
import static com.opengamma.bbg.util.BloombergDataUtils.isValidField;

import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.fudgemsg.FudgeMsg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.ImmutableSet;
import com.opengamma.bbg.referencedata.ReferenceDataProvider;
import com.opengamma.bbg.security.BloombergSecurityProvider;
import com.opengamma.bbg.util.BloombergDataUtils;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.financial.security.equity.EquitySecurity;
import com.opengamma.financial.security.equity.GICSCode;
import com.opengamma.financial.timeseries.exchange.Exchange;
import com.opengamma.financial.timeseries.exchange.ExchangeDataProvider;
import com.opengamma.id.ExternalId;
import com.opengamma.id.UniqueId;
import com.opengamma.master.security.ManageableSecurity;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.Currency;

/**
 * Loads the data for an Equity Future from Bloomberg.
 */
public final class EquityLoader extends SecurityLoader {

    /** Logger. */
    private static final Logger s_logger = LoggerFactory.getLogger(EquityLoader.class);
    /**
     * The fields to load from Bloomberg.
     */
    private static final Set<String> BLOOMBERG_EQUITY_FIELDS = ImmutableSet.of(FIELD_NAME, FIELD_SECURITY_DES,
            FIELD_SECURITY_SHORT_DES, FIELD_TICKER, FIELD_EXCH_CODE, FIELD_MARKET_SECTOR_DES, FIELD_CRNCY,
            FIELD_ID_CUSIP, FIELD_ID_ISIN, FIELD_ID_SEDOL1, FIELD_GICS_SUB_INDUSTRY, FIELD_ID_BBG_UNIQUE,
            FIELD_MIC_LOCAL_EXCH, FIELD_MIC_PRIM_EXCH, FIELD_MIC_1);

    /**
     * The valid Bloomberg security types for Equity.
     */
    public static final Set<String> VALID_SECURITY_TYPES = new ImmutableSet.Builder<String>()
            .addAll(VALID_EQUITY_TYPES).build();

    /**
     * The exchange data provider.
     */
    private final ExchangeDataProvider _exchangeDataProvider;

    /**
     * Creates an instance.
     * @param referenceDataProvider  the provider, not null
     * @param exchangeDataProvider  the exchange data provider, not null
     */
    public EquityLoader(ReferenceDataProvider referenceDataProvider, ExchangeDataProvider exchangeDataProvider) {
        super(s_logger, referenceDataProvider, SecurityType.EQUITY);
        ArgumentChecker.notNull(exchangeDataProvider, "exchangeDataProvider");
        _exchangeDataProvider = exchangeDataProvider;
    }

    //-------------------------------------------------------------------------
    @Override
    protected ManageableSecurity createSecurity(FudgeMsg fieldData) {
        final String bbgUniqueIdString = fieldData.getString(FIELD_ID_BBG_UNIQUE);
        final String name = fieldData.getString(FIELD_NAME);
        final String ticker = fieldData.getString(FIELD_TICKER);
        final String bbgExchangeCode = fieldData.getString(FIELD_EXCH_CODE);
        final String gicsCodeString = fieldData.getString(FIELD_GICS_SUB_INDUSTRY);
        final String currencyCode = fieldData.getString(FIELD_CRNCY);

        String marketSector = fieldData.getString(FIELD_MARKET_SECTOR_DES);
        String micExchangeCode;
        boolean isPreferred;
        if (MARKET_SECTOR_PREFERRED.equals(marketSector)) {
            micExchangeCode = fieldData.getString(FIELD_MIC_1);
            isPreferred = true;
        } else {
            micExchangeCode = fieldData.getString(FIELD_MIC_LOCAL_EXCH);
            if (micExchangeCode == null || !BloombergDataUtils.isValidField(micExchangeCode)) {
                micExchangeCode = fieldData.getString(FIELD_MIC_PRIM_EXCH);
            }
            isPreferred = false;
        }

        if (!isValidField(bbgUniqueIdString)) {
            logMissingData("bbgUniqueID", name);
            return null;
        }
        if (!isValidField(name)) {
            logMissingData("equity name", bbgUniqueIdString);
            return null;
        }
        if (!BloombergDataUtils.isValidField(ticker)) {
            logMissingData("equity ticker", name);
            return null;
        }
        if (!BloombergDataUtils.isValidField(bbgExchangeCode)) {
            logMissingData("equity exchange", name);
            return null;
        }
        if (!BloombergDataUtils.isValidField(currencyCode)) {
            logMissingData("equity currency", name);
            return null;
        }

        final Exchange exchangeData = _exchangeDataProvider.getExchange(micExchangeCode);
        if (exchangeData == null) {
            logMissingData("equity exchange data (common stock)", name);
            return null;
        }

        UniqueId bbgUniqueId = BloombergSecurityProvider.createUniqueId(bbgUniqueIdString);
        Currency currency = Currency.of(currencyCode.toUpperCase());
        GICSCode gicsCode = gicsCodeString != null ? GICSCode.of(gicsCodeString) : null;

        EquitySecurity security = new EquitySecurity(exchangeData.getDescription(), exchangeData.getMic(), name,
                currency);
        security.setUniqueId(bbgUniqueId);
        security.setName(name);
        security.setShortName(ticker);
        if (gicsCode != null) {
            security.setGicsCode(gicsCode);
        }
        security.setPreferred(isPreferred);

        //set identifiers
        parseIdentifiers(fieldData, security);

        return security;
    }

    private void logMissingData(String fieldName, String securityName) {
        s_logger.warn("Cannot construct equity security " + securityName + " as " + fieldName + " is missing");
    }

    @Override
    protected Set<String> getBloombergFields() {
        return BLOOMBERG_EQUITY_FIELDS;
    }

    @Override
    protected void parseIdentifiers(final FudgeMsg fieldData, final ManageableSecurity security) {
        super.parseIdentifiers(fieldData, security);

        String marketSector = StringUtils.trimToEmpty(fieldData.getString(FIELD_MARKET_SECTOR_DES));
        if (!BloombergDataUtils.isValidField(marketSector)) {
            return;
        }
        String bbgExchangeCode;
        if (MARKET_SECTOR_PREFERRED.equals(marketSector)) {
            bbgExchangeCode = null;
        } else {
            bbgExchangeCode = StringUtils.trimToEmpty(fieldData.getString(FIELD_EXCH_CODE));
            if (!BloombergDataUtils.isValidField(bbgExchangeCode)) {
                bbgExchangeCode = null;
            }
        }

        String securityShortDes = StringUtils.trimToEmpty(fieldData.getString(FIELD_SECURITY_SHORT_DES));
        if (BloombergDataUtils.isValidField(securityShortDes)) {
            security.addExternalId(getTicker(securityShortDes, bbgExchangeCode, marketSector));
        } else {
            String securityDes = StringUtils.trimToEmpty(fieldData.getString(FIELD_SECURITY_DES));
            if (BloombergDataUtils.isValidField(securityDes)) {
                security.addExternalId(getTicker(securityDes, bbgExchangeCode, marketSector));
            }
        }
    }

    private ExternalId getTicker(final String securityDes, final String exchangeCode, final String marketSector) {
        final StringBuilder sb = new StringBuilder(securityDes).append(" ");
        if (exchangeCode != null) {
            sb.append(exchangeCode).append(" ");
        }
        sb.append(marketSector);
        return ExternalSchemes.bloombergTickerSecurityId(sb.toString());
    }
}