/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.integration.copier.timeseries.writer; import java.util.HashMap; import java.util.Map; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundleWithDates; import com.opengamma.id.ExternalIdSearch; import com.opengamma.id.ObjectIdentifiable; import com.opengamma.id.VersionCorrection; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesGetFilter; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoDocument; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoSearchRequest; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoSearchResult; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesMaster; import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeries; import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeriesInfo; import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries; import com.opengamma.util.ArgumentChecker; /** * A time series writer that writes to an OpenGamma time series master */ public class MasterTimeSeriesWriter implements TimeSeriesWriter { private HistoricalTimeSeriesMaster _htsMaster; private Map<ExternalId, ObjectIdentifiable> _idMap = new HashMap<ExternalId, ObjectIdentifiable>(); public MasterTimeSeriesWriter(HistoricalTimeSeriesMaster htsMaster) { ArgumentChecker.notNull(htsMaster, "htsMaster"); _htsMaster = htsMaster; } @Override public LocalDateDoubleTimeSeries writeDataPoints(ExternalId htsId, String dataSource, String dataProvider, String dataField, String observationTime, LocalDateDoubleTimeSeries series) { ObjectIdentifiable oId = _idMap.get(htsId); if (oId == null) { // resolve hts name to id of hts HistoricalTimeSeriesInfoSearchRequest searchRequest = new HistoricalTimeSeriesInfoSearchRequest(); searchRequest.setExternalIdSearch(ExternalIdSearch.of(htsId)); searchRequest.setDataField(dataField); searchRequest.setDataProvider(dataProvider); searchRequest.setDataSource(dataSource); searchRequest.setObservationTime(observationTime); HistoricalTimeSeriesInfoSearchResult searchResult = _htsMaster.search(searchRequest); oId = searchResult.getFirstDocument() == null ? null : searchResult.getFirstDocument().getObjectId(); // if this is a new hts, create it if (oId == null) { ManageableHistoricalTimeSeriesInfo info = new ManageableHistoricalTimeSeriesInfo(); info.setDataField(dataField); info.setDataProvider(dataProvider); info.setDataSource(dataSource); info.setObservationTime(observationTime); info.setExternalIdBundle(ExternalIdBundleWithDates.of(htsId.toBundle())); info.setName(dataProvider + " " + dataField + " - " + htsId.getValue()); HistoricalTimeSeriesInfoDocument infoDoc = new HistoricalTimeSeriesInfoDocument(); infoDoc.setInfo(info); infoDoc = _htsMaster.add(infoDoc); oId = infoDoc.getObjectId(); } _idMap.put(htsId, oId); } // TODO check if update could be used more often instead of correct ManageableHistoricalTimeSeries orig = _htsMaster.getTimeSeries(oId, VersionCorrection.LATEST, HistoricalTimeSeriesGetFilter.ofRange(series.getEarliestTime(), null, 1)); if (orig.getTimeSeries().isEmpty()) { _htsMaster.updateTimeSeriesDataPoints(oId, series); } else { _htsMaster.correctTimeSeriesDataPoints(oId, series); } return series; } @Override public void flush() { } }