/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.core.historicaltimeseries.impl;
import java.net.URI;
import java.util.Map;
import java.util.Set;
import org.fudgemsg.FudgeMsg;
import org.threeten.bp.LocalDate;
import com.opengamma.core.change.BasicChangeManager;
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.timeseries.date.localdate.LocalDateDoubleTimeSeries;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.fudgemsg.FudgeMapWrapper;
import com.opengamma.util.rest.AbstractRemoteClient;
import com.opengamma.util.rest.UniformInterfaceException404NotFound;
import com.opengamma.util.tuple.Pair;
import com.opengamma.util.tuple.Pairs;
/**
* Provides remote access to an {@link HistoricalTimeSeriesSource}.
*/
public class RemoteHistoricalTimeSeriesSource extends AbstractRemoteClient implements HistoricalTimeSeriesSource {
/**
* The change manager.
*/
private final ChangeManager _changeManager;
/**
* Creates an instance.
*
* @param baseUri the base target URI for all RESTful web services, not null
*/
public RemoteHistoricalTimeSeriesSource(final URI baseUri) {
this(baseUri, new BasicChangeManager());
}
/**
* Creates an instance.
*
* @param baseUri the base target URI for all RESTful web services, not null
* @param changeManager the change manager, not null
*/
public RemoteHistoricalTimeSeriesSource(final URI baseUri, final ChangeManager changeManager) {
super(baseUri);
ArgumentChecker.notNull(changeManager, "changeManager");
_changeManager = changeManager;
}
//-------------------------------------------------------------------------
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(final UniqueId uniqueId) {
ArgumentChecker.notNull(uniqueId, "uniqueId");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriGet(getBaseUri(), uniqueId);
return accessRemote(uri).get(HistoricalTimeSeries.class);
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(UniqueId uniqueId, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) {
ArgumentChecker.notNull(uniqueId, "uniqueId");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriGet(getBaseUri(), uniqueId, start, includeStart, end, includeEnd, null);
return accessRemote(uri).get(HistoricalTimeSeries.class);
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(UniqueId uniqueId, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd, int maxPoints) {
ArgumentChecker.notNull(uniqueId, "uniqueId");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriGet(getBaseUri(), uniqueId, start, includeStart, end, includeEnd, maxPoints);
return accessRemote(uri).get(HistoricalTimeSeries.class);
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
//-------------------------------------------------------------------------
@Override
public Pair<LocalDate, Double> getLatestDataPoint(UniqueId uniqueId) {
return extractPair(getHistoricalTimeSeries(uniqueId, null, true, null, true, -1));
}
@Override
public Pair<LocalDate, Double> getLatestDataPoint(UniqueId uniqueId, LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) {
return extractPair(getHistoricalTimeSeries(uniqueId, start, includeStart, end, includeEnd, -1));
}
//-------------------------------------------------------------------------
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(ExternalIdBundle identifierBundle, String dataSource, String dataProvider, String dataField) {
return getHistoricalTimeSeries(identifierBundle, dataSource, dataProvider, dataField, null, true, null, true);
}
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(ExternalIdBundle identifierBundle, String dataSource, String dataProvider, String dataField,
LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) {
ArgumentChecker.notNull(identifierBundle, "identifierBundle");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriSearchSingle(
getBaseUri(), identifierBundle, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd, null);
return accessRemote(uri).get(HistoricalTimeSeries.class);
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(ExternalIdBundle identifierBundle, String dataSource, String dataProvider, String dataField,
LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd, int maxPoints) {
ArgumentChecker.notNull(identifierBundle, "identifierBundle");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriSearchSingle(
getBaseUri(), identifierBundle, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd, maxPoints);
return accessRemote(uri).get(HistoricalTimeSeries.class);
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String dataSource, String dataProvider, String dataField) {
return getHistoricalTimeSeries(identifierBundle, identifierValidityDate, dataSource, dataProvider, dataField, null, true, null, true);
}
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String dataSource, String dataProvider, String dataField,
LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) {
ArgumentChecker.notNull(identifierBundle, "identifierBundle");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriSearchSingle(
getBaseUri(), identifierBundle, identifierValidityDate, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd, null);
return accessRemote(uri).get(HistoricalTimeSeries.class);
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String dataSource, String dataProvider, String dataField,
LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd, int maxPoints) {
ArgumentChecker.notNull(identifierBundle, "identifierBundle");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriSearchSingle(
getBaseUri(), identifierBundle, identifierValidityDate, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd, maxPoints);
return accessRemote(uri).get(HistoricalTimeSeries.class);
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
//-------------------------------------------------------------------------
@Override
public Pair<LocalDate, Double> getLatestDataPoint(ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String dataSource, String dataProvider, String dataField) {
return getLatestDataPoint(identifierBundle, identifierValidityDate, dataSource, dataProvider, dataField, null, true, null, true);
}
@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 extractPair(getHistoricalTimeSeries(identifierBundle, identifierValidityDate, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd, -1));
}
@Override
public Pair<LocalDate, Double> getLatestDataPoint(ExternalIdBundle identifierBundle, String dataSource, String dataProvider, String dataField) {
return getLatestDataPoint(identifierBundle, dataSource, dataProvider, dataField, null, true, null, true);
}
@Override
public Pair<LocalDate, Double> getLatestDataPoint(ExternalIdBundle identifierBundle, String dataSource, String dataProvider, String dataField,
LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) {
return extractPair(getHistoricalTimeSeries(identifierBundle, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd, -1));
}
//-------------------------------------------------------------------------
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(String dataField, ExternalIdBundle identifierBundle, String resolutionKey) {
return getHistoricalTimeSeries(dataField, identifierBundle, resolutionKey, null, true, null, true);
}
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(String dataField, ExternalIdBundle identifierBundle, String resolutionKey,
LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) {
ArgumentChecker.notNull(identifierBundle, "identifierBundle");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriSearchResolve(
getBaseUri(), identifierBundle, dataField, resolutionKey, start, includeStart, end, includeEnd, null);
return accessRemote(uri).get(HistoricalTimeSeries.class);
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(String dataField, ExternalIdBundle identifierBundle, String resolutionKey,
LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd, int maxPoints) {
ArgumentChecker.notNull(identifierBundle, "identifierBundle");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriSearchResolve(
getBaseUri(), identifierBundle, dataField, resolutionKey, start, includeStart, end, includeEnd, maxPoints);
return accessRemote(uri).get(HistoricalTimeSeries.class);
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(String dataField, ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String resolutionKey) {
return getHistoricalTimeSeries(dataField, identifierBundle, identifierValidityDate, resolutionKey, null, true, null, true);
}
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(String dataField, ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String resolutionKey,
LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) {
ArgumentChecker.notNull(identifierBundle, "identifierBundle");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriSearchResolve(
getBaseUri(), identifierBundle, identifierValidityDate, dataField, resolutionKey, start, includeStart, end, includeEnd, null);
return accessRemote(uri).get(HistoricalTimeSeries.class);
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
@Override
public HistoricalTimeSeries getHistoricalTimeSeries(String dataField, ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String resolutionKey,
LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd, int maxPoints) {
ArgumentChecker.notNull(identifierBundle, "identifierBundle");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriSearchResolve(
getBaseUri(), identifierBundle, identifierValidityDate, dataField, resolutionKey, start, includeStart, end, includeEnd, maxPoints);
return accessRemote(uri).get(HistoricalTimeSeries.class);
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
//-------------------------------------------------------------------------
@Override
public Pair<LocalDate, Double> getLatestDataPoint(String dataField, ExternalIdBundle identifierBundle, String resolutionKey) {
return getLatestDataPoint(dataField, identifierBundle, resolutionKey, null, true, null, true);
}
@Override
public Pair<LocalDate, Double> getLatestDataPoint(String dataField, ExternalIdBundle identifierBundle, String resolutionKey,
LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) {
return extractPair(getHistoricalTimeSeries(dataField, identifierBundle, resolutionKey, start, includeStart, end, includeEnd, -1));
}
@Override
public Pair<LocalDate, Double> getLatestDataPoint(String dataField, ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String resolutionKey) {
return getLatestDataPoint(dataField, identifierBundle, identifierValidityDate, resolutionKey, null, true, null, true);
}
@Override
public Pair<LocalDate, Double> getLatestDataPoint(String dataField, ExternalIdBundle identifierBundle, LocalDate identifierValidityDate, String resolutionKey,
LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) {
return extractPair(getHistoricalTimeSeries(dataField, identifierBundle, identifierValidityDate, resolutionKey, start, includeStart, end, includeEnd, -1));
}
//-------------------------------------------------------------------------
@SuppressWarnings("unchecked")
@Override
public Map<ExternalIdBundle, HistoricalTimeSeries> getHistoricalTimeSeries(Set<ExternalIdBundle> identifierSet, String dataSource, String dataProvider, String dataField,
LocalDate start, boolean includeStart, LocalDate end, boolean includeEnd) {
ArgumentChecker.notNull(identifierSet, "identifierSet");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriSearchBulk(getBaseUri());
FudgeMsg msg = DataHistoricalTimeSeriesSourceResource.uriSearchBulkData(identifierSet, dataSource, dataProvider, dataField, start, includeStart, end, includeEnd);
return accessRemote(uri).post(FudgeMapWrapper.class, msg).getMap();
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
//-------------------------------------------------------------------------
private Pair<LocalDate, Double> extractPair(HistoricalTimeSeries historicalTimeSeries) {
if (historicalTimeSeries == null) {
return null;
}
LocalDateDoubleTimeSeries series = historicalTimeSeries.getTimeSeries();
if (series.size() == 0) {
return null;
}
return Pairs.of(series.getLatestTime(), series.getLatestValue());
}
@Override
public ExternalIdBundle getExternalIdBundle(UniqueId uniqueId) {
ArgumentChecker.notNull(uniqueId, "uniqueId");
try {
URI uri = DataHistoricalTimeSeriesSourceResource.uriExternalIdBundleGet(getBaseUri(), uniqueId);
return accessRemote(uri).get(ExternalIdBundle.class);
} catch (UniformInterfaceException404NotFound ex) {
return null;
}
}
@Override
public ChangeManager changeManager() {
return _changeManager;
}
}