/** * 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.net.URI; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; import org.apache.commons.lang.ObjectUtils; import org.threeten.bp.LocalDate; import com.opengamma.id.ObjectId; import com.opengamma.id.ObjectIdentifiable; import com.opengamma.id.UniqueId; import com.opengamma.id.VersionCorrection; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesGetFilter; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesMaster; import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeries; import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.rest.AbstractDataResource; import com.opengamma.util.rest.RestUtils; /** * RESTful resource for accessing time-series data points. */ public class DataHistoricalDataPointsResource extends AbstractDataResource { /** * The parent resource. */ private final DataHistoricalTimeSeriesMasterResource _htsResource; /** * The identifier specified in the URI. */ private ObjectId _urlResourceId; /** * Creates the resource. * * @param htsResource the parent resource, not null * @param dpId the data-points unique identifier, not null */ public DataHistoricalDataPointsResource(final DataHistoricalTimeSeriesMasterResource htsResource, final ObjectId dpId) { ArgumentChecker.notNull(htsResource, "htsResource"); ArgumentChecker.notNull(dpId, "dpId"); _htsResource = htsResource; _urlResourceId = dpId; } //------------------------------------------------------------------------- /** * Gets the parent resource. * * @return the parent resource, not null */ public DataHistoricalTimeSeriesMasterResource getParentResource() { return _htsResource; } /** * Gets the data-points identifier from the URL. * * @return the object identifier, not null */ public ObjectId getUrlDataPointsId() { return _urlResourceId; } //------------------------------------------------------------------------- /** * Gets the time-series master. * * @return the time-series master, not null */ public HistoricalTimeSeriesMaster getHistoricalTimeSeriesMaster() { return getParentResource().getHistoricalTimeSeriesMaster(); } //------------------------------------------------------------------------- @GET public Response get(@Context UriInfo uriInfo, @QueryParam("versionAsOf") String versionAsOf, @QueryParam("correctedTo") String correctedTo) { VersionCorrection vc = VersionCorrection.parse(versionAsOf, correctedTo); HistoricalTimeSeriesGetFilter filter = RestUtils.decodeQueryParams(uriInfo, HistoricalTimeSeriesGetFilter.class); if (filter != null) { ManageableHistoricalTimeSeries result = getHistoricalTimeSeriesMaster().getTimeSeries(getUrlDataPointsId(), vc, filter); return responseOkObject(result); } else { ManageableHistoricalTimeSeries result = getHistoricalTimeSeriesMaster().getTimeSeries(getUrlDataPointsId(), vc); return responseOkObject(result); } } @POST @Path("updates") public Response postUpdates(LocalDateDoubleTimeSeries newPoints) { UniqueId result = getHistoricalTimeSeriesMaster().updateTimeSeriesDataPoints(getUrlDataPointsId(), newPoints); return responseOkObject(result); } @POST @Path("corrections") public Response postCorrections(LocalDateDoubleTimeSeries newPoints) { UniqueId result = getHistoricalTimeSeriesMaster().correctTimeSeriesDataPoints(getUrlDataPointsId(), newPoints); return responseOkObject(result); } @DELETE @Path("removals/{startDate}/{endDate}") public Response remove(@PathParam("startDate") String startDateStr, @PathParam("endDate") String endDateStr) { LocalDate fromDateInclusive = (startDateStr != null ? LocalDate.parse(startDateStr) : null); LocalDate toDateInclusive = (endDateStr != null ? LocalDate.parse(endDateStr) : null); UniqueId result = getHistoricalTimeSeriesMaster().removeTimeSeriesDataPoints(getUrlDataPointsId(), fromDateInclusive, toDateInclusive); return responseOkObject(result); } //------------------------------------------------------------------------- @GET @Path("versions/{versionId}") public Response getVersioned(@Context UriInfo uriInfo, @PathParam("versionId") String versionId) { HistoricalTimeSeriesGetFilter filter = RestUtils.decodeQueryParams(uriInfo, HistoricalTimeSeriesGetFilter.class); if (filter != null) { ManageableHistoricalTimeSeries result = getHistoricalTimeSeriesMaster().getTimeSeries(getUrlDataPointsId().atVersion(versionId), filter); return responseOkObject(result); } else { ManageableHistoricalTimeSeries result = getHistoricalTimeSeriesMaster().getTimeSeries(getUrlDataPointsId().atVersion(versionId)); return responseOkObject(result); } } //------------------------------------------------------------------------- /** * Builds a URI for the resource. * * @param baseUri the base URI, not null * @param objectId the object identifier, not null * @param vc the version-correction locator, null for latest * @param filter the filter, may be null * @return the URI, not null */ public static URI uri(URI baseUri, ObjectIdentifiable objectId, VersionCorrection vc, HistoricalTimeSeriesGetFilter filter) { UriBuilder bld = UriBuilder.fromUri(baseUri).path("/dataPoints/{dpId}"); if (vc != null) { bld.queryParam("versionAsOf", vc.getVersionAsOfString()); bld.queryParam("correctedTo", vc.getCorrectedToString()); } if (filter != null) { RestUtils.encodeQueryParams(bld, filter); } return bld.build(objectId.getObjectId()); } /** * Builds a URI for a specific version of the resource. * * @param baseUri the base URI, not null * @param uniqueId the unique identifier, not null * @param filter the filter, may be null * @return the URI, not null */ public static URI uriVersion(URI baseUri, UniqueId uniqueId, HistoricalTimeSeriesGetFilter filter) { if (uniqueId.isLatest()) { return uri(baseUri, uniqueId, null, filter); } UriBuilder bld = UriBuilder.fromUri(baseUri).path("/dataPoints/{dpId}/versions/{versionId}"); if (filter != null) { RestUtils.encodeQueryParams(bld, filter); } return bld.build(uniqueId.toLatest(), uniqueId.getVersion()); } /** * Builds a URI for the corrections resource. * * @param baseUri the base URI, not null * @param objectId the object identifier, not null * @return the URI, not null */ public static URI uriUpdates(URI baseUri, ObjectIdentifiable objectId) { UriBuilder bld = UriBuilder.fromUri(baseUri).path("/dataPoints/{dpId}/updates"); return bld.build(objectId.getObjectId()); } /** * Builds a URI for the corrections resource. * * @param baseUri the base URI, not null * @param objectId the object identifier, not null * @return the URI, not null */ public static URI uriCorrections(URI baseUri, ObjectIdentifiable objectId) { UriBuilder bld = UriBuilder.fromUri(baseUri).path("/dataPoints/{dpId}/corrections"); return bld.build(objectId.getObjectId()); } /** * Builds a URI for the corrections resource. * * @param baseUri the base URI, not null * @param objectId the object identifier, not null * @param fromDateInclusive the start date, may be null * @param toDateInclusive the end date, may be null * @return the URI, not null */ public static URI uriRemovals(URI baseUri, ObjectIdentifiable objectId, LocalDate fromDateInclusive, LocalDate toDateInclusive) { UriBuilder bld = UriBuilder.fromUri(baseUri).path("/dataPoints/{dpId}/removals/{startDate}/{endDate}"); return bld.build(objectId.getObjectId(), ObjectUtils.toString(fromDateInclusive, ""), ObjectUtils.toString(toDateInclusive, "")); } }