/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.master.historicaltimeseries.impl;
import java.util.Collection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.threeten.bp.Instant;
import org.threeten.bp.LocalDate;
import com.opengamma.core.change.ChangeEvent;
import com.opengamma.core.change.ChangeListener;
import com.opengamma.core.change.ChangeType;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.ObjectId;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoSearchRequest;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoSearchResult;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesMaster;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolutionResult;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolver;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolverWithBasicChangeManager;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesSelector;
import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeriesInfo;
import com.opengamma.util.paging.PagingRequest;
/**
* Simple implementation of {@link HistoricalTimeSeriesResolver} which backs directly onto retrieves candidates from an underlying master.
*/
public class DefaultHistoricalTimeSeriesResolver extends HistoricalTimeSeriesResolverWithBasicChangeManager {
private static final Logger s_logger = LoggerFactory.getLogger(DefaultHistoricalTimeSeriesResolver.class);
private final HistoricalTimeSeriesSelector _selector;
private final HistoricalTimeSeriesMaster _master;
public DefaultHistoricalTimeSeriesResolver(HistoricalTimeSeriesSelector selector, HistoricalTimeSeriesMaster master) {
_selector = selector;
_master = master;
_master.changeManager().addChangeListener(new ChangeListener() {
@Override
public void entityChanged(ChangeEvent event) {
ObjectId oid = event.getObjectId();
ChangeType type = event.getType();
Instant vFrom = event.getVersionFrom();
Instant vInstant = event.getVersionInstant();
Instant vTo = event.getVersionTo();
DefaultHistoricalTimeSeriesResolver.this.changeManager().entityChanged(type, oid, vFrom, vTo, vInstant);
}
});
}
@Override
public HistoricalTimeSeriesResolutionResult resolve(final ExternalIdBundle identifierBundle, final LocalDate identifierValidityDate, final String dataSource, final String dataProvider,
final String dataField, final String resolutionKey) {
if (identifierBundle != null) {
Collection<ManageableHistoricalTimeSeriesInfo> timeSeriesCandidates = search(identifierBundle, identifierValidityDate, dataSource, dataProvider, dataField);
ManageableHistoricalTimeSeriesInfo selectedResult = select(timeSeriesCandidates, resolutionKey);
if (selectedResult == null) {
s_logger.warn("Resolver failed to find any time-series for {} using {}/{}", new Object[] {identifierBundle, dataField, resolutionKey });
return null;
}
return new HistoricalTimeSeriesResolutionResult(selectedResult);
} else {
return search(dataSource, dataProvider, dataField);
}
}
protected ManageableHistoricalTimeSeriesInfo select(Collection<ManageableHistoricalTimeSeriesInfo> timeSeriesCandidates, String resolutionKey) {
return getSelector().select(timeSeriesCandidates, resolutionKey);
}
protected Collection<ManageableHistoricalTimeSeriesInfo> search(ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String dataSource, String dataProvider, String dataField) {
final HistoricalTimeSeriesInfoSearchRequest searchRequest = new HistoricalTimeSeriesInfoSearchRequest(identifierBundle);
searchRequest.setValidityDate(identifierValidityDate);
searchRequest.setDataSource(dataSource);
searchRequest.setDataProvider(dataProvider);
searchRequest.setDataField(dataField);
final HistoricalTimeSeriesInfoSearchResult searchResult = _master.search(searchRequest);
return searchResult.getInfoList();
}
protected HistoricalTimeSeriesResolutionResult search(final String dataSource, final String dataProvider, final String dataField) {
final HistoricalTimeSeriesInfoSearchRequest searchRequest = new HistoricalTimeSeriesInfoSearchRequest();
searchRequest.setDataSource(dataSource);
searchRequest.setDataProvider(dataProvider);
searchRequest.setDataField(dataField);
searchRequest.setPagingRequest(PagingRequest.NONE);
if (_master.search(searchRequest).getPaging().getTotalItems() > 0) {
return new HistoricalTimeSeriesResolutionResult(null, null);
} else {
return null;
}
}
private HistoricalTimeSeriesSelector getSelector() {
return _selector;
}
}