/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.sesame.cache.source; import java.util.Map; import java.util.Set; import org.threeten.bp.LocalDate; import com.opengamma.core.change.ChangeManager; import com.opengamma.core.historicaltimeseries.HistoricalTimeSeries; import com.opengamma.core.historicaltimeseries.HistoricalTimeSeriesSource; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.UniqueId; import com.opengamma.sesame.cache.CacheInvalidator; import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.tuple.Pair; import com.opengamma.util.tuple.Pairs; /** * */ public class CacheAwareHistoricalTimeSeriesSource implements HistoricalTimeSeriesSource { private final HistoricalTimeSeriesSource _delegate; private final CacheInvalidator _cacheInvalidator; public CacheAwareHistoricalTimeSeriesSource(HistoricalTimeSeriesSource delegate, CacheInvalidator cacheInvalidator) { _cacheInvalidator = ArgumentChecker.notNull(cacheInvalidator, "cacheInvalidator"); _delegate = ArgumentChecker.notNull(delegate, "delegate"); } private static Pair<LocalDate, Double> getLatestDataPoint(HistoricalTimeSeries timeSeries) { if (timeSeries == null) { return null; } else { LocalDateDoubleTimeSeries dateTimeSeries = timeSeries.getTimeSeries(); return Pairs.of(dateTimeSeries.getLatestTime(), dateTimeSeries.getLatestValueFast()); } } @Override public HistoricalTimeSeries getHistoricalTimeSeries(UniqueId uniqueId) { return register(_delegate.getHistoricalTimeSeries(uniqueId)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(UniqueId uniqueId, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) { return register(_delegate.getHistoricalTimeSeries(uniqueId, start, includeStart, end, includeEnd)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(UniqueId uniqueId, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd, int maxPoints) { return register(_delegate.getHistoricalTimeSeries(uniqueId, start, includeStart, end, includeEnd, maxPoints)); } @Override public Pair<LocalDate, Double> getLatestDataPoint(UniqueId uniqueId) { HistoricalTimeSeries timeSeries = _delegate.getHistoricalTimeSeries(uniqueId); return getLatestDataPoint(timeSeries); } @Override public Pair<LocalDate, Double> getLatestDataPoint(UniqueId uniqueId, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) { return getLatestDataPoint(_delegate.getHistoricalTimeSeries(uniqueId, start, includeStart, end, includeEnd)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(ExternalIdBundle identifierBundle, String dataSource, String dataProvider, String dataField) { return register(_delegate.getHistoricalTimeSeries(identifierBundle, dataSource, dataProvider, dataField)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(ExternalIdBundle identifierBundle, String dataSource, String dataProvider, String dataField, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) { return register(_delegate.getHistoricalTimeSeries(identifierBundle, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(ExternalIdBundle identifierBundle, String dataSource, String dataProvider, String dataField, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd, int maxPoints) { return register(_delegate.getHistoricalTimeSeries(identifierBundle, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd, maxPoints)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String dataSource, String dataProvider, String dataField) { return register(_delegate.getHistoricalTimeSeries(identifierBundle, identifierValidityDate, dataSource, dataProvider, dataField)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String dataSource, String dataProvider, String dataField, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) { return register(_delegate.getHistoricalTimeSeries(identifierBundle, identifierValidityDate, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String dataSource, String dataProvider, String dataField, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd, int maxPoints) { return register(_delegate.getHistoricalTimeSeries(identifierBundle, identifierValidityDate, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd, maxPoints)); } @Override public Pair<LocalDate, Double> getLatestDataPoint(ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String dataSource, String dataProvider, String dataField) { return getLatestDataPoint(_delegate.getHistoricalTimeSeries(identifierBundle, identifierValidityDate, dataSource, dataProvider, dataField)); } @Override public Pair<LocalDate, Double> getLatestDataPoint(ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String dataSource, String dataProvider, String dataField, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) { return getLatestDataPoint(_delegate.getHistoricalTimeSeries(identifierBundle, identifierValidityDate, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd)); } @Override public Pair<LocalDate, Double> getLatestDataPoint(ExternalIdBundle identifierBundle, String dataSource, String dataProvider, String dataField) { return getLatestDataPoint(_delegate.getHistoricalTimeSeries(identifierBundle, dataSource, dataProvider, dataField)); } @Override public Pair<LocalDate, Double> getLatestDataPoint(ExternalIdBundle identifierBundle, String dataSource, String dataProvider, String dataField, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) { return getLatestDataPoint(_delegate.getHistoricalTimeSeries(identifierBundle, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(String dataField, ExternalIdBundle identifierBundle, String resolutionKey) { return register(_delegate.getHistoricalTimeSeries(dataField, identifierBundle, resolutionKey)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(String dataField, ExternalIdBundle identifierBundle, String resolutionKey, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) { return register(_delegate.getHistoricalTimeSeries(dataField, identifierBundle, resolutionKey, start, includeStart, end, includeEnd)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(String dataField, ExternalIdBundle identifierBundle, String resolutionKey, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd, int maxPoints) { return register(_delegate.getHistoricalTimeSeries(dataField, identifierBundle, resolutionKey, start, includeStart, end, includeEnd, maxPoints)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(String dataField, ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String resolutionKey) { return register(_delegate.getHistoricalTimeSeries(dataField, identifierBundle, identifierValidityDate, resolutionKey)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(String dataField, ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String resolutionKey, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) { return register(_delegate.getHistoricalTimeSeries(dataField, identifierBundle, identifierValidityDate, resolutionKey, start, includeStart, end, includeEnd)); } @Override public HistoricalTimeSeries getHistoricalTimeSeries(String dataField, ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String resolutionKey, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd, int maxPoints) { return register(_delegate.getHistoricalTimeSeries(dataField, identifierBundle, identifierValidityDate, resolutionKey, start, includeStart, end, includeEnd, maxPoints)); } @Override public Pair<LocalDate, Double> getLatestDataPoint(String dataField, ExternalIdBundle identifierBundle, String resolutionKey) { return getLatestDataPoint(_delegate.getHistoricalTimeSeries(dataField, identifierBundle, resolutionKey)); } @Override public Pair<LocalDate, Double> getLatestDataPoint(String dataField, ExternalIdBundle identifierBundle, String resolutionKey, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) { return getLatestDataPoint(_delegate.getHistoricalTimeSeries(dataField, identifierBundle, resolutionKey, start, includeStart, end, includeEnd)); } @Override public Pair<LocalDate, Double> getLatestDataPoint(String dataField, ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String resolutionKey) { return getLatestDataPoint(_delegate.getHistoricalTimeSeries(dataField, identifierBundle, resolutionKey)); } @Override public Pair<LocalDate, Double> getLatestDataPoint(String dataField, ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String resolutionKey, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) { return getLatestDataPoint(_delegate.getHistoricalTimeSeries(dataField, identifierBundle, identifierValidityDate, resolutionKey, start, includeStart, end, includeEnd)); } @Override public Map<ExternalIdBundle, HistoricalTimeSeries> getHistoricalTimeSeries(Set<ExternalIdBundle> identifierSet, String dataSource, String dataProvider, String dataField, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) { return register(_delegate.getHistoricalTimeSeries(identifierSet, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd)); } @Override public ExternalIdBundle getExternalIdBundle(UniqueId uniqueId) { ExternalIdBundle bundle = _delegate.getExternalIdBundle(uniqueId); if (bundle != null) { _cacheInvalidator.register(uniqueId.getObjectId()); } return bundle; } @Override public ChangeManager changeManager() { return _delegate.changeManager(); } private <K> Map<K, HistoricalTimeSeries> register(Map<K, HistoricalTimeSeries> items) { for (HistoricalTimeSeries timeSeries : items.values()) { register(timeSeries); } return items; } private HistoricalTimeSeries register(HistoricalTimeSeries timeSeries) { if (timeSeries != null) { _cacheInvalidator.register(timeSeries.getUniqueId().getObjectId()); } return timeSeries; } }