/** * 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.apache.shiro.authc.credential.PasswordService; 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.ManageableUser; import com.opengamma.master.user.UserEventHistoryRequest; import com.opengamma.master.user.UserForm; import com.opengamma.master.user.UserFormError; import com.opengamma.master.user.UserFormException; import com.opengamma.master.user.UserMaster; import com.opengamma.master.user.UserSearchRequest; import com.opengamma.master.user.UserSearchResult; import com.opengamma.master.user.UserSearchSortOrder; import com.opengamma.util.paging.PagingRequest; import com.opengamma.web.WebPaging; /** * RESTful resource for all users. * <p> * The users resource represents the whole of a user master. */ @Path("/users") public class WebUsersResource extends AbstractWebUserResource { /** Logger. */ private static final Logger s_logger = LoggerFactory.getLogger(WebUsersResource.class); /** * The ftl file. */ private static final String USERS_PAGE = HTML_DIR + "users.ftl"; /** * The ftl file. */ private static final String USER_ADD_PAGE = HTML_DIR + "user-add.ftl"; /** * Creates the resource. * @param userMaster the user master, not null * @param passwordService the password service, not null */ public WebUsersResource(final UserMaster userMaster, final PasswordService passwordService) { super(userMaster, passwordService); } //------------------------------------------------------------------------- @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("username") String username, @QueryParam("name") String name, @QueryParam("email") String email, @QueryParam("idscheme") String idScheme, @QueryParam("idvalue") String idValue, @QueryParam("userId") List<String> userIdStrs, @Context UriInfo uriInfo) { sort = StringUtils.trimToNull(sort); username = StringUtils.trimToNull(username); name = StringUtils.trimToNull(name); email = StringUtils.trimToNull(email); idScheme = StringUtils.trimToNull(idScheme); idValue = StringUtils.trimToNull(idValue); PagingRequest pr = buildPagingRequest(pgIdx, pgNum, pgSze); UserSearchSortOrder so = buildSortOrder(sort, UserSearchSortOrder.NAME_ASC); FlexiBean out = createSearchResultData(pr, so, username, name, email, idScheme, idValue, userIdStrs, uriInfo); return getFreemarker().build(USERS_PAGE, out); } private FlexiBean createSearchResultData( PagingRequest pr, UserSearchSortOrder so, String username, String name, String email, String idScheme, String idValue, List<String> userIdStrs, UriInfo uriInfo) { FlexiBean out = createRootData(); UserSearchRequest searchRequest = new UserSearchRequest(); searchRequest.setPagingRequest(pr); searchRequest.setSortOrder(so); searchRequest.setUserName(username); searchRequest.setDisplayName(name); searchRequest.setEmailAddress(email); searchRequest.setAlternateIdScheme(StringUtils.trimToNull(idScheme)); searchRequest.setAlternateIdValue(StringUtils.trimToNull(idValue)); for (String userIdStr : userIdStrs) { searchRequest.addObjectId(ObjectId.parse(userIdStr)); } out.put("searchRequest", searchRequest); if (data().getUriInfo().getQueryParameters().size() > 0) { UserSearchResult searchResult = data().getUserMaster().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("username") String userName, @FormParam("password") String password, @FormParam("email") String email, @FormParam("displayname") String displayName, @FormParam("locale") String locale, @FormParam("timezone") String zone, @FormParam("datestyle") String dateStyle, @FormParam("timestyle") String timeStyle) { try { UserForm form = new UserForm(userName, password, email, displayName, locale, zone, dateStyle, timeStyle); ManageableUser added = form.add(data().getUserMaster(), data().getPasswordService()); URI uri = WebUserResource.uri(data(), added.getUserName()); return Response.seeOther(uri).build(); } catch (UserFormException ex) { ex.logUnexpected(s_logger); FlexiBean out = createRootData(); out.put("username", userName); out.put("displayname", displayName); out.put("timezone", zone); out.put("email", email); for (UserFormError error : ex.getErrors()) { out.put("err_" + error.toLowerCamel(), true); } return Response.ok(getFreemarker().build(USER_ADD_PAGE, out)).build(); } } //------------------------------------------------------------------------- @Path("name/{userName}") public WebUserResource findUser(@PathParam("userName") String userName) { data().setUriUserName(userName); try { ManageableUser user = data().getUserMaster().getByName(userName); data().setUser(user); } catch (DataNotFoundException ex) { UserEventHistoryRequest request = new UserEventHistoryRequest(userName); try { data().getUserMaster().eventHistory(request); ManageableUser user = new ManageableUser(userName); data().setUser(user); } catch (DataNotFoundException ex2) { throw ex; } } return new WebUserResource(this); } //------------------------------------------------------------------------- /** * Creates the output root data. * @return the output root data, not null */ @Override protected FlexiBean createRootData() { FlexiBean out = super.createRootData(); UserSearchRequest searchRequest = new UserSearchRequest(); out.put("searchRequest", searchRequest); return out; } //------------------------------------------------------------------------- /** * Builds a URI for users. * @param data the data, not null * @return the URI, not null */ public static URI uri(WebUserData data) { UriBuilder builder = data.getUriInfo().getBaseUriBuilder().path(WebUsersResource.class); return builder.build(); } }