/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.view.rest; import java.net.URI; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import org.fudgemsg.FudgeContext; import org.fudgemsg.FudgeMsg; import org.fudgemsg.mapping.FudgeSerializer; import org.threeten.bp.Instant; import com.opengamma.DataNotFoundException; import com.opengamma.core.position.Portfolio; import com.opengamma.engine.view.helper.AvailableOutputs; import com.opengamma.engine.view.helper.AvailableOutputsProvider; import com.opengamma.id.UniqueId; import com.opengamma.transport.jaxrs.FudgeFieldContainerBrowser; import com.opengamma.transport.jaxrs.FudgeRest; import com.opengamma.util.rest.AbstractDataResource; /** * RESTful resource for accessing available outputs from a portfolio */ public class DataAvailablePortfolioOutputsResource extends AbstractDataResource { /** * The provider. */ private final AvailableOutputsProvider _provider; /** * The Fudge context. */ private final FudgeContext _fudgeContext; //------------------------------------------------------------------------- /** * Builder-style RESTful resource for accessing available outputs from a portfolio */ public static final class Instance extends AbstractDataResource { private final AvailableOutputsProvider _provider; private final FudgeContext _fudgeContext; private final Instant _instant; private final Integer _maxNodes; private final Integer _maxPositions; private Instance(AvailableOutputsProvider provider, FudgeContext fudgeContext, Instant instant) { this(provider, fudgeContext, instant, null, null); } private Instance(AvailableOutputsProvider provider, FudgeContext fudgeContext, Instant instant, Integer maxNodes, Integer maxPositions) { _provider = provider; _fudgeContext = fudgeContext; _instant = instant; _maxNodes = maxNodes; _maxPositions = maxPositions; } @Path("nodes/{count}") public Instance nodes(@PathParam("count") int maxNodes) { return new Instance(_provider, _fudgeContext, _instant, maxNodes, _maxPositions); } @Path("positions/{count}") public Instance positions(@PathParam("count") int maxPositions) { return new Instance(_provider, _fudgeContext, _instant, _maxNodes, maxPositions); } @Path("{portfolioId}") public FudgeFieldContainerBrowser portfolioOutputsByPortfolioId(@PathParam("portfolioId") String portfolioUid) { try { final AvailableOutputs outputs = _provider.getPortfolioOutputs(UniqueId.parse(portfolioUid), _instant, _maxNodes, _maxPositions); final FudgeSerializer serializer = new FudgeSerializer(_fudgeContext); return new FudgeFieldContainerBrowser(serializer.objectToFudgeMsg(outputs)); } catch (DataNotFoundException e) { throw new WebApplicationException(Response.Status.NOT_FOUND); } } @POST @Consumes(FudgeRest.MEDIA) @Produces(FudgeRest.MEDIA) public FudgeMsg portfolioOutputsByPortfolio(Portfolio portfolio) { try { FudgeSerializer serializer = new FudgeSerializer(_fudgeContext); AvailableOutputs availableOutputs = _provider.getPortfolioOutputs(portfolio, _instant, _maxNodes, _maxPositions); return serializer.objectToFudgeMsg(availableOutputs); } catch (DataNotFoundException e) { throw new WebApplicationException(Response.Status.NOT_FOUND); } } } //------------------------------------------------------------------------- /** * Creates an instance. * * @param provider the provider, not null * @param fudgeContext the Fudge context, not null */ public DataAvailablePortfolioOutputsResource(final AvailableOutputsProvider provider, final FudgeContext fudgeContext) { _provider = provider; _fudgeContext = fudgeContext; } //------------------------------------------------------------------------- private AvailableOutputsProvider getProvider() { return _provider; } private FudgeContext getFudgeContext() { return _fudgeContext; } //------------------------------------------------------------------------- @Path("now") public Instance now() { return new Instance(getProvider(), getFudgeContext(), null); } @Path("{timestamp}") public Instance timestamp(@PathParam("timestamp") String timestamp) { Instant instant = Instant.parse(timestamp); return new Instance(getProvider(), getFudgeContext(), instant); } //------------------------------------------------------------------------- /** * Builds a URI. * * @param baseUri the base URI, not null * @param instant the instant, may be null * @param maxNodes the maximum nodes, may be null * @param maxPositions the maximum positions, may be null * @param portfolioId the portfolio identifier, may be null * @return the URI, not null */ public static URI uri(URI baseUri, Instant instant, Integer maxNodes, Integer maxPositions, UniqueId portfolioId) { UriBuilder bld = UriBuilder.fromUri(DataAvailableOutputsProviderResource.uriPortfolio(baseUri)); bld.path(instant != null ? instant.toString() : "now"); if (maxNodes != null && maxNodes > 0) { bld.path("nodes").path(Integer.toString(maxNodes)); } if (maxPositions != null && maxPositions > 0) { bld.path("positions").path(Integer.toString(maxPositions)); } if (portfolioId != null) { bld.path(portfolioId.toString()); } return bld.build(); } }