/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.web.legalentity;
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.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.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.master.legalentity.LegalEntityDocument;
import com.opengamma.master.legalentity.LegalEntityHistoryRequest;
import com.opengamma.master.legalentity.LegalEntityHistoryResult;
import com.opengamma.master.legalentity.LegalEntityMaster;
import com.opengamma.master.legalentity.LegalEntitySearchRequest;
import com.opengamma.master.legalentity.LegalEntitySearchResult;
import com.opengamma.master.legalentity.LegalEntitySearchSortOrder;
import com.opengamma.master.legalentity.ManageableLegalEntity;
import com.opengamma.master.security.SecurityMaster;
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;
import com.sun.jersey.api.client.ClientResponse.Status;
/**
* RESTful resource for all legalEntity documents.
* <p/>
* The legalEntity documents resource represents all the data for one element type in the legalEntity master.
*/
@Path("/legalentities")
public class WebLegalEntitiesResource extends AbstractWebLegalEntityResource {
/**
* Creates the resource.
*
* @param legalEntityMaster the legalEntity master, not null
* @param securityMaster the securityMaster master, not null
*/
public WebLegalEntitiesResource(final LegalEntityMaster legalEntityMaster, final SecurityMaster securityMaster) {
super(legalEntityMaster, securityMaster);
}
//-------------------------------------------------------------------------
@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("legalEntityId") List<String> legalEntityIdStrs,
@Context UriInfo uriInfo) {
PagingRequest pr = buildPagingRequest(pgIdx, pgNum, pgSze);
LegalEntitySearchSortOrder so = buildSortOrder(sort, LegalEntitySearchSortOrder.NAME_ASC);
FlexiBean out = search(pr, so, name, type, legalEntityIdStrs, uriInfo);
return getFreemarker().build(HTML_DIR + "legalentities.ftl", out);
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@SubscribeMaster(MasterType.CONFIG)
public String getJSON(
@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("legalEntityId") List<String> legalEntityIdStrs,
@Context UriInfo uriInfo) {
PagingRequest pr = buildPagingRequest(pgIdx, pgNum, pgSze);
LegalEntitySearchSortOrder so = buildSortOrder(sort, LegalEntitySearchSortOrder.NAME_ASC);
FlexiBean out = search(pr, so, name, type, legalEntityIdStrs, uriInfo);
return getFreemarker().build(JSON_DIR + "legalentities.ftl", out);
}
private FlexiBean search(PagingRequest request, LegalEntitySearchSortOrder so, String name,
String typeName, List<String> legalEntityIdStrs, UriInfo uriInfo) {
FlexiBean out = createRootData();
LegalEntitySearchRequest searchRequest = new LegalEntitySearchRequest();
typeName = StringUtils.trimToNull(typeName);
searchRequest.setPagingRequest(request);
searchRequest.setSortOrder(so);
searchRequest.setName(StringUtils.trimToNull(name));
out.put("searchRequest", searchRequest);
out.put("type", typeName);
for (String legalEntityIdStr : legalEntityIdStrs) {
searchRequest.addObjectId(ObjectId.parse(legalEntityIdStr));
}
if (data().getUriInfo().getQueryParameters().size() > 0) {
LegalEntitySearchResult searchResult = data().getLegalEntityMaster().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("name") String name,
@FormParam("legalEntityXML") String xml,
@FormParam("type") String typeName) {
name = StringUtils.trimToNull(name);
xml = StringUtils.trimToNull(xml);
typeName = StringUtils.trimToNull(typeName);
if (name == null || xml == null) {
FlexiBean out = createRootData();
if (name == null) {
out.put("err_nameMissing", true);
}
if (xml == null) {
out.put("err_xmlMissing", true);
}
out.put("name", StringUtils.defaultString(name));
out.put("type", StringUtils.defaultString(typeName));
out.put("legalEntityXML", StringEscapeUtils.escapeJavaScript(StringUtils.defaultString(xml)));
String html = getFreemarker().build(HTML_DIR + "legalentity-add.ftl", out);
return Response.ok(html).build();
}
final ManageableLegalEntity legalEntity = parseXML(xml, ManageableLegalEntity.class);
legalEntity.setName(name);
LegalEntityDocument doc = new LegalEntityDocument(legalEntity);
LegalEntityDocument added = data().getLegalEntityMaster().add(doc);
URI uri = data().getUriInfo().getAbsolutePathBuilder().path(added.getUniqueId().toLatest().toString()).build();
return Response.seeOther(uri).build();
}
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
public Response postJSON(
@FormParam("name") String name,
@FormParam("legalEntityJSON") String json,
@FormParam("legalEntityXML") String xml,
@FormParam("type") String typeName) {
name = StringUtils.trimToNull(name);
json = StringUtils.trimToNull(json);
xml = StringUtils.trimToNull(xml);
typeName = StringUtils.trimToNull(typeName);
final Class<? extends ManageableLegalEntity> typeClazz = (typeName != null ? data().getTypeMap().get(typeName) : null);
Response result = null;
if (name == null || typeClazz == null || isEmptyLegalEntityData(json, xml)) {
result = Response.status(Status.BAD_REQUEST).build();
} else {
ManageableLegalEntity legalEntity = null;
if (json != null) {
legalEntity = (ManageableLegalEntity) parseJSON(json);
} else if (xml != null) {
legalEntity = parseXML(xml, typeClazz);
}
if (legalEntity == null) {
result = Response.status(Status.BAD_REQUEST).build();
} else {
legalEntity.setName(name);
LegalEntityDocument doc = new LegalEntityDocument(legalEntity);
LegalEntityDocument added = data().getLegalEntityMaster().add(doc);
URI uri = data().getUriInfo().getAbsolutePathBuilder().path(added.getUniqueId().toLatest().toString()).build();
result = Response.created(uri).build();
}
}
return result;
}
private boolean isEmptyLegalEntityData(String json, String xml) {
return (json == null && xml == null);
}
//-------------------------------------------------------------------------
@GET
@Path("metaData")
@Produces(MediaType.APPLICATION_JSON)
public String getMetaDataJSON() {
FlexiBean out = createRootData();
return getFreemarker().build(JSON_DIR + "metadata.ftl", out);
}
//-------------------------------------------------------------------------
@Path("{legalEntityId}")
public Object findLegalEntityHTML(@Subscribe @PathParam("legalEntityId") String idStr) {
data().setUriLegalEntityId(idStr);
UniqueId oid = UniqueId.parse(idStr);
try {
LegalEntityDocument doc = data().getLegalEntityMaster().get(oid);
data().setLegalEntity(doc);
} catch (DataNotFoundException ex) {
LegalEntityHistoryRequest historyRequest = new LegalEntityHistoryRequest(oid);
historyRequest.setPagingRequest(PagingRequest.ONE);
LegalEntityHistoryResult historyResult = data().getLegalEntityMaster().history(historyRequest);
if (historyResult.getDocuments().size() == 0) {
throw ex;
}
data().setLegalEntity(historyResult.getFirstDocument());
}
return new WebLegalEntityResource(this);
}
//-------------------------------------------------------------------------
/**
* Creates the output root data.
*
* @return the output root data, not null
*/
@Override
protected FlexiBean createRootData() {
FlexiBean out = super.createRootData();
LegalEntitySearchRequest searchRequest = new LegalEntitySearchRequest();
out.put("searchRequest", searchRequest);
return out;
}
//-------------------------------------------------------------------------
/**
* Builds a URI for legalEntities.
*
* @param data the data, not null
* @return the URI, not null
*/
public static URI uri(WebLegalEntityData data) {
UriBuilder builder = data.getUriInfo().getBaseUriBuilder().path(WebLegalEntitiesResource.class);
return builder.build();
}
}