/**
* 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.BLOOMBERG_DATA_SOURCE_NAME;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.google.common.collect.Maps;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.bbg.util.BloombergDataUtils;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.ExternalIdBundleWithDates;
import com.opengamma.master.historicaltimeseries.ExternalIdResolver;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoDocument;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoSearchRequest;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesMaster;
import com.opengamma.master.historicaltimeseries.impl.HistoricalTimeSeriesInfoSearchIterator;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.PlatformConfigUtils;
/**
* Updates the timeseries identifiers with loaded identifiers from Bloomberg
*/
public class BloombergTimeSeriesIdentifiersUpdater {
/** Logger. */
private static final Logger s_logger = LoggerFactory.getLogger(BloombergTimeSeriesIdentifiersUpdater.class);
/**
* The Spring config file.
*/
static final String CONTEXT_CONFIGURATION_PATH = "/com/opengamma/bbg/loader/bloomberg-timeseries-identifier-context.xml";
/**
* The master.
*/
private final HistoricalTimeSeriesMaster _htsMaster;
/**
* The provider of identifiers.
*/
private final ExternalIdResolver _bbgIdentifierProvider;
/**
* Creates a new instance of the updater.
*
* @param htsMaster the historical time-series master, not null
* @param bbgIdentifierProvider the identifier provider, not null
*/
public BloombergTimeSeriesIdentifiersUpdater(final HistoricalTimeSeriesMaster htsMaster, final ExternalIdResolver bbgIdentifierProvider) {
ArgumentChecker.notNull(htsMaster, "htsMaster");
ArgumentChecker.notNull(bbgIdentifierProvider, "identifierProvider");
_htsMaster = htsMaster;
_bbgIdentifierProvider = bbgIdentifierProvider;
}
//-------------------------------------------------------------------------
/**
* Main processing.
*/
public void run() {
// fetch the documents to update
Iterable<HistoricalTimeSeriesInfoDocument> documents = getCurrentTimeSeriesDocuments();
// find the BUIDs
Map<ExternalId, HistoricalTimeSeriesInfoDocument> buidDocMap = extractBuids(documents);
Set<ExternalId> buids = new HashSet<ExternalId>(buidDocMap.keySet());
// query Bloomberg
Map<ExternalId, ExternalIdBundleWithDates> buidToUpdated = _bbgIdentifierProvider.getExternalIds(buids);
for (Entry<ExternalId, ExternalIdBundleWithDates> entry : buidToUpdated.entrySet()) {
entry.setValue(BloombergDataUtils.addTwoDigitYearCode(entry.getValue()));
}
// update the database
updateIdentifiers(buidDocMap, buidToUpdated);
}
//-------------------------------------------------------------------------
/**
* Gets all the current Bloomberg-based time-series.
*
* @return the current documents, not null
*/
private Iterable<HistoricalTimeSeriesInfoDocument> getCurrentTimeSeriesDocuments() {
HistoricalTimeSeriesInfoSearchRequest request = new HistoricalTimeSeriesInfoSearchRequest();
request.setDataSource(BLOOMBERG_DATA_SOURCE_NAME);
return HistoricalTimeSeriesInfoSearchIterator.iterable(_htsMaster, request);
}
//-------------------------------------------------------------------------
/**
* Extracts the BUID from each document.
*
* @param documents the documents, not null
* @return the map of BIUD to unique identifier, not null
*/
private Map<ExternalId, HistoricalTimeSeriesInfoDocument> extractBuids(Iterable<HistoricalTimeSeriesInfoDocument> documents) {
Map<ExternalId, HistoricalTimeSeriesInfoDocument> buids = Maps.newHashMap();
for (HistoricalTimeSeriesInfoDocument doc : documents) {
ExternalIdBundleWithDates identifierBundleWithDates = doc.getInfo().getExternalIdBundle();
ExternalIdBundle bundle = identifierBundleWithDates.toBundle();
ExternalId buid = bundle.getExternalId(ExternalSchemes.BLOOMBERG_BUID);
if (buid == null) {
throw new OpenGammaRuntimeException("no buid for " + bundle);
}
buids.put(buid, doc);
}
return buids;
}
//-------------------------------------------------------------------------
/**
* Updates the identifiers.
*
* @param buidDocMap the map from BUID to document, not null
* @param buidToUpdated the map from BUID to updated identifier, not null
*/
private void updateIdentifiers(
Map<ExternalId, HistoricalTimeSeriesInfoDocument> buidDocMap,
Map<ExternalId, ExternalIdBundleWithDates> buidToUpdated) {
for (Entry<ExternalId, ExternalIdBundleWithDates> entry : buidToUpdated.entrySet()) {
HistoricalTimeSeriesInfoDocument doc = buidDocMap.get(entry.getKey());
ExternalIdBundleWithDates updatedId = entry.getValue();
if (doc != null && doc.getInfo().getExternalIdBundle().equals(updatedId) == false) {
doc.getInfo().setExternalIdBundle(updatedId);
s_logger.debug("Updated {} with {}", doc.getUniqueId(), updatedId);
_htsMaster.update(doc);
}
}
}
//-------------------------------------------------------------------------
/**
* Main method to run the updater.
* This uses the updater configured by Spring.
*
* @param args not used
*/
public static void main(String[] args) { //CSIGNORE
PlatformConfigUtils.configureSystemProperties();
BloombergTimeSeriesIdentifiersUpdater updater = loadUpdater();
updater.run();
}
/**
* Gets the loader from Spring config.
*
* @return the identifier loader, not null
*/
private static BloombergTimeSeriesIdentifiersUpdater loadUpdater() {
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext(CONTEXT_CONFIGURATION_PATH);
context.start();
BloombergTimeSeriesIdentifiersUpdater loader = (BloombergTimeSeriesIdentifiersUpdater) context.getBean("identifiersLoader");
return loader;
}
}