/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.web.user; 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.StringUtils; import org.joda.beans.impl.flexi.FlexiBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.DataNotFoundException; import com.opengamma.id.ObjectId; import com.opengamma.master.user.ManageableRole; import com.opengamma.master.user.RoleEventHistoryRequest; import com.opengamma.master.user.RoleForm; import com.opengamma.master.user.RoleFormError; import com.opengamma.master.user.RoleFormException; import com.opengamma.master.user.RoleSearchRequest; import com.opengamma.master.user.RoleSearchResult; import com.opengamma.master.user.RoleSearchSortOrder; import com.opengamma.master.user.UserMaster; import com.opengamma.util.paging.PagingRequest; import com.opengamma.web.WebPaging; /** * RESTful resource for all roles. * <p> * The roles resource represents the whole of a role master. */ @Path("/roles") public class WebRolesResource extends AbstractWebRoleResource { /** Logger. */ private static final Logger s_logger = LoggerFactory.getLogger(WebRolesResource.class); /** * The ftl file. */ private static final String ROLES_PAGE = HTML_DIR + "roles.ftl"; /** * The ftl file. */ private static final String ROLE_ADD_PAGE = HTML_DIR + "role-add.ftl"; /** * Creates the resource. * @param userMaster the user master, not null */ public WebRolesResource(final UserMaster userMaster) { super(userMaster); } //------------------------------------------------------------------------- @GET @Produces(MediaType.TEXT_HTML) public String getHTML( @QueryParam("pgIdx") Integer pgIdx, @QueryParam("pgNum") Integer pgNum, @QueryParam("pgSze") Integer pgSze, @QueryParam("sort") String sort, @QueryParam("rolename") String rolename, @QueryParam("name") String name, @QueryParam("roleId") List<String> roleIdStrs, @Context UriInfo uriInfo) { sort = StringUtils.trimToNull(sort); rolename = StringUtils.trimToNull(rolename); name = StringUtils.trimToNull(name); PagingRequest pr = buildPagingRequest(pgIdx, pgNum, pgSze); RoleSearchSortOrder so = buildSortOrder(sort, RoleSearchSortOrder.NAME_ASC); FlexiBean out = createSearchResultData(pr, so, rolename, name, roleIdStrs, uriInfo); return getFreemarker().build(ROLES_PAGE, out); } private FlexiBean createSearchResultData( PagingRequest pr, RoleSearchSortOrder so, String rolename, String name, List<String> roleIdStrs, UriInfo uriInfo) { FlexiBean out = createRootData(); RoleSearchRequest searchRequest = new RoleSearchRequest(); searchRequest.setPagingRequest(pr); searchRequest.setSortOrder(so); searchRequest.setRoleName(rolename); for (String roleIdStr : roleIdStrs) { searchRequest.addObjectId(ObjectId.parse(roleIdStr)); } out.put("searchRequest", searchRequest); if (data().getUriInfo().getQueryParameters().size() > 0) { RoleSearchResult searchResult = data().getRoleMaster().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("rolename") String roleName, @FormParam("description") String description, @FormParam("addroles") String addRoles, @FormParam("addperms") String addPerms, @FormParam("addusers") String addUsers) { try { RoleForm form = new RoleForm(roleName, description); form.setAddRoles(addRoles); form.setAddPermissions(addPerms); form.setAddUsers(addUsers); ManageableRole added = form.add(data().getUserMaster()); URI uri = WebRoleResource.uri(data(), added.getRoleName()); return Response.seeOther(uri).build(); } catch (RoleFormException ex) { ex.logUnexpected(s_logger); FlexiBean out = createRootData(); out.put("rolename", roleName); out.put("description", description); out.put("addroles", addRoles); out.put("addperms", addPerms); out.put("addusers", addUsers); for (RoleFormError error : ex.getErrors()) { out.put("err_" + error.toLowerCamel(), true); } return Response.ok(getFreemarker().build(ROLE_ADD_PAGE, out)).build(); } } //------------------------------------------------------------------------- @Path("name/{roleName}") public WebRoleResource findRole(@PathParam("roleName") String roleName) { data().setUriRoleName(roleName); try { ManageableRole role = data().getRoleMaster().getByName(roleName); data().setRole(role); } catch (DataNotFoundException ex) { RoleEventHistoryRequest request = new RoleEventHistoryRequest(roleName); try { data().getRoleMaster().eventHistory(request); ManageableRole role = new ManageableRole(roleName); data().setRole(role); } catch (DataNotFoundException ex2) { throw ex; } } return new WebRoleResource(this); } //------------------------------------------------------------------------- /** * Creates the output root data. * @return the output root data, not null */ @Override protected FlexiBean createRootData() { FlexiBean out = super.createRootData(); RoleSearchRequest searchRequest = new RoleSearchRequest(); out.put("searchRequest", searchRequest); return out; } //------------------------------------------------------------------------- /** * Builds a URI for roles. * @param data the data, not null * @return the URI, not null */ public static URI uri(WebRoleData data) { UriBuilder builder = data.getUriInfo().getBaseUriBuilder().path(WebRolesResource.class); return builder.build(); } }