/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.integration.marketdata; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.threeten.bp.LocalDate; import com.google.common.collect.Sets; import com.opengamma.bbg.util.BloombergDataUtils; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundleWithDates; import com.opengamma.id.ExternalIdWithDates; import com.opengamma.id.UniqueId; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoDocument; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoSearchRequest; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoSearchResult; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesLoaderRequest; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesLoaderResult; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesMaster; import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeriesInfo; import com.opengamma.master.historicaltimeseries.impl.AbstractHistoricalTimeSeriesLoader; import com.opengamma.master.historicaltimeseries.impl.RandomTimeSeriesGenerator; import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.time.DateUtils; /** * Loads random time-series to the time-series master for demo/testing purposes. */ public class RandomTimeSeriesLoader extends AbstractHistoricalTimeSeriesLoader { /** The data source name for the random data. */ private static final String RANDOM_DATA_SOURCE_NAME = "RANDOM"; /** The time series master to populate. */ private final HistoricalTimeSeriesMaster _htsMaster; /** * Creates an instance. * * @param htsMaster the time-series master, not null */ public RandomTimeSeriesLoader(final HistoricalTimeSeriesMaster htsMaster) { ArgumentChecker.notNull(htsMaster, "timeseries master"); _htsMaster = htsMaster; } //------------------------------------------------------------------------- @Override protected HistoricalTimeSeriesLoaderResult doBulkLoad(HistoricalTimeSeriesLoaderRequest request) { ArgumentChecker.notNull(request, "request"); ArgumentChecker.notNull(request.getDataField(), "dataField"); Set<ExternalId> externalIds = request.getExternalIds(); LocalDate startDate = request.getStartDate(); LocalDate endDate = request.getEndDate(); String dataProvider = request.getDataProvider(); String dataField = request.getDataField(); if (endDate == null) { endDate = DateUtils.previousWeekDay(); } if (startDate == null) { startDate = endDate.minusYears(1); } checkValidDateRange(startDate, endDate); Set<ExternalId> missingIdentifiers = Sets.newHashSet(); for (ExternalId identifier : externalIds) { if (!haveTimeSeries(identifier, dataProvider, dataField)) { missingIdentifiers.add(identifier); } } Map<ExternalId, UniqueId> resultMap = addToMaster(missingIdentifiers, dataProvider, dataField, startDate, endDate); return new HistoricalTimeSeriesLoaderResult(resultMap); } private Map<ExternalId, UniqueId> addToMaster( Set<ExternalId> missingIdentifiers, String dataProvider, String dataField, LocalDate startDate, LocalDate endDate) { Map<ExternalId, UniqueId> result = new HashMap<ExternalId, UniqueId>(); for (ExternalId identifier : missingIdentifiers) { // add the info ManageableHistoricalTimeSeriesInfo info = new ManageableHistoricalTimeSeriesInfo(); info.setExternalIdBundle(ExternalIdBundleWithDates.of(ExternalIdWithDates.of(identifier, null, null))); info.setDataField(dataField); info.setDataProvider(BloombergDataUtils.resolveDataProvider(dataProvider)); info.setObservationTime(BloombergDataUtils.resolveObservationTime(dataProvider)); info.setDataSource(RANDOM_DATA_SOURCE_NAME); HistoricalTimeSeriesInfoDocument addedDoc = _htsMaster.add(new HistoricalTimeSeriesInfoDocument(info)); // add the series LocalDateDoubleTimeSeries timeSeries = generateRandomHistoricalTimeSeries(startDate, endDate); UniqueId uid = _htsMaster.updateTimeSeriesDataPoints(addedDoc.getInfo().getTimeSeriesObjectId(), timeSeries); result.put(identifier, uid); } return result; } private void checkValidDateRange(LocalDate startDate, LocalDate endDate) { if (endDate.isBefore(startDate)) { throw new IllegalArgumentException(endDate + " is before " + startDate); } } private LocalDateDoubleTimeSeries generateRandomHistoricalTimeSeries(LocalDate startDate, LocalDate endDate) { int daysBetween = DateUtils.getDaysBetween(startDate, endDate); return RandomTimeSeriesGenerator.makeRandomTimeSeries(startDate, daysBetween); } /** * Checks if the time-series exists. * * @param identifier the identifier * @param dataProvider the data provider * @param dataField the data field * @return true if there is a time-series for the identifier, data provider and data field */ private boolean haveTimeSeries(final ExternalId identifier, final String dataProvider, final String dataField) { HistoricalTimeSeriesInfoSearchRequest searchRequest = new HistoricalTimeSeriesInfoSearchRequest(identifier); searchRequest.setDataField(dataField); searchRequest.setDataProvider(BloombergDataUtils.resolveDataProvider(dataProvider)); searchRequest.setDataSource(RANDOM_DATA_SOURCE_NAME); HistoricalTimeSeriesInfoSearchResult searchTimeSeries = _htsMaster.search(searchRequest); List<HistoricalTimeSeriesInfoDocument> documents = searchTimeSeries.getDocuments(); return !documents.isEmpty(); } @Override public boolean updateTimeSeries(UniqueId uniqueIdentifier) { throw new UnsupportedOperationException(); } }