com.opengamma.web.exchange.WebExchangeResource.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.web.exchange.WebExchangeResource.java

Source

/**
 * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.web.exchange;

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.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;

import org.apache.commons.lang.StringUtils;
import org.joda.beans.impl.flexi.FlexiBean;

import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.UniqueId;
import com.opengamma.master.exchange.ExchangeDocument;
import com.opengamma.master.exchange.ManageableExchange;

/**
 * RESTful resource for a exchange.
 */
@Path("/exchanges/{exchangeId}")
public class WebExchangeResource extends AbstractWebExchangeResource {

    /**
     * Creates the resource.
     * @param parent  the parent resource, not null
     */
    public WebExchangeResource(final AbstractWebExchangeResource parent) {
        super(parent);
    }

    //-------------------------------------------------------------------------
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String getHTML() {
        FlexiBean out = createRootData();
        return getFreemarker().build(HTML_DIR + "exchange.ftl", out);
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getJSON(@Context Request request) {
        EntityTag etag = new EntityTag(data().getExchange().getUniqueId().toString());
        ResponseBuilder builder = request.evaluatePreconditions(etag);
        if (builder != null) {
            return builder.build();
        }
        FlexiBean out = createRootData();
        String json = getFreemarker().build(JSON_DIR + "exchange.ftl", out);
        return Response.ok(json).tag(etag).build();
    }

    //-------------------------------------------------------------------------
    @PUT
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.TEXT_HTML)
    public Response putHTML(@FormParam("name") String name, @FormParam("idscheme") String idScheme,
            @FormParam("idvalue") String idValue, @FormParam("regionscheme") String regionScheme,
            @FormParam("regionvalue") String regionValue) {
        if (data().getExchange().isLatest() == false) {
            return Response.status(Status.FORBIDDEN).entity(getHTML()).build();
        }

        name = StringUtils.trimToNull(name);
        idScheme = StringUtils.trimToNull(idScheme);
        idValue = StringUtils.trimToNull(idValue);
        if (name == null || idScheme == null || idValue == null) {
            FlexiBean out = createRootData();
            if (name == null) {
                out.put("err_nameMissing", true);
            }
            if (idScheme == null) {
                out.put("err_idschemeMissing", true);
            }
            if (idValue == null) {
                out.put("err_idvalueMissing", true);
            }
            if (regionScheme == null) {
                out.put("err_regionschemeMissing", true);
            }
            if (regionValue == null) {
                out.put("err_regionvalueMissing", true);
            }
            String html = getFreemarker().build(HTML_DIR + "exchange-update.ftl", out);
            return Response.ok(html).build();
        }
        URI uri = updateExchange(name, idScheme, idValue, regionScheme, regionValue);
        return Response.seeOther(uri).build();
    }

    @PUT
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public Response putJSON(@FormParam("name") String name, @FormParam("idscheme") String idScheme,
            @FormParam("idvalue") String idValue, @FormParam("regionscheme") String regionScheme,
            @FormParam("regionvalue") String regionValue) {
        if (data().getExchange().isLatest() == false) {
            return Response.status(Status.FORBIDDEN).entity(getHTML()).build();
        }

        name = StringUtils.trimToNull(name);
        idScheme = StringUtils.trimToNull(idScheme);
        idValue = StringUtils.trimToNull(idValue);
        if (name == null || idScheme == null || idValue == null) {
            return Response.status(Status.BAD_REQUEST).build();
        }
        updateExchange(name, idScheme, idValue, regionScheme, regionValue);
        return Response.ok().build();
    }

    private URI updateExchange(String name, String idScheme, String idValue, String regionScheme,
            String regionValue) {
        ManageableExchange exchange = data().getExchange().getExchange().clone();
        exchange.setName(name);
        exchange.setExternalIdBundle(ExternalIdBundle.of(ExternalId.of(idScheme, idValue)));
        exchange.setRegionIdBundle(ExternalIdBundle.of(ExternalId.of(regionScheme, regionValue)));
        ExchangeDocument doc = new ExchangeDocument(exchange);
        doc = data().getExchangeMaster().update(doc);
        data().setExchange(doc);
        URI uri = WebExchangeResource.uri(data());
        return uri;
    }

    //-------------------------------------------------------------------------
    @DELETE
    @Produces(MediaType.TEXT_HTML)
    public Response deleteHTML() {
        ExchangeDocument doc = data().getExchange();
        if (doc.isLatest() == false) {
            return Response.status(Status.FORBIDDEN).entity(getHTML()).build();
        }
        data().getExchangeMaster().remove(doc.getUniqueId());
        URI uri = WebExchangeResource.uri(data());
        return Response.seeOther(uri).build();
    }

    @DELETE
    @Produces(MediaType.APPLICATION_JSON)
    public Response deleteJSON() {
        ExchangeDocument doc = data().getExchange();
        if (doc.isLatest()) {
            data().getExchangeMaster().remove(doc.getUniqueId());
        }
        return Response.ok().build();
    }

    //-------------------------------------------------------------------------
    /**
     * Creates the output root data.
     * @return the output root data, not null
     */
    protected FlexiBean createRootData() {
        FlexiBean out = super.createRootData();
        ExchangeDocument doc = data().getExchange();
        out.put("exchangeDoc", doc);
        out.put("exchange", doc.getExchange());
        out.put("deleted", !doc.isLatest());
        return out;
    }

    //-------------------------------------------------------------------------
    @Path("versions")
    public WebExchangeVersionsResource findVersions() {
        return new WebExchangeVersionsResource(this);
    }

    //-------------------------------------------------------------------------
    /**
     * Builds a URI for this resource.
     * @param data  the data, not null
     * @return the URI, not null
     */
    public static URI uri(final WebExchangeData data) {
        return uri(data, null);
    }

    /**
     * Builds a URI for this resource.
     * @param data  the data, not null
     * @param overrideExchangeId  the override exchange id, null uses information from data
     * @return the URI, not null
     */
    public static URI uri(final WebExchangeData data, final UniqueId overrideExchangeId) {
        String exchangeId = data.getBestExchangeUriId(overrideExchangeId);
        return data.getUriInfo().getBaseUriBuilder().path(WebExchangeResource.class).build(exchangeId);
    }

}