/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.master.historicaltimeseries.impl;
import java.util.List;
import org.threeten.bp.LocalDate;
import com.opengamma.id.ObjectIdentifiable;
import com.opengamma.id.UniqueId;
import com.opengamma.id.VersionCorrection;
import com.opengamma.master.ChangeProvidingCombinedMaster;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesGetFilter;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoDocument;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoHistoryRequest;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoHistoryResult;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoMetaDataRequest;
import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoMetaDataResult;
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.timeseries.date.localdate.LocalDateDoubleTimeSeries;
/**
* A {@link HistoricalTimeSeriesMaster} which delegates its calls to a list of underlying {@link HistoricalTimeSeriesMaster}s.
*
* This class extends {@link ChangeProvidingCombinedMaster} to implement methods specific to the {@link HistoricalTimeSeriesMaster}.
*/
public class CombinedHistoricalTimeSeriesMaster extends ChangeProvidingCombinedMaster<HistoricalTimeSeriesInfoDocument, HistoricalTimeSeriesMaster> implements HistoricalTimeSeriesMaster {
public CombinedHistoricalTimeSeriesMaster(List<HistoricalTimeSeriesMaster> masterList) {
super(masterList);
}
@Override
public HistoricalTimeSeriesInfoMetaDataResult metaData(HistoricalTimeSeriesInfoMetaDataRequest request) {
HistoricalTimeSeriesInfoMetaDataResult result = new HistoricalTimeSeriesInfoMetaDataResult();
for (HistoricalTimeSeriesMaster master : getMasterList()) {
HistoricalTimeSeriesInfoMetaDataResult masterResult = master.metaData(request);
result.getDataFields().addAll(masterResult.getDataFields());
result.getDataProviders().addAll(masterResult.getDataProviders());
result.getDataSources().addAll(masterResult.getDataSources());
result.getObservationTimes().addAll(masterResult.getObservationTimes());
}
return result;
}
@Override
public HistoricalTimeSeriesInfoSearchResult search(HistoricalTimeSeriesInfoSearchRequest request) {
final HistoricalTimeSeriesInfoSearchResult result = new HistoricalTimeSeriesInfoSearchResult();
SearchStrategy<HistoricalTimeSeriesInfoDocument, HistoricalTimeSeriesMaster, HistoricalTimeSeriesInfoSearchRequest> searchStrategy =
new SearchStrategy<HistoricalTimeSeriesInfoDocument, HistoricalTimeSeriesMaster, HistoricalTimeSeriesInfoSearchRequest>() {
@Override
public HistoricalTimeSeriesInfoSearchResult search(HistoricalTimeSeriesMaster master, HistoricalTimeSeriesInfoSearchRequest searchRequest) {
HistoricalTimeSeriesInfoSearchResult searchResult = master.search(searchRequest);
result.setVersionCorrection(searchResult.getVersionCorrection());
return searchResult;
}
};
pagedSearch(searchStrategy, result, request);
return result;
}
@Override
public HistoricalTimeSeriesInfoHistoryResult history(HistoricalTimeSeriesInfoHistoryRequest request) {
final HistoricalTimeSeriesInfoHistoryResult result = new HistoricalTimeSeriesInfoHistoryResult();
SearchStrategy<HistoricalTimeSeriesInfoDocument, HistoricalTimeSeriesMaster, HistoricalTimeSeriesInfoHistoryRequest> searchStrategy =
new SearchStrategy<HistoricalTimeSeriesInfoDocument, HistoricalTimeSeriesMaster, HistoricalTimeSeriesInfoHistoryRequest>() {
@Override
public HistoricalTimeSeriesInfoHistoryResult search(HistoricalTimeSeriesMaster master, HistoricalTimeSeriesInfoHistoryRequest searchRequest) {
HistoricalTimeSeriesInfoHistoryResult searchResult = master.history(searchRequest);
searchResult.getInfoList().addAll(result.getInfoList());
return searchResult;
}
};
pagedSearch(searchStrategy, result, request);
return result;
}
@Override
public ManageableHistoricalTimeSeries getTimeSeries(final UniqueId uniqueId) {
return apply(uniqueId.getScheme(), new Try<ManageableHistoricalTimeSeries>() {
@Override
public ManageableHistoricalTimeSeries tryMaster(HistoricalTimeSeriesMaster master) {
return master.getTimeSeries(uniqueId);
}
});
}
@Override
public ManageableHistoricalTimeSeries getTimeSeries(final UniqueId uniqueId, final HistoricalTimeSeriesGetFilter filter) {
return apply(uniqueId.getScheme(), new Try<ManageableHistoricalTimeSeries>() {
@Override
public ManageableHistoricalTimeSeries tryMaster(HistoricalTimeSeriesMaster master) {
return master.getTimeSeries(uniqueId, filter);
}
});
}
@Override
public ManageableHistoricalTimeSeries getTimeSeries(final ObjectIdentifiable objectId, final VersionCorrection versionCorrection) {
return apply(objectId.getObjectId().getScheme(), new Try<ManageableHistoricalTimeSeries>() {
@Override
public ManageableHistoricalTimeSeries tryMaster(HistoricalTimeSeriesMaster master) {
return master.getTimeSeries(objectId, versionCorrection);
}
});
}
@Override
public ManageableHistoricalTimeSeries getTimeSeries(final ObjectIdentifiable objectId, final VersionCorrection versionCorrection, final HistoricalTimeSeriesGetFilter filter) {
return apply(objectId.getObjectId().getScheme(), new Try<ManageableHistoricalTimeSeries>() {
@Override
public ManageableHistoricalTimeSeries tryMaster(HistoricalTimeSeriesMaster master) {
return master.getTimeSeries(objectId, versionCorrection, filter);
}
});
}
@Override
public UniqueId updateTimeSeriesDataPoints(final ObjectIdentifiable objectId, final LocalDateDoubleTimeSeries series) {
return apply(objectId.getObjectId().getScheme(), new Try<UniqueId>() {
@Override
public UniqueId tryMaster(HistoricalTimeSeriesMaster master) {
return master.updateTimeSeriesDataPoints(objectId, series);
}
});
}
@Override
public UniqueId correctTimeSeriesDataPoints(final ObjectIdentifiable objectId, final LocalDateDoubleTimeSeries series) {
return apply(objectId.getObjectId().getScheme(), new Try<UniqueId>() {
@Override
public UniqueId tryMaster(HistoricalTimeSeriesMaster master) {
return master.correctTimeSeriesDataPoints(objectId, series);
}
});
}
@Override
public UniqueId removeTimeSeriesDataPoints(final ObjectIdentifiable objectId, final LocalDate fromDateInclusive, final LocalDate toDateInclusive) {
return apply(objectId.getObjectId().getScheme(), new Try<UniqueId>() {
@Override
public UniqueId tryMaster(HistoricalTimeSeriesMaster master) {
return master.removeTimeSeriesDataPoints(objectId, fromDateInclusive, toDateInclusive);
}
});
}
private <D> D apply(String scheme, Try<D> tryObject) {
HistoricalTimeSeriesMaster master = getMasterByScheme(scheme);
if (master != null) {
return tryObject.tryMaster(master);
}
return tryObject.each(scheme);
}
}