/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.master.user.impl;
import java.net.URI;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import com.opengamma.core.user.UserAccount;
import com.opengamma.id.ObjectId;
import com.opengamma.id.ObjectIdentifiable;
import com.opengamma.id.UniqueId;
import com.opengamma.master.user.ManageableUser;
import com.opengamma.master.user.UserEventHistoryRequest;
import com.opengamma.master.user.UserEventHistoryResult;
import com.opengamma.master.user.UserMaster;
import com.opengamma.master.user.UserSearchRequest;
import com.opengamma.master.user.UserSearchResult;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.rest.AbstractDataResource;
/**
* RESTful resource for users.
* <p>
* The users resource receives and processes RESTful calls to the user master.
*/
@Path("userMaster")
public class DataUserMasterResource extends AbstractDataResource {
/**
* The user master.
*/
private final UserMaster _userMaster;
/**
* Creates the resource, exposing the underlying master over REST.
*
* @param userMaster the underlying user master, not null
*/
public DataUserMasterResource(final UserMaster userMaster) {
ArgumentChecker.notNull(userMaster, "userMaster");
_userMaster = userMaster;
}
//-------------------------------------------------------------------------
/**
* Gets the user master.
*
* @return the user master, not null
*/
public UserMaster getUserMaster() {
return _userMaster;
}
//-------------------------------------------------------------------------
@GET
public Response getHateaos(@Context UriInfo uriInfo) {
return hateoasResponse(uriInfo);
}
@HEAD
@Path("users")
public Response status() {
// simple HEAD to quickly return, avoiding loading the whole database
return responseOk();
}
@POST
@Path("userSearches")
public Response search(UserSearchRequest request) {
UserSearchResult result = getUserMaster().search(request);
return responseOkObject(result);
}
@POST
@Path("users")
public Response add(@Context UriInfo uriInfo, ManageableUser user) {
UniqueId result = getUserMaster().add(user);
URI createdUri = uriUserById(uriInfo.getBaseUri(), result);
return responseCreatedObject(createdUri, result);
}
//-------------------------------------------------------------------------
@GET
@Path("users/{objectId}")
public Response getById(@PathParam("objectId") String idStr) {
ObjectId id = ObjectId.parse(idStr);
ManageableUser result = getUserMaster().getById(id);
return responseOkObject(result);
}
@PUT
@Path("users/{objectId}")
public Response updateById(@Context UriInfo uriInfo, @PathParam("objectId") String idStr, ManageableUser user) {
ObjectId id = ObjectId.parse(idStr);
if (id.equals(user.getObjectId()) == false) {
throw new IllegalArgumentException("ObjectId of user does not match URI");
}
UniqueId result = getUserMaster().update(user);
return responseOkObject(result);
}
@DELETE
@Path("users/{objectId}")
public void removeById(@PathParam("objectId") String idStr) {
ObjectId id = ObjectId.parse(idStr);
getUserMaster().removeById(id);
}
@GET
@Path("users/{objectId}/eventHistory")
public Response eventHistoryById(@PathParam("objectId") String idStr) {
ObjectId id = ObjectId.parse(idStr);
UserEventHistoryRequest request = new UserEventHistoryRequest(id);
UserEventHistoryResult result = getUserMaster().eventHistory(request);
return responseOkObject(result);
}
//-------------------------------------------------------------------------
@GET
@Path("users/exists/{userName}")
public Response nameExists(@PathParam("userName") String userName) {
boolean exists = getUserMaster().nameExists(userName);
return (exists ? responseOk() : Response.status(Status.NOT_FOUND).build());
}
@GET
@Path("users/name/{userName}")
public Response getByName(@PathParam("userName") String userName) {
ManageableUser result = getUserMaster().getByName(userName);
return responseOkObject(result);
}
@PUT
@Path("users/name/{userName}")
public Response updateByName(@Context UriInfo uriInfo, @PathParam("userName") String userName, ManageableUser user) {
ManageableUser current = getUserMaster().getByName(userName);
if (current.getObjectId().equals(user.getObjectId()) == false) {
throw new IllegalArgumentException("User does not match URI");
}
UniqueId result = getUserMaster().update(user);
return responseOkObject(result);
}
@DELETE
@Path("users/name/{userName}")
public void removeByName(@PathParam("userName") String userName) {
getUserMaster().removeByName(userName);
}
@GET
@Path("users/name/{userName}/eventHistory")
public Response eventHistoryByName(@PathParam("userName") String userName) {
UserEventHistoryRequest request = new UserEventHistoryRequest(userName);
UserEventHistoryResult result = getUserMaster().eventHistory(request);
return responseOkObject(result);
}
@GET
@Path("users/name/{userName}/account")
public Response accountByName(@PathParam("userName") String userName) {
UserAccount account = getUserMaster().getAccount(userName);
return responseOkObject(account);
}
//-------------------------------------------------------------------------
/**
* Builds a URI.
*
* @param baseUri the base URI, not null
* @return the URI, not null
*/
public static URI uriSearch(URI baseUri) {
UriBuilder bld = UriBuilder.fromUri(baseUri).path("userSearches");
return bld.build();
}
/**
* Builds a URI.
*
* @param baseUri the base URI, not null
* @return the URI, not null
*/
public static URI uriAdd(URI baseUri) {
UriBuilder bld = UriBuilder.fromUri(baseUri).path("users");
return bld.build();
}
//-------------------------------------------------------------------------
/**
* Builds a URI for the resource.
*
* @param baseUri the base URI, not null
* @param objectId the object identifier, not null
* @return the URI, not null
*/
public static URI uriUserById(URI baseUri, ObjectIdentifiable objectId) {
UriBuilder bld = UriBuilder.fromUri(baseUri).path("/users/{objectId}");
return bld.build(objectId.getObjectId());
}
/**
* Builds a URI for the resource.
*
* @param baseUri the base URI, not null
* @param userName the user name, not null
* @return the URI, not null
*/
public static URI uriUserByName(URI baseUri, String userName) {
UriBuilder bld = UriBuilder.fromUri(baseUri).path("/users/name/{userName}");
return bld.build(userName);
}
/**
* Builds a URI for the resource.
*
* @param baseUri the base URI, not null
* @param userName the user name, not null
* @return the URI, not null
*/
public static URI uriNameExists(URI baseUri, String userName) {
UriBuilder bld = UriBuilder.fromUri(baseUri).path("/users/exists/{userName}");
return bld.build(userName);
}
//-------------------------------------------------------------------------
/**
* Builds a URI for the resource.
*
* @param baseUri the base URI, not null
* @param request the request, not null
* @return the URI, not null
*/
public static URI uriEventHistory(URI baseUri, UserEventHistoryRequest request) {
UriBuilder bld = UriBuilder.fromUri(baseUri);
if (request.getObjectId() != null) {
return bld.path("/users/{objectId}/eventHistory").build(request.getObjectId());
} else {
return bld.path("/users/name/{userName}/eventHistory").build(request.getUserName());
}
}
/**
* Builds a URI for the resource.
*
* @param baseUri the base URI, not null
* @param userName the user name, not null
* @return the URI, not null
*/
public static URI uriUserAccountByName(URI baseUri, String userName) {
UriBuilder bld = UriBuilder.fromUri(baseUri).path("/users/name/{userName}/account");
return bld.build(userName);
}
}