Package com.opengamma.core.config.impl

Source Code of com.opengamma.core.config.impl.DataConfigSourceResource

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

import java.net.URI;
import java.util.Collection;

import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;

import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import org.fudgemsg.mapping.FudgeSerializer;

import com.opengamma.core.config.ConfigSource;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.ReflectionUtils;
import com.opengamma.util.fudgemsg.OpenGammaFudgeContext;
import com.opengamma.util.rest.AbstractDataResource;

/**
* RESTful resource for configuration.
* <p>
* This resource receives and processes RESTful calls to the configuration source.
*/
@Path("configSource")
public class DataConfigSourceResource extends AbstractDataResource {

  /**
   * The config source.
   */
  private final ConfigSource _exgSource;

  /**
   * Creates the resource, exposing the underlying source over REST.
   *
   * @param configSource  the underlying config source, not null
   */
  public DataConfigSourceResource(final ConfigSource configSource) {
    ArgumentChecker.notNull(configSource, "configSource");
    _exgSource = configSource;
  }

  //-------------------------------------------------------------------------

  /**
   * Gets the configuration source.
   *
   * @return the configuration source, not null
   */
  public ConfigSource getConfigSource() {
    return _exgSource;
  }

  @SuppressWarnings("unchecked")
  private FudgeMsg configItemCollectionResult(final Collection<?> items) {
    final FudgeSerializer serializer = new FudgeSerializer(OpenGammaFudgeContext.getInstance());
    final MutableFudgeMsg msg = serializer.newMessage();
    for (final ConfigItem<?> item : (Collection<ConfigItem<?>>) items) {
      serializer.addToMessageWithClassHeaders(msg, null, null, item, ConfigItem.class);
    }
    return msg;
  }

  private FudgeMsg configItemResult(final ConfigItem<?> item) {
    final FudgeSerializer serializer = new FudgeSerializer(OpenGammaFudgeContext.getInstance());
    return FudgeSerializer.addClassHeader(serializer.objectToFudgeMsg(item), item.getClass(), ConfigItem.class);
  }

  private FudgeMsg configValueResult(final Class<?> clazz, final Object value) {
    if (value == null) {
      return null;
    }
    final FudgeSerializer serializer = new FudgeSerializer(OpenGammaFudgeContext.getInstance());
    return FudgeSerializer.addClassHeader(serializer.objectToFudgeMsg(value), value.getClass(), clazz);
  }

  //-------------------------------------------------------------------------
  @GET
  public Response getHateaos(@Context final UriInfo uriInfo) {
    return hateoasResponse(uriInfo);
  }

  @GET
  @Path("configs")
  public Response search(
    @QueryParam("type") final String typeStr,
    @QueryParam("versionCorrection") final String versionCorrectionStr,
    @QueryParam("name") final String name) {
    final Class<?> type = ReflectionUtils.loadClass(typeStr);
    final VersionCorrection versionCorrection = (versionCorrectionStr != null) ? VersionCorrection.parse(versionCorrectionStr) : VersionCorrection.LATEST;
    if (name == null) {
      return responseOkFudge(configItemCollectionResult(getConfigSource().getAll(type, versionCorrection)));
    } else {
      return responseOkFudge(configItemCollectionResult(getConfigSource().get(type, name, versionCorrection)));
    }
  }

  /**
   * Builds a URI.
   *
   * @param baseUri the base URI, not null
   * @param name the name, may be null
   * @param versionCorrection the version to fetch, null means latest
   * @param type the config type, may be null
   * @return the URI, not null
   */
  public static URI uriGet(final URI baseUri, final String name, final VersionCorrection versionCorrection, final Class<?> type) {
    ArgumentChecker.notNull(baseUri, "baseUri");
    ArgumentChecker.notNull(name, "name");
    ArgumentChecker.notNull(type, "type");
    final UriBuilder bld = UriBuilder.fromUri(baseUri).path("configs");
    bld.queryParam("name", name);
    bld.queryParam("type", type.getName());
    if (versionCorrection != null) {
      bld.queryParam("versionCorrection", versionCorrection.toString());
    } else {
      bld.queryParam("versionCorrection", VersionCorrection.LATEST.toString());
    }
    return bld.build();
  }

  @GET
  @Path("configs/{uid}")
  public Response get(
    @PathParam("uid") final String uidStr) {
    final UniqueId uid = UniqueId.parse(uidStr);
    final ConfigItem<?> result = getConfigSource().get(uid);
    return responseOkFudge(configItemResult(result));
  }

  /**
   * Builds a URI.
   *
   * @param baseUri  the base URI, not null
   * @param uniqueId  the unique identifier, may be null
   * @return the URI, not null
   */
  public static URI uriGet(final URI baseUri, final UniqueId uniqueId) {
    ArgumentChecker.notNull(baseUri, "baseUri");
    ArgumentChecker.notNull(uniqueId, "uniqueId");
    final UriBuilder bld = UriBuilder.fromUri(baseUri).path("configs/{uid}");
    return bld.build(uniqueId);
  }

