/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.web.namedsnapshot;
import java.net.URI;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.joda.beans.impl.flexi.FlexiBean;
import com.opengamma.DataNotFoundException;
import com.opengamma.core.marketdatasnapshot.NamedSnapshot;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.master.marketdatasnapshot.MarketDataSnapshotDocument;
import com.opengamma.master.marketdatasnapshot.MarketDataSnapshotHistoryRequest;
import com.opengamma.master.marketdatasnapshot.MarketDataSnapshotHistoryResult;
import com.opengamma.master.marketdatasnapshot.MarketDataSnapshotMaster;
import com.opengamma.master.marketdatasnapshot.MarketDataSnapshotSearchRequest;
import com.opengamma.master.marketdatasnapshot.MarketDataSnapshotSearchResult;
import com.opengamma.master.marketdatasnapshot.MarketDataSnapshotSearchSortOrder;
import com.opengamma.util.paging.PagingRequest;
import com.opengamma.web.WebPaging;
import com.opengamma.web.analytics.rest.MasterType;
import com.opengamma.web.analytics.rest.Subscribe;
import com.opengamma.web.analytics.rest.SubscribeMaster;
/**
* RESTful resource for all snapshot documents.
* <p>
* The snapshot documents resource represents all the data for one element type in the snapshot master.
*
*/
@Path("/snapshots")
public class WebNamedSnapshotsResource extends AbstractWebNamedSnapshotResource {
/**
* Creates the resource.
* @param snapshotMaster the snapshot master, not null
*/
public WebNamedSnapshotsResource(final MarketDataSnapshotMaster snapshotMaster) {
super(snapshotMaster);
}
//-------------------------------------------------------------------------
@GET
@Produces(MediaType.TEXT_HTML)
@SubscribeMaster(MasterType.CONFIG)
public String getHTML(
@QueryParam("pgIdx") Integer pgIdx,
@QueryParam("pgNum") Integer pgNum,
@QueryParam("pgSze") Integer pgSze,
@QueryParam("sort") String sort,
@QueryParam("name") String name,
@QueryParam("type") String type,
@QueryParam("snapshotId") List<String> snapshotIdStrs,
@Context UriInfo uriInfo) {
PagingRequest pr = buildPagingRequest(pgIdx, pgNum, pgSze);
MarketDataSnapshotSearchSortOrder so = buildSortOrder(sort, MarketDataSnapshotSearchSortOrder.NAME_ASC);
FlexiBean out = search(pr, so, name, type, snapshotIdStrs, uriInfo);
return getFreemarker().build(HTML_DIR + "namedsnapshots.ftl", out);
}
private FlexiBean search(PagingRequest request, MarketDataSnapshotSearchSortOrder so, String name,
String typeName, List<String> snapshotIdStrs, UriInfo uriInfo) {
FlexiBean out = createRootData();
MarketDataSnapshotSearchRequest searchRequest = new MarketDataSnapshotSearchRequest();
typeName = StringUtils.trimToNull(typeName);
if (typeName != null) {
Class<? extends NamedSnapshot> typeClazz = data().getTypeMap().get(typeName);
searchRequest.setType(typeClazz);
}
searchRequest.setPagingRequest(request);
searchRequest.setSortOrder(so);
searchRequest.setName(StringUtils.trimToNull(name));
out.put("searchRequest", searchRequest);
out.put("type", typeName);
for (String snapshotIdStr : snapshotIdStrs) {
searchRequest.addMarketDataSnapshotId(ObjectId.parse(snapshotIdStr));
}
if (data().getUriInfo().getQueryParameters().size() > 0) {
MarketDataSnapshotSearchResult searchResult = data().getSnapshotMaster().search(searchRequest);
out.put("searchResult", searchResult);
out.put("paging", new WebPaging(searchResult.getPaging(), uriInfo));
}
return out;
}
//-------------------------------------------------------------------------
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_HTML)
public Response postHTML(
@FormParam("snapshotxml") String xml) {
xml = StringUtils.trimToNull(xml);
try {
final NamedSnapshot snapshot = parseXML(xml, NamedSnapshot.class);
MarketDataSnapshotDocument doc = new MarketDataSnapshotDocument(snapshot);
MarketDataSnapshotDocument added = data().getSnapshotMaster().add(doc);
URI uri = data().getUriInfo().getAbsolutePathBuilder().path(added.getUniqueId().toLatest().toString()).build();
return Response.seeOther(uri).build();
} catch (Exception ex) {
FlexiBean out = createRootData();
out.put("snapshotXml", StringEscapeUtils.escapeJava(StringUtils.defaultString(xml)));
out.put("err_snapshotXmlMsg", StringUtils.defaultString(ex.getMessage()));
String html = getFreemarker().build(HTML_DIR + "namedsnapshot-add.ftl", out);
return Response.ok(html).build();
}
}
//-------------------------------------------------------------------------
@Path("{snapshotId}")
public Object findSnapshotHTML(@Subscribe @PathParam("snapshotId") String idStr, @Context HttpHeaders headers) {
data().setUriSnapshotId(idStr);
UniqueId oid = UniqueId.parse(idStr);
try {
MarketDataSnapshotDocument doc = data().getSnapshotMaster().get(oid);
data().setSnapshot(doc);
} catch (DataNotFoundException ex) {
MarketDataSnapshotHistoryRequest historyRequest = new MarketDataSnapshotHistoryRequest(oid);
historyRequest.setPagingRequest(PagingRequest.ONE);
MarketDataSnapshotHistoryResult historyResult = data().getSnapshotMaster().history(historyRequest);
if (historyResult.getDocuments().size() == 0) {
throw ex;
}
data().setSnapshot(historyResult.getFirstDocument());
}
return new WebNamedSnapshotResource(this);
}
//-------------------------------------------------------------------------
/**
* Creates the output root data.
* @return the output root data, not null
*/
@Override
protected FlexiBean createRootData() {
FlexiBean out = super.createRootData();
MarketDataSnapshotSearchRequest searchRequest = new MarketDataSnapshotSearchRequest();
out.put("searchRequest", searchRequest);
out.put("type", "");
out.put("snapshotTypes", getSnapshotTypesProvider().getTypeSet());
out.put("snapshotDescriptionMap", getSnapshotTypesProvider().getDescriptionMap());
return out;
}
//-------------------------------------------------------------------------
/**
* Builds a URI for snapshot.
* @param data the data, not null
* @return the URI, not null
*/
public static URI uri(WebNamedSnapshotData data) {
UriBuilder builder = data.getUriInfo().getBaseUriBuilder().path(WebNamedSnapshotsResource.class);
return builder.build();
}
}