/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.web.historicaltimeseries; import java.io.StringWriter; import java.net.URI; import java.util.Collection; import java.util.Map; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.joda.beans.impl.flexi.FlexiBean; import au.com.bytecode.opencsv.CSVWriter; import com.opengamma.id.UniqueId; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoDocument; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoSearchRequest; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesInfoSearchResult; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesLoader; import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeriesInfo; import com.opengamma.util.paging.PagingRequest; import com.opengamma.util.rest.RestUtils; /** * RESTful resource for a historical time-series. */ @Path("/timeseries/{timeseriesId}") public class WebHistoricalTimeSeriesResource extends AbstractWebHistoricalTimeSeriesResource { /** * Creates the resource. * @param parent the parent resource, not null */ public WebHistoricalTimeSeriesResource(final AbstractWebHistoricalTimeSeriesResource parent) { super(parent); } //------------------------------------------------------------------------- @GET @Produces(MediaType.TEXT_HTML) public String getHTML() { FlexiBean out = createRootData(); return getFreemarker().build(HTML_DIR + "onetimeseries.ftl", out); } @GET @Produces(MediaType.APPLICATION_JSON) public String getJSON() { FlexiBean out = createRootData(); return getFreemarker().build(JSON_DIR + "onetimeseries.ftl", out); } @GET @Produces(RestUtils.TEXT_CSV) public String getCSV() { StringWriter stringWriter = new StringWriter(); @SuppressWarnings("resource") CSVWriter csvWriter = new CSVWriter(stringWriter); csvWriter.writeNext(new String[] {"Time", "Value"}); for (Map.Entry<?, Double> entry : data().getTimeSeries().getTimeSeries()) { csvWriter.writeNext(new String[] {entry.getKey().toString(), entry.getValue().toString()}); } return stringWriter.toString(); } @PUT @Produces(MediaType.TEXT_HTML) public Response put() { HistoricalTimeSeriesInfoDocument tsDoc = data().getInfo(); updateTimeseries(tsDoc.getUniqueId()); URI uri = uri(data()); return Response.seeOther(uri).build(); } @PUT @Produces(MediaType.APPLICATION_JSON) public Response putJSON() { HistoricalTimeSeriesInfoDocument tsDoc = data().getInfo(); Response result = null; if (updateTimeseries(tsDoc.getUniqueId())) { result = Response.ok().build(); } else { result = Response.notModified().build(); } return result; } private boolean updateTimeseries(final UniqueId uniqueId) { HistoricalTimeSeriesLoader timeSeriesLoader = data().getHistoricalTimeSeriesLoader(); return timeSeriesLoader.updateTimeSeries(uniqueId); } //------------------------------------------------------------------------- @DELETE @Produces(MediaType.TEXT_HTML) public Response delete() { URI uri = deleteTimeSeries(); return Response.seeOther(uri).build(); } @DELETE @Produces(MediaType.APPLICATION_JSON) public Response deleteJSON() { deleteTimeSeries(); return Response.ok().build(); } private URI deleteTimeSeries() { HistoricalTimeSeriesInfoDocument doc = data().getInfo(); data().getHistoricalTimeSeriesMaster().remove(doc.getUniqueId()); URI uri = WebAllHistoricalTimeSeriesResource.uri(data()); return uri; } //------------------------------------------------------------------------- /** * Creates the output root data. * @return the output root data, not null */ @Override protected FlexiBean createRootData() { FlexiBean out = super.createRootData(); HistoricalTimeSeriesInfoDocument doc = data().getInfo(); out.put("infoDoc", doc); out.put("info", doc.getInfo()); out.put("related", getRelatedTimeSeries()); out.put("timeseries", data().getTimeSeries()); out.put("deleted", !doc.isLatest()); return out; } private Collection<ManageableHistoricalTimeSeriesInfo> getRelatedTimeSeries() { HistoricalTimeSeriesInfoSearchRequest searchRequest = new HistoricalTimeSeriesInfoSearchRequest(data().getInfo().getInfo().getExternalIdBundle().toBundle()); searchRequest.setPagingRequest(PagingRequest.FIRST_PAGE); HistoricalTimeSeriesInfoSearchResult searchResult = data().getHistoricalTimeSeriesMaster().search(searchRequest); Collection<ManageableHistoricalTimeSeriesInfo> result = searchResult.getInfoList(); result.remove(data().getInfo().getInfo()); // remove the original time series itself from its related list return result; } //------------------------------------------------------------------------- /** * Builds a URI for this resource. * @param data the data, not null * @return the URI, not null */ public static URI uri(final WebHistoricalTimeSeriesData data) { return uri(data, null); } /** * Builds a URI for this resource. * @param data the data, not null * @param overrideTimeSeriesId the override historical time-series id, null uses information from data * @return the URI, not null */ public static URI uri(final WebHistoricalTimeSeriesData data, final UniqueId overrideTimeSeriesId) { String portfolioId = data.getBestHistoricalTimeSeriesUriId(overrideTimeSeriesId); return data.getUriInfo().getBaseUriBuilder().path(WebHistoricalTimeSeriesResource.class).build(portfolioId); } }