/** * 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.List; import java.util.Map; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import org.fudgemsg.FudgeContext; import org.fudgemsg.MutableFudgeMsg; import org.fudgemsg.mapping.FudgeSerializer; import org.threeten.bp.LocalDate; import com.google.common.collect.MapMaker; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolutionResult; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolver; import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeriesInfo; import com.opengamma.util.rest.AbstractDataResource; /** * RESTful resource for accessing a historical time-series resolver. */ public class DataHistoricalTimeSeriesResolverResource extends AbstractDataResource { private final HistoricalTimeSeriesResolver _underlying; private final FudgeContext _fudgeContext; private final Map<Resolve, HistoricalTimeSeriesResolutionResult> _cache = new MapMaker().weakValues().makeMap(); public DataHistoricalTimeSeriesResolverResource(final HistoricalTimeSeriesResolver underlying, final FudgeContext fudgeContext) { _underlying = underlying; _fudgeContext = fudgeContext; } protected HistoricalTimeSeriesResolver getUnderlying() { return _underlying; } protected FudgeContext getFudgeContext() { return _fudgeContext; } /** * URL construction state. */ public final class Resolve { private final ExternalIdBundle _identifierBundle; private final LocalDate _identifierValidityDate; private final String _dataSource; private final String _dataProvider; private final String _dataField; private final String _resolutionKey; private Resolve(final ExternalIdBundle identifierBundle, final LocalDate identifierValidityDate, final String dataSource, final String dataProvider, final String dataField, final String resolutionKey) { _identifierBundle = identifierBundle; _identifierValidityDate = identifierValidityDate; _dataSource = dataSource; _dataProvider = dataProvider; _dataField = dataField; _resolutionKey = resolutionKey; } @Path("id/{id}") public Resolve id(@PathParam("id") final String id) { if (_identifierBundle == null) { return new Resolve(ExternalIdBundle.of(ExternalId.parse(id)), _identifierValidityDate, _dataSource, _dataProvider, _dataField, _resolutionKey); } else { return new Resolve(_identifierBundle.withExternalId(ExternalId.parse(id)), _identifierValidityDate, _dataSource, _dataProvider, _dataField, _resolutionKey); } } @Path("identifierValidityDate/{date}") public Resolve identifierValidityDate(@PathParam("date") final String date) { return new Resolve(_identifierBundle, LocalDate.parse(date), _dataSource, _dataProvider, _dataField, _resolutionKey); } @Path("dataSource/{source}") public Resolve dataSource(@PathParam("source") final String source) { return new Resolve(_identifierBundle, _identifierValidityDate, source, _dataProvider, _dataField, _resolutionKey); } @Path("dataProvider/{provider}") public Resolve dataProvider(@PathParam("provider") final String provider) { return new Resolve(_identifierBundle, _identifierValidityDate, _dataSource, provider, _dataField, _resolutionKey); } @Path("dataField/{field}") public Resolve dataField(@PathParam("field") final String field) { return new Resolve(_identifierBundle, _identifierValidityDate, _dataSource, _dataProvider, field, _resolutionKey); } @Path("resolutionKey/{key}") public Resolve resolutionKey(@PathParam("key") final String key) { return new Resolve(_identifierBundle, _identifierValidityDate, _dataSource, _dataProvider, _dataField, key); } private HistoricalTimeSeriesResolutionResult resolve() { HistoricalTimeSeriesResolutionResult hts = _cache.get(this); if (hts == null) { hts = getUnderlying().resolve(_identifierBundle, _identifierValidityDate, _dataSource, _dataProvider, _dataField, _resolutionKey); if (hts == null) { return null; } _cache.put(this, hts); } return hts; } @GET public Response get() { final HistoricalTimeSeriesResolutionResult hts = resolve(); if (hts == null) { throw new WebApplicationException(Response.Status.NOT_FOUND); } final FudgeSerializer fsc = new FudgeSerializer(getFudgeContext()); final MutableFudgeMsg response = fsc.newMessage(); fsc.addToMessageWithClassHeaders(response, "info", null, hts.getHistoricalTimeSeriesInfo(), ManageableHistoricalTimeSeriesInfo.class); if (hts.getAdjuster() != null) { response.add("adjustment", hts.getAdjuster().getAdjustment(_identifierBundle).toString()); } return responseOk(response); } @GET @Path("adjustment") public Response adjustment(@QueryParam("id") List<String> idStrs) { final HistoricalTimeSeriesResolutionResult hts = resolve(); if (hts == null) { throw new WebApplicationException(Response.Status.NOT_FOUND); } final ExternalIdBundle bundle = ExternalIdBundle.parse(idStrs); final MutableFudgeMsg response = getFudgeContext().newMessage(); response.add("adjustment", hts.getAdjuster().getAdjustment(bundle).toString()); return responseOk(response); } } @Path("resolve") public Resolve resolve() { return new Resolve(null, null, null, null, null, null); } }