  @GET
  @Path("configs/{oid}/{versionCorrection}")
  public Response getByOidVersionCorrection(
    @PathParam("oid") final String idStr,
    @PathParam("versionCorrection") final String versionCorrectionStr) {
    final ObjectId objectId = ObjectId.parse(idStr);
    final VersionCorrection versionCorrection = VersionCorrection.parse(versionCorrectionStr);
    final ConfigItem<?> result = getConfigSource().get(objectId, versionCorrection);
    return responseOkFudge(configItemResult(result));
  }


  /**
   * Builds a URI.
   *
   * @param baseUri  the base URI, not null
   * @param objectId  the object identifier, may be null
   * @param versionCorrection  the version-correction, null means latest
   * @return the URI, not null
   */
  public static URI uriGet(final URI baseUri, final ObjectId objectId, VersionCorrection versionCorrection) {
    ArgumentChecker.notNull(baseUri, "baseUri");
    ArgumentChecker.notNull(objectId, "objectId");
    final UriBuilder bld = UriBuilder.fromUri(baseUri).path("configs/{oid}/{versionCorrection}");
    versionCorrection = versionCorrection != null ? versionCorrection : VersionCorrection.LATEST;
    return bld.build(objectId, versionCorrection);
  }

  @GET
  @Path("configSearches/single")
  public Response searchSingle(
    @QueryParam("type") final String typeStr,
    @QueryParam("versionCorrection") final String versionCorrectionStr,
    @QueryParam("name") final String name) {
    final Class<?> type = ReflectionUtils.loadClass(typeStr);
    final VersionCorrection versionCorrection = (versionCorrectionStr != null) ? VersionCorrection.parse(versionCorrectionStr) : VersionCorrection.LATEST;
    return responseOkFudge(configValueResult(type, getConfigSource().getSingle(type, name, versionCorrection)));
  }

  /**
   * Builds a URI.
   *
   * @param baseUri  the base URI, not null
   * @param name  the name, may be null
   * @param versionCorrection  the version to fetch, null means latest
   * @param type  the config type, may be null
   * @return the URI, not null
   */
  public static URI uriSearchSingle(final URI baseUri, final String name, final VersionCorrection versionCorrection, final Class<?> type) {
    ArgumentChecker.notNull(baseUri, "baseUri");
    ArgumentChecker.notNull(name, "name");
    ArgumentChecker.notNull(type, "type");
    final UriBuilder bld = UriBuilder.fromUri(baseUri).path("configSearches/single");
    bld.queryParam("name", name);
    bld.queryParam("type", type.getName());
    if (versionCorrection != null) {
      bld.queryParam("versionCorrection", versionCorrection.toString());
    } else {
      bld.queryParam("versionCorrection", VersionCorrection.LATEST.toString());
    }
    return bld.build();
  }

  @GET
  @Path("configSearches")
  public Response search(
    @QueryParam("type") final String typeStr,
    @QueryParam("versionCorrection") final String versionCorrectionStr) {
    final Class<?> type = ReflectionUtils.loadClass(typeStr);
    final VersionCorrection versionCorrection = (versionCorrectionStr != null) ? VersionCorrection.parse(versionCorrectionStr) : VersionCorrection.LATEST;
    return responseOkFudge(configItemCollectionResult(getConfigSource().getAll(type, versionCorrection)));
  }

  /**
   * Builds a URI.
   *
   * @param baseUri  the base URI, not null
   * @param type  the config type, may be null
   * @param versionCorrection  the version to fetch, null means latest
   *
   * @return the URI, not null
   */
  public static URI uriSearch(final URI baseUri, final Class<?> type, final VersionCorrection versionCorrection) {
    ArgumentChecker.notNull(baseUri, "baseUri");
    ArgumentChecker.notNull(type, "type");
    final UriBuilder bld = UriBuilder.fromUri(baseUri).path("configSearches");
    bld.queryParam("type", type.getName());
    if (versionCorrection != null) {
      bld.queryParam("versionCorrection", versionCorrection.toString());
    } else {
      bld.queryParam("versionCorrection", VersionCorrection.LATEST.toString());
    }
    return bld.build();
  }

  // TODO: put is not a RESTful URI!
  @PUT
  @Path("put")
  public Response put(
    @QueryParam("type") final String typeStr,
    @QueryParam("versionCorrection") final String versionCorrectionStr) {
    final Class<?> type = ReflectionUtils.loadClass(typeStr);
    final VersionCorrection versionCorrection = (versionCorrectionStr != null) ? VersionCorrection.parse(versionCorrectionStr) : VersionCorrection.LATEST;
    return responseOkFudge(configItemCollectionResult(getConfigSource().getAll(type, versionCorrection)));
  }

  public static <T> URI uriPut(final URI baseUri) {
    ArgumentChecker.notNull(baseUri, "baseUri");
    final UriBuilder bld = UriBuilder.fromUri(baseUri).path("put");
    return bld.build();
  }

}
TOP

Related Classes of com.opengamma.core.config.impl.DataConfigSourceResource

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.