/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.web.region;
import static com.opengamma.util.EnumUtils.safeValueOf;
import java.net.URI;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
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 javax.ws.rs.core.Response.Status;
import org.apache.commons.lang.StringUtils;
import org.joda.beans.impl.flexi.FlexiBean;
import org.threeten.bp.ZoneId;
import com.opengamma.core.region.RegionClassification;
import com.opengamma.id.UniqueId;
import com.opengamma.master.region.ManageableRegion;
import com.opengamma.master.region.RegionDocument;
import com.opengamma.master.region.RegionSearchRequest;
import com.opengamma.master.region.RegionSearchResult;
import com.opengamma.util.i18n.Country;
import com.opengamma.util.money.Currency;
import com.opengamma.util.paging.PagingRequest;
/**
* RESTful resource for a region.
*/
@Path("/regions/{regionId}")
public class WebRegionResource extends AbstractWebRegionResource {
/**
* Creates the resource.
* @param parent the parent resource, not null
*/
public WebRegionResource(final AbstractWebRegionResource parent) {
super(parent);
}
//-------------------------------------------------------------------------
@GET
@Produces(MediaType.TEXT_HTML)
public String getHTML() {
RegionSearchRequest search = new RegionSearchRequest();
search.setPagingRequest(PagingRequest.ALL); // may need to add paging
search.setChildrenOfId(data().getRegion().getUniqueId());
RegionSearchResult children = data().getRegionMaster().search(search);
data().setRegionChildren(children.getDocuments());
for (UniqueId parentId : data().getRegion().getRegion().getParentRegionIds()) {
RegionDocument parent = data().getRegionMaster().get(parentId);
data().getRegionParents().add(parent);
}
FlexiBean out = createRootData();
return getFreemarker().build(HTML_DIR + "region.ftl", out);
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getJSON() {
RegionSearchRequest search = new RegionSearchRequest();
search.setPagingRequest(PagingRequest.ALL); // may need to add paging
search.setChildrenOfId(data().getRegion().getUniqueId());
RegionSearchResult children = data().getRegionMaster().search(search);
data().setRegionChildren(children.getDocuments());
for (UniqueId parentId : data().getRegion().getRegion().getParentRegionIds()) {
RegionDocument parent = data().getRegionMaster().get(parentId);
data().getRegionParents().add(parent);
}
FlexiBean out = createRootData();
return getFreemarker().build(JSON_DIR + "region.ftl", out);
}
//-------------------------------------------------------------------------
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_HTML)
public Response postHTML(
@FormParam("name") String name,
@FormParam("fullname") String fullName,
@FormParam("classification") String classification,
@FormParam("country") String countryISO,
@FormParam("currency") String currencyISO,
@FormParam("timezone") String timeZoneId) {
if (data().getRegion().isLatest() == false) {
return Response.status(Status.FORBIDDEN).entity(getHTML()).build();
}
name = StringUtils.trimToNull(name);
fullName = StringUtils.trimToNull(fullName);
countryISO = StringUtils.trimToNull(countryISO);
currencyISO = StringUtils.trimToNull(currencyISO);
timeZoneId = StringUtils.trimToNull(timeZoneId);
RegionClassification regionClassification = safeValueOf(RegionClassification.class, classification);
if (name == null || regionClassification == null) {
FlexiBean out = createRootData();
if (name == null) {
out.put("err_nameMissing", true);
}
if (regionClassification == null) {
out.put("err_classificationMissing", true);
}
String html = getFreemarker().build(HTML_DIR + "region-add.ftl", out);
return Response.ok(html).build();
}
if (fullName == null) {
fullName = name;
}
URI uri = addRegion(name, fullName, regionClassification, countryISO, currencyISO, timeZoneId);
return Response.seeOther(uri).build();
}
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
public Response postJSON(
@FormParam("name") String name,
@FormParam("fullname") String fullName,
@FormParam("classification") RegionClassification classification,
@FormParam("country") String countryISO,
@FormParam("currency") String currencyISO,
@FormParam("timezone") String timeZoneId) {
if (data().getRegion().isLatest() == false) {
return Response.status(Status.FORBIDDEN).entity(getHTML()).build();
}
name = StringUtils.trimToNull(name);
fullName = StringUtils.trimToNull(fullName);
countryISO = StringUtils.trimToNull(countryISO);
currencyISO = StringUtils.trimToNull(currencyISO);
timeZoneId = StringUtils.trimToNull(timeZoneId);
if (name == null || classification == null) {
Response.status(Status.BAD_REQUEST);
}
if (fullName == null) {
fullName = name;
}
URI uri = addRegion(name, fullName, classification, countryISO, currencyISO, timeZoneId);
return Response.created(uri).build();
}
private URI addRegion(String name, String fullName, RegionClassification classification, String countryISO, String currencyISO, String timeZoneId) {
ManageableRegion region = new ManageableRegion();
region.getParentRegionIds().add(data().getRegion().getUniqueId());
region.setName(name);
region.setFullName(fullName);
region.setClassification(classification);
region.setCountry(countryISO != null ? Country.of(countryISO) : null);
region.setCurrency(currencyISO != null ? Currency.of(currencyISO) : null);
region.setTimeZone(timeZoneId != null ? ZoneId.of(timeZoneId) : null);
RegionDocument doc = new RegionDocument(region);
RegionDocument added = data().getRegionMaster().add(doc);
return WebRegionResource.uri(data(), added.getUniqueId());
}
//-------------------------------------------------------------------------
@PUT
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_HTML)
public Response putHTML(
@FormParam("name") String name,
@FormParam("fullname") String fullName,
@FormParam("classification") String classification,
@FormParam("country") String countryISO,
@FormParam("currency") String currencyISO,
@FormParam("timezone") String timeZoneId) {
if (data().getRegion().isLatest() == false) {
return Response.status(Status.FORBIDDEN).entity(getHTML()).build();
}
name = StringUtils.trimToNull(name);
fullName = StringUtils.trimToNull(fullName);
countryISO = StringUtils.trimToNull(countryISO);
currencyISO = StringUtils.trimToNull(currencyISO);
timeZoneId = StringUtils.trimToNull(timeZoneId);
RegionClassification regionClassification = safeValueOf(RegionClassification.class, classification);
if (name == null || regionClassification == null) {
FlexiBean out = createRootData();
if (name == null) {
out.put("err_nameMissing", true);
}
if (regionClassification == null) {
out.put("err_classificationMissing", true);
}
String html = getFreemarker().build(HTML_DIR + "region-update.ftl", out);
return Response.ok(html).build();
}
if (fullName == null) {
fullName = name;
}
URI uri = updateRegion(name, fullName, regionClassification, countryISO, currencyISO, timeZoneId);
return Response.seeOther(uri).build();
}
@PUT
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
public Response putJSON(
@FormParam("name") String name,
@FormParam("fullname") String fullName,
@FormParam("classification") String classification,
@FormParam("country") String countryISO,
@FormParam("currency") String currencyISO,
@FormParam("timezone") String timeZoneId) {
if (data().getRegion().isLatest() == false) { // TODO: idempotent
return Response.status(Status.FORBIDDEN).entity(getHTML()).build();
}
name = StringUtils.trimToNull(name);
fullName = StringUtils.trimToNull(fullName);
countryISO = StringUtils.trimToNull(countryISO);
currencyISO = StringUtils.trimToNull(currencyISO);
timeZoneId = StringUtils.trimToNull(timeZoneId);
RegionClassification regionClassification = safeValueOf(RegionClassification.class, classification);
if (name == null || regionClassification == null) {
return Response.status(Status.BAD_REQUEST).build();
}
if (fullName == null) {
fullName = name;
}
updateRegion(name, fullName, regionClassification, countryISO, currencyISO, timeZoneId);
return Response.ok().build();
}
private URI updateRegion(String name, String fullName, RegionClassification classification, String countryISO, String currencyISO, String timeZoneId) {
ManageableRegion region = new ManageableRegion();
region.setUniqueId(data().getRegion().getUniqueId());
region.setParentRegionIds(data().getRegion().getRegion().getParentRegionIds());
region.setName(name);
region.setFullName(fullName);
region.setClassification(classification);
region.setCountry(countryISO != null ? Country.of(countryISO) : null);
region.setCurrency(currencyISO != null ? Currency.of(currencyISO) : null);
region.setTimeZone(timeZoneId != null ? ZoneId.of(timeZoneId) : null);
RegionDocument doc = new RegionDocument(region);
doc = data().getRegionMaster().update(doc);
data().setRegion(doc);
return WebRegionResource.uri(data());
}
//-------------------------------------------------------------------------
@DELETE
@Produces(MediaType.TEXT_HTML)
public Response deleteHTML() {
RegionDocument doc = data().getRegion();
if (doc.isLatest() == false) {
return Response.status(Status.FORBIDDEN).entity(getHTML()).build();
}
data().getRegionMaster().remove(doc.getUniqueId());
URI uri = WebRegionResource.uri(data());
return Response.seeOther(uri).build();
}
@DELETE
@Produces(MediaType.APPLICATION_JSON)
public Response deleteJSON() {
RegionDocument doc = data().getRegion();
if (doc.isLatest()) { // idempotent
data().getRegionMaster().remove(doc.getUniqueId());
}
return Response.ok().build();
}
//-------------------------------------------------------------------------
/**
* Creates the output root data.
* @return the output root data, not null
*/
@Override
protected FlexiBean createRootData() {
FlexiBean out = super.createRootData();
RegionDocument doc = data().getRegion();
out.put("regionDoc", doc);
out.put("region", doc.getRegion());
out.put("deleted", !doc.isLatest());
out.put("regionParents", data().getRegionParents());
out.put("regionChildren", data().getRegionChildren());
return out;
}
//-------------------------------------------------------------------------
@Path("versions")
public WebRegionVersionsResource findVersions() {
return new WebRegionVersionsResource(this);
}
//-------------------------------------------------------------------------
/**
* Builds a URI for this resource.
* @param data the data, not null
* @return the URI, not null
*/
public static URI uri(final WebRegionData data) {
return uri(data, null);
}
/**
* Builds a URI for this resource.
* @param data the data, not null
* @param overrideRegionId the override region id, null uses information from data
* @return the URI, not null
*/
public static URI uri(final WebRegionData data, final UniqueId overrideRegionId) {
String regionId = data.getBestRegionUriId(overrideRegionId);
return data.getUriInfo().getBaseUriBuilder().path(WebRegionResource.class).build(regionId);
}
